mirror of
https://github.com/bluewave-labs/Checkmate.git
synced 2026-01-29 13:19:33 -06:00
89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
import axios from "axios";
|
|
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
|
|
import { jwtDecode } from "jwt-decode";
|
|
const BASE_URL = import.meta.env.VITE_APP_API_BASE_URL;
|
|
|
|
const initialState = {
|
|
isLoading: false,
|
|
authToken: "",
|
|
user: "",
|
|
success: null,
|
|
msg: null,
|
|
};
|
|
|
|
export const register = createAsyncThunk(
|
|
"auth/register",
|
|
async (form, thunkApi) => {
|
|
try {
|
|
const res = await axios.post(`${BASE_URL}/auth/register`, form);
|
|
return res.data;
|
|
} catch (error) {
|
|
if (error.response.data) {
|
|
return thunkApi.rejectWithValue(error.response.data);
|
|
}
|
|
return thunkApi.rejectWithValue(error.message);
|
|
}
|
|
}
|
|
);
|
|
|
|
export const login = createAsyncThunk("auth/login", async (form, thunkApi) => {
|
|
try {
|
|
const res = await axios.post(`${BASE_URL}/auth/login`, form);
|
|
return res.data;
|
|
} catch (error) {
|
|
if (error.response && error.response.data) {
|
|
return thunkApi.rejectWithValue(error.response.data);
|
|
}
|
|
return thunkApi.rejectWithValue(error.message);
|
|
}
|
|
});
|
|
|
|
const handleAuthFulfilled = (state, action) => {
|
|
state.isLoading = false;
|
|
state.success = action.payload.success;
|
|
state.msg = action.payload.msg;
|
|
state.authToken = action.payload.data;
|
|
const decodedToken = jwtDecode(action.payload.data);
|
|
const user = { ...decodedToken };
|
|
state.user = user;
|
|
};
|
|
const handleAuthRejected = (state, action) => {
|
|
state.isLoading = false;
|
|
state.success = false;
|
|
state.msg = action.payload
|
|
? action.payload.msg
|
|
: "Failed to login or register";
|
|
};
|
|
|
|
const authSlice = createSlice({
|
|
name: "auth",
|
|
initialState,
|
|
reducers: {
|
|
clearAuthState: (state) => {
|
|
state.authToken = "";
|
|
state.user = "";
|
|
state.isLoading = false;
|
|
state.success = true;
|
|
state.msg = "Logged out successfully";
|
|
},
|
|
},
|
|
extraReducers: (builder) => {
|
|
builder
|
|
// Register thunk
|
|
.addCase(register.pending, (state) => {
|
|
state.isLoading = true;
|
|
})
|
|
.addCase(register.fulfilled, handleAuthFulfilled)
|
|
.addCase(register.rejected, handleAuthRejected)
|
|
// Login thunk
|
|
.addCase(login.pending, (state) => {
|
|
state.isLoading = true;
|
|
})
|
|
.addCase(login.fulfilled, handleAuthFulfilled)
|
|
.addCase(login.rejected, handleAuthRejected);
|
|
},
|
|
});
|
|
|
|
export default authSlice.reducer;
|
|
export const { clearAuthState } = authSlice.actions;
|