import { useMatch } from './useMatch' import type { StructuralSharingOption, ValidateSelected, } from './structuralSharing' import type { AnyRouter, RegisteredRouter, ResolveUseParams, StrictOrFrom, ThrowConstraint, ThrowOrOptional, UseParamsResult, } from '@tanstack/router-core' export interface UseParamsBaseOptions< TRouter extends AnyRouter, TFrom, TStrict extends boolean, TThrow extends boolean, TSelected, TStructuralSharing, > { select?: ( params: ResolveUseParams, ) => ValidateSelected shouldThrow?: TThrow } export type UseParamsOptions< TRouter extends AnyRouter, TFrom extends string | undefined, TStrict extends boolean, TThrow extends boolean, TSelected, TStructuralSharing, > = StrictOrFrom & UseParamsBaseOptions< TRouter, TFrom, TStrict, TThrow, TSelected, TStructuralSharing > & StructuralSharingOption export type UseParamsRoute = < TRouter extends AnyRouter = RegisteredRouter, TSelected = unknown, TStructuralSharing extends boolean = boolean, >( opts?: UseParamsBaseOptions< TRouter, TFrom, /* TStrict */ true, /* TThrow */ true, TSelected, TStructuralSharing > & StructuralSharingOption, ) => UseParamsResult /** * Access the current route's path parameters with type-safety. * * Options: * - `from`/`strict`: Specify the matched route and whether to enforce strict typing * - `select`: Project the params object to a derived value for memoized renders * - `structuralSharing`: Enable structural sharing for stable references * - `shouldThrow`: Throw if the route is not found in strict contexts * * @returns The params object (or selected value) for the matched route. * @link https://tanstack.com/router/latest/docs/framework/react/api/router/useParamsHook */ export function useParams< TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string | undefined = undefined, TStrict extends boolean = true, TThrow extends boolean = true, TSelected = unknown, TStructuralSharing extends boolean = boolean, >( opts: UseParamsOptions< TRouter, TFrom, TStrict, ThrowConstraint, TSelected, TStructuralSharing >, ): ThrowOrOptional< UseParamsResult, TThrow > { return useMatch({ from: opts.from!, shouldThrow: opts.shouldThrow, structuralSharing: opts.structuralSharing, strict: opts.strict, select: (match) => { const params = opts.strict === false ? match.params : match._strictParams return opts.select ? opts.select(params) : params }, }) as any }