import React, { useState, useEffect } from 'react'; import Center from '@arcblock/ux/lib/Center'; import { CircularProgress } from '@mui/material'; type ComponentType

= React.ComponentType

; type LoaderFunction = () => Promise<{ default: T } | T>; interface LazyComponentOptions { LoadingComponent?: React.ComponentType; ErrorComponent?: React.ComponentType<{ error: Error }>; } export function createLazyComponent>( loader: LoaderFunction, options: LazyComponentOptions = {} ) { let loadPromise: Promise | null = null; const { LoadingComponent = () => (

), ErrorComponent = ({ error }) =>
Error: {error.message}
, } = options; const loadComponent = async () => { if (loadPromise) return loadPromise; try { loadPromise = loader().then((result) => ('default' in result ? result.default : result)); return await loadPromise; } catch (error) { loadPromise = null; throw error; } }; return function WrappedComponent(props: P) { const [Component, setComponent] = useState(null); const [error, setError] = useState(null); useEffect(() => { loadComponent() .then((comp) => { setComponent(() => comp); }) .catch((err) => { setError(err); console.error('Failed to load component:', err); }); }, []); if (error) { return ; } if (!Component) { return ; } return ; }; }