@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
44 lines • 1.8 kB
JSX
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