import { useCallback, useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { createProject, deleteProject, listProjects, type ProjectCreateInput, } from "../api/projects"; import { Icon } from "../components/icon"; import type { Project } from "../types"; type ProjectsStatus = "loading" | "ready" | "error"; export const ProjectsPage = () => { const [status, setStatus] = useState("loading"); const [projects, setProjects] = useState([]); const [showCreate, setShowCreate] = useState(false); const [formName, setFormName] = useState(""); const [formDescription, setFormDescription] = useState(""); const [formError, setFormError] = useState(null); const [deleteConfirmId, setDeleteConfirmId] = useState(null); const loadProjects = useCallback(async () => { setStatus("loading"); try { const data = await listProjects(); setProjects(data); setStatus("ready"); } catch { setProjects([]); setStatus("error"); } }, []); useEffect(() => { void loadProjects(); }, [loadProjects]); const openCreate = () => { setFormName(""); setFormDescription(""); setFormError(null); setShowCreate(true); }; const closeCreate = () => { setShowCreate(false); setFormError(null); }; const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); setFormError(null); if (!formName.trim()) { setFormError("Project name is required"); return; } try { const input: ProjectCreateInput = { name: formName.trim(), description: formDescription.trim() || null, }; await createProject(input); closeCreate(); await loadProjects(); } catch { setFormError("Failed to save project"); } }; const handleDelete = async (projectId: string) => { try { await deleteProject(projectId); setDeleteConfirmId(null); await loadProjects(); } catch { setDeleteConfirmId(null); } }; const isEmpty = status === "ready" && projects.length === 0; return (

Projects

{status === "loading" &&

Loading projects...

} {status === "error" && (

Failed to load projects

)} {isEmpty &&

No projects yet. Create your first project above.

} {status === "ready" && projects.length > 0 && (
{projects.map((project) => (

{project.name}

{project.description &&

{project.description}

}
Settings {deleteConfirmId === project.id ? (
Are you sure?
) : ( )} Open Workspace
))}
)} {showCreate && (

Create Project