import { Plus, RefreshCw } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import type { AgentInfo, SessionInfo } from "sandbox-agent"; const SessionSidebar = ({ sessions, selectedSessionId, onSelectSession, onRefresh, onCreateSession, agents, agentsLoading, agentsError, sessionsLoading, sessionsError }: { sessions: SessionInfo[]; selectedSessionId: string; onSelectSession: (session: SessionInfo) => void; onRefresh: () => void; onCreateSession: (agentId: string) => void; agents: AgentInfo[]; agentsLoading: boolean; agentsError: string | null; sessionsLoading: boolean; sessionsError: string | null; }) => { const [showMenu, setShowMenu] = useState(false); const menuRef = useRef(null); useEffect(() => { if (!showMenu) return; const handler = (event: MouseEvent) => { if (!menuRef.current) return; if (!menuRef.current.contains(event.target as Node)) { setShowMenu(false); } }; document.addEventListener("mousedown", handler); return () => document.removeEventListener("mousedown", handler); }, [showMenu]); const agentLabels: Record = { claude: "Claude Code", codex: "Codex", opencode: "OpenCode", amp: "Amp", mock: "Mock" }; return (
Sessions
{showMenu && (
{agentsLoading &&
Loading agents...
} {agentsError &&
{agentsError}
} {!agentsLoading && !agentsError && agents.length === 0 && (
No agents available.
)} {!agentsLoading && !agentsError && agents.map((agent) => ( ))}
)}
{sessionsLoading ? (
Loading sessions...
) : sessionsError ? (
{sessionsError}
) : sessions.length === 0 ? (
No sessions yet.
) : ( sessions.map((session) => ( )) )}
); }; export default SessionSidebar;