Files
support-desk/frontend/src/features/tickets/ticketSlice.js
T
2022-12-10 17:21:26 +02:00

145 lines
3.8 KiB
JavaScript

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import ticketService from "./ticketService";
const initialState = {
tickets: [],
ticket: {},
isError: false,
isSuccess: false,
isLoading: false,
message: "",
};
export const ticketSlice = createSlice({
name: "ticket",
initialState,
reducers: {
reset: (state) => initialState,
},
extraReducers: (builder) => {
builder
.addCase(createTicket.pending, (state) => {
state.isLoading = true;
})
.addCase(createTicket.fulfilled, (state) => {
state.isLoading = false;
state.isSuccess = true;
})
.addCase(createTicket.rejected, (state, action) => {
state.isLoading = false;
state.isError = true;
state.message = action.payload;
})
.addCase(getTickets.pending, (state) => {
state.isLoading = true;
})
.addCase(getTickets.fulfilled, (state, action) => {
state.isLoading = false;
state.isSuccess = true;
state.tickets = action.payload;
})
.addCase(getTickets.rejected, (state, action) => {
state.isLoading = false;
state.isError = true;
state.message = action.payload;
})
.addCase(getTicket.pending, (state) => {
state.isLoading = true;
})
.addCase(getTicket.fulfilled, (state, action) => {
state.isLoading = false;
state.isSuccess = true;
state.ticket = action.payload;
})
.addCase(getTicket.rejected, (state, action) => {
state.isLoading = false;
state.isError = true;
state.message = action.payload;
})
.addCase(closeTicket.fulfilled, (state, action) => {
state.isLoading = false;
state.tickets.map((ticket) =>
ticket._id === action.payload._id
? (ticket.status = "closed")
: ticket
);
});
},
});
export const closeTicket = createAsyncThunk(
"tickets/close",
async (ticketId, thunkAPI) => {
try {
const token = thunkAPI.getState().auth.user.token;
return await ticketService.closeTicket(ticketId, token);
} catch (error) {
const message =
(error.response &&
error.response.data &&
error.response.data.message) ||
error.message ||
error.toString();
return thunkAPI.rejectWithValue(message);
}
}
);
export const getTickets = createAsyncThunk(
"tickets/getAll",
async (_, thunkAPI) => {
try {
const token = thunkAPI.getState().auth.user.token;
return await ticketService.getTickets(token);
} catch (error) {
const message =
(error.response &&
error.response.data &&
error.response.data.message) ||
error.message ||
error.toString();
return thunkAPI.rejectWithValue(message);
}
}
);
export const createTicket = createAsyncThunk(
"tickets/create",
async (ticketData, thunkAPI) => {
try {
const token = thunkAPI.getState().auth.user.token;
return await ticketService.createTicket(ticketData, token);
} catch (error) {
const message =
(error.response &&
error.response.data &&
error.response.data.message) ||
error.message ||
error.toString();
return thunkAPI.rejectWithValue(message);
}
}
);
export const getTicket = createAsyncThunk(
"tickets/get",
async (ticketId, thunkAPI) => {
try {
const token = thunkAPI.getState().auth.user.token;
return await ticketService.getTicket(ticketId, token);
} catch (error) {
const message =
(error.response &&
error.response.data &&
error.response.data.message) ||
error.message ||
error.toString();
return thunkAPI.rejectWithValue(message);
}
}
);
export const { reset } = ticketSlice.actions;
export default ticketSlice.reducer;