Download apps/admin/src/pages/super-admin/SuperAdminLayout.tsx from safetrack/edtech: direct link, hf CLI and curl.
- Browser
- Download file 5.22 kB
-
https://huggingface.co/spaces/safetrack/edtech/resolve/main/apps/admin/src/pages/super-admin/SuperAdminLayout.tsx
- Command line
-
hf download hf://spaces/safetrack/edtech/apps/admin/src/pages/super-admin/SuperAdminLayout.tsx
-
curl -L -o SuperAdminLayout.tsx https://huggingface.co/spaces/safetrack/edtech/resolve/main/apps/admin/src/pages/super-admin/SuperAdminLayout.tsx
5.22 kB
| import { Outlet, NavLink, useNavigate } from 'react-router-dom'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { useAuth } from '@/lib/auth'; | |
| import { useTenant } from '@/lib/tenant'; | |
| import { | |
| LayoutDashboard, Building2, Users, Phone, MessageSquare, Contact2, | |
| Activity, CreditCard, Bot, LogOut, ChevronLeft, ScrollText | |
| } from 'lucide-react'; | |
| const NAV_ITEMS = [ | |
| { to: '/platform/dashboard', icon: LayoutDashboard, labelKey: 'super_admin.nav_dashboard' }, | |
| { to: '/platform/organizations', icon: Building2, labelKey: 'super_admin.nav_organizations' }, | |
| { to: '/platform/users', icon: Users, labelKey: 'super_admin.nav_users' }, | |
| { to: '/platform/whatsapp', icon: Phone, labelKey: 'super_admin.nav_whatsapp' }, | |
| { to: '/platform/whatsapp/templates', icon: MessageSquare, labelKey: 'super_admin.nav_templates' }, | |
| { to: '/platform/whatsapp/profiles', icon: Contact2, labelKey: 'super_admin.nav_profiles' }, | |
| { to: '/platform/monitoring', icon: Activity, labelKey: 'super_admin.nav_monitoring' }, | |
| { to: '/platform/billing', icon: CreditCard, labelKey: 'super_admin.nav_billing' }, | |
| { to: '/platform/ai', icon: Bot, labelKey: 'super_admin.nav_ai' }, | |
| { to: '/platform/audit-logs', icon: ScrollText, labelKey: 'super_admin.nav_audit_logs' }, | |
| ]; | |
| export default function SuperAdminLayout() { | |
| const { t } = useTranslation(); | |
| const { user, logout } = useAuth(); | |
| const { setSelectedOrgId } = useTenant(); | |
| const navigate = useNavigate(); | |
| function handleExit() { | |
| setSelectedOrgId(null); | |
| navigate('/'); | |
| } | |
| return ( | |
| <div className="flex h-screen bg-slate-950 text-white overflow-hidden"> | |
| {/* Sidebar */} | |
| <aside className="w-60 shrink-0 bg-slate-900 border-r border-slate-800 flex flex-col"> | |
| <div className="px-4 py-5 border-b border-slate-800"> | |
| <div className="text-xs font-semibold text-violet-400 uppercase tracking-widest mb-0.5">XAMLÉ</div> | |
| <div className="text-base font-bold text-white">{t('super_admin.platform_admin')}</div> | |
| </div> | |
| <nav className="flex-1 overflow-y-auto py-3 px-2 space-y-0.5"> | |
| {NAV_ITEMS.map(({ to, icon: Icon, labelKey }) => ( | |
| <NavLink | |
| key={to} | |
| to={to} | |
| className={({ isActive }) => | |
| `flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition-colors ${ | |
| isActive | |
| ? 'bg-violet-600 text-white' | |
| : 'text-slate-400 hover:text-white hover:bg-slate-800' | |
| }` | |
| } | |
| > | |
| <Icon className="w-4 h-4 shrink-0" /> | |
| {t(labelKey)} | |
| </NavLink> | |
| ))} | |
| </nav> | |
| <div className="p-3 border-t border-slate-800 space-y-1"> | |
| <button | |
| onClick={handleExit} | |
| className="flex items-center gap-3 w-full px-3 py-2 rounded-lg text-sm text-slate-400 hover:text-white hover:bg-slate-800 transition-colors" | |
| > | |
| <ChevronLeft className="w-4 h-4" /> | |
| {t('super_admin.exit_admin')} | |
| </button> | |
| <button | |
| onClick={logout} | |
| className="flex items-center gap-3 w-full px-3 py-2 rounded-lg text-sm text-red-400 hover:text-red-300 hover:bg-slate-800 transition-colors" | |
| > | |
| <LogOut className="w-4 h-4" /> | |
| {t('super_admin.logout')} | |
| </button> | |
| </div> | |
| </aside> | |
| {/* Main */} | |
| <div className="flex-1 flex flex-col min-w-0 overflow-hidden"> | |
| {/* Top bar */} | |
| <header className="h-14 shrink-0 bg-slate-900 border-b border-slate-800 flex items-center justify-between px-6"> | |
| <div className="text-sm text-slate-400"> | |
| {t('super_admin.super_admin_label')} · <span className="text-white">{user?.email || user?.name || 'Admin'}</span> | |
| </div> | |
| <div className="flex items-center gap-2"> | |
| <div className="w-2 h-2 rounded-full bg-green-400 animate-pulse" /> | |
| <span className="text-xs text-slate-400">{t('super_admin.system_active')}</span> | |
| </div> | |
| </header> | |
| {/* Page content */} | |
| <main className="flex-1 overflow-y-auto bg-slate-950"> | |
| <div className="p-6 max-w-screen-xl mx-auto"> | |
| <Outlet /> | |
| </div> | |
| </main> | |
| </div> | |
| </div> | |
| ); | |
| } | |