import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; import { jwtDecode } from "jwt-decode"; import { networkService } from "../../main"; const initialState = { isLoading: false, monitors: [], success: null, msg: null, }; export const createPageSpeed = createAsyncThunk( "pageSpeedMonitors/createPageSpeed", async (data, thunkApi) => { try { const { authToken, monitor } = data; const res = await networkService.createMonitor(authToken, monitor); return res.data; } catch (error) { if (error.response && error.response.data) { return thunkApi.rejectWithValue(error.response.data); } const payload = { status: false, msg: error.message ? error.message : "Unknown error", }; return thunkApi.rejectWithValue(payload); } } ); export const getPageSpeedByUserId = createAsyncThunk( "pageSpeedMonitors/getPageSpeedByUserId", async (token, thunkApi) => { const user = jwtDecode(token); try { const res = await networkService.getMonitorsByUserId( token, user._id, 25, ["pagespeed"], null, "desc", false ); return res.data; } catch (error) { if (error.response && error.response.data) { return thunkApi.rejectWithValue(error.response.data); } const payload = { status: false, msg: error.message ? error.message : "Unknown error", }; return thunkApi.rejectWithValue(payload); } } ); export const updatePageSpeed = createAsyncThunk( "pageSpeedMonitors/updatePageSpeed", async (data, thunkApi) => { try { const { authToken, monitor } = data; const updatedFields = { name: monitor.name, description: monitor.description, interval: monitor.interval, // notifications: monitor.notifications, }; const res = await networkService.updateMonitor( authToken, monitor._id, updatedFields ); return res.data; } catch (error) { if (error.response && error.response.data) { return thunkApi.rejectWithValue(error.response.data); } const payload = { status: false, msg: error.message ? error.message : "Unknown error", }; return thunkApi.rejectWithValue(payload); } } ); export const deletePageSpeed = createAsyncThunk( "pageSpeedMonitors/deletePageSpeed", async (data, thunkApi) => { try { const { authToken, monitor } = data; const res = await networkService.deleteMonitorById( authToken, monitor._id ); return res.data; } catch (error) { if (error.response && error.response.data) { return thunkApi.rejectWithValue(error.response.data); } const payload = { status: false, msg: error.message ? error.message : "Unknown error", }; return thunkApi.rejectWithValue(payload); } } ); const pageSpeedMonitorSlice = createSlice({ name: "pageSpeedMonitor", initialState, reducers: { clearMonitorState: (state) => { state.isLoading = false; state.monitors = []; state.success = null; state.msg = null; }, }, extraReducers: (builder) => { builder // ***************************************************** // Monitors by userId // ***************************************************** .addCase(getPageSpeedByUserId.pending, (state) => { state.isLoading = true; }) .addCase(getPageSpeedByUserId.fulfilled, (state, action) => { state.isLoading = false; state.success = action.payload.msg; state.monitors = action.payload.data; }) .addCase(getPageSpeedByUserId.rejected, (state, action) => { state.isLoading = false; state.success = false; state.msg = action.payload ? action.payload.msg : "Getting page speed monitors failed"; }) // ***************************************************** // Create Monitor // ***************************************************** .addCase(createPageSpeed.pending, (state) => { state.isLoading = true; }) .addCase(createPageSpeed.fulfilled, (state, action) => { state.isLoading = false; state.success = action.payload.success; state.msg = action.payload.msg; }) .addCase(createPageSpeed.rejected, (state, action) => { state.isLoading = false; state.success = false; state.msg = action.payload ? action.payload.msg : "Failed to create page speed monitor"; }) // ***************************************************** // Create Monitor // ***************************************************** .addCase(updatePageSpeed.pending, (state) => { state.isLoading = true; }) .addCase(updatePageSpeed.fulfilled, (state, action) => { state.isLoading = false; state.success = action.payload.success; state.msg = action.payload.msg; }) .addCase(updatePageSpeed.rejected, (state, action) => { state.isLoading = false; state.success = false; state.msg = action.payload ? action.payload.msg : "Failed to update page speed monitor"; }) // ***************************************************** // Delete Monitor // ***************************************************** .addCase(deletePageSpeed.pending, (state) => { state.isLoading = true; }) .addCase(deletePageSpeed.fulfilled, (state, action) => { state.isLoading = false; state.success = action.payload.success; state.msg = action.payload.msg; }) .addCase(deletePageSpeed.rejected, (state, action) => { state.isLoading = false; state.success = false; state.msg = action.payload ? action.payload.msg : "Failed to delete page speed monitor"; }); }, }); export const { setMonitors, clearMonitorState } = pageSpeedMonitorSlice.actions; export default pageSpeedMonitorSlice.reducer;