diff --git a/admin-frontend/src/api/utils.ts b/admin-frontend/src/api/utils.ts index 751cdd2..ba8a7c9 100644 --- a/admin-frontend/src/api/utils.ts +++ b/admin-frontend/src/api/utils.ts @@ -1,8 +1,14 @@ -import axios from "axios"; +import axios, {AxiosError} from "axios"; +import {Store} from "src/store"; +import { clearLoginStatus } from 'src/store/loginSlice'; // import { useContext } from 'react'; // import { LoginContext } from "../utils/context"; export const baseUrl = '/bison/api/' +let store: Store +export const injectStore = (_store: Store) => { + store = _store +} // const loginStatus = useContext(LoginContext); axios.interceptors.request.use(function (config) { @@ -37,4 +43,9 @@ axios.interceptors.response.use(function (response) { // } // response.data = parseToMap(data); return response; +}, function(error: AxiosError) { + if(error.response && error.response.status === 401) { + store.dispatch(clearLoginStatus()); + } + return Promise.reject(error); }); diff --git a/admin-frontend/src/index.tsx b/admin-frontend/src/index.tsx index f56de60..5621bf9 100644 --- a/admin-frontend/src/index.tsx +++ b/admin-frontend/src/index.tsx @@ -5,7 +5,9 @@ import App from './App'; import './index.css'; import reportWebVitals from './reportWebVitals'; import store from './store'; +import {injectStore} from 'src/api/utils'; +injectStore(store); ReactDOM.render( diff --git a/admin-frontend/src/store/index.ts b/admin-frontend/src/store/index.ts index 6e64858..36f6821 100644 --- a/admin-frontend/src/store/index.ts +++ b/admin-frontend/src/store/index.ts @@ -15,3 +15,4 @@ export default store; export type RootState = ReturnType; export type AppDispatch = typeof store.dispatch; +export type Store = typeof store; diff --git a/admin-frontend/src/store/loginSlice.ts b/admin-frontend/src/store/loginSlice.ts index 9898d7a..6db2da1 100644 --- a/admin-frontend/src/store/loginSlice.ts +++ b/admin-frontend/src/store/loginSlice.ts @@ -60,7 +60,10 @@ export const loginSlice = createSlice({ name: 'auth', initialState, reducers: { - doLogin: loginAction + doLogin: loginAction, + doClearLogin: (state) => { + state.login = false + } }, extraReducers: (builder) => { builder.addCase(login.fulfilled, loginAction); @@ -70,7 +73,7 @@ export const loginSlice = createSlice({ } }) -export const { doLogin } = loginSlice.actions +export const { doLogin, doClearLogin } = loginSlice.actions export const loadLoginState = (): ThunkAction => (dispatch, getState) => { @@ -94,6 +97,12 @@ export const loadLoginState = (): ThunkAction => + (dispatch) => { + localStorage.removeItem('loginInfo') + localStorage.removeItem('token') + dispatch(doClearLogin()) + } export const loginSelector = (state: RootState) => state.login export default loginSlice.reducer