import { PatchDiff } from "@pierre/diffs/react"; import { XIcon } from "lucide-react"; import { useMemo } from "react"; import { isElectron } from "../env"; import { deriveTurnDiffSummaries, formatTimestamp } from "../session-logic"; import { useStore } from "../store"; import { Button } from "./ui/button"; import { cn } from "~/lib/utils"; export default function DiffPanel() { const { state, dispatch } = useStore(); const activeThread = state.threads.find((thread) => thread.id === state.activeThreadId); const turnDiffSummaries = useMemo( () => deriveTurnDiffSummaries(activeThread?.events ?? []), [activeThread?.events], ); const canApplyStoredTarget = Boolean(activeThread && state.diffThreadId === activeThread.id); const selectedTurnId = canApplyStoredTarget ? state.diffTurnId : null; const selectedFilePath = canApplyStoredTarget ? state.diffFilePath : null; const selectedTurn = turnDiffSummaries.find((summary) => summary.turnId === selectedTurnId) ?? turnDiffSummaries[0]; const selectedFile = selectedTurn?.files.find((file) => file.path === selectedFilePath) ?? selectedTurn?.files[0]; const selectedPatch = selectedFile?.diff ?? selectedTurn?.unifiedDiff; const selectTurn = (turnId: string) => { if (!activeThread) return; const turn = turnDiffSummaries.find((summary) => summary.turnId === turnId); dispatch({ type: "SET_DIFF_TARGET", threadId: activeThread.id, turnId, ...(turn?.files[0]?.path ? { filePath: turn.files[0].path } : {}), }); }; const selectFile = (filePath: string) => { if (!activeThread || !selectedTurn) return; dispatch({ type: "SET_DIFF_TARGET", threadId: activeThread.id, turnId: selectedTurn.turnId, filePath, }); }; return ( ); }