revertlogin initial steup in organization_management brnach
This commit is contained in:
parent
070fa93fca
commit
3e5afe0bc6
@ -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 you’re 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;
|
@ -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: <AuthLayout />,
|
||||
children: [
|
||||
{ path: "/auth/login", element: <MainLogin /> },
|
||||
{ path: "/auth/user", element: <TenantSelection /> },
|
||||
{ path: "/auth/login-otp", element: <MainLoginWithOTPPage /> },
|
||||
{ path: "/auth/reqest/demo", element: <MainRegisterPage /> },
|
||||
{ path: "/auth/forgot-password", element: <MainForgetPage /> },
|
||||
|
@ -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");
|
||||
};
|
@ -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;
|
||||
|
@ -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";
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user