import React, { lazy, Suspense, useMemo, useState, useEffect, } from 'react'; import cloneDeep from 'lodash/cloneDeep'; import Skeleton from '@material-ui/lab/Skeleton'; import Loading from '@Components/Base/Loading'; import { Props, ComponentState } from './types'; const Components: { [key: string]: ComponentState } = {}; const Lazy: React.FC = (props): React.ReactElement => { const { componentImport, componentChunkName, componentProps } = props; const [isRender, setIsRender] = useState(false); const RenderComponent = useMemo(() => { const Component = Components[componentChunkName]; if (Component) { return ; } return (
); }, [componentChunkName, isRender, componentProps]); /* Hooks */ useEffect(() => { (async () => { if (!Components[componentChunkName]) { Components[componentChunkName] = lazy(async () => { const Element = await componentImport; return Element; }); } setIsRender(cloneDeep(!isRender)); })(); }, [componentChunkName]); return ( }> {RenderComponent} ); }; export default Lazy;