Skip to content

Commit aa9ccaf

Browse files
committed
fix: chat send race condition — pass text directly instead of setInput + setTimeout
The ChatHome onSend handler was setting input state then calling sendMessage() after 50ms timeout. But sendMessage captured the OLD closure with empty input. On iOS (slower WKWebView re-renders), the state update hadn't committed yet. Fix: sendMessage now accepts optional overrideText parameter, and ChatHome passes text directly. Same fix applied to regenerate handler.
1 parent 6104fca commit aa9ccaf

1 file changed

Lines changed: 4 additions & 8 deletions

File tree

components/agent-panel.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,8 +1189,8 @@ export function AgentPanel() {
11891189
}, [appendErrorMessage, appendStatusMessage])
11901190

11911191
// ─── Send message ─────────────────────────────────────────────
1192-
const sendMessage = useCallback(async () => {
1193-
const text = input.trim()
1192+
const sendMessage = useCallback(async (overrideText?: string) => {
1193+
const text = (overrideText ?? input).trim()
11941194
if (!text || sending) return
11951195

11961196
logChatDebug('send attempt', {
@@ -1938,8 +1938,7 @@ export function AgentPanel() {
19381938
if (userIdx < 0) return prev
19391939
const userMsg = prev[userIdx]
19401940
queueMicrotask(() => {
1941-
setInput(userMsg.content)
1942-
setTimeout(() => sendMessage(), 50)
1941+
sendMessage(userMsg.content)
19431942
})
19441943
return prev.slice(0, idx)
19451944
})
@@ -2126,10 +2125,7 @@ export function AgentPanel() {
21262125
<ChatHome
21272126
onSend={(text, mode) => {
21282127
setAgentMode(mode)
2129-
setInput(text)
2130-
setTimeout(() => {
2131-
sendMessage()
2132-
}, 50)
2128+
sendMessage(text)
21332129
}}
21342130
onSelectFolder={() => emit('open-folder')}
21352131
onCloneRepo={() => emit('open-folder')}

0 commit comments

Comments
 (0)