import { useCallback, useEffect, useRef, useState } from "react"; import type { IssueDocument } from "@paperclipai/shared"; import { ISSUE_CONTINUATION_SUMMARY_DOCUMENT_KEY } from "@paperclipai/shared"; import { Button } from "@/components/ui/button"; import { cn, relativeTime } from "../lib/utils"; import { MarkdownBody } from "./MarkdownBody"; import { Check, ChevronDown, ChevronRight, Copy, History } from "lucide-react"; type IssueContinuationHandoffProps = { document: IssueDocument | null | undefined; focusSignal?: number; }; export function IssueContinuationHandoff({ document, focusSignal = 0, }: IssueContinuationHandoffProps) { const [expanded, setExpanded] = useState(false); const [copied, setCopied] = useState(false); const [highlighted, setHighlighted] = useState(false); const rootRef = useRef(null); const copiedTimerRef = useRef | null>(null); useEffect(() => { return () => { if (copiedTimerRef.current) { clearTimeout(copiedTimerRef.current); } }; }, []); useEffect(() => { if (!document || focusSignal <= 0) return; setExpanded(true); setHighlighted(true); rootRef.current?.scrollIntoView({ behavior: "smooth", block: "center" }); const timer = setTimeout(() => setHighlighted(false), 3000); return () => clearTimeout(timer); }, [document, focusSignal]); const copyBody = useCallback(async () => { if (!document) return; await navigator.clipboard?.writeText(document.body); setCopied(true); if (copiedTimerRef.current) { clearTimeout(copiedTimerRef.current); } copiedTimerRef.current = setTimeout(() => setCopied(false), 1500); }, [document]); if (!document) return null; const title = document.title?.trim() || "Continuation handoff"; return (
{title} handoff
Updated {relativeTime(document.updatedAt)} {document.latestRevisionNumber > 0 ? ` - revision ${document.latestRevisionNumber}` : ""}
{expanded ? (
{document.body}
) : null}
); }