import { A, useLocation, useNavigate } from '@solidjs/router'; import { createMemo, createSignal, onMount, type JSX } from 'solid-js'; import AdminSidebar from './AdminSidebar'; import { clearAdminSession, hasAdminSession } from '~/lib/admin-session'; import { sidebarCollapsed } from '~/lib/sidebar-state'; 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' }, ], }, { 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/approval', title: 'Approval Management' }, { prefix: '/admin/users', title: 'External User Management' }, { prefix: '/admin/company', title: 'Company Management' }, { prefix: '/admin/customer', title: 'Customer Management' }, { prefix: '/admin/candidate', title: 'Candidate Management' }, { prefix: '/admin/photographer', title: 'Photographer Management' }, { prefix: '/admin/makeup-artist', title: 'Makeup Artist Management' }, { prefix: '/admin/tutors', title: 'Tutor Management' }, { prefix: '/admin/developers', title: 'Developer Management' }, { prefix: '/admin/jobs', title: 'Jobs Management' }, { prefix: '/admin/leads', title: 'Leads Management' }, { prefix: '/admin/pricing', title: 'Pricing Management' }, { prefix: '/admin/invoice', title: 'Invoice Management' }, { prefix: '/admin/credit', title: 'Credit Management' }, { prefix: '/admin/ledger', title: 'Ledger Management' }, { prefix: '/admin/report', title: 'Report Management' }, { prefix: '/admin/roles', title: 'Internal Role Management' }, { prefix: '/admin/runtime-roles', title: 'External Role Management' }, { prefix: '/admin/onboarding-schemas', title: 'Onboarding Management' }, { prefix: '/admin', title: 'Dashboard' }, ]; export default function AdminShell(props: { children: JSX.Element }) { const location = useLocation(); const navigate = useNavigate(); const [checkedSession, setCheckedSession] = createSignal(false); 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(() => { if (!hasAdminSession()) { const from = encodeURIComponent(location.pathname + location.search); navigate(`/login?from=${from}`, { replace: true }); return; } setCheckedSession(true); }); const onLogout = () => { clearAdminSession(); navigate('/login', { replace: true }); }; return (
NXTGAUGE

{pageTitle()}

Super Admin

{checkedSession() ? (
{tabs().length > 0 ? (
) : null}
{props.children}
) : (

Checking session...

)}
); }