import { createSlice, PayloadAction } from "@reduxjs/toolkit"; import { baseApi } from "redux/api/apiSlice"; import { AppThunk } from "redux/store"; import { ACCESS_TOKEN, USER_NAME } from "utils/constants"; import { LoginResponseType, UserType } from "utils/types/appTypes"; export type AuthState = { user: UserType | undefined; isActivated: boolean; loading: boolean; loginFailed: boolean; expiredToken: boolean; error: string; token: string; loaded: boolean; }; const initialState: AuthState = { user: undefined, isActivated: !!localStorage.getItem(ACCESS_TOKEN), loaded: false, loading: false, loginFailed: false, expiredToken: false, error: "", token: localStorage.getItem(ACCESS_TOKEN) || "", }; export const authSlice = createSlice({ name: "auth", initialState, reducers: { resetState: () => initialState, initialLoadStart(state) { state.loading = true; state.isActivated = false; }, initialLoadSuccess(state) { state.loading = false; state.isActivated = true; }, loginStart(state) { state.loading = true; state.loginFailed = false; state.loaded = false; }, loginSuccess(state, action: PayloadAction) { if (action.payload.token) { localStorage.setItem(ACCESS_TOKEN, action.payload.token); state.token = action.payload.token; if (state.user?.username) localStorage.setItem(USER_NAME, state.user.username); state.isActivated = true; state.loading = false; state.loginFailed = false; state.expiredToken = false; state.error = ""; state.loaded = true; } }, logout: (state) => { localStorage.removeItem(ACCESS_TOKEN); state.isActivated = false; state.token = ""; state.user = undefined; }, failedWithError(state, action: PayloadAction) { state.loading = false; state.loginFailed = true; state.error = action.payload; }, resetLoadedStatus(state) { state.loaded = false; }, setUser(state, action: PayloadAction) { state.user = action.payload; }, tokenExpired(state) { state.expiredToken = true; }, }, }); export const { resetState, initialLoadStart, initialLoadSuccess, loginStart, loginSuccess, failedWithError, tokenExpired, logout, setUser, resetLoadedStatus, } = authSlice.actions; export default authSlice.reducer; export const logoutThunk = (): AppThunk => (dispatch) => { if (localStorage.getItem(ACCESS_TOKEN)) { localStorage.clear(); dispatch(baseApi.util.resetApiState()); dispatch(logout()); } };