diff --git a/src/pages/authentication/TenantSelection.jsx b/src/pages/authentication/TenantSelection.jsx deleted file mode 100644 index 04223282..00000000 --- a/src/pages/authentication/TenantSelection.jsx +++ /dev/null @@ -1,61 +0,0 @@ -import React from "react"; - -const TenantSelection = () => { - return ( -
- {/* Header */} -
-

Welcome Pramod

-

- Please select which dashboard you want to explore!!! -

-
- - {/* Card Section */} -
-
-
- {/* Image */} -
- logo -
- - {/* Content */} -
-

- Marco Secure Solution Pvt Limited -

- -
-
-

Industry:

-

Information Technology (IT) Service

-
- -

- Pune has emerged as a major IT hub in India, home to a variety - of global technology companies providing cutting-edge - solutions. In this blog, we cover the top 50 IT companies in - Pune, highlighting their addresses, key services, and - specialties. Whether youโ€™re looking for career opportunities, - partnerships, or business solutions, -

- - -
-
-
-
-
-
- ); -}; - -export default TenantSelection; diff --git a/src/router/AppRoutes.jsx b/src/router/AppRoutes.jsx index 423e57dd..66943fb0 100644 --- a/src/router/AppRoutes.jsx +++ b/src/router/AppRoutes.jsx @@ -51,7 +51,6 @@ import { Navigate } from "react-router-dom"; import CreateTenant from "../pages/Tenant/CreateTenant"; import OrganizationPage from "../pages/Organization/OrganizationPage"; import LandingPage from "../pages/Home/LandingPage"; -import TenantSelection from "../pages/authentication/TenantSelection"; const router = createBrowserRouter( [ { @@ -62,7 +61,6 @@ const router = createBrowserRouter( element: , children: [ { path: "/auth/login", element: }, - { path: "/auth/user", element: }, { path: "/auth/login-otp", element: }, { path: "/auth/reqest/demo", element: }, { path: "/auth/forgot-password", element: }, diff --git a/src/services/tenantService.js b/src/services/tenantService.js deleted file mode 100644 index 5d08b577..00000000 --- a/src/services/tenantService.js +++ /dev/null @@ -1,30 +0,0 @@ -// Save org-level token -export const setOrgToken = (token, refreshToken) => { - localStorage.setItem("orgJwtToken", token); - localStorage.setItem("orgRefreshToken", refreshToken); -}; - -// Save selected tenant token -export const setTenantToken = (token, refreshToken, tenantId) => { - localStorage.setItem("jwtToken", token); // tenant JWT - localStorage.setItem("refreshToken", refreshToken); - localStorage.setItem("tenantId", tenantId); -}; - -// Get tenant token -export const getTenantToken = () => { - return { - token: localStorage.getItem("jwtToken"), - refreshToken: localStorage.getItem("refreshToken"), - tenantId: localStorage.getItem("tenantId"), - }; -}; - -// Clear all tokens -export const clearAllTokens = () => { - localStorage.removeItem("jwtToken"); - localStorage.removeItem("refreshToken"); - localStorage.removeItem("orgJwtToken"); - localStorage.removeItem("orgRefreshToken"); - localStorage.removeItem("tenantId"); -}; diff --git a/src/slices/globalVariablesSlice.jsx b/src/slices/globalVariablesSlice.jsx index 70e6a479..8e656000 100644 --- a/src/slices/globalVariablesSlice.jsx +++ b/src/slices/globalVariablesSlice.jsx @@ -4,9 +4,7 @@ const globalVariablesSlice = createSlice({ name: "globalVariables", initialState: { loginUser: null, - tenantList: [], currentTenant: null, - permissions: [], }, reducers: { setGlobalVariable: (state, action) => { @@ -14,10 +12,7 @@ const globalVariablesSlice = createSlice({ state[key] = value; }, setLoginUserPermmisions: (state, action) => { - state.permissions = action.payload; - }, - setLoginUserTenants: (state, action) => { - state.tenantList = action.payload; + state.loginUser = action.payload; }, setCurrentTenant: (state, action) => { state.currentTenant = action.payload; @@ -25,10 +20,6 @@ const globalVariablesSlice = createSlice({ }, }); -export const { - setGlobalVariable, - setLoginUserPermmisions, - setCurrentTenant, - setLoginUserTenants, -} = globalVariablesSlice.actions; +export const { setGlobalVariable, setLoginUserPermmisions, setCurrentTenant } = + globalVariablesSlice.actions; export default globalVariablesSlice.reducer; diff --git a/src/utils/axiosClient.jsx b/src/utils/axiosClient.jsx index 427b596a..62e9b3bb 100644 --- a/src/utils/axiosClient.jsx +++ b/src/utils/axiosClient.jsx @@ -1,9 +1,9 @@ import axios from "axios"; +import { useNavigate } from "react-router-dom"; import axiosRetry from "axios-retry"; import showToast from "../services/toastService"; import { startSignalR, stopSignalR } from "../services/signalRService"; import { BASE_URL } from "./constants"; - const base_Url = BASE_URL; export const axiosClient = axios.create({ @@ -14,15 +14,16 @@ export const axiosClient = axios.create({ }, }); -// Retry failed requests +// Auto retry failed requests (e.g., network issues) +axiosRetry(axiosClient, { retries: 3 }); + +// Request Interceptor โ€” Add Bearer token if required axiosClient.interceptors.request.use( async (config) => { - const requiresAuth = config.authRequired !== false; + const requiresAuth = config.authRequired !== false; // default to true if (requiresAuth) { - let token = localStorage.getItem("jwtToken"); // tenant token by default - if (config.orgToken) token = localStorage.getItem("orgJwtToken"); // org token if requested - + const token = localStorage.getItem("jwtToken"); if (token) { config.headers["Authorization"] = `Bearer ${token}`; config._retry = true; @@ -36,12 +37,13 @@ axiosClient.interceptors.request.use( (error) => Promise.reject(error) ); -// Response interceptor +// ๐Ÿ”„ Response Interceptor โ€” Handle 401, refresh token, etc. axiosClient.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; + // Skip retry for public requests or already retried ones if ( (!originalRequest && originalRequest._retry) || originalRequest.authRequired === false @@ -49,6 +51,7 @@ axiosClient.interceptors.response.use( return Promise.reject(error); } + // Avoid showing multiple toasts if (!originalRequest._toastShown) { originalRequest._toastShown = true; @@ -68,25 +71,34 @@ axiosClient.interceptors.response.use( if (status === 401 && !isRefreshRequest) { originalRequest._retry = true; + const refreshToken = localStorage.getItem("refreshToken"); - if (!refreshToken) { + if ( + !refreshToken || + error.response.data?.errors === "Invalid or expired refresh token." + ) { redirectToLogin(); return Promise.reject(error); } stopSignalR(); + try { + // Refresh token call const res = await axiosClient.post("/api/Auth/refresh-token", { token: localStorage.getItem("jwtToken"), refreshToken, }); const { token, refreshToken: newRefreshToken } = res.data.data; + + // Save updated tokens localStorage.setItem("jwtToken", token); localStorage.setItem("refreshToken", newRefreshToken); startSignalR(); + // Set Authorization header originalRequest.headers["Authorization"] = `Bearer ${token}`; return axiosClient(originalRequest); } catch (refreshError) { @@ -121,41 +133,40 @@ const apiRequest = async (method, url, data = {}, config = {}) => { // Exported API wrapper export const api = { + // Public routes (no token required) postPublic: (url, data = {}, customHeaders = {}) => apiRequest("post", url, data, { headers: { ...customHeaders }, authRequired: false, }), - get: (url, params = {}, customHeaders = {}, orgToken = false) => + // Authenticated routes + get: (url, params = {}, customHeaders = {}) => apiRequest("get", url, params, { headers: { ...customHeaders }, authRequired: true, - orgToken, }), - post: (url, data = {}, customHeaders = {}, orgToken = false) => + post: (url, data = {}, customHeaders = {}) => apiRequest("post", url, data, { headers: { ...customHeaders }, authRequired: true, - orgToken, }), - put: (url, data = {}, customHeaders = {}, orgToken = false) => + put: (url, data = {}, customHeaders = {}) => apiRequest("put", url, data, { headers: { ...customHeaders }, authRequired: true, - orgToken, }), - delete: (url, data = {}, customHeaders = {}, orgToken = false) => + delete: (url, data = {}, customHeaders = {}) => apiRequest("delete", url, data, { headers: { ...customHeaders }, authRequired: true, - orgToken, }), }; +// Redirect helper function redirectToLogin() { window.location.href = "/auth/login"; }