import { createSlice, createAsyncThunk } from "@reduxjs/toolkit"; import sebnInventory from "../../apis/sebnInventory"; import jwt_decode from "jwt-decode"; export const getUser = createAsyncThunk("auth/getUser", async () => { let accessToken = localStorage.getItem("token"); let data = jwt_decode(accessToken); if (accessToken) { const response = await sebnInventory.get(`user/${data.user_id}/`); return response.data; } }); export const refreshToken = createAsyncThunk("auth/refreshToken", async () => { let refreshToken = localStorage.getItem("refresh"); let accessToken = localStorage.getItem("token"); if (jwt_decode(accessToken).exp > new Date()) { return { token: accessToken, refresh: refreshToken }; } else { const response = await sebnInventory.post(`token-refresh/`, { refresh: refreshToken, }); localStorage.setItem("token", response.data.access); localStorage.setItem("refresh", response.data.refresh); return response.data; } }); export const login = createAsyncThunk("auth/login", async (values, state) => { let payload = {}; const response = await sebnInventory.post("token-auth/", values); localStorage.setItem("token", response.data.access); localStorage.setItem("refresh", response.data.refresh); const user_data = await sebnInventory.get( `/user/${jwt_decode(response.data.access).user_id}` ); payload.user = user_data.data; return payload; }); export const authSlice = createSlice({ name: "auth", initialState: { token: localStorage.getItem("token") || null, refresh: localStorage.getItem("refresh") || null, isAuthenticated: null, user: {}, }, reducers: { logout: (state, action) => { localStorage.removeItem("token"); localStorage.removeItem("branch"); localStorage.removeItem("refresh"); state.token = null; state.isAuthenticated = false; state.user = {}; }, }, extraReducers: { [getUser.fulfilled]: (state, action) => { state.isAuthenticated = true; state.user = action.payload; }, [refreshToken.fulfilled]: (state, action) => { state.isAuthenticated = true; state.user = action.payload; }, [login.fulfilled]: (state, action) => { state.isAuthenticated = true; state.token = localStorage.getItem("token"); state.refresh = localStorage.getItem("refresh"); state.user = action.payload.user; }, }, }); export const { logout } = authSlice.actions; export default authSlice.reducer;