const reducer = (state, action) => { switch (action.type) { case 'query': { const query = action.payload; if (state.queryEffectId) { cancelEffect(state.queryEffectId); } const queryEffectId = emitEffect( send => { const controller = new AbortController(); const signal = controller.signal; abortableRequest(query, signal, randomRange(3500, 5000)) .then(result => { send({ type: 'result', payload: { query, result: result } }); }) .catch(err => { if (err.name === 'AbortError') { // do nothing } else { console.error(err); } }); return () => { controller.abort(); }; }, { cancelOnUnmount: true } ); return { ...state, query: query, status: 'loading', queryEffectId }; } case 'result': { const { result } = action.payload; return { ...state, result: result, status: 'success', }; } default: throw new Error('Unexpected action'); } };