84 lines
3.1 KiB
TypeScript

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<DeliveryOffer>(
'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;
});
});