import { useEffect, useMemo } from "react"; import { FileEdit, FileMinus, FilePlus, FileSymlink, FolderGit2, X } from "lucide-react"; import { useChangedFiles } from "../hooks/useChangedFiles"; import { highlightDiff } from "../utils/highlightDiff"; import type { TaskFileDiff } from "../api"; interface ChangedFilesModalProps { taskId: string; worktree: string | undefined; column: string; isOpen: boolean; onClose: () => void; } function getStatusLabel(status: TaskFileDiff["status"]): string { switch (status) { case "added": return "A"; case "deleted": return "D"; case "renamed": return "R"; default: return "M"; } } function getStatusIcon(status: TaskFileDiff["status"]) { switch (status) { case "added": return ; case "deleted": return ; case "renamed": return ; default: return ; } } function getDiffStat(diff: string): string { const lines = diff.split("\n"); const statLines = lines.filter((line) => line.startsWith("diff --git") || line.startsWith("index ") || line.startsWith("--- ") || line.startsWith("+++ ")); return statLines.join("\n").trim(); } export function ChangedFilesModal({ taskId, worktree, column, isOpen, onClose }: ChangedFilesModalProps) { const { files, loading, error, selectedFile, setSelectedFile } = useChangedFiles(taskId, worktree, column); useEffect(() => { if (!isOpen) return; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { onClose(); } }; document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [isOpen, onClose]); const selectedStat = useMemo(() => (selectedFile ? getDiffStat(selectedFile.diff) : ""), [selectedFile]); if (!isOpen) return null; return (
event.stopPropagation()}>
Changed Files — {taskId}
{!loading && !error && files.length > 0 && !selectedFile ? (
Select a file to view changes
) : null} {selectedFile ? (
{selectedFile.path} {getStatusLabel(selectedFile.status)} {selectedFile.oldPath ? Renamed from {selectedFile.oldPath} : null}
{selectedStat ?
{selectedStat}
: null}
                    {highlightDiff(selectedFile.diff || "No diff available")}
                  
) : null}
); }