Safe React Context
A utility to create a safe React context with error handling
createSafeContext creates a React context together with a hook that fails loudly when called outside its provider.
It is useful for compound components such as dialogs, selects, and field systems where child components should never silently receive a missing context.
Installation
CLI
npx shadcn add https://ui.tiesen.id.vn/r/create-safe-context.jsonManual
Copy and paste the following code into your project.
import * as React from 'react'export function createSafeContext<TValue>( errorMessage = 'useContext must be used within a Provider') { const Context = React.createContext<TValue | null>(null) function useSafeContext() { const context = React.use(Context) if (context === null) throw new Error(errorMessage) return context } return [useSafeContext, Context] as const}Usage
import { createSafeContext } from '@/lib/create-safe-context'
const [useMenuContext, MenuContext] = createSafeContext<{
close: () => void
}>()
function MenuButton() {
const { close } = useMenuContext()
return <button onClick={close}>Close</button>
}A provider can supply the context with the returned Context object:
<MenuContext value={{ close }}>
<MenuButton />
</MenuContext>Calling useMenuContext outside of the provider throws useContext must be used within a Provider by default.
Custom error message
const [useAuthContext, AuthContext] = createSafeContext<AuthValue>(
'useAuthContext must be used within AuthProvider'
)API Reference
createSafeContext
function createSafeContext<TValue>(
errorMessage?: string
): readonly [
useSafeContext: () => TValue,
Context: React.Context<TValue | null>
]| Parameter | Default |
|---|---|
errorMessage | 'useContext must be used within a Provider' |
The hook only succeeds when the context value is non-null.