import { useMatch } from './useMatch' import type { StructuralSharingOption, ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter, ResolveUseLoaderData, StrictOrFrom, UseLoaderDataResult, } from '@tanstack/router-core' export interface UseLoaderDataBaseOptions< TRouter extends AnyRouter, TFrom, TStrict extends boolean, TSelected, TStructuralSharing, > { select?: ( match: ResolveUseLoaderData, ) => ValidateSelected } export type UseLoaderDataOptions< TRouter extends AnyRouter, TFrom extends string | undefined, TStrict extends boolean, TSelected, TStructuralSharing, > = StrictOrFrom & UseLoaderDataBaseOptions< TRouter, TFrom, TStrict, TSelected, TStructuralSharing > & StructuralSharingOption export type UseLoaderDataRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, TStructuralSharing extends boolean = boolean, >( opts?: UseLoaderDataBaseOptions< TRouter, TId, true, TSelected, TStructuralSharing > & StructuralSharingOption, ) => UseLoaderDataResult /** * Read and select the current route's loader data with type‑safety. * * Options: * - `from`/`strict`: Choose which route's data to read and strictness * - `select`: Map the loader data to a derived value * - `structuralSharing`: Enable structural sharing for stable references * * @returns The loader data (or selected value) for the matched route. * @link https://tanstack.com/router/latest/docs/framework/react/api/router/useLoaderDataHook */ export function useLoaderData< TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TStrict extends boolean = true, TSelected = unknown, TStructuralSharing extends boolean = boolean, >( opts: UseLoaderDataOptions< TRouter, TFrom, TStrict, TSelected, TStructuralSharing >, ): UseLoaderDataResult { return useMatch({ from: opts.from!, strict: opts.strict, structuralSharing: opts.structuralSharing, select: (s: any) => { return opts.select ? opts.select(s.loaderData) : s.loaderData }, } as any) as UseLoaderDataResult }