Skip to content

Commit 22d4390

Browse files
fix: review
1 parent c26b211 commit 22d4390

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

src/components/Fullscreen/Fullscreen.tsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {cn} from '../../utils/cn';
77
import {useTypedDispatch, useTypedSelector} from '../../utils/hooks';
88
import {Portal} from '../Portal/Portal';
99

10+
import {useFullscreenContext} from './FullscreenContext';
11+
1012
import disableFullscreenIcon from '../../assets/icons/disableFullscreen.svg';
1113

1214
import './Fullscreen.scss';
@@ -21,11 +23,7 @@ interface FullscreenProps {
2123
export function Fullscreen({children, className}: FullscreenProps) {
2224
const isFullscreen = useTypedSelector((state) => state.fullscreen);
2325
const dispatch = useTypedDispatch();
24-
25-
const fullscreenRoot = React.useMemo(
26-
() => document.getElementById('fullscreen-root') ?? undefined,
27-
[],
28-
);
26+
const fullscreenRootRef = useFullscreenContext();
2927

3028
const onDisableFullScreen = React.useCallback(() => {
3129
dispatch(disableFullscreen());
@@ -47,25 +45,25 @@ export function Fullscreen({children, className}: FullscreenProps) {
4745
const [container, setContainer] = React.useState<HTMLDivElement | null>(null);
4846
React.useEffect(() => {
4947
const div = document.createElement('div');
50-
fullscreenRoot?.appendChild(div);
48+
fullscreenRootRef.current?.appendChild(div);
5149
div.style.display = 'contents';
5250
setContainer(div);
5351
return () => {
5452
setContainer(null);
5553
div.remove();
5654
};
57-
}, [fullscreenRoot]);
55+
}, [fullscreenRootRef]);
5856

5957
const ref = React.useRef<HTMLDivElement>(null);
6058
React.useLayoutEffect(() => {
6159
if (container) {
6260
if (isFullscreen) {
63-
fullscreenRoot?.appendChild(container);
61+
fullscreenRootRef.current?.appendChild(container);
6462
} else {
6563
ref.current?.appendChild(container);
6664
}
6765
}
68-
}, [container, fullscreenRoot, isFullscreen]);
66+
}, [container, fullscreenRootRef, isFullscreen]);
6967

7068
if (!container) {
7169
return null;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import React from 'react';
2+
3+
const FullscreenContext = React.createContext<React.RefObject<HTMLDivElement> | null>(null);
4+
5+
export function useFullscreenContext() {
6+
const context = React.useContext(FullscreenContext);
7+
if (!context) {
8+
throw new Error('useFullscreenContext must be used within a FullscreenProvider');
9+
}
10+
return context;
11+
}
12+
13+
export function FullscreenProvider({
14+
children,
15+
fullscreenRootRef,
16+
}: {
17+
children: React.ReactNode;
18+
fullscreenRootRef: React.RefObject<HTMLDivElement>;
19+
}) {
20+
return (
21+
<FullscreenContext.Provider value={fullscreenRootRef}>
22+
{children}
23+
</FullscreenContext.Provider>
24+
);
25+
}

src/containers/App/App.tsx

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {History} from 'history';
55
import {Helmet} from 'react-helmet-async';
66

77
import {componentsRegistry} from '../../components/ComponentsProvider/componentsRegistry';
8+
import {FullscreenProvider} from '../../components/Fullscreen/FullscreenContext';
89
import {useTypedSelector} from '../../utils/hooks';
910
import ReduxTooltip from '../ReduxTooltip/ReduxTooltip';
1011
import type {YDBEmbeddedUISettings} from '../UserSettings/settings';
@@ -47,19 +48,22 @@ function AppContent({
4748
}) {
4849
const {appTitle} = useAppTitle();
4950
const singleClusterMode = useTypedSelector((state) => state.singleClusterMode);
51+
const fullscreenRootRef = React.useRef<HTMLDivElement>(null);
5052

5153
return (
5254
<React.Fragment>
5355
<Helmet defaultTitle={appTitle} titleTemplate={`%s — ${appTitle}`} />
54-
<ContentWrapper>
55-
<NavigationWrapper
56-
singleClusterMode={singleClusterMode}
57-
userSettings={userSettings}
58-
>
59-
<Content singleClusterMode={singleClusterMode}>{children}</Content>
60-
<div id="fullscreen-root"></div>
61-
</NavigationWrapper>
62-
</ContentWrapper>
56+
<FullscreenProvider fullscreenRootRef={fullscreenRootRef}>
57+
<ContentWrapper>
58+
<NavigationWrapper
59+
singleClusterMode={singleClusterMode}
60+
userSettings={userSettings}
61+
>
62+
<Content singleClusterMode={singleClusterMode}>{children}</Content>
63+
<div ref={fullscreenRootRef}></div>
64+
</NavigationWrapper>
65+
</ContentWrapper>
66+
</FullscreenProvider>
6367
</React.Fragment>
6468
);
6569
}

0 commit comments

Comments
 (0)