revertlogin initial steup in organization_management brnach

This commit is contained in:
Pramod 2025-09-21 10:13:12 +05:30
parent 070fa93fca
commit 3e5afe0bc6
5 changed files with 30 additions and 121 deletions

View File

@ -1,61 +0,0 @@
import React from "react";
const TenantSelection = () => {
return (
<div className="container-fluid py-4">
{/* Header */}
<div className="text-center mb-4">
<p className="fs-4 mb-1">Welcome Pramod</p>
<p className="fs-5">
Please select which dashboard you want to explore!!!
</p>
</div>
{/* Card Section */}
<div className="row justify-content-center">
<div className="col-12 col-md-10 col-lg-8">
<div className="d-flex flex-column flex-md-row gap-3 align-items-center align-items-md-start p-3 border rounded shadow-sm bg-white">
{/* Image */}
<div className="flex-shrink-0 text-center">
<img
src="/assets/img/SP-Placeholdeer.svg"
alt="logo"
className="img-fluid"
style={{ maxWidth: "180px", height: "auto" }}
/>
</div>
{/* Content */}
<div className="d-flex flex-column text-start gap-2">
<p className="fs-5 text-muted fw-semibold mb-1">
Marco Secure Solution Pvt Limited
</p>
<div className="d-flex flex-column gap-2">
<div className="d-flex flex-wrap gap-2 align-items-center">
<p className="fw-semibold m-0">Industry:</p>
<p className="m-0">Information Technology (IT) Service</p>
</div>
<p className="text-start text-wrap m-0">
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 youre looking for career opportunities,
partnerships, or business solutions,
</p>
<button className="btn btn-primary btn-sm mt-2 align-self-start">
Go To Dashboard
</button>
</div>
</div>
</div>
</div>
</div>
</div>
);
};
export default TenantSelection;

View File

@ -51,7 +51,6 @@ import { Navigate } from "react-router-dom";
import CreateTenant from "../pages/Tenant/CreateTenant"; import CreateTenant from "../pages/Tenant/CreateTenant";
import OrganizationPage from "../pages/Organization/OrganizationPage"; import OrganizationPage from "../pages/Organization/OrganizationPage";
import LandingPage from "../pages/Home/LandingPage"; import LandingPage from "../pages/Home/LandingPage";
import TenantSelection from "../pages/authentication/TenantSelection";
const router = createBrowserRouter( const router = createBrowserRouter(
[ [
{ {
@ -62,7 +61,6 @@ const router = createBrowserRouter(
element: <AuthLayout />, element: <AuthLayout />,
children: [ children: [
{ path: "/auth/login", element: <MainLogin /> }, { path: "/auth/login", element: <MainLogin /> },
{ path: "/auth/user", element: <TenantSelection /> },
{ path: "/auth/login-otp", element: <MainLoginWithOTPPage /> }, { path: "/auth/login-otp", element: <MainLoginWithOTPPage /> },
{ path: "/auth/reqest/demo", element: <MainRegisterPage /> }, { path: "/auth/reqest/demo", element: <MainRegisterPage /> },
{ path: "/auth/forgot-password", element: <MainForgetPage /> }, { path: "/auth/forgot-password", element: <MainForgetPage /> },

View File

@ -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");
};

View File

@ -4,9 +4,7 @@ const globalVariablesSlice = createSlice({
name: "globalVariables", name: "globalVariables",
initialState: { initialState: {
loginUser: null, loginUser: null,
tenantList: [],
currentTenant: null, currentTenant: null,
permissions: [],
}, },
reducers: { reducers: {
setGlobalVariable: (state, action) => { setGlobalVariable: (state, action) => {
@ -14,10 +12,7 @@ const globalVariablesSlice = createSlice({
state[key] = value; state[key] = value;
}, },
setLoginUserPermmisions: (state, action) => { setLoginUserPermmisions: (state, action) => {
state.permissions = action.payload; state.loginUser = action.payload;
},
setLoginUserTenants: (state, action) => {
state.tenantList = action.payload;
}, },
setCurrentTenant: (state, action) => { setCurrentTenant: (state, action) => {
state.currentTenant = action.payload; state.currentTenant = action.payload;
@ -25,10 +20,6 @@ const globalVariablesSlice = createSlice({
}, },
}); });
export const { export const { setGlobalVariable, setLoginUserPermmisions, setCurrentTenant } =
setGlobalVariable, globalVariablesSlice.actions;
setLoginUserPermmisions,
setCurrentTenant,
setLoginUserTenants,
} = globalVariablesSlice.actions;
export default globalVariablesSlice.reducer; export default globalVariablesSlice.reducer;

View File

@ -1,9 +1,9 @@
import axios from "axios"; import axios from "axios";
import { useNavigate } from "react-router-dom";
import axiosRetry from "axios-retry"; import axiosRetry from "axios-retry";
import showToast from "../services/toastService"; import showToast from "../services/toastService";
import { startSignalR, stopSignalR } from "../services/signalRService"; import { startSignalR, stopSignalR } from "../services/signalRService";
import { BASE_URL } from "./constants"; import { BASE_URL } from "./constants";
const base_Url = BASE_URL; const base_Url = BASE_URL;
export const axiosClient = axios.create({ 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( axiosClient.interceptors.request.use(
async (config) => { async (config) => {
const requiresAuth = config.authRequired !== false; const requiresAuth = config.authRequired !== false; // default to true
if (requiresAuth) { if (requiresAuth) {
let token = localStorage.getItem("jwtToken"); // tenant token by default const token = localStorage.getItem("jwtToken");
if (config.orgToken) token = localStorage.getItem("orgJwtToken"); // org token if requested
if (token) { if (token) {
config.headers["Authorization"] = `Bearer ${token}`; config.headers["Authorization"] = `Bearer ${token}`;
config._retry = true; config._retry = true;
@ -36,12 +37,13 @@ axiosClient.interceptors.request.use(
(error) => Promise.reject(error) (error) => Promise.reject(error)
); );
// Response interceptor // 🔄 Response Interceptor Handle 401, refresh token, etc.
axiosClient.interceptors.response.use( axiosClient.interceptors.response.use(
(response) => response, (response) => response,
async (error) => { async (error) => {
const originalRequest = error.config; const originalRequest = error.config;
// Skip retry for public requests or already retried ones
if ( if (
(!originalRequest && originalRequest._retry) || (!originalRequest && originalRequest._retry) ||
originalRequest.authRequired === false originalRequest.authRequired === false
@ -49,6 +51,7 @@ axiosClient.interceptors.response.use(
return Promise.reject(error); return Promise.reject(error);
} }
// Avoid showing multiple toasts
if (!originalRequest._toastShown) { if (!originalRequest._toastShown) {
originalRequest._toastShown = true; originalRequest._toastShown = true;
@ -68,25 +71,34 @@ axiosClient.interceptors.response.use(
if (status === 401 && !isRefreshRequest) { if (status === 401 && !isRefreshRequest) {
originalRequest._retry = true; originalRequest._retry = true;
const refreshToken = localStorage.getItem("refreshToken"); const refreshToken = localStorage.getItem("refreshToken");
if (!refreshToken) { if (
!refreshToken ||
error.response.data?.errors === "Invalid or expired refresh token."
) {
redirectToLogin(); redirectToLogin();
return Promise.reject(error); return Promise.reject(error);
} }
stopSignalR(); stopSignalR();
try { try {
// Refresh token call
const res = await axiosClient.post("/api/Auth/refresh-token", { const res = await axiosClient.post("/api/Auth/refresh-token", {
token: localStorage.getItem("jwtToken"), token: localStorage.getItem("jwtToken"),
refreshToken, refreshToken,
}); });
const { token, refreshToken: newRefreshToken } = res.data.data; const { token, refreshToken: newRefreshToken } = res.data.data;
// Save updated tokens
localStorage.setItem("jwtToken", token); localStorage.setItem("jwtToken", token);
localStorage.setItem("refreshToken", newRefreshToken); localStorage.setItem("refreshToken", newRefreshToken);
startSignalR(); startSignalR();
// Set Authorization header
originalRequest.headers["Authorization"] = `Bearer ${token}`; originalRequest.headers["Authorization"] = `Bearer ${token}`;
return axiosClient(originalRequest); return axiosClient(originalRequest);
} catch (refreshError) { } catch (refreshError) {
@ -121,41 +133,40 @@ const apiRequest = async (method, url, data = {}, config = {}) => {
// Exported API wrapper // Exported API wrapper
export const api = { export const api = {
// Public routes (no token required)
postPublic: (url, data = {}, customHeaders = {}) => postPublic: (url, data = {}, customHeaders = {}) =>
apiRequest("post", url, data, { apiRequest("post", url, data, {
headers: { ...customHeaders }, headers: { ...customHeaders },
authRequired: false, authRequired: false,
}), }),
get: (url, params = {}, customHeaders = {}, orgToken = false) => // Authenticated routes
get: (url, params = {}, customHeaders = {}) =>
apiRequest("get", url, params, { apiRequest("get", url, params, {
headers: { ...customHeaders }, headers: { ...customHeaders },
authRequired: true, authRequired: true,
orgToken,
}), }),
post: (url, data = {}, customHeaders = {}, orgToken = false) => post: (url, data = {}, customHeaders = {}) =>
apiRequest("post", url, data, { apiRequest("post", url, data, {
headers: { ...customHeaders }, headers: { ...customHeaders },
authRequired: true, authRequired: true,
orgToken,
}), }),
put: (url, data = {}, customHeaders = {}, orgToken = false) => put: (url, data = {}, customHeaders = {}) =>
apiRequest("put", url, data, { apiRequest("put", url, data, {
headers: { ...customHeaders }, headers: { ...customHeaders },
authRequired: true, authRequired: true,
orgToken,
}), }),
delete: (url, data = {}, customHeaders = {}, orgToken = false) => delete: (url, data = {}, customHeaders = {}) =>
apiRequest("delete", url, data, { apiRequest("delete", url, data, {
headers: { ...customHeaders }, headers: { ...customHeaders },
authRequired: true, authRequired: true,
orgToken,
}), }),
}; };
// Redirect helper
function redirectToLogin() { function redirectToLogin() {
window.location.href = "/auth/login"; window.location.href = "/auth/login";
} }