{"record":{"id":"2689f1ad91fd79b4","repo":"clockworklabs/SpacetimeDB","slug":"usespacetimedb-must-be-used-within-a-spacetimedbpr-2689f1","errorCode":null,"errorMessage":"useSpacetimeDB must be used within a SpacetimeDBProvider component. Did you forget to add a `SpacetimeDBProvider` to your component tree?","messagePattern":"useSpacetimeDB must be used within a SpacetimeDBProvider component\\. Did you forget to add a `SpacetimeDBProvider` to your component tree\\?","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"crates/bindings-typescript/src/solid/useSpacetimeDB.ts","lineNumber":13,"sourceCode":"import { createContext, useContext } from 'solid-js';\nimport type { ConnectionState } from './connection_state';\n\nexport const SpacetimeDBContext = createContext<ConnectionState | undefined>(\n  undefined\n);\n\n// Throws an error if used outside of a SpacetimeDBProvider\n// Error is caught by other hooks like useTable so they can provide better error messages\nexport function useSpacetimeDB(): ConnectionState {\n  const context = useContext(SpacetimeDBContext) as ConnectionState | undefined;\n  if (!context) {\n    throw new Error(\n      'useSpacetimeDB must be used within a SpacetimeDBProvider component. Did you forget to add a `SpacetimeDBProvider` to your component tree?'\n    );\n  }\n  return context;\n}\n","sourceCodeStart":1,"sourceCodeEnd":19,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/bindings-typescript/src/solid/useSpacetimeDB.ts#L1-L19","documentation":"The Solid bindings distribute SpacetimeDB connection state through a Solid context (SpacetimeDBContext). useSpacetimeDB() reads it with useContext(), and Solid returns undefined when no matching Provider exists above the calling component, so the hook throws to fail fast. The throw is intentionally loud: sibling hooks such as useTable catch it and rethrow with their own guidance.","triggerScenarios":"Calling useSpacetimeDB() directly, or any hook that wraps it (useTable, useReducer, useProcedure), in a component that is not a descendant of <SpacetimeDBProvider connectionBuilder={builder}>. Also occurs when a consumer is mounted via createRoot() or a portal outside the provider subtree, or when a second app root is mounted without its own provider.","commonSituations":"SolidStart/SolidKit apps where the provider was added to one route layout but a shared widget renders outside it; unit tests rendering a single component without the provider; reordering the tree so the provider ends up below the consumer; mixing the Solid provider with hooks imported from the React bindings.","solutions":["Wrap the tree with <SpacetimeDBProvider connectionBuilder={builder}> so every hook consumer is a descendant of it","In tests, render the component under test inside SpacetimeDBProvider before asserting on table data","Verify the provider sits ABOVE (not beside or below) every component calling useTable/useSpacetimeDB","If you must use createRoot/portals, render the consumer inside the provider subtree or pass the context value explicitly"],"exampleFix":"// before\nexport default function App() {\n  return <PlayerList />; // PlayerList calls useTable -> throws\n}\n\n// after\nimport { SpacetimeDBProvider } from '@clockworklabs/spacetime-db-solid';\n\nexport default function App() {\n  return (\n    <SpacetimeDBProvider connectionBuilder={builder}>\n      <PlayerList />\n    </SpacetimeDBProvider>\n  );\n}","handlingStrategy":"validation","validationCode":"import { useContext } from 'solid-js';\nimport { SpacetimeDBContext } from './solid/useSpacetimeDB';\n\nexport function hasSpacetimeDB(): boolean {\n  return useContext(SpacetimeDBContext) !== undefined;\n}\n\n// before calling hooks:\nif (!hasSpacetimeDB()) throw new Error('Mount this component under <SpacetimeDBProvider>');","typeGuard":"import { useContext } from 'solid-js';\nimport { SpacetimeDBContext, type ConnectionState } from './solid/useSpacetimeDB';\n\nexport function tryGetConnection(): ConnectionState | undefined {\n  return useContext(SpacetimeDBContext); // undefined instead of throwing\n}","tryCatchPattern":"// hooks run during render; catch with Solid's ErrorBoundary\n<ErrorBoundary fallback={(err) => <p>SpacetimeDB setup missing: {err.message}</p>}>\n  <PlayerList />\n</ErrorBoundary>","preventionTips":["Add SpacetimeDBProvider at the app root as the first integration step, before any useTable calls","Create a test wrapper component that always includes the provider","Convention: any file importing useTable/useSpacetimeDB must render below the provider"],"tags":["solid","hooks","context","provider","typescript"],"backgroundTag":"missing-context-provider","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}