import React, { useState, useMemo } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { ErrorBoundary } from "../shared/ErrorBoundary"; import { BarChart3, FileText, Upload, GitCompare, Link, Layers, Search, Bell, Settings, HelpCircle, User, ChevronDown, ChevronRight, PanelLeftClose, PanelLeftOpen, } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { useAgentGraph } from "@/context/AgentGraphContext"; import { useNavigation } from "@/context/NavigationContext"; import { WelcomeGuideModal } from "@/components/shared/WelcomeGuideModal"; import { SettingsModal } from "@/components/shared/SettingsModal"; interface SidebarItem { id: string; label: string; icon: React.ComponentType<{ className?: string }>; onClick: () => void; badge?: string | number; } interface SidebarGroup { id: string; label: string; items: SidebarItem[]; isCollapsible?: boolean; } interface SidebarProps { isCollapsed: boolean; onToggleSidebar: () => void; } export function AppSidebar({ isCollapsed, onToggleSidebar }: SidebarProps) { const { actions } = useAgentGraph(); const navigation = useNavigation(); const [expandedGroups, setExpandedGroups] = useState([ "main", "tools", ]); const [searchQuery, setSearchQuery] = useState(""); const [isNotificationsOpen, setIsNotificationsOpen] = useState(false); const [isHelpModalOpen, setIsHelpModalOpen] = useState(false); const [isSettingsModalOpen, setIsSettingsModalOpen] = useState(false); const handleDashboardClick = () => { actions.setActiveView("welcome"); }; // Memoize notification calculations const unreadNotificationsCount = useMemo(() => { return navigation.state.notifications.filter((n) => !n.read).length; }, [navigation.state.notifications]); const hasUnreadNotifications = unreadNotificationsCount > 0; const navigationGroups: SidebarGroup[] = [ { id: "main", label: "Main", isCollapsible: true, items: [ { id: "dashboard", label: "Dashboard", icon: BarChart3, onClick: () => actions.setActiveView("welcome"), }, { id: "traces", label: "My Traces", icon: FileText, onClick: () => actions.setActiveView("traces"), }, { id: "gallery", label: "Gallery", icon: Layers, onClick: () => actions.setActiveView("example-traces"), }, ], }, { id: "tools", label: "Tools", isCollapsible: true, items: [ { id: "upload", label: "Upload", icon: Upload, onClick: () => actions.setActiveView("upload"), }, { id: "compare", label: "Compare", icon: GitCompare, onClick: () => actions.setActiveView("graph-comparison"), }, { id: "connections", label: "Connections", icon: Link, onClick: () => actions.setActiveView("connections"), }, ], }, ]; const toggleGroup = (groupId: string) => { setExpandedGroups((prev) => prev.includes(groupId) ? prev.filter((id) => id !== groupId) : [...prev, groupId] ); }; return ( <> {/* Modals and Dialogs */} ); }