import { type ComponentType } from 'react'; type PreloadableComponent = ComponentType & { preload: () => Promise; }; export const lazyWithPreload = ( loader: () => Promise<{ default: ComponentType }>, ): PreloadableComponent => { let LoadedComponent: ComponentType | null = null; let loadingPromise: Promise | null = null; const preload = () => { loadingPromise ??= loader().then((loadedModule) => { LoadedComponent = loadedModule.default; }); return loadingPromise; }; const PreloadableComponent = () => { const Component = LoadedComponent; if (Component === null) { throw preload(); } return ; }; return Object.assign(PreloadableComponent, { preload }); };