UNPKG

@tanstack/solid-router

Version:

Modern and scalable routing for Solid applications

108 lines (107 loc) 3.69 kB
import { CatchBoundary, ErrorComponent } from "./CatchBoundary.js"; import { useRouter } from "./useRouter.js"; import { nearestMatchContext } from "./matchContext.js"; import { Rendered, Transitioner } from "./Transitioner.js"; import { SafeFragment } from "./SafeFragment.js"; import { Match } from "./Match.js"; import { replaceEqualDeep } from "@tanstack/router-core"; import { createComponent, memo } from "@solidjs/web"; import * as Solid from "solid-js"; //#region src/Matches.tsx var NearestMatchContext = nearestMatchContext; function Matches() { return createComponent(useRouter().options.InnerWrap || SafeFragment, { get children() { return [ createComponent(Transitioner, {}), createComponent(MatchesInner, {}), createComponent(Rendered, {}) ]; } }); } function MatchesInner() { const router = useRouter(); const routeId = () => router.stores.ids.get()[0]; const match = () => routeId() ? router.stores.byRoute.get(routeId())?.get() : void 0; const nearestMatch = [routeId, match]; const matchContent = () => createComponent(Solid.Show, { get when() { return routeId(); }, keyed: true, children: (currentRouteId) => createComponent(Match, { routeId: currentRouteId }) }); if (router.options.disableGlobalCatchBoundary) return createComponent(NearestMatchContext, { value: nearestMatch, get children() { return matchContent(); } }); return createComponent(NearestMatchContext, { value: nearestMatch, get children() { return createComponent(CatchBoundary, { getResetKey: () => router.stores.matches.get(), render: matchContent, errorComponent: ErrorComponent, get onCatch() { return process.env.NODE_ENV !== "production" ? (error) => { console.warn(`Warning: The following error wasn't caught by any route! At the very least, consider setting an 'errorComponent' in your RootRoute!`); console.warn(`Warning: ${error.message || error.toString()}`); } : void 0; } }); } }); } function useMatchRoute() { const router = useRouter(); return (opts) => { return Solid.createMemo(() => { const { pending, caseSensitive, fuzzy, includeSearch, ...rest } = opts; router.stores.location.get(); router.stores.resolvedLocation.get(); router.stores.status.get(); return router.matchRoute(rest, { pending, caseSensitive, fuzzy, includeSearch }); }); }; } function MatchRoute(props) { const params = useMatchRoute()(props); return memo(Solid.createMemo(() => { const matchedParams = params(); const child = props.children; if (typeof child === "function") return child(matchedParams); return matchedParams ? child : null; })); } function useMatches(opts) { const router = useRouter(); return Solid.createMemo((prev) => { const matches = router.stores.matches.get(); const res = opts?.select ? opts.select(matches) : matches; if (prev === void 0) return res; return replaceEqualDeep(prev, res); }); } function useParentMatches(opts) { const contextRouteId = Solid.useContext(nearestMatchContext)[0]; return useMatches({ select: (matches) => { matches = matches.slice(0, matches.findIndex((d) => d.routeId === contextRouteId())); return opts?.select ? opts.select(matches) : matches; } }); } function useChildMatches(opts) { const contextRouteId = Solid.useContext(nearestMatchContext)[0]; return useMatches({ select: (matches) => { matches = matches.slice(matches.findIndex((d) => d.routeId === contextRouteId()) + 1); return opts?.select ? opts.select(matches) : matches; } }); } //#endregion export { MatchRoute, Matches, useChildMatches, useMatchRoute, useMatches, useParentMatches }; //# sourceMappingURL=Matches.js.map