Skip to content

Commit 1acc648

Browse files
fix: text buffer handling
1 parent a3a35f6 commit 1acc648

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

extensions/cli/src/ui/EditMessageSelector.test.tsx

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,7 @@ import React from "react";
77
import { describe, it, expect, vi, beforeEach } from "vitest";
88

99
import { EditMessageSelector } from "./EditMessageSelector.js";
10-
11-
// Mock TextBuffer for controlled testing
12-
vi.mock("./TextBuffer.js", () => {
13-
return {
14-
TextBuffer: vi.fn().mockImplementation(() => ({
15-
text: "",
16-
cursor: 0,
17-
setText: vi.fn(),
18-
setCursor: vi.fn(),
19-
handleInput: vi.fn(),
20-
})),
21-
};
22-
});
10+
import { TextBuffer } from "./TextBuffer.js";
2311

2412
describe("EditMessageSelector", () => {
2513
const createMockChatHistory = (count: number): ChatHistoryItem[] => {

extensions/cli/src/ui/EditMessageSelector.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,22 @@ export function EditMessageSelector({
3636
const [editText, setEditText] = useState("");
3737
const [cursorPosition, setCursorPosition] = useState(0);
3838

39+
// Stable callback for TextBuffer state changes (e.g., paste finalization)
40+
const onStateChange = React.useCallback(() => {
41+
setEditText(textBuffer.text);
42+
setCursorPosition(textBuffer.cursor);
43+
}, [textBuffer]);
44+
45+
// Set up callback for when TextBuffer state changes asynchronously
46+
React.useEffect(() => {
47+
textBuffer.setStateChangeCallback(onStateChange);
48+
49+
return () => {
50+
// Clear any pending timers on unmount
51+
textBuffer.clear();
52+
};
53+
}, [textBuffer, onStateChange]);
54+
3955
// Initialize edit text when selection changes
4056
React.useEffect(() => {
4157
if (!isEditing && userMessages[selectedIndex]) {

0 commit comments

Comments
 (0)