fix(chat): prevent accidental abort on mobile touch send (#440)
Mobile touch send was firing on pointerdown and then same gesture click landed on stop button after UI switched to abort state. Removed pointerdown-based send/queue handlers and dedupe ref. Mobile send/queue now trigger from click path, avoiding retargeted click to stop.
This commit is contained in:
@@ -127,7 +127,6 @@ export const ChatInput: React.FC<ChatInputProps> = ({ onOpenSettings, scrollToBo
|
|||||||
const [showAbortStatus, setShowAbortStatus] = React.useState(false);
|
const [showAbortStatus, setShowAbortStatus] = React.useState(false);
|
||||||
const abortTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
|
const abortTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);
|
||||||
const prevWasAbortedRef = React.useRef(false);
|
const prevWasAbortedRef = React.useRef(false);
|
||||||
const sendTriggeredByPointerDownRef = React.useRef(false);
|
|
||||||
|
|
||||||
// Message queue
|
// Message queue
|
||||||
const queueModeEnabled = useMessageQueueStore((state) => state.queueModeEnabled);
|
const queueModeEnabled = useMessageQueueStore((state) => state.queueModeEnabled);
|
||||||
@@ -1660,30 +1659,11 @@ export const ChatInput: React.FC<ChatInputProps> = ({ onOpenSettings, scrollToBo
|
|||||||
<button
|
<button
|
||||||
type={isMobile ? 'button' : 'submit'}
|
type={isMobile ? 'button' : 'submit'}
|
||||||
disabled={!canSend || (!currentSessionId && !newSessionDraftOpen)}
|
disabled={!canSend || (!currentSessionId && !newSessionDraftOpen)}
|
||||||
onPointerDownCapture={(event) => {
|
|
||||||
if (!isMobile || event.pointerType !== 'touch') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!canSend || (!currentSessionId && !newSessionDraftOpen)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sendTriggeredByPointerDownRef.current = true;
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
handlePrimaryAction();
|
|
||||||
}}
|
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
if (!isMobile) {
|
if (!isMobile) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sendTriggeredByPointerDownRef.current) {
|
|
||||||
sendTriggeredByPointerDownRef.current = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
handlePrimaryAction();
|
handlePrimaryAction();
|
||||||
}}
|
}}
|
||||||
@@ -1704,26 +1684,8 @@ export const ChatInput: React.FC<ChatInputProps> = ({ onOpenSettings, scrollToBo
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={!hasContent || !currentSessionId}
|
disabled={!hasContent || !currentSessionId}
|
||||||
onPointerDownCapture={(event) => {
|
|
||||||
if (!isMobile || event.pointerType !== 'touch') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasContent || !currentSessionId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sendTriggeredByPointerDownRef.current = true;
|
|
||||||
event.preventDefault();
|
|
||||||
event.stopPropagation();
|
|
||||||
handleQueueMessage();
|
|
||||||
}}
|
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
if (isMobile) {
|
if (isMobile) {
|
||||||
if (sendTriggeredByPointerDownRef.current) {
|
|
||||||
sendTriggeredByPointerDownRef.current = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
handleQueueMessage();
|
handleQueueMessage();
|
||||||
|
|||||||
Reference in New Issue
Block a user