import type { UrlPatternOptions } from "@stackflow/plugin-history-sync"; import { makeTemplate, useRoutes } from "@stackflow/plugin-history-sync"; import type { ActivityComponentType } from "@stackflow/react"; import { useMemo } from "react"; import { useLoaders } from "./LoadersContext"; export type PreloadFunc = < K extends Extract, >( activityName: K, activityParams: T[K] extends ActivityComponentType ? U : {}, options?: { activityContext?: {}; }, ) => any; export type UsePreloaderOptions = { urlPatternOptions?: UrlPatternOptions; }; export function usePreloader( usePreloaderOptions?: UsePreloaderOptions, ): { preload: PreloadFunc; } { const loaders = useLoaders(); const routes = useRoutes(); return useMemo( () => ({ preload(activityName, activityParams, options) { const loader = loaders[activityName]; if (!loader) { return null; } const match = routes.find((r) => r.activityName === activityName); const template = match ? makeTemplate(match, usePreloaderOptions?.urlPatternOptions) : undefined; const path = template?.fill(activityParams); return loader({ activityParams, activityContext: { ...(path ? { path } : null), ...options?.activityContext, }, }); }, }), [loaders], ); }