import { createContext, Dispatch, ReactNode, useContext, useReducer } from 'react'; type State = { count: number }; type Action = { type: 'INCREMENT' | 'DECREMENT' }; const initialState: State = { count: 0 }; function counterReducer(state: State, action: Action): State { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: throw new Error('Unhandled action'); } } const CounterStateContext = createContext(undefined); const CounterDispatchContext = createContext | undefined>(undefined); export function CounterProvider({ children }: { children: ReactNode }) { const [state, dispatch] = useReducer(counterReducer, initialState); return ( {children} ); } export function useCounterState() { const context = useContext(CounterStateContext); if (context === undefined) throw new Error('useCounterState must be used within a CounterProvider'); return context; } export function useCounterDispatch() { const context = useContext(CounterDispatchContext); if (context === undefined) throw new Error('useCounterDispatch must be used within a CounterProvider'); return context; }