File size: 1,941 Bytes
b91e262
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
'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<URLSearchParams | null>(null)
export const PathnameContext = createContext<string | null>(null)
export const PathParamsContext = createContext<Params | null>(null)

// Dev-only context for Suspense DevTools instrumentation
// These promises are used to track navigation hook usage in React DevTools
export type InstrumentedPromise<T> = Promise<T> & {
  status: 'fulfilled'
  value: T
  displayName: string
}

export type NavigationPromises = {
  pathname: InstrumentedPromise<string>
  searchParams: InstrumentedPromise<ReadonlyURLSearchParams>
  params: InstrumentedPromise<Params>
  // Layout segment hooks (updated at each layout boundary)
  selectedLayoutSegmentPromises?: Map<
    string,
    InstrumentedPromise<string | null>
  >
  selectedLayoutSegmentsPromises?: Map<string, InstrumentedPromise<string[]>>
}

export const NavigationPromisesContext =
  createContext<NavigationPromises | null>(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<T>(
  displayName: string,
  value: T
): InstrumentedPromise<T> {
  const promise = Promise.resolve(value) as InstrumentedPromise<T>
  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'
}