+ Changed files ({turnSummary.files.length}) +
+ +{formatMessageMeta( timelineEntry.message.createdAt, diff --git a/apps/web/src/components/DiffPanel.tsx b/apps/web/src/components/DiffPanel.tsx index 84a6cad50831d99a6d14174207309cecd3298b03..8cecdedd5d932b08009e59a8ecfe4090b73ebc8c 100644 --- a/apps/web/src/components/DiffPanel.tsx +++ b/apps/web/src/components/DiffPanel.tsx @@ -1,58 +1,145 @@ +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 { dispatch } = useStore(); + 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 ( -