From ef4bfec3f2d9ac6d13d2a6677e7ddfc927868075 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 7 Oct 2024 13:47:20 +0800 Subject: [PATCH] Refactor network service, clear auth and monitor state on bad token --- Client/src/Utils/NetworkService.js | 18 +++++++++++++++--- Client/src/Utils/NetworkServiceProvider.jsx | 15 +++++++++++++++ Client/src/main.jsx | 13 ++++++++----- 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 Client/src/Utils/NetworkServiceProvider.jsx diff --git a/Client/src/Utils/NetworkService.js b/Client/src/Utils/NetworkService.js index c72fce9d0..460befc0b 100644 --- a/Client/src/Utils/NetworkService.js +++ b/Client/src/Utils/NetworkService.js @@ -1,10 +1,14 @@ import axios from "axios"; const BASE_URL = import.meta.env.VITE_APP_API_BASE_URL; const FALLBACK_BASE_URL = "http://localhost:5000/api/v1"; +import { clearAuthState } from "../Features/Auth/authSlice"; +import { clearUptimeMonitorState } from "../Features/UptimeMonitors/uptimeMonitorsSlice"; import { logger } from "./Logger"; class NetworkService { - constructor(store) { + constructor(store, dispatch, navigate) { this.store = store; + this.dispatch = dispatch; + this.navigate = navigate; let baseURL = BASE_URL; this.axiosInstance = axios.create(); this.setBaseUrl(baseURL); @@ -22,9 +26,10 @@ class NetworkService { this.axiosInstance.interceptors.response.use( (response) => response, (error) => { - logger.error(error); if (error.response && error.response.status === 401) { - logger.error("Invalid token received"); + dispatch(clearAuthState()); + dispatch(clearUptimeMonitorState()); + navigate("/login"); } return Promise.reject(error); } @@ -688,3 +693,10 @@ class NetworkService { } export default NetworkService; + +let networkService; + +export const setNetworkService = (service) => { + networkService = service; +}; +export { networkService }; diff --git a/Client/src/Utils/NetworkServiceProvider.jsx b/Client/src/Utils/NetworkServiceProvider.jsx new file mode 100644 index 000000000..4c66681e0 --- /dev/null +++ b/Client/src/Utils/NetworkServiceProvider.jsx @@ -0,0 +1,15 @@ +import { useDispatch } from "react-redux"; +import { useNavigate } from "react-router"; +import { setNetworkService } from "./NetworkService"; +import NetworkService from "./NetworkService"; +import { store } from "../store"; + +const NetworkServiceProvider = ({ children }) => { + const dispatch = useDispatch(); + const navigate = useNavigate(); + const networkService = new NetworkService(store, dispatch, navigate); + setNetworkService(networkService); + return children; +}; + +export default NetworkServiceProvider; diff --git a/Client/src/main.jsx b/Client/src/main.jsx index d592f9137..4c04a65eb 100644 --- a/Client/src/main.jsx +++ b/Client/src/main.jsx @@ -1,18 +1,21 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.jsx"; import "./index.css"; -import { BrowserRouter as Router, HashRouter } from "react-router-dom"; +import { BrowserRouter as Router } from "react-router-dom"; import { Provider } from "react-redux"; import { persistor, store } from "./store"; import { PersistGate } from "redux-persist/integration/react"; -import NetworkService from "./Utils/NetworkService.js"; -export const networkService = new NetworkService(store); +import NetworkServiceProvider from "./Utils/NetworkServiceProvider.jsx"; +import { networkService } from "./Utils/NetworkService"; +export { networkService }; + ReactDOM.createRoot(document.getElementById("root")).render( - + + +