import * as React from "react"; type ComponentPromise> = Promise<{ default: T; }>; /** * Lazy load a component with automatic retry on failure. * * @param component A function that returns a promise of a component. * @param retries The number of retries, defaults to 3. * @param interval The interval between retries in milliseconds, defaults to 1000. * @returns A lazy component. */ export default function lazyWithRetry>( component: () => ComponentPromise, retries?: number, interval?: number ): React.LazyExoticComponent { return React.lazy(() => retry(component, retries, interval)); } function retry>( fn: () => ComponentPromise, retriesLeft = 3, interval = 1000 ): ComponentPromise { return new Promise((resolve, reject) => { fn() .then(resolve) .catch((error) => { setTimeout(() => { if (retriesLeft === 1) { reject(error); return; } retry(fn, retriesLeft - 1, interval).then(resolve, reject); }, interval); }); }); }