106 lines
2.6 KiB
TypeScript
106 lines
2.6 KiB
TypeScript
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<LoginResponseType>) {
|
|
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<string>) {
|
|
state.loading = false;
|
|
state.loginFailed = true;
|
|
state.error = action.payload;
|
|
},
|
|
resetLoadedStatus(state) {
|
|
state.loaded = false;
|
|
},
|
|
setUser(state, action: PayloadAction<any>) {
|
|
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());
|
|
}
|
|
};
|