import { NProgress } from '@tanem/react-nprogress'; import { useRouter } from 'next/router'; import React, { useEffect, useState } from 'react'; import ReactDOM from 'react-dom'; interface BarProps { progress: number; isFinished: boolean; } const Bar = ({ progress, isFinished }: BarProps) => { return (
); }; const NProgressBar = ({ loading }: { loading: boolean }) => ( {({ isFinished, progress }) => ( )} ); const MemoizedNProgress = React.memo(NProgressBar); const LoadingBar = (): React.ReactPortal | null => { const [mounted, setMounted] = useState(false); const [loading, setLoading] = useState(false); const router = useRouter(); useEffect(() => { setMounted(true); }, []); useEffect(() => { const handleLoading = () => { setLoading(true); }; const handleFinishedLoading = () => { setLoading(false); }; router.events.on('routeChangeStart', handleLoading); router.events.on('routeChangeComplete', handleFinishedLoading); router.events.on('routeChangeError', handleFinishedLoading); return () => { router.events.off('routeChangeStart', handleLoading); router.events.off('routeChangeComplete', handleFinishedLoading); router.events.off('routeChangeError', handleFinishedLoading); }; }, [router]); return mounted ? ReactDOM.createPortal( , document.body ) : null; }; export default LoadingBar;