import { useCallback, useEffect } from "react"; import { useParams } from "react-router-dom"; import { projectsApi } from "../api/projects"; import { issuesApi } from "../api/issues"; import { useApi } from "../hooks/useApi"; import { usePanel } from "../context/PanelContext"; import { useCompany } from "../context/CompanyContext"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { ProjectProperties } from "../components/ProjectProperties"; import { StatusBadge } from "../components/StatusBadge"; import { EntityRow } from "../components/EntityRow"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import type { Issue } from "@paperclip/shared"; export function ProjectDetail() { const { projectId } = useParams<{ projectId: string }>(); const { selectedCompanyId } = useCompany(); const { openPanel, closePanel } = usePanel(); const { setBreadcrumbs } = useBreadcrumbs(); const projectFetcher = useCallback(() => { if (!projectId) return Promise.reject(new Error("No project ID")); return projectsApi.get(projectId); }, [projectId]); const issuesFetcher = useCallback(() => { if (!selectedCompanyId) return Promise.resolve([] as Issue[]); return issuesApi.list(selectedCompanyId); }, [selectedCompanyId]); const { data: project, loading, error } = useApi(projectFetcher); const { data: allIssues } = useApi(issuesFetcher); const projectIssues = (allIssues ?? []).filter((i) => i.projectId === projectId); useEffect(() => { setBreadcrumbs([ { label: "Projects", href: "/projects" }, { label: project?.name ?? projectId ?? "Project" }, ]); }, [setBreadcrumbs, project, projectId]); useEffect(() => { if (project) { openPanel(); } return () => closePanel(); }, [project]); // eslint-disable-line react-hooks/exhaustive-deps if (loading) return

Loading...

; if (error) return

{error.message}

; if (!project) return null; return (

{project.name}

{project.description && (

{project.description}

)}
Overview Issues ({projectIssues.length})
Status
{project.targetDate && (
Target Date

{project.targetDate}

)}
{projectIssues.length === 0 ? (

No issues in this project.

) : (
{projectIssues.map((issue) => ( } /> ))}
)}
); }