inventory / frontend / src / features / auth / authSlice.js
authSlice.js
Raw
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;