62 lines
2.4 KiB
TypeScript

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<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;
});
});