| 45 | > = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected |
| 46 | |
| 47 | export function useRouterState< |
| 48 | TRouter extends AnyRouter = RegisteredRouter, |
| 49 | TSelected = unknown, |
| 50 | >( |
| 51 | opts?: UseRouterStateOptions<TRouter, TSelected>, |
| 52 | ): Accessor<UseRouterStateResult<TRouter, TSelected>> { |
| 53 | const contextRouter = useRouter<TRouter>({ |
| 54 | warn: opts?.router === undefined, |
| 55 | }) |
| 56 | const router = opts?.router || contextRouter |
| 57 | |
| 58 | // During SSR we render exactly once and do not need reactivity. |
| 59 | // Avoid subscribing to the store on the server since the server store |
| 60 | // implementation does not provide subscribe() semantics. |
| 61 | const _isServer = isServer ?? router.isServer |
| 62 | if (_isServer) { |
| 63 | const state = router.state as RouterState<TRouter['routeTree']> |
| 64 | const selected = ( |
| 65 | opts?.select ? opts.select(state) : state |
| 66 | ) as UseRouterStateResult<TRouter, TSelected> |
| 67 | return (() => selected) as Accessor< |
| 68 | UseRouterStateResult<TRouter, TSelected> |
| 69 | > |
| 70 | } |
| 71 | |
| 72 | return useStore( |
| 73 | router.__store, |
| 74 | (state) => { |
| 75 | if (opts?.select) return opts.select(state) |
| 76 | |
| 77 | return state |
| 78 | }, |
| 79 | { |
| 80 | // Use deep equality to match behavior of solid-store 0.7.0 which used |
| 81 | // reconcile(). This ensures updates work correctly when selectors |
| 82 | // return new object references but with the same values. |
| 83 | equal: deepEqual, |
| 84 | }, |
| 85 | ) as Accessor<UseRouterStateResult<TRouter, TSelected>> |
| 86 | } |