| 20 | > = unknown extends TSelected ? RouterState<TRouter['routeTree']> : TSelected |
| 21 | |
| 22 | export function useRouterState< |
| 23 | TRouter extends AnyRouter = RegisteredRouter, |
| 24 | TSelected = unknown, |
| 25 | >( |
| 26 | opts?: UseRouterStateOptions<TRouter, TSelected>, |
| 27 | ): Accessor<UseRouterStateResult<TRouter, TSelected>> { |
| 28 | const contextRouter = useRouter<TRouter>({ |
| 29 | warn: opts?.router === undefined, |
| 30 | }) |
| 31 | const router = opts?.router || contextRouter |
| 32 | |
| 33 | // During SSR we render exactly once and do not need reactivity. |
| 34 | // Avoid subscribing to the store on the server since the server store |
| 35 | // implementation does not provide subscribe() semantics. |
| 36 | const _isServer = isServer ?? router.isServer |
| 37 | if (_isServer) { |
| 38 | const state = router.stores.__store.get() as RouterState< |
| 39 | TRouter['routeTree'] |
| 40 | > |
| 41 | const selected = ( |
| 42 | opts?.select ? opts.select(state) : state |
| 43 | ) as UseRouterStateResult<TRouter, TSelected> |
| 44 | return (() => selected) as Accessor< |
| 45 | UseRouterStateResult<TRouter, TSelected> |
| 46 | > |
| 47 | } |
| 48 | |
| 49 | if (!opts?.select) { |
| 50 | return (() => router.stores.__store.get()) as Accessor< |
| 51 | UseRouterStateResult<TRouter, TSelected> |
| 52 | > |
| 53 | } |
| 54 | |
| 55 | const select = opts.select |
| 56 | |
| 57 | return Solid.createMemo((prev: TSelected | undefined) => { |
| 58 | const res = select(router.stores.__store.get()) |
| 59 | if (prev === undefined) return res |
| 60 | return replaceEqualDeep(prev, res) |
| 61 | }) as Accessor<UseRouterStateResult<TRouter, TSelected>> |
| 62 | } |