import { createReducer, createAction } from '@reduxjs/toolkit'; import { DeliveryOffer, PickupOrderResponse } from '@interfaces'; import { respondToOfferThunk, checkPendingOfferThunk, changeOrderStatusThunk, } from './thunk'; export interface DeliveryState { currentOffer: DeliveryOffer | null; respondLoading: boolean; respondError: string | null; pendingOfferLoading: boolean; pickupLoading: boolean; pickupError: string | null; pickupOrderResponse: PickupOrderResponse | null; } const initialState: DeliveryState = { currentOffer: null, respondLoading: false, respondError: null, pendingOfferLoading: false, pickupLoading: false, pickupError: null, pickupOrderResponse: null, }; /** 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; }) .addCase(changeOrderStatusThunk.pending, state => { state.pickupLoading = true; state.pickupError = null; }) .addCase(changeOrderStatusThunk.fulfilled, (state, action) => { state.pickupLoading = false; state.pickupOrderResponse = action.payload; }) .addCase(changeOrderStatusThunk.rejected, (state, action) => { state.pickupLoading = false; state.pickupError = action.payload as string; }); });