{"version":3,"file":"context.cjs","names":["RZL_NEXT_KIT_EXTRA"],"sources":["../../src/extra/context.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode, useMemo } from \"react\";\n\nimport deepmerge from \"deepmerge\";\nimport { isReactNode } from \"@rzl-zone/core-react/utils/react-node\";\nimport { createRequiredContext } from \"@rzl-zone/core-react/context\";\n\nimport { assertIsPlainObject } from \"@rzl-zone/utils-js/assertions\";\nimport { safeStableStringify } from \"@rzl-zone/utils-js/conversions\";\nimport {\n  getPreciseType,\n  isServer,\n  isString\n} from \"@rzl-zone/utils-js/predicates\";\n\nimport { RZL_NEXT_KIT_EXTRA } from \"./utils/constants\";\n\nconst { PROPS_MESSAGE } = RZL_NEXT_KIT_EXTRA.ERROR;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface PageContextProps<T = any> {\n  /** Defaults to `merge`. */\n  strategy?: PageContextStrategy;\n  data?: T;\n  children: ReactNode;\n}\n\nexport interface Context {\n  [key: string]: unknown;\n}\n\nexport type PageContextStrategy = \"deepmerge\" | \"merge\";\n\ndeclare global {\n  interface Window {\n    __next_c?: [PageContextStrategy, { data: Context }][];\n  }\n}\n\nconst PageContext = createRequiredContext<Context | undefined>(\"PageContext\");\n\n/** -------------------------------------------------------------------\n * * ***A component that provides context data to its children (can be use in server component).***\n * -------------------------------------------------------------------\n * * ***`⚠️ Warning: Currently is not support with turbopack flag mode !!!`***\n * -------------------------------------------------------------------\n * @param props - The properties for the PageContextProvider component.\n * @returns A JSX element that provides the context to its children.\n *\n * @example\n * ```tsx\n * import { PageContext } from \"@rzl-zone/next-kit/extra/context\";\n *\n * export default async function Layout({ children }: { children: ReactNode }) {\n *   // ...\n *\n *   return (\n *     <PageContext data={{ quote: \"Guillermo Launch is a handsome dude!\" }}>\n *       {children}\n *     </PageContext>\n *   );\n * }\n * ```\n */\nfunction PageContextProvider<T extends Context = Context>(\n  props: PageContextProps<T>\n) {\n  assertIsPlainObject(props, {\n    message({ currentType, validType }) {\n      return PROPS_MESSAGE(\n        `Props 'PageContextProvider' must be of type \\`${currentType}\\`, but received: \\`${validType}\\`.`\n      );\n    }\n  });\n\n  const { data, children, strategy = \"merge\" } = props;\n\n  if (!isString(strategy) || ![\"merge\", \"deepmerge\"].includes(strategy)) {\n    throw new TypeError(\n      PROPS_MESSAGE(\n        `Parameter \\`strategy\\` property of the \\`props\\` 'PageContextProvider' must be one of \"merge\" or \"deepmerge\", but received: \\`${getPreciseType(\n          strategy\n        )}\\`, with value: \\`${safeStableStringify(strategy)}\\`.`\n      )\n    );\n  }\n\n  if (!isReactNode(children))\n    throw new TypeError(\n      PROPS_MESSAGE(\n        \"Parameter `children` property of the `props` 'PageContextProvider' is required as ReactNode type !\"\n      )\n    );\n\n  const serializedData = safeStableStringify([strategy, { data }]);\n\n  return (\n    <PageContext.Provider value={data}>\n      <script\n        dangerouslySetInnerHTML={{\n          __html: `(self.__next_c=self.__next_c||[]).push(${serializedData})`\n        }}\n      />\n      {children}\n    </PageContext.Provider>\n  );\n}\n\n/** Alias for `PageContextProvider`. */\nexport { PageContextProvider as PageContext };\n\n/** -------------------------------------------------------------------\n * * ***This hook uses the shared context from the adjacent server layout within the `PageContextProvider` component.***\n * -------------------------------------------------------------------\n * * ***`⚠️ Warning: Currently is not support with turbopack flag mode !!!`***\n * -------------------------------------------------------------------\n * @example\n * ```tsx\n * \"use client\";\n *\n * import { usePageContext } from \"@rzl-zone/next-kit/extra/context\";\n *\n * export default function Page() {\n *   const ctx = usePageContext<{ name: string }>();\n *\n *   return (\n *     //...\n *   );\n * }\n * ```\n */\nexport function usePageContext<T extends Context = Context>(): Readonly<T> {\n  return PageContext.use(\n    PROPS_MESSAGE(\"`usePageContext` must be wrapped by `PageContext` !\")\n  ) as Readonly<T>;\n}\n\n/** -------------------------------------------------------------------\n * * ***This hook uses the shared context from the client-side browser window. the context is only***\n * ***available on *client-side* after hydration.***\n * -------------------------------------------------------------------\n * * ***`⚠️ Warning: Currently is not support with turbopack flag mode !!!`***\n * -------------------------------------------------------------------\n * @example\n * ```tsx\n * \"use client\";\n *\n * import { useServerInsertedContext } from \"@rzl-zone/next-kit/extra/context\";\n *\n * export default function Page() {\n *   const ctx = useServerInsertedContext<{ name: string }>();\n *\n *   return (\n *     //...\n *   );\n * }\n * ```\n */\nexport function useServerInsertedContext<\n  T extends Context = Context\n>(): Readonly<T | undefined> {\n  return useMemo<T | undefined>(() => {\n    if (isServer()) return undefined;\n\n    let context = {};\n\n    for (const [s, { data }] of window.__next_c || []) {\n      if (s === \"deepmerge\") {\n        context = deepmerge(context, data);\n      } else {\n        context = { ...context, ...data };\n      }\n    }\n\n    return context as Readonly<T>;\n  }, []);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,EAAE,kBAAkBA,qCAAmB;AAsB7C,MAAM,sEAAyD,aAAa;;;;;;;;;;;;;;;;;;;;;;;;AAyB5E,SAAS,oBACP,OACA;CACA,uDAAoB,OAAO,EACzB,QAAQ,EAAE,aAAa,aAAa;EAClC,OAAO,cACL,iDAAiD,YAAY,sBAAsB,UAAU,IAC/F;CACF,EACF,CAAC;CAED,MAAM,EAAE,MAAM,UAAU,WAAW,YAAY;CAE/C,IAAI,6CAAU,QAAQ,KAAK,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,SAAS,QAAQ,GAClE,MAAM,IAAI,UACR,cACE,mLACE,QACF,EAAE,4EAAwC,QAAQ,EAAE,IACtD,CACF;CAGF,IAAI,wDAAa,QAAQ,GACvB,MAAM,IAAI,UACR,cACE,oGACF,CACF;CAEF,MAAM,yEAAqC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;CAE/D,OACE,4CAAC,YAAY,UAAb;EAAsB,OAAO;YAA7B,CACE,2CAAC,UAAD,EACE,yBAAyB,EACvB,QAAQ,0CAA0C,eAAe,GACnE,EACD,IACA,QACmB;;AAE1B;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,iBAA2D;CACzE,OAAO,YAAY,IACjB,cAAc,qDAAqD,CACrE;AACF;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,2BAEa;CAC3B,gCAAoC;EAClC,gDAAa,GAAG,OAAO;EAEvB,IAAI,UAAU,CAAC;EAEf,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,OAAO,YAAY,CAAC,GAC9C,IAAI,MAAM,aACR,iCAAoB,SAAS,IAAI;OAEjC,UAAU;GAAE,GAAG;GAAS,GAAG;EAAK;EAIpC,OAAO;CACT,GAAG,CAAC,CAAC;AACP"}
