import Cookies from 'js-cookie'; import { useCallback, useEffect, useRef } from 'react'; import { createRoot, type Root } from 'react-dom/client'; import { useNavigate } from 'react-router-dom'; import { UserManagementApp } from '@tria-plc/iamui'; import type { DesignConfig, UserManagementSessionOptions } from '@tria-plc/iamui'; import '@tria-plc/iamui/style.css'; const UM_OVERRIDES = ` .um-theme-light { --background: #ffffff !important; --foreground: #1f2937 !important; --card: #ffffff !important; --card-foreground: #1f2937 !important; --popover: #ffffff !important; --popover-foreground: #1f2937 !important; --secondary: #f1f5f9 !important; --secondary-foreground: #1e293b !important; --muted: #f1f5f9 !important; --muted-foreground: #64748b !important; --accent: var(--primary) !important; --accent-foreground: var(--primary-foreground) !important; --border: #e2e8f0 !important; --input: #e2e8f0 !important; --sidebar: #ffffff !important; --sidebar-foreground: #1e293b !important; --sidebar-accent: #f1f5f9 !important; --sidebar-accent-foreground: #1e293b !important; --sidebar-border: #e2e8f0 !important; --sidebar-ring: var(--primary) !important; --color-amber-50: #eff6ff !important; --color-amber-100: #dbeafe !important; --color-yellow-50: #eff6ff !important; --color-yellow-100: #dbeafe !important; } [class*="bg-[#f7efe8]"] { background-color: #f1f5f9 !important; } [class*="bg-[#f2ece8]"] { background-color: #f1f5f9 !important; } [class*="hover:bg-[#f7efe8]"]:hover { background-color: #f1f5f9 !important; } [class*="hover:bg-[#f2ece8]"]:hover { background-color: #f1f5f9 !important; } [class*="border-[#e6d8cc]"] { border-color: #e2e8f0 !important; } [class*="bg-[#fffdfa]"] { background-color: #ffffff !important; } [class*="bg-[#fcf7f3]"] { background-color: #f8fafc !important; } [class*="bg-[#fffaf6]"] { background-color: #f8fafc !important; } [class*="text-[#432319]"] { color: #1e293b !important; } [class*="text-[#7a6a61]"] { color: #64748b !important; } [class*="text-[#6b4a3d]"] { color: #475569 !important; } .um-theme-light [class*="dark:border-gray-900"], .um-theme-light [class*="dark:border-gray-800"], .um-theme-light [class*="dark:border-gray-700"], .um-theme-light [class*="dark:border-gray-600"], .um-theme-light [class*="dark:border-slate-800"], .um-theme-light [class*="dark:border-slate-700"] { border-color: #e2e8f0 !important; } `; const UM_CONFIG: DesignConfig = { brand: { appName: 'Ethiopian Maritime Licence', logoUrl: '/assets/emaLogo.jpg', }, colors: { primary: '#2563eb', sidebar: '#ffffff', background: '#f8fafc', foreground: '#1e293b', border: '#e2e8f0', mutedForeground: '#94a3b8', card: '#ffffff', }, typography: { fontFamily: 'Inter, ui-sans-serif, system-ui, sans-serif', }, layout: { userManagementView: 'classic', sidebarBrandLabel: 'Ethiopian Maritime Authority', sidebarBrandSublabel: 'User Management', sidebarBackground: '#ffffff', sidebarColor: '#1e293b', sidebarMutedColor: '#94a3b8', sidebarActiveBackground: '#eff6ff', sidebarActiveColor: '#2563eb', sidebarHoverBackground: '#f8fafc', sidebarBorder: '#e2e8f0', sidebarWidth: '280px', sidebarCollapsedWidth: '80px', modalAccentColor: '#2563eb', modalHeaderBackground: '#f8fafc', modalHeaderEditBackground: '#eff6ff', modalIconBackground: '#eff6ff', modalIconColor: '#2563eb', modalTitleColor: '#1e293b', modalFocusColor: '#2563eb', modalSurface: '#ffffff', }, }; const UM_RUNTIME = { basename: '/um', // Keep the embedded IAM module on the same API as the backoffice client. // When VITE_BASE_API_URL is absent locally, passing undefined makes iamui // fall back to its remote development server, where the local JWT is // rejected and the module redirects to its login page. apiUrl: import.meta.env.VITE_BASE_API_URL ?? 'http://localhost:3000/api', }; const buttonStyle: React.CSSProperties = { position: 'fixed', top: 12, left: 12, zIndex: 9999, display: 'flex', alignItems: 'center', gap: 6, padding: '8px 16px', border: '1px solid #e2e8f0', borderRadius: 8, background: '#ffffff', color: '#2563eb', fontSize: 14, fontWeight: 600, cursor: 'pointer', fontFamily: 'Inter, ui-sans-serif, system-ui, sans-serif', boxShadow: '0 1px 3px rgba(0,0,0,0.08)', transition: 'all 150ms ease', }; export default function UserManagementPage() { const containerRef = useRef(null); const rootRef = useRef(null); const navigate = useNavigate(); const handleReturn = useCallback(() => { navigate('/dashboard'); }, [navigate]); useEffect(() => { if (!containerRef.current) return; const style = document.createElement('style'); style.textContent = UM_OVERRIDES; document.head.appendChild(style); const token = Cookies.get('ema-backoffice-auth-token') ?? ''; const refreshToken = Cookies.get('ema-backoffice-refresh-token'); const session: UserManagementSessionOptions = { initialSession: token ? { token, refreshToken, rememberMe: true } : null, enableEmbeddedAuthBridge: false, }; rootRef.current = createRoot(containerRef.current); rootRef.current.render( , ); return () => { if (rootRef.current) { rootRef.current.unmount(); rootRef.current = null; } style.remove(); }; }, []); return ( <>
); }