65 lines
1.6 KiB
JavaScript
65 lines
1.6 KiB
JavaScript
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
|
|
// import axios from "axios";
|
|
import api from "../../app/api";
|
|
|
|
export const login = createAsyncThunk(
|
|
"auth/login",
|
|
async (credentials, thunkAPI) => {
|
|
try {
|
|
const response = await api.post("/auth/login", credentials);
|
|
|
|
console.log("Login response:", response.data);
|
|
|
|
const token = response.data?.token || response.data?.data?.token;
|
|
const user = response.data?.user || response.data?.data?.user;
|
|
|
|
if (!token) {
|
|
throw new Error("No token returned from server");
|
|
}
|
|
|
|
localStorage.setItem("token", token);
|
|
return { user, token };
|
|
} catch (error) {
|
|
return thunkAPI.rejectWithValue(
|
|
error.response?.data?.message || "Login failed"
|
|
);
|
|
}
|
|
}
|
|
);
|
|
|
|
const authSlice = createSlice({
|
|
name: "auth",
|
|
initialState: {
|
|
user: null,
|
|
loading: false,
|
|
error: null,
|
|
token: localStorage.getItem("token") || null,
|
|
},
|
|
reducers: {
|
|
logout: (state) => {
|
|
state.user = null;
|
|
state.token = null;
|
|
localStorage.removeItem("token");
|
|
},
|
|
},
|
|
extraReducers: (builder) => {
|
|
builder
|
|
.addCase(login.pending, (state) => {
|
|
state.loading = true;
|
|
state.error = null;
|
|
})
|
|
.addCase(login.fulfilled, (state, action) => {
|
|
state.loading = false;
|
|
state.user = action.payload.user;
|
|
state.token = action.payload.token;
|
|
})
|
|
.addCase(login.rejected, (state, action) => {
|
|
state.loading = false;
|
|
state.error = action.payload;
|
|
});
|
|
},
|
|
});
|
|
|
|
export const { logout } = authSlice.actions;
|
|
export default authSlice.reducer;
|