import { useCallback, useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import { getDashboardSummary, type DashboardSummary } from "../api/dashboard"; import { getUserSessions } from "../api/sessions"; import { listProjects } from "../api/projects"; import { listToolTypes } from "../api/tool-types"; import type { Session as SessionApi } from "../types/session"; import type { Project } from "../types/project"; import type { ToolType } from "../types/tool-type"; import { DashboardSummary as DashboardSummaryComponent, ActiveSessionsList, ProjectsSection, QuickCreateForm, RecentSessionsSection, } from "../components/features/dashboard"; import { LoadingState, ErrorState } from "../components/ui"; import { useDashboardActions } from "../hooks/use-dashboard-actions"; import { listRepositories } from "../api/git-repositories"; import type { GitRepository } from "../types/git-repository"; type HomeStatus = "loading" | "ready" | "error"; type SessionView = SessionApi; export const HomePage = () => { const navigate = useNavigate(); const [status, setStatus] = useState("loading"); const [summary, setSummary] = useState(null); const [sessions, setSessions] = useState([]); const [projects, setProjects] = useState([]); const [repositories, setRepositories] = useState([]); const [toolTypes, setToolTypes] = useState([]); const safeSessions = Array.isArray(sessions) ? sessions : []; const loadHome = useCallback(async () => { setStatus("loading"); try { const [dashboard, sessionData, projectData, toolTypeData] = await Promise.all([ getDashboardSummary(), getUserSessions(), listProjects(), listToolTypes(), ]); setSummary(dashboard); setSessions(sessionData as SessionView[]); setProjects(projectData); setToolTypes(toolTypeData); setStatus("ready"); } catch { setStatus("error"); } }, []); useEffect(() => { void loadHome(); }, [loadHome]); const loadRepos = useCallback(async (projectId: string) => { try { setRepositories(await listRepositories(projectId)); } catch { setRepositories([]); } }, []); const activeSessions = useMemo( () => safeSessions.filter((s) => ["running", "building", "pending"].includes(s.status), ), [safeSessions], ); const recentSessions = useMemo( () => safeSessions .filter((s) => ["stopped", "error"].includes(s.status)) .slice(0, 5), [safeSessions], ); const actions = useDashboardActions(loadHome); return (

Workspace overview

Home

Open sessions, available projects, and the fastest path back into work.

{status === "loading" && } {status === "error" && ( void loadHome()} /> )} {status === "ready" && summary && ( <>

Open sessions

{activeSessions.length}

Available projects

{projects.length}

navigate(`/projects/${id}`)} />

Quick create

Start a session

)}
); }; export { HomePage as DashboardPage };