import { useState, useEffect, useCallback } from 'react'; import { apiFetchAllSessions, apiFetchEnvironments } from '../api/client'; import type { Session, Environment } from '../types'; import { EnvironmentList } from '../components/EnvironmentList'; import { SessionList } from '../components/SessionList'; import { NewSessionDialog } from '../components/NewSessionDialog'; interface DashboardProps { onNavigateSession: (sessionId: string) => void; } export function Dashboard({ onNavigateSession }: DashboardProps) { const [sessions, setSessions] = useState([]); const [environments, setEnvironments] = useState([]); const [dialogOpen, setDialogOpen] = useState(false); const loadDashboard = useCallback(async () => { try { const [sess, envs] = await Promise.all([apiFetchAllSessions(), apiFetchEnvironments()]); setSessions(sess || []); setEnvironments(envs || []); } catch (err) { console.error('Dashboard render error:', err); } }, []); useEffect(() => { loadDashboard(); const interval = setInterval(loadDashboard, 10000); return () => clearInterval(interval); }, [loadDashboard]); const handleSessionCreated = (session: Session) => { setDialogOpen(false); onNavigateSession(session.id); }; const handleSelectEnvironment = useCallback((_env: Environment) => { // ACP agents require WebSocket connection and cannot be navigated to directly // Bridge environments: no direct navigation (sessions are listed below) }, []); const handleSelectSession = useCallback( (sessionId: string) => { onNavigateSession(sessionId); }, [onNavigateSession], ); return (

Dashboard

{/* Environments */}

Environments

{/* Sessions */}

Sessions

setDialogOpen(false)} onCreated={handleSessionCreated} />
); }