import { useReducer } from 'react'; type State = | { value: T; error: undefined } | { value: false; error: Error } | { value: undefined; error: undefined }; type Action = | { type: 'RESOLVE'; value: T } | { type: 'REJECT'; error: Error } | { type: 'RESET' }; function reducer(state: State, action: Action): State { switch (action.type) { case 'RESOLVE': return { value: action.value, error: undefined }; case 'REJECT': return { value: false, error: action.error }; case 'RESET': return { value: undefined, error: undefined }; default: return state; } } export default function useResolver(): [State, React.Dispatch>] { return useReducer(reducer, { value: undefined, error: undefined }); }