UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

44 lines 1.8 kB
import * as Solid from 'solid-js'; import { invariant, replaceEqualDeep } from '@tanstack/router-core'; import { nearestMatchContext } from './matchContext'; import { useRouter } from './useRouter'; export function useMatch(opts) { const router = useRouter(); const nearestMatch = opts.from ? undefined : Solid.useContext(nearestMatchContext); const match = () => { if (opts.from) { const ids = router.stores.matchesId.state; for (const id of ids) { const matchStore = router.stores.activeMatchStoresById.get(id); if (matchStore?.routeId === opts.from) { return matchStore.state; } } return undefined; } return nearestMatch?.match(); }; return Solid.createMemo((prev) => { const selectedMatch = match(); if (selectedMatch === undefined) { const hasPendingMatch = opts.from ? Boolean(router.stores.pendingRouteIds.state[opts.from]) : (nearestMatch?.hasPending() ?? false); const isTransitioning = router.stores.isTransitioning.state; if (!hasPendingMatch && !isTransitioning && (opts.shouldThrow ?? true)) { if (process.env.NODE_ENV !== 'production') { throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`); } invariant(); } return undefined; } const res = opts.select ? opts.select(selectedMatch) : selectedMatch; if (prev === undefined) return res; return replaceEqualDeep(prev, res); }); } //# sourceMappingURL=useMatch.jsx.map