84 lines
3.1 KiB
TypeScript
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;
|
|
});
|
|
});
|