Skip to content

Commit 7f6c3dd

Browse files
fix: guard client API against SSR until CustConfComp optimizations are merged (DevExpress#28730)
1 parent 98540a1 commit 7f6c3dd

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

packages/devextreme-react/src/core/component-base.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,12 @@ const ComponentBase = forwardRef<ComponentBaseRef, any>(
9595

9696
const prevPropsRef = useRef<P & ComponentBaseProps>();
9797

98-
const templateContainer = useMemo(() => document.createElement('div'), []);
98+
const templateContainer = useMemo(
99+
() => (typeof document !== 'undefined'
100+
? document.createElement('div')
101+
: undefined),
102+
[],
103+
);
99104

100105
const [widgetConfig, context] = useOptionScanning(
101106
{
@@ -422,8 +427,8 @@ const ComponentBase = forwardRef<ComponentBaseRef, any>(
422427
return (
423428
<RestoreTreeContext.Provider value={restoreTree}>
424429
<TemplateDiscoveryContext.Provider value={{ discoveryRendering: false }}>
425-
{
426-
createPortal(
430+
{ templateContainer
431+
&& createPortal(
427432
<TemplateDiscoveryContext.Provider value={{ discoveryRendering: true }}>
428433
{_renderChildren()}
429434
</TemplateDiscoveryContext.Provider>,

packages/devextreme-react/src/core/nested-option.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const NestedOption = function NestedOption<P>(
3030
const { children } = props;
3131
const { elementDescriptor, ...restProps } = props;
3232

33-
if (!elementDescriptor) {
33+
if (!elementDescriptor || typeof document === 'undefined') {
3434
return null;
3535
}
3636

packages/devextreme-react/src/core/use-option-scanning.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { NestedOptionContext, NestedOptionContextContent } from './contexts';
1717
export function useOptionScanning(
1818
optionElement: IOptionElement,
1919
children: ReactNode,
20-
templateContainer: HTMLDivElement,
20+
templateContainer: HTMLDivElement | undefined,
2121
parentUpdateToken: symbol,
2222
): [
2323
IConfigNode,
@@ -75,7 +75,12 @@ export function useOptionScanning(
7575
};
7676

7777
useLayoutEffect(() => {
78+
if (!templateContainer) {
79+
return;
80+
}
81+
7882
const hasTemplateRendered = templateContainer.childNodes.length > 0;
83+
7984
configBuilder.updateAnonymousTemplates(hasTemplateRendered);
8085
}, [parentUpdateToken]);
8186

0 commit comments

Comments
 (0)