A React hook that lets you consume a context only within its provider, it throws an error otherwise
npm install use-safe-context``sh`
yarn add use-safe-context`
orsh`
npm install use-safe-context
`typescript
// ---------- ContextProvider.tsx
import {createContext, type PropsWithChildren, useState} from "react";
import {useSafeContext} from 'use-safe-context'
// the initial value of the context should be undefined
const CounterCtx = createContext
// you should export a custom hook that consumes the context (for the error message to be accurate)
export const useCounter = () => useSafeContext(CounterCtx);
// the error message contains the file name (ContextProvider in this case)
// the file name and the ContextProvider name should match
export default function ContextProvider({children}: PropsWithChildren) {
const [counter, setCounter] = useState(0);
return
}
// ---------- ConsumerComponent.tsx
import {useCounter} from "./ContextProvider.tsx";
export default function ConsumerComponent() {
// this will throw an error if the ConsumerComponent is used outside the ContextProvider
const counter = useCounter();
// ...
}
`
The error message is composed based on the browser error stack. This mechanism was chosen to simplify the hook's api,
so you are not required to pass explicitly the provider name and the consumer hook's name. The error message
has the following form:
```
Uncaught Error: useCounter must be used within ContextProvider
at useSafeContext (use-safe-context.js?v=766d6ed6:11:138)
at useCounter (ContextProvider.tsx:8:33)
at ConsumerComponent (ConsumerComponent.tsx:4:21)
The useSafeContext hook uses the "use" hook behind the scenes if it is available, if not it falls back to useContext. It
adds a new layer of safety and offers you an architecture to follow.