import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"; import * as api from "../api"; import axios from "axios"; export const login = createAsyncThunk( "auth/login", async ({ formValue, navigate }, { rejectWithValue }) => { try { const response = await api.signIn(formValue); navigate("/dashboard"); return response.data; } catch (err) { return rejectWithValue(err.response.data); } } ); export const register = createAsyncThunk( "auth/register", async ({ formValue, navigate, toast }, { rejectWithValue }) => { try { const response = await api.signUp(formValue); toast.success("Register Successfully"); navigate("/registrationsuccess"); return response.data; } catch (err) { return rejectWithValue(err.response.data); } } ); // Thunk to update user details export const updateUser = createAsyncThunk( 'auth/updateUser', async (updatedUserData, { rejectWithValue }) => { try { const response = await axios.put(`http://localhost:3002/users/update`, updatedUserData); // console.log('Update user response:', response.data); return response.data; } catch (error) { return rejectWithValue(error.response.data); } } ); const authSlice = createSlice({ name: "auth", initialState: { user: null, error: "", loading: false, isLoading: false, }, reducers: { setUser: (state, action) => { state.user = action.payload; }, setLogout: (state) => { localStorage.clear(); state.user = null; }, setUserDetails: (state, action) => { state.user = action.payload; }, updateUser: (state, action) => { const updatedUser = action.payload; state.user = { ...state.user, ...updatedUser }; // Update user state without removing it }, }, extraReducers: (builder) => { builder .addCase(login.pending, (state) => { state.loading = true; }) .addCase(login.fulfilled, (state, action) => { state.loading = false; localStorage.setItem("profile", JSON.stringify({ ...action.payload })); state.user = action.payload; }) .addCase(login.rejected, (state, action) => { state.loading = false; state.error = action.payload.message; }) .addCase(register.pending, (state) => { state.loading = true; }) .addCase(register.fulfilled, (state, action) => { state.loading = false; localStorage.setItem("profile", JSON.stringify({ ...action.payload })); state.user = action.payload; }) .addCase(register.rejected, (state, action) => { state.loading = false; state.error = action.payload.message; }) .addCase(updateUser.pending, (state) => { state.isLoading = true; }) .addCase(updateUser.fulfilled, (state, action) => { state.isLoading = false; state.user = action.payload; // Update the user state with the new data }) .addCase(updateUser.rejected, (state, action) => { state.isLoading = false; state.error = action.payload; }); }, }); export const { setUser, setLogout, setUserDetails } = authSlice.actions; export default authSlice.reducer;