libs/@guardian/react-crossword/src/context/ShowAnagramHelper.tsx (33 lines of code) (raw):
import type { Dispatch, SetStateAction } from 'react';
import {
createContext,
type ReactNode,
useCallback,
useContext,
useState,
} from 'react';
type Context = {
showAnagramHelper: boolean;
setShowAnagramHelper: Dispatch<SetStateAction<boolean>>;
toggleAnagramHelper: () => void;
};
const ShowAnagramHelperContext = createContext<Context | undefined>(undefined);
export const ShowAnagramHelperProvider = ({
children,
userShowAnagramHelper = false,
}: {
children: ReactNode;
userShowAnagramHelper?: boolean;
}) => {
const [showAnagramHelper, setShowAnagramHelper] = useState(
userShowAnagramHelper,
);
const toggleAnagramHelper = useCallback(() => {
setShowAnagramHelper((prev) => !prev);
}, [setShowAnagramHelper]);
return (
<ShowAnagramHelperContext.Provider
value={{ showAnagramHelper, setShowAnagramHelper, toggleAnagramHelper }}
>
{children}
</ShowAnagramHelperContext.Provider>
);
};
export const useShowAnagramHelper = () => {
const context = useContext(ShowAnagramHelperContext);
if (!context) {
throw new Error(
'ShowAnagramHelperContext does not exist. Have you used a Crossword subcomponent outside a Crossword component?',
);
}
return context;
};