{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "session-provider",
  "title": "Session Provider",
  "description": "Shares one useKnockCodes session across a tree, so a gate, a Logout Button, and a Session Timeout Banner all read and act on the same unlock state.",
  "registryDependencies": [
    "https://knock.codes/r/react/knock-codes-hook.json"
  ],
  "files": [
    {
      "path": "packages/react/KnockCodesProvider.tsx",
      "content": "\"use client\";\r\n\r\nimport { createContext, useContext, type ReactNode } from \"react\";\r\nimport { useKnockCodes } from \"./useKnockCodes.ts\";\r\nimport type { KnockCodesConfig, UseKnockCodesResult } from \"./types.ts\";\r\n\r\nconst KnockCodesContext = createContext<UseKnockCodesResult | null>(null);\r\n\r\nexport interface KnockCodesProviderProps extends KnockCodesConfig {\r\n  children: ReactNode;\r\n}\r\n\r\n/**\r\n * Shares one `useKnockCodes` session across a whole tree, so multiple\r\n * components — a gate, a `LogoutButton`, a `SessionTimeoutBanner` — read and\r\n * act on the same unlock state instead of each running an independent\r\n * verification/session lifecycle. Optional: `useKnockCodes` or `<KnockCodes>`\r\n * work standalone with no provider; reach for this only when two or more\r\n * components need to share one session.\r\n */\r\nexport function KnockCodesProvider({ children, ...config }: KnockCodesProviderProps) {\r\n  const state = useKnockCodes(config);\r\n  return <KnockCodesContext.Provider value={state}>{children}</KnockCodesContext.Provider>;\r\n}\r\n\r\n/** Throws outside a `<KnockCodesProvider>` — there is no meaningful standalone default. */\r\nexport function useKnockCodesContext(): UseKnockCodesResult {\r\n  const context = useContext(KnockCodesContext);\r\n  if (!context) {\r\n    throw new Error(\"Knock Codes: useKnockCodesContext must be used within an <KnockCodesProvider>.\");\r\n  }\r\n  return context;\r\n}\r\n",
      "type": "registry:file",
      "target": "components/knock-codes/react/KnockCodesProvider.tsx"
    }
  ],
  "type": "registry:block"
}