import { useEffect, useState } from "react"; import { ComponentRoute, LazyComponentRoute, useRouterContext } from "./Router"; interface RouteComponentProps { spinner?: React.ReactNode; } export function RouteComponent({ spinner }: RouteComponentProps) { const ctx = useRouterContext(); const route = ctx.route; if ((route as ComponentRoute).Component) { const Component = (route as ComponentRoute).Component; return } else if ((route as LazyComponentRoute).LazyComponent) { return } else { throw new Error(`Invalid route for ${route.path}. Either Component or LazyCOmponent must be specified.`); } } interface LazyRouteComponentProps { route: LazyComponentRoute; spinner?: React.ReactNode; } function LazyRouteComponent({ route, spinner }: LazyRouteComponentProps) { const [Component, setComponent] = useState | null>(null); useEffect(() => { route.LazyComponent().then(module => { if (!module.default) { throw new Error(`Lazy module for ${route.path} does not have a default export`); } // we need to wrap the component type in an arrow function // otherwise the setState function will execute the function as a state update function setComponent(() => module.default); }); }, [route]); return Component ? ( ) : spinner || null; }