import React, { useState } from 'react' import { Link, usePage } from '@inertiajs/react' const buildAdminNavGroups = (isAdmin) => [ { label: 'Overview', items: [ { label: 'Dashboard', href: '/moderation', icon: 'fa-solid fa-gauge-high', exact: true }, { label: 'Daily Activity', href: '/moderation/activity', icon: 'fa-solid fa-calendar-day' }, { label: 'Online Users', href: '/moderation/traffic/online', icon: 'fa-solid fa-user-check' }, ], }, { label: 'People', items: [ { label: 'All Users', href: '/moderation/users', icon: 'fa-solid fa-users' }, { label: 'Staff', href: '/moderation/users?role=admin', icon: 'fa-solid fa-shield-halved' }, { label: 'Moderators', href: '/moderation/users?role=moderator', icon: 'fa-solid fa-user-shield' }, ], }, { label: 'Content', items: [ { label: 'Stories', href: '/moderation/stories', icon: 'fa-solid fa-feather-pointed' }, { label: 'Artworks', href: '/moderation/artworks', icon: 'fa-solid fa-images' }, { label: 'Featured Artworks', href: '/moderation/artworks/featured', icon: 'fa-solid fa-star' }, { label: 'Homepage Announcements', href: '/moderation/homepage/announcements', icon: 'fa-solid fa-bullhorn' }, { label: 'Upload Queue', href: '/moderation/uploads', icon: 'fa-solid fa-cloud-arrow-up' }, { label: 'Username Queue', href: '/moderation/usernames/moderation', icon: 'fa-solid fa-id-badge' }, { label: 'AI Biography', href: '/moderation/ai-biography', icon: 'fa-solid fa-wand-magic-sparkles' }, ], }, { label: 'Academy', items: [ { label: 'Academy Dashboard', href: '/moderation/academy/dashboard', icon: 'fa-solid fa-graduation-cap' }, { label: 'Academy Courses', href: '/moderation/academy/courses', icon: 'fa-solid fa-road' }, { label: 'Academy Lessons', href: '/moderation/academy/lessons', icon: 'fa-solid fa-book-open' }, { label: 'Academy Prompts', href: '/moderation/academy/prompts', icon: 'fa-solid fa-wand-magic-sparkles' }, { label: 'Academy Challenges', href: '/moderation/academy/challenges', icon: 'fa-solid fa-trophy' }, ], }, { label: 'System', items: [ ...(isAdmin ? [{ label: 'Auth Audit', href: '/moderation/auth-audit', icon: 'fa-solid fa-user-shield' }] : []), { label: 'Settings', href: '/moderation/settings', icon: 'fa-solid fa-gear' }, ], }, ] function NavLink({ item, active }) { const cls = `flex items-center gap-3 px-4 py-2.5 rounded-xl text-sm font-medium transition-all duration-200 ${ active ? 'bg-rose-500/20 text-rose-300 shadow-sm shadow-rose-500/10' : 'text-slate-400 hover:text-white hover:bg-white/5' }` // For some moderation surfaces (traffic/online) we prefer a full-page // navigation so the server-rendered blade view opens as its own page // instead of being handled by Inertia or opened inline. if (item.href === '/moderation/traffic/online') { return ( {item.label} ) } return ( {item.label} ) } function Sidebar({ pathname, isAdmin }) { const adminNavGroups = buildAdminNavGroups(isAdmin) const isActive = (item) => { if (item.exact) return pathname === item.href return pathname.startsWith(item.href.split('?')[0]) } return ( ) } export default function AdminLayout({ children, title, subtitle }) { const { url, props } = usePage() const [mobileOpen, setMobileOpen] = useState(false) const pathname = url.split('?')[0] const currentUserIsAdmin = Boolean(props.auth?.user?.is_admin) return (
{/* Desktop sidebar */}
{/* Mobile header */}
Admin Panel
{/* Mobile drawer */} {mobileOpen && (
setMobileOpen(false)} />
)} {/* Main content */}
{(title || subtitle) && (
{title &&

{title}

} {subtitle &&

{subtitle}

}
)} {children}
) }