2026-07-02 14:34:19 +05:30

87 lines
2.3 KiB
TypeScript

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<JobOffer>) => {
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<JobStatus>) => {
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<Job[]>) => {
state.jobHistory = action.payload;
},
},
});
export const {
setNewJobOffer,
acceptJob,
rejectJob,
advanceJobStatus,
completeJob,
clearJob,
setJobHistory,
} = jobSlice.actions;
export default jobSlice.reducer;