import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import type { IssueDocument } from "@paperclipai/shared"; import { FileQuestion, Loader2 } from "lucide-react"; import { ApiError } from "@/api/client"; import { issuesApi } from "@/api/issues"; import { DocumentAnnotationsCountChip, IssueDocumentAnnotations } from "@/components/IssueDocumentAnnotations"; import { MarkdownBody } from "@/components/MarkdownBody"; import { QueryErrorState, useQueryView } from "@/components/QueryView"; import { queryKeys } from "@/lib/queryKeys"; import { documentDisplayTitle } from "@/lib/issue-artifacts"; import { useLocation } from "@/lib/router"; export function TaskDocumentPanel({ issueId, documentKey, initialDocument, revisionId, }: { issueId: string; documentKey: string; initialDocument?: IssueDocument; revisionId?: string; }) { const location = useLocation(); const [annotationPanelOpen, setAnnotationPanelOpen] = useState(false); const query = useQuery({ queryKey: [...queryKeys.issues.documents(issueId), documentKey, ...(revisionId ? ["revision", revisionId] : [])], queryFn: async () => { try { const current = await issuesApi.getDocument(issueId, documentKey); if (!revisionId) return current; const revision = await issuesApi.getDocumentRevision(issueId, documentKey, revisionId); return { ...current, title: revision.title, body: revision.body, format: revision.format, latestRevisionId: revision.id, latestRevisionNumber: revision.revisionNumber, updatedAt: revision.createdAt }; } catch (error) { if (error instanceof ApiError && error.status === 404) return null; throw error; } }, initialData: revisionId ? undefined : initialDocument, }); const view = useQueryView(query); if (query.isLoading || view.kind === "reconnecting") { return (
Loading document…
); } if (view.kind === "error") { return (
); } const document = query.data; if (!document) { return (

{revisionId ? "Reviewed revision unavailable" : "Document no longer available"}

{revisionId ? "The exact reviewed revision could not be found. The current version has not been substituted." : "Close this tab or choose another document."}

); } return (

{documentDisplayTitle(document)}

{`Revision ${document.latestRevisionNumber ?? 1}`} · {`Updated ${new Date(document.updatedAt).toLocaleString()}`} {!revisionId ? setAnnotationPanelOpen((open) => !open)} /> : · Reviewed version}
{document.body.trim() ? ( {document.body} ) : (

Document is empty.

)}
); }