import { Action } from '@reduxjs/toolkit'; import { createContext, useCallback, useContext } from 'react'; export type Reducer = (state: S, action: A) => S; export const combineReducers = (reducers: { [P in keyof S]: Reducer }) => (state: S, action: A): Partial => { const newState = {} as S; for (const key in reducers) { newState[key] = reducers[key](state[key], action); } return newState; }; export const useStatelessReducer = ( onChange: (value: State) => void, state: State, reducer: (state: State, action: A) => State ) => { const dispatch = useCallback( (action: A) => { onChange(reducer(state, action)); }, [onChange, state, reducer] ); return dispatch; }; export const DispatchContext = createContext<((action: Action) => void) | undefined>(undefined); export const useDispatch = (): ((action: T) => void) => { const dispatch = useContext(DispatchContext); if (!dispatch) { throw new Error('Use DispatchContext first.'); } return dispatch; };