87 lines
2.3 KiB
TypeScript
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;
|