Skip to content

Commit 72e8c4f

Browse files
committed
Initial support for SSR rendering
1 parent b542470 commit 72e8c4f

File tree

4 files changed

+57
-29
lines changed

4 files changed

+57
-29
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-spaces",
3-
"version": "0.2.0",
3+
"version": "0.2.1-beta.9",
44
"main": "dist/index.js",
55
"module": "dist/es/index.js",
66
"types": "dist/index.d.ts",

src/components/Space.tsx

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useSpace, ParentContext, LayerContext, DOMRectContext } from "../core-r
33
import * as React from "react";
44
import { Centered } from "./Centered";
55
import { CenteredVertically } from "./CenteredVertically";
6-
import { shortuuid } from "../core-utils";
6+
import { shortuuid, updateStyleDefinition } from "../core-utils";
77

88
function applyCentering(children: React.ReactNode, centerType: CenterType | undefined) {
99
switch (centerType) {
@@ -60,6 +60,18 @@ const SpaceInner: React.FC<ISpaceProps & { wrapperInstance: Space }> = (props) =
6060

6161
React.useEffect(() => {
6262
space.element = elementRef.current!;
63+
64+
if (space.element.getAttribute("data-ssr") === "1") {
65+
const preRenderedStyle = space.element.children[0];
66+
if (preRenderedStyle) {
67+
const newStyle = document.createElement("style");
68+
newStyle.id = `style_${space.id}`;
69+
newStyle.innerHTML = preRenderedStyle.innerHTML;
70+
document.head.appendChild(newStyle);
71+
}
72+
space.element.removeAttribute("data-ssr");
73+
updateStyleDefinition(space);
74+
}
6375
}, []);
6476

6577
const userClasses = className ? className.split(" ").map((c) => c.trim()) : [];
@@ -86,28 +98,39 @@ const SpaceInner: React.FC<ISpaceProps & { wrapperInstance: Space }> = (props) =
8698

8799
const centeredContent = applyCentering(children, props.centerContent);
88100

101+
const outerProps = {
102+
...{
103+
id: space.id,
104+
ref: elementRef,
105+
className: outerClasses.join(" "),
106+
},
107+
...events,
108+
} as any;
109+
110+
const isSSR = typeof document === "undefined";
111+
112+
if (isSSR) {
113+
outerProps["data-ssr"] = "1";
114+
}
115+
89116
return (
90117
<>
91118
{resizeHandles.mouseHandles.map((r) => (
92119
<div {...r} />
93120
))}
94121
{React.createElement(
95122
props.as || "div",
96-
{
97-
...{
98-
id: space.id,
99-
ref: elementRef,
100-
className: outerClasses.join(" "),
101-
},
102-
...events,
103-
},
104-
<div className={innerClasses.join(" ")} style={innerStyle}>
105-
<ParentContext.Provider value={space.id}>
106-
<LayerContext.Provider value={undefined}>
107-
<DOMRectContext.Provider value={domRect}>{centeredContent}</DOMRectContext.Provider>
108-
</LayerContext.Provider>
109-
</ParentContext.Provider>
110-
</div>,
123+
outerProps,
124+
<>
125+
{isSSR && space.ssrStyle && <style className="ssr">{space.ssrStyle}</style>}
126+
<div className={innerClasses.join(" ")} style={innerStyle}>
127+
<ParentContext.Provider value={space.id}>
128+
<LayerContext.Provider value={undefined}>
129+
<DOMRectContext.Provider value={domRect}>{centeredContent}</DOMRectContext.Provider>
130+
</LayerContext.Provider>
131+
</ParentContext.Provider>
132+
</div>
133+
</>,
111134
)}
112135
</>
113136
);

src/core-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,4 +156,5 @@ export interface ISpaceDefinition {
156156
canResizeLeft: boolean;
157157
canResizeRight: boolean;
158158
canResizeBottom: boolean;
159+
ssrStyle?: string;
159160
}

src/core-utils.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -173,20 +173,24 @@ export function styleDefinition(space: ISpaceDefinition) {
173173
}
174174

175175
export function updateStyleDefinition(space: ISpaceDefinition) {
176-
if (document) {
177-
const definition = styleDefinition(space);
178-
const existing = document.getElementById(`style_${space.id}`);
179-
180-
if (existing) {
181-
if (existing.innerHTML !== definition) {
182-
existing.innerHTML = definition;
176+
const definition = styleDefinition(space);
177+
if (typeof document !== "undefined") {
178+
if (document) {
179+
const existing = document.getElementById(`style_${space.id}`);
180+
181+
if (existing) {
182+
if (existing.innerHTML !== definition) {
183+
existing.innerHTML = definition;
184+
}
185+
} else {
186+
const newStyle = document.createElement("style");
187+
newStyle.id = `style_${space.id}`;
188+
newStyle.innerHTML = definition;
189+
document.head.appendChild(newStyle);
183190
}
184-
} else {
185-
const newStyle = document.createElement("style");
186-
newStyle.id = `style_${space.id}`;
187-
newStyle.innerHTML = definition;
188-
document.head.appendChild(newStyle);
189191
}
192+
} else {
193+
space.ssrStyle = definition;
190194
}
191195
}
192196

0 commit comments

Comments
 (0)