'use client' import { createContext } from 'react' import type { Params } from '../../server/request/params' import { ReadonlyURLSearchParams } from '../../client/components/readonly-url-search-params' export const SearchParamsContext = createContext(null) export const PathnameContext = createContext(null) export const PathParamsContext = createContext(null) // Dev-only context for Suspense DevTools instrumentation // These promises are used to track navigation hook usage in React DevTools export type InstrumentedPromise = Promise & { status: 'fulfilled' value: T displayName: string } export type NavigationPromises = { pathname: InstrumentedPromise searchParams: InstrumentedPromise params: InstrumentedPromise // Layout segment hooks (updated at each layout boundary) selectedLayoutSegmentPromises?: Map< string, InstrumentedPromise > selectedLayoutSegmentsPromises?: Map> } export const NavigationPromisesContext = createContext(null) // Creates an instrumented promise for Suspense DevTools // These promises are always fulfilled and exist purely for // tracking in React's Suspense DevTools. export function createDevToolsInstrumentedPromise( displayName: string, value: T ): InstrumentedPromise { const promise = Promise.resolve(value) as InstrumentedPromise promise.status = 'fulfilled' promise.value = value promise.displayName = `${displayName} (SSR)` return promise } export { ReadonlyURLSearchParams } if (process.env.NODE_ENV !== 'production') { SearchParamsContext.displayName = 'SearchParamsContext' PathnameContext.displayName = 'PathnameContext' PathParamsContext.displayName = 'PathParamsContext' NavigationPromisesContext.displayName = 'NavigationPromisesContext' }