From ddde77fe55edd16ec211af075e12425d296fa819 Mon Sep 17 00:00:00 2001 From: Gavrila Andrei Date: Mon, 11 Dec 2023 11:46:49 +0200 Subject: [PATCH] Fix document issues --- src/UI/DappModal/components/DappModal.tsx | 84 ++++++++++++------- .../TransactionsToastList.tsx | 30 +++++-- src/hocs/useStyles.ts | 19 +++-- src/utils/isSSR.ts | 3 + 4 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 src/utils/isSSR.ts diff --git a/src/UI/DappModal/components/DappModal.tsx b/src/UI/DappModal/components/DappModal.tsx index 41e2d570d..2fa02a407 100644 --- a/src/UI/DappModal/components/DappModal.tsx +++ b/src/UI/DappModal/components/DappModal.tsx @@ -1,6 +1,8 @@ import React, { ReactNode } from 'react'; +import { useState } from 'react'; +import { useEffect } from 'react'; import classNames from 'classnames'; -import ReactDOM from 'react-dom'; +import { createPortal } from 'react-dom'; import { DataTestIdsEnum } from 'constants/index'; import { withStyles, WithStylesImportType } from 'hocs/withStyles'; import { WithClassnameType } from '../../types'; @@ -36,6 +38,12 @@ const DappModalComponent = ({ visible, styles }: DappModalPropsType & WithStylesImportType) => { + const [isBrowser, setIsBrowser] = useState(false); + + useEffect(() => { + setIsBrowser(true); + }, []); + if (!visible) { return null; } @@ -56,38 +64,52 @@ const DappModalComponent = ({ customModalFooter } = config; - return ReactDOM.createPortal( - , + parentElement ?? document?.body + )} + ); }; diff --git a/src/UI/TransactionsToastList/TransactionsToastList.tsx b/src/UI/TransactionsToastList/TransactionsToastList.tsx index ad9aeb7fc..b1df50b4e 100644 --- a/src/UI/TransactionsToastList/TransactionsToastList.tsx +++ b/src/UI/TransactionsToastList/TransactionsToastList.tsx @@ -1,4 +1,10 @@ -import React, { useCallback, useEffect, useMemo, useRef } from 'react'; +import React, { + useCallback, + useEffect, + useMemo, + useRef, + useState +} from 'react'; import classNames from 'classnames'; import { createPortal } from 'react-dom'; import { withStyles, WithStylesImportType } from 'hocs/withStyles'; @@ -53,6 +59,7 @@ export const TransactionsToastListComponent = ({ children, styles }: TransactionsToastListPropsType & WithStylesImportType) => { + const [isBrowser, setIsBrowser] = useState(false); const customToasts = useSelector(customToastsSelector); const transactionsToasts = useSelector(transactionToastsSelector); const dispatch = useDispatch(); @@ -174,6 +181,8 @@ export const TransactionsToastListComponent = ({ }; useEffect(() => { + setIsBrowser(true); + window?.addEventListener( 'beforeunload', clearNotPendingTransactionsFromStorage @@ -187,13 +196,18 @@ export const TransactionsToastListComponent = ({ }; }, []); - return createPortal( -
- {customToastsList} - {MemoizedTransactionsToastsList} - {children} -
, - parentElement || document?.body + return ( + <> + {isBrowser && + createPortal( +
+ {customToastsList} + {MemoizedTransactionsToastsList} + {children} +
, + parentElement || document?.body + )} + ); }; diff --git a/src/hocs/useStyles.ts b/src/hocs/useStyles.ts index 30af2e553..efac3148a 100644 --- a/src/hocs/useStyles.ts +++ b/src/hocs/useStyles.ts @@ -1,6 +1,5 @@ import React, { useEffect } from 'react'; -import { useSelector } from '../reduxStore/DappProviderContext'; -import { dappConfigSelector } from '../reduxStore/selectors'; +import { isSSR } from 'utils/isSSR'; type StylesType = typeof import('*.scss'); @@ -9,8 +8,12 @@ export type WithStylesImportType = { styles?: Record; }; -const defaultGlobalImport = async () => await import('assets/sass/main.scss'); +const defaultServerGlobalImport = async () => + await import('assets/sass/main.scss'); +const defaultClientGlobalImport = () => + require('assets/sass/main.scss').default; +const ssr = isSSR(); export function useStyles({ ssrGlobalImportCallback, ssrImportCallback, @@ -20,19 +23,17 @@ export function useStyles({ ssrImportCallback?: () => Promise; clientImportCallback?: () => StylesType; }) { - const dappConfig = useSelector(dappConfigSelector); - const [globalStyles, setGlobalStyles] = React.useState>( - dappConfig?.isSSR ? undefined : require('assets/sass/main.scss').default + ssr ? undefined : defaultClientGlobalImport() ); const [styles, setStyles] = React.useState | undefined>( - dappConfig?.isSSR ? undefined : clientImportCallback?.() + ssr ? undefined : clientImportCallback?.() ); const importStyles = async () => { (ssrGlobalImportCallback ? ssrGlobalImportCallback() - : defaultGlobalImport() + : defaultServerGlobalImport() ).then((styles: StylesType) => setGlobalStyles(styles.default)); ssrImportCallback?.().then((styles: StylesType) => @@ -41,7 +42,7 @@ export function useStyles({ }; useEffect(() => { - if (dappConfig?.isSSR) { + if (ssr) { importStyles(); } }, []); diff --git a/src/utils/isSSR.ts b/src/utils/isSSR.ts new file mode 100644 index 000000000..c18902f18 --- /dev/null +++ b/src/utils/isSSR.ts @@ -0,0 +1,3 @@ +import { isWindowAvailable } from './isWindowAvailable'; + +export const isSSR = () => !isWindowAvailable();