estatesfunding/ef-ui/src/redux/features/authSlice.js

118 lines
3.2 KiB
JavaScript

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;