diff --git a/frontend/components/Loading.tsx b/frontend/components/Loading.tsx new file mode 100644 index 000000000..aa3570888 --- /dev/null +++ b/frontend/components/Loading.tsx @@ -0,0 +1,9 @@ +import styled from 'styled-components'; + +const LoadingWrapper = styled.div` + background-color: #0000; +`; + +const Loading = () => ; + +export default Loading; diff --git a/frontend/pages/_app.tsx b/frontend/pages/_app.tsx index 7a6c2efe8..442d6e14c 100644 --- a/frontend/pages/_app.tsx +++ b/frontend/pages/_app.tsx @@ -2,7 +2,7 @@ import '../styles/globals.scss'; import { ConfigProvider } from 'antd'; import type { AppProps } from 'next/app'; -import { useEffect, useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Layout } from '@/components/Layout'; import { BalanceProvider } from '@/context/BalanceProvider'; @@ -18,17 +18,42 @@ import { StakingContractInfoProvider } from '@/context/StakingContractInfoProvid import { StoreProvider } from '@/context/StoreProvider'; import { WalletProvider } from '@/context/WalletProvider'; import { mainTheme } from '@/theme'; +import Loading from '@/components/Loading'; export default function App({ Component, pageProps }: AppProps) { const isMounted = useRef(false); + const [isLoaded, setIsLoaded] = useState(false); + const [loadingTimeReached, setLoadingTimeReached] = useState(false); useEffect(() => { isMounted.current = true; + + const handleLoad = () => { + setIsLoaded(true); + }; + const checkStylesLoaded = () => { + const styles = document.querySelectorAll('link[rel="stylesheet"]'); + if (styles.length > 0) { + handleLoad(); + } + }; + + const timer = setTimeout(() => { + setLoadingTimeReached(true); + }, 1000); + + checkStylesLoaded(); + window.addEventListener('load', checkStylesLoaded); return () => { isMounted.current = false; + clearTimeout(timer); + window.removeEventListener('load', checkStylesLoaded); }; }, []); + if (!loadingTimeReached || !isLoaded) { + return ; + } return ( diff --git a/frontend/pages/_document.tsx b/frontend/pages/_document.tsx new file mode 100644 index 000000000..2d1d90e53 --- /dev/null +++ b/frontend/pages/_document.tsx @@ -0,0 +1,47 @@ +// _document.tsx +import Document, { Html, Head, Main, NextScript, DocumentContext, DocumentInitialProps } from 'next/document'; +import { ServerStyleSheet } from 'styled-components'; + +class MyDocument extends Document { + static async getInitialProps(ctx: DocumentContext): Promise { + const sheet = new ServerStyleSheet(); + const originalRenderPage = ctx.renderPage; + + try { + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: (App) => (props) => sheet.collectStyles(), + }); + + const initialProps = await Document.getInitialProps(ctx); + return { + ...initialProps, + styles: ( + <> + {initialProps.styles} + {sheet.getStyleElement()} + + ), + }; + } finally { + sheet.seal(); + } + } + + render() { + return ( + + + + + + +
+ + + + ); + } +} + +export default MyDocument;