62 lines
2.4 KiB
TypeScript
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;
|
|
});
|
|
});
|