import { createReducer, createAction } from '@reduxjs/toolkit'; import { DeliveryOffer } from '@interfaces'; import { respondToOfferThunk, checkPendingOfferThunk } from './thunk'; export interface DeliveryState { currentOffer: DeliveryOffer | null; respondLoading: boolean; respondError: string | null; pendingOfferLoading: boolean; } const initialState: DeliveryState = { currentOffer: null, respondLoading: false, respondError: null, pendingOfferLoading: false, }; /** Dispatched by socketService when a `delivery_offer` event is received. */ export const setDeliveryOffer = createAction( 'delivery/setDeliveryOffer', ); /** Dispatched after accept/reject to clear the current offer from state. */ export const clearDeliveryOffer = createAction('delivery/clearDeliveryOffer'); export const deliveryReducer = createReducer(initialState, builder => { builder // ── Sync actions ────────────────────────────────────────────────────── .addCase(setDeliveryOffer, (state, action) => { state.currentOffer = action.payload; }) .addCase(clearDeliveryOffer, state => { state.currentOffer = null; state.respondError = null; }) // ── respondToOfferThunk ─────────────────────────────────────────────── .addCase(respondToOfferThunk.pending, state => { state.respondLoading = true; state.respondError = null; }) .addCase(respondToOfferThunk.fulfilled, state => { state.respondLoading = false; state.currentOffer = null; }) .addCase(respondToOfferThunk.rejected, (state, action) => { state.respondLoading = false; state.respondError = action.payload as string; }) // ── checkPendingOfferThunk ──────────────────────────────────────────── .addCase(checkPendingOfferThunk.pending, state => { state.pendingOfferLoading = true; }) .addCase(checkPendingOfferThunk.fulfilled, (state, action) => { state.pendingOfferLoading = false; state.currentOffer = action.payload.offer; }) .addCase(checkPendingOfferThunk.rejected, state => { state.pendingOfferLoading = false; }); });