diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 6d82071512f..fbd7db07436 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1442,6 +1442,12 @@ const ChatViewComponent: React.ForwardRefRenderFunction { + vscode.postMessage({ type: "cancelAutoApproval" }) + }, []) + const itemContent = useCallback( (index: number, messageOrGroup: ClineMessage) => { const hasCheckpoint = modifiedMessages.some((message) => message.say === "checkpoint_saved") @@ -1459,6 +1465,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { expect(screen.getByText(/3s/)).toBeInTheDocument() }) }) + + describe("auto-approve toggle off mid-countdown", () => { + it("should call onCancelAutoApproval when autoApprovalEnabled changes to false during countdown", async () => { + const { rerender } = renderWithTestProviders( + , + defaultTestState, + ) + + // Should show countdown initially + expect(screen.getByText(/3s/)).toBeInTheDocument() + + // Advance timer partially + await act(async () => { + vi.advanceTimersByTime(1000) + }) + + // Countdown should be at 2s + expect(screen.getByText(/2s/)).toBeInTheDocument() + + // Clear mock to track calls from the toggle-off + mockOnCancelAutoApproval.mockClear() + + // User toggles auto-approve off + rerender( + + + + + , + ) + + // Countdown should disappear + expect(screen.queryByText(/\d+s/)).not.toBeInTheDocument() + + // onCancelAutoApproval should have been called to cancel the backend timeout + expect(mockOnCancelAutoApproval).toHaveBeenCalled() + + // Advance timer past original timeout - nothing should happen + await act(async () => { + vi.advanceTimersByTime(5000) + }) + + // onSuggestionClick should NOT have been called + expect(mockOnSuggestionClick).not.toHaveBeenCalled() + }) + + it("should call onCancelAutoApproval when alwaysAllowFollowupQuestions changes to false during countdown", async () => { + const { rerender } = renderWithTestProviders( + , + defaultTestState, + ) + + // Should show countdown initially + expect(screen.getByText(/3s/)).toBeInTheDocument() + + // Clear mock to track calls from the toggle-off + mockOnCancelAutoApproval.mockClear() + + // User disables follow-up question auto-approval + rerender( + + + + + , + ) + + // Countdown should disappear + expect(screen.queryByText(/\d+s/)).not.toBeInTheDocument() + + // onCancelAutoApproval should have been called to cancel the backend timeout + expect(mockOnCancelAutoApproval).toHaveBeenCalled() + }) + }) })