From caa2cae575ec98ecbc477d3c23a292c7794165fa Mon Sep 17 00:00:00 2001 From: iliya Date: Wed, 4 Mar 2026 01:21:23 +0200 Subject: [PATCH] feat: make new-file reject undo persistent Allow Ctrl/Cmd+Z to restore previously rejected NEW files without a time limit, while keeping normal editor undo behavior intact. Made-with: Cursor --- .../team/review/ChangeReviewDialog.tsx | 20 +++++++++++-------- .../components/team/review/ReviewToolbar.tsx | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/team/review/ChangeReviewDialog.tsx b/src/renderer/components/team/review/ChangeReviewDialog.tsx index 59a7d2c0..efac7fb9 100644 --- a/src/renderer/components/team/review/ChangeReviewDialog.tsx +++ b/src/renderer/components/team/review/ChangeReviewDialog.tsx @@ -606,14 +606,18 @@ export const ChangeReviewDialog = ({ // even if focus is inside a CM editor (focus often remains there after clicking buttons). const now = Date.now(); - // Undo: recently rejected NEW file (deleted from disk + removed from review list) - const removedRecently = now - lastNewFileRemoveAtRef.current < 30_000; + // Undo: rejected NEW file (deleted from disk + removed from review list) const removedStack = removedNewFileUndoStackRef.current; - if ( - removedRecently && - removedStack.length > 0 && - !document.activeElement?.closest('.cm-editor') - ) { + const lastHunkAt = Object.values(lastHunkActionAtRef.current).reduce( + (max, v) => Math.max(max, v), + 0 + ); + const lastReviewActionAt = Math.max(lastBulkActionAtRef.current, lastHunkAt); + const newFileWasLastAction = lastNewFileRemoveAtRef.current >= lastReviewActionAt; + const isInEditor = !!document.activeElement?.closest('.cm-editor'); + const lastViewConnected = !!lastFocusedEditorRef.current?.dom.isConnected; + const shouldPreferEditorUndo = isInEditor && lastViewConnected; + if (newFileWasLastAction && removedStack.length > 0 && !shouldPreferEditorUndo) { e.preventDefault(); e.stopPropagation(); const snap = removedStack.pop()!; @@ -621,7 +625,7 @@ export const ChangeReviewDialog = ({ ...snap.file, originalFullContent: '', modifiedFullContent: snap.restoreContent, - contentSource: 'disk-current', + contentSource: 'snippet-reconstruction', }; addReviewFile(snap.file, { index: snap.index, content: restoredContent }); setActiveFilePath(snap.file.filePath); diff --git a/src/renderer/components/team/review/ReviewToolbar.tsx b/src/renderer/components/team/review/ReviewToolbar.tsx index 1b93dae2..dde07a11 100644 --- a/src/renderer/components/team/review/ReviewToolbar.tsx +++ b/src/renderer/components/team/review/ReviewToolbar.tsx @@ -153,7 +153,7 @@ export const ReviewToolbar = ({ Undo - Undo last bulk operation (Ctrl+Z) + Undo last review operation (Ctrl+Z) )}