import { createFactory, createContext, useContext, useReducer } from 'react'; const createReducerContext = >( reducer: R, defaultInitialState: React.ReducerState ) => { const context = createContext<[React.ReducerState, React.Dispatch>] | undefined>(undefined); const providerFactory = createFactory(context.Provider); const ReducerProvider: React.FC<{ initialState?: React.ReducerState }> = ({ children, initialState }) => { const state = useReducer(reducer, initialState !== undefined ? initialState : defaultInitialState); return providerFactory({ value: state }, children); }; const useReducerContext = () => { const state = useContext(context); if (state == null) { throw new Error(`useReducerContext must be used inside a ReducerProvider.`); } return state; }; return [useReducerContext, ReducerProvider, context] as const; }; export default createReducerContext;