import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { Job, JobOffer } from '@app-types/index'; import { JobStatus } from '@utils/constants'; interface JobState { activeJob: Job | null; jobStatus: JobStatus; newJobOffer: JobOffer | null; jobHistory: Job[]; } const initialState: JobState = { activeJob: null, jobStatus: JobStatus.Idle, newJobOffer: null, jobHistory: [], }; const jobSlice = createSlice({ name: 'job', initialState, reducers: { setNewJobOffer: (state, action: PayloadAction) => { state.newJobOffer = action.payload; state.jobStatus = JobStatus.NewRequest; }, acceptJob: (state) => { if (state.newJobOffer) { state.activeJob = { ...state.newJobOffer, orderId: `#ORD${Date.now().toString().slice(-6)}`, status: JobStatus.Accepted, acceptedAt: new Date().toISOString(), collectAmount: state.newJobOffer.paymentType === 'cod' ? state.newJobOffer.amount : 0, }; state.jobStatus = JobStatus.Accepted; state.newJobOffer = null; } }, rejectJob: (state) => { state.newJobOffer = null; state.jobStatus = JobStatus.Idle; }, advanceJobStatus: (state, action: PayloadAction) => { state.jobStatus = action.payload; if (state.activeJob) { state.activeJob.status = action.payload; if (action.payload === JobStatus.PickedUp) { state.activeJob.pickedUpAt = new Date().toISOString(); } } }, completeJob: (state) => { if (state.activeJob) { const completedJob: Job = { ...state.activeJob, status: JobStatus.Delivered, deliveredAt: new Date().toISOString(), }; state.jobHistory = [completedJob, ...state.jobHistory]; } state.activeJob = null; state.jobStatus = JobStatus.Idle; }, clearJob: (state) => { state.activeJob = null; state.newJobOffer = null; state.jobStatus = JobStatus.Idle; }, setJobHistory: (state, action: PayloadAction) => { state.jobHistory = action.payload; }, }, }); export const { setNewJobOffer, acceptJob, rejectJob, advanceJobStatus, completeJob, clearJob, setJobHistory, } = jobSlice.actions; export default jobSlice.reducer;