Make sure DOM is ready for Portal

environments/review-hoverable-cuf604/deployments/2584
Chewbacca 2023-02-10 13:49:59 -05:00
rodzic 21a525ba8d
commit 04e5e06d26
2 zmienionych plików z 39 dodań i 19 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
import React from 'react';
import React, { useLayoutEffect, useRef } from 'react';
import ReactDOM from 'react-dom';
interface IPortal {
@ -8,9 +8,27 @@ interface IPortal {
/**
* Portal
*/
const Portal: React.FC<IPortal> = ({ children }) => ReactDOM.createPortal(
children,
document.querySelector('#soapbox') as HTMLDivElement,
);
const Portal: React.FC<IPortal> = ({ children }) => {
const isRendered = useRef<boolean>(false);
useLayoutEffect(() => {
if (isRendered.current) {
return;
}
isRendered.current = true;
}, [isRendered.current]);
if (!isRendered.current) {
return null;
}
return (
ReactDOM.createPortal(
children,
document.getElementById('soapbox') as HTMLDivElement,
)
);
};
export default Portal;

Wyświetl plik

@ -51,21 +51,23 @@ const TestApp: FC<any> = ({ children, storeProps, routerProps = {} }) => {
};
return (
<Provider store={props.store}>
<MemoryRouter {...routerProps}>
<StatProvider>
<QueryClientProvider client={queryClient}>
<ChatProvider>
<IntlProvider locale={props.locale}>
{children}
<div id='soapbox'>
<Provider store={props.store}>
<MemoryRouter {...routerProps}>
<StatProvider>
<QueryClientProvider client={queryClient}>
<ChatProvider>
<IntlProvider locale={props.locale}>
{children}
<Toaster />
</IntlProvider>
</ChatProvider>
</QueryClientProvider>
</StatProvider>
</MemoryRouter>
</Provider>
<Toaster />
</IntlProvider>
</ChatProvider>
</QueryClientProvider>
</StatProvider>
</MemoryRouter>
</Provider>
</div>
);
};