From edd8fe80895377f3bcd875f454b1ca17593d21bf Mon Sep 17 00:00:00 2001 From: Yashwin Date: Fri, 19 Jun 2026 16:46:01 +0530 Subject: [PATCH] refactor: centralize platform resources and improve role-based access control with standardized parsing and updated permission hooks --- src/components/layout/Header.tsx | 15 +- src/components/layout/Sidebar.tsx | 102 +- src/components/shared/FailedEmailsTable.tsx | 64 +- .../superadmin/PlatformRolesTable.tsx | 1220 +++++++++++++++++ .../superadmin/PlatformUsersTable.tsx | 1035 ++++++++++++++ src/components/superadmin/RolesTable.tsx | 96 +- src/constants/platformResources.ts | 34 + src/hooks/usePermissions.ts | 28 +- src/pages/Login.tsx | 17 +- src/pages/ProtectedRoute.tsx | 9 +- src/pages/superadmin/AIFallbackHistory.tsx | 41 +- src/pages/superadmin/Modules.tsx | 54 +- src/pages/superadmin/NotificationMaster.tsx | 170 ++- .../superadmin/NotificationTemplateMaster.tsx | 66 +- src/pages/superadmin/Roles.tsx | 458 +------ src/pages/superadmin/SmtpConfig.tsx | 10 +- src/pages/superadmin/Tenants.tsx | 44 +- src/pages/superadmin/Users.tsx | 491 +------ src/pages/tenant/TenantProtectedRoute.tsx | 9 +- src/routes/super-admin-routes.tsx | 10 + src/services/role-service.ts | 6 +- src/services/user-service.ts | 11 +- src/types/user.ts | 8 +- 23 files changed, 2783 insertions(+), 1215 deletions(-) create mode 100644 src/components/superadmin/PlatformRolesTable.tsx create mode 100644 src/components/superadmin/PlatformUsersTable.tsx create mode 100644 src/constants/platformResources.ts diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 80da0d8..580e6c3 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -17,7 +17,7 @@ interface HeaderProps { export const Header = ({ breadcrumbs, currentPage, onMenuClick }: HeaderProps): ReactElement => { const navigate = useNavigate(); const dispatch = useAppDispatch(); - const { user, isLoading,roles } = useAppSelector((state) => state.auth); + const { user, isLoading, roles, tenantId } = useAppSelector((state) => state.auth); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const dropdownRef = useRef(null); @@ -61,6 +61,8 @@ export const Header = ({ breadcrumbs, currentPage, onMenuClick }: HeaderProps): }; }, [isDropdownOpen]); + const isPlatformUser = roles.includes('super_admin') || tenantId === '00000000-0000-0000-0000-000000000001'; + // Handle logout const handleLogout = async (e: React.MouseEvent): Promise => { e.preventDefault(); @@ -72,10 +74,9 @@ export const Header = ({ breadcrumbs, currentPage, onMenuClick }: HeaderProps): // Check if user is on a tenant route to determine redirect path // Note: use /tenant/ instead of /tenant to avoid matching /tenants const isTenantRoute = window.location.pathname.startsWith('/tenant/') || window.location.pathname === '/tenant'; - const isSuperAdmin = roles.includes('super_admin'); - // Super admins always go to root login, tenant users go to /tenant/login if on a tenant route - const redirectPath = isSuperAdmin ? '/' : (isTenantRoute ? '/tenant/login' : '/'); + // Platform users always go to root login, tenant users go to /tenant/login if on a tenant route + const redirectPath = isPlatformUser ? '/' : (isTenantRoute ? '/tenant/login' : '/'); try { // Call logout API with Bearer token @@ -110,7 +111,7 @@ export const Header = ({ breadcrumbs, currentPage, onMenuClick }: HeaderProps): > - + {/* Breadcrumbs */}