import { router } from '@inertiajs/react'; import { BrainCircuit, Database, FileSliders, KeyRound, LayoutDashboard, LogOut, MessageSquare, Users, } from 'lucide-react'; import type { CSSProperties, ReactNode } from 'react'; import { useState, useSyncExternalStore } from 'react'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import AppearanceToggle from '@/components/appearance-toggle'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarTrigger, useSidebar, } from '@/components/ui/sidebar'; import { clearAuthSession, getStoredAuthUser } from '@/lib/auth'; import { dashboard as adminDashboard, llmConfig as adminLlmConfig, login as adminLogin, retrievalConfig as adminRetrievalConfig, vectordbConfig as adminVectorDbConfig, } from '@/routes/admin'; import { index as adminApiKeys } from '@/routes/admin/api-keys'; import { index as adminUsers } from '@/routes/admin/users'; export type AdminMenu = | 'api-keys' | 'dashboard' | 'llm-config' | 'rag-config' | 'retrieval-config' | 'settings' | 'users' | 'vector-retrieval-config' | 'vectordb-config'; const adminSidebarStyle = { '--sidebar-width': '260px', '--sidebar-width-icon': '64px', } as CSSProperties; function getStoredAdminName(): string { return getStoredAuthUser()?.name ?? 'Admin'; } function subscribeToAuthStorage(onStoreChange: () => void): () => void { if (typeof window === 'undefined') { return () => {}; } window.addEventListener('storage', onStoreChange); return () => window.removeEventListener('storage', onStoreChange); } function useStoredAdminName(): string { return useSyncExternalStore( subscribeToAuthStorage, getStoredAdminName, () => 'Admin', ); } function getInitials(name: string): string { return name .split(' ') .filter(Boolean) .slice(0, 2) .map((part) => part[0]?.toUpperCase()) .join(''); } function confirmLogout(): void { clearAuthSession(); router.visit(adminLogin.url()); } function AdminSidebarBrand() { const { state, toggleSidebar } = useSidebar(); const handleBrandClick = (): void => { if (state === 'collapsed') { toggleSidebar(); } }; return ( ); } function AdminSidebar({ activeMenu }: { activeMenu: AdminMenu }) { const adminName = useStoredAdminName(); const [isLogoutDialogOpen, setIsLogoutDialogOpen] = useState(false); return ( <> router.visit(adminDashboard()) } tooltip="Dashboard" > Dashboard router.visit(adminLlmConfig()) } tooltip="LLM Config" > LLM Config router.visit(adminVectorDbConfig()) } tooltip="VectorDB Config" > VectorDB Config router.visit(adminRetrievalConfig()) } tooltip="Retrieval Config" > Retrieval Config router.visit(adminApiKeys()) } tooltip="Generate API Key" > Generate API Key router.visit(adminUsers()) } tooltip="User Management" > User Management {getInitials(adminName) || 'AD'} {adminName} Admin setIsLogoutDialogOpen(true)} tooltip="Logout" > Logout Keluar dari akun admin? Anda perlu login kembali untuk mengakses dashboard admin. ); } export function AdminShell({ activeMenu = 'dashboard', children, }: { activeMenu?: AdminMenu; children: ReactNode; }) { return (
{children}
); }