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
>
);
}
export function AdminShell({
activeMenu = 'dashboard',
children,
}: {
activeMenu?: AdminMenu;
children: ReactNode;
}) {
return (
{children}
);
}