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 ;
};
}