import { A, useLocation, useNavigate, useSearchParams } from '@solidjs/router'; import { createMemo, createSignal, onMount, type JSX } from 'solid-js'; import AdminSidebar from './AdminSidebar'; import { isExternalIdentity } from '~/lib/admin-auth'; import { clearAdminSession, hasAdminSession, setAdminSession } from '~/lib/admin-session'; type Tab = { href: string; label: string; exact?: boolean }; const TAB_SETS: Array<{ prefixes: string[]; tabs: Tab[] }> = [ { prefixes: ['/admin/roles'], tabs: [ { href: '/admin/roles', label: 'Internal Roles', exact: true }, { href: '/admin/roles/create', label: 'Create Role' }, { href: '/admin/roles/templates', label: 'Role Templates' }, ], }, { prefixes: ['/admin/runtime-roles'], tabs: [ { href: '/admin/runtime-roles', label: 'External Roles', exact: true }, { href: '/admin/runtime-roles/new', label: 'Create External Role' }, ], }, { prefixes: ['/admin/onboarding-schemas'], tabs: [ { href: '/admin/onboarding-schemas', label: 'Onboarding Flows', exact: true }, { href: '/admin/onboarding-schemas/new', label: 'Create Flow' }, ], }, { prefixes: ['/admin/internal-dashboard-management'], tabs: [ { href: '/admin/internal-dashboard-management', label: 'Internal Dashboards' }, ], }, { prefixes: ['/admin/external-dashboard-management'], tabs: [ { href: '/admin/external-dashboard-management', label: 'External Dashboards' }, ], }, { prefixes: ['/admin/role-ui-configs'], tabs: [ { href: '/admin/role-ui-configs', label: 'Config Inspector', exact: true }, { href: '/admin/role-ui-configs/new', label: 'Create Config' }, ], }, ]; const PAGE_TITLES: Array<{ prefix: string; title: string }> = [ { prefix: '/admin/employees', title: 'Employee Management' }, { prefix: '/admin/department', title: 'Department Management' }, { prefix: '/admin/designation', title: 'Designation Management' }, { prefix: '/admin/roles', title: 'Internal Role Management' }, { prefix: '/admin/runtime-roles', title: 'External Role Management' }, { prefix: '/admin/onboarding-schemas', title: 'External Onboarding Management' }, { prefix: '/admin/internal-dashboard-management', title: 'Internal Dashboard Management' }, { prefix: '/admin/external-dashboard-management', title: 'External Dashboard Management' }, { prefix: '/admin/role-ui-configs', title: 'External Dashboard Management' }, { prefix: '/admin/approval', title: 'Approval Management' }, { prefix: '/admin/users', title: 'Users Management' }, { prefix: '/admin/company', title: 'Company Management' }, { prefix: '/admin/candidate', title: 'Candidate Management' }, { prefix: '/admin/customer', title: 'Customer Management' }, { prefix: '/admin/photographer', title: 'Photographer Management' }, { prefix: '/admin/makeup-artist', title: 'Makeup Artist Management' }, { prefix: '/admin/tutors', title: 'Tutors Management' }, { prefix: '/admin/developers', title: 'Developers Management' }, { prefix: '/admin/video-editors', title: 'Video Editor Management' }, { prefix: '/admin/fitness-trainers', title: 'Fitness Trainer Management' }, { prefix: '/admin/catering-services', title: 'Catering Services Management' }, { prefix: '/admin/graphic-designers', title: 'Graphics Designer Management' }, { prefix: '/admin/social-media-managers', title: 'Social Media Manager Management' }, { prefix: '/admin/jobs', title: 'Jobs Management' }, { prefix: '/admin/leads', title: 'Leads Management' }, { prefix: '/admin/pricing', title: 'Pricing Management' }, { prefix: '/admin/credit', title: 'Credit Management' }, { prefix: '/admin/coupon', title: 'Coupon Management' }, { prefix: '/admin/discount', title: 'Discount Management' }, { prefix: '/admin/tax', title: 'Tax Management' }, { prefix: '/admin/order', title: 'Order Management' }, { prefix: '/admin/invoice', title: 'Invoice Management' }, { prefix: '/admin/review', title: 'Review Management' }, { prefix: '/admin/support', title: 'Support Management' }, { prefix: '/admin/kb', title: 'Knowledge Base Management' }, { prefix: '/admin/notifications', title: 'Notifications' }, { prefix: '/admin/report', title: 'Report Management' }, { prefix: '/admin/ledger', title: 'Ledger Management' }, { prefix: '/admin/workspace', title: 'Dashboard Workspace' }, { prefix: '/admin', title: 'Dashboard' }, ]; export default function AdminShell(props: { children: JSX.Element }) { const location = useLocation(); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const [checkedSession, setCheckedSession] = createSignal(false); const [adminName, setAdminName] = createSignal('Admin'); const [adminRole, setAdminRole] = createSignal('Super Admin'); const tabs = createMemo(() => { const path = location.pathname; for (const set of TAB_SETS) { if (set.prefixes.some((p) => path === p || path.startsWith(`${p}/`))) { return set.tabs; } } return []; }); const isTabActive = (tab: Tab) => { if (tab.exact) return location.pathname === tab.href; return location.pathname === tab.href || location.pathname.startsWith(`${tab.href}/`); }; const pageTitle = createMemo(() => { const path = location.pathname; for (const item of PAGE_TITLES) { if (path === item.prefix || path.startsWith(`${item.prefix}/`)) return item.title; } return 'Dashboard'; }); onMount(() => { const isLocalDev = typeof window !== 'undefined' && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1'); const isPreview = searchParams._preview === '1' || (typeof sessionStorage !== 'undefined' && sessionStorage.getItem('nxtgauge_admin_preview') === '1'); if (isPreview || isLocalDev) { if (typeof sessionStorage !== 'undefined') sessionStorage.setItem('nxtgauge_admin_preview', '1'); setAdminSession(); setCheckedSession(true); return; } const verify = async () => { if (!hasAdminSession()) { const from = encodeURIComponent(location.pathname + location.search); navigate(`/login?from=${from}`, { replace: true }); return; } try { const accessToken = typeof sessionStorage !== 'undefined' ? sessionStorage.getItem('nxtgauge_admin_access_token') || '' : ''; const response = await fetch('/api/gateway/users/auth/me', { method: 'GET', headers: { Accept: 'application/json', 'x-portal-target': 'admin', ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}), }, credentials: 'include', }); const payload = await response.json().catch(() => ({})); if (!response.ok || isExternalIdentity(payload)) throw new Error('Unauthorized'); if (payload?.full_name) setAdminName(payload.full_name); if (payload?.role?.name) setAdminRole(payload.role.name); setCheckedSession(true); } catch { clearAdminSession(); const from = encodeURIComponent(location.pathname + location.search); navigate(`/login?from=${from}`, { replace: true }); } }; void verify(); }); const onLogout = async () => { await fetch('/api/gateway/users/auth/logout', { method: 'POST', headers: { Accept: 'application/json', 'x-portal-target': 'admin' }, credentials: 'include', }).catch(() => {}); clearAdminSession(); if (typeof sessionStorage !== 'undefined') { sessionStorage.removeItem('nxtgauge_admin_access_token'); sessionStorage.removeItem('nxtgauge_admin_preview'); } navigate('/login', { replace: true }); }; const initials = () => adminName().charAt(0).toUpperCase() || 'A'; return (
{/* ── Fixed Header ── */}
{/* Left: logo + separator + page title */}
NXTGAUGE
{pageTitle()}
{/* Right: notifications + avatar + logout */}
{/* Notification bell */}
{/* Avatar + name */}
{/* Logout */}
{/* ── Body: sidebar + main (fixed, below header) ── */} {checkedSession() ? (
{/* Sidebar */} {/* Main content */}
{/* Sub-tabs (shown for multi-tab sections) */} {tabs().length > 0 && (
{tabs().map((tab) => ( {tab.label} ))}
)} {props.children}
) : ( /* Session check loading state */

Checking session…

)}
); }