| | 'use client' |
| |
|
| | import { InvariantError } from '../../shared/lib/invariant-error' |
| |
|
| | import type { Params } from '../../server/request/params' |
| | import { LayoutRouterContext } from '../../shared/lib/app-router-context.shared-runtime' |
| | import { use } from 'react' |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function ClientSegmentRoot({ |
| | Component, |
| | slots, |
| | serverProvidedParams, |
| | }: { |
| | Component: React.ComponentType<any> |
| | slots: { [key: string]: React.ReactNode } |
| | serverProvidedParams: null | { |
| | params: Params |
| | promises: Array<Promise<any>> | null |
| | } |
| | }) { |
| | let params: Params |
| | if (serverProvidedParams !== null) { |
| | params = serverProvidedParams.params |
| | } else { |
| | |
| | |
| | const layoutRouterContext = use(LayoutRouterContext) |
| | params = |
| | layoutRouterContext !== null ? layoutRouterContext.parentParams : {} |
| | } |
| |
|
| | if (typeof window === 'undefined') { |
| | const { workAsyncStorage } = |
| | require('../../server/app-render/work-async-storage.external') as typeof import('../../server/app-render/work-async-storage.external') |
| |
|
| | let clientParams: Promise<Params> |
| | |
| | |
| | const store = workAsyncStorage.getStore() |
| | if (!store) { |
| | throw new InvariantError( |
| | 'Expected workStore to exist when handling params in a client segment such as a Layout or Template.' |
| | ) |
| | } |
| |
|
| | const { createParamsFromClient } = |
| | require('../../server/request/params') as typeof import('../../server/request/params') |
| | clientParams = createParamsFromClient(params, store) |
| |
|
| | return <Component {...slots} params={clientParams} /> |
| | } else { |
| | const { createRenderParamsFromClient } = |
| | require('../request/params.browser') as typeof import('../request/params.browser') |
| | const clientParams = createRenderParamsFromClient(params) |
| | return <Component {...slots} params={clientParams} /> |
| | } |
| | } |
| |
|