Repository navigation
[Bug]: iOS composer requires tapping outside text box before Send works on follow-up messages #11755
Description
Activity
Triage
Confirmed as a real iOS thread-composer send bug. Tapping Send while the editor is focused does not dispatch the follow-up; the first tap blurs/collapses, and only a later tap (after dismissing the keyboard) sends. The new-task draft screen sending on the first tap is a useful contrast, not a contradiction.
This is not a duplicate of #7390 (send stays disabled / draft bleed), #10956 (focus lost after skill pick), or #7440 (composer sits behind the keyboard during hydration). Same class as #10956 (blur collapses the card) but a different trigger. No open/merged PR fixes Send being swallowed while the thread composer is focused.
What’s going on
Thread composer (
apps/mobile)ThreadComposerkeys the card on focus:isExpanded = isFocused || settingsSheetPresentation.keepsComposerExpanded.- While typing, Send lives on the expanded toolbar (
ComposerActionButton+onPress={handleSend}). - Tapping Send is outside the native
UITextView. iOS resigns first responder (textViewDidEndEditing→onComposerBlur→handleBlur) before RNonPresscan fire. - Blur flips
isExpandedoff, unmounts that Send (pointerEvents="none"on the toolbar), mounts the compact Send in a different slot, and runsCOMPOSER_LAYOUT_TRANSITION(220ms, iOS only).onPressneeds touch-up on the same view, so the gesture dies.
Feed overlay
ThreadDetailScreenwraps the feed inBlurTargetViewwithonTouchStart/onTouchEnd→collapseComposer()→editor.blur().ThreadFeedalready useskeyboardShouldPersistTaps="always"andkeyboardDismissMode="none". A miss or stale Reanimated hit target (see #11114) can take the tap as “tap the transcript” and only dismiss.
Why new task works
NewTaskDraftScreenuses the same Send button andKeyboardStickyView, but it does not morph compact/expanded on focus. Blur does not remount Send, so the first tap lands.
Web already had to stop collapsing on composer-chrome taps (#9490). Mobile thread composer still treats any editor blur as “collapse the card,” including a tap on Send.
Suggested fix
- Do not remount/disable the expanded Send on the same gesture that hits it (
onPressIn, delay collapse until after press, or keep expanded across chrome taps). - Keep feed
collapseComposer()off composer chrome (exclude overlay bounds / don’t let those touches fall through). - Device-check: focused follow-up Send, Stop while focused, model/attachment with keyboard up, new-task first send unchanged. Android unverified.
Severity: medium–high (extra tap on every iOS follow-up).
Accepting this. Localized to the thread composer + feed overlay; new-task is the working control.
- addedbugSomething is broken or behaving incorrectly.Something is broken or behaving incorrectly.acceptedfeature request acceptedfeature request acceptedvia-triageFiled through npx t3 triageFiled through npx t3 triage
on Sep 14, 2026 Device details for reproduction:
- Device: iPhone 13 Pro Max
- OS Version: iOS 26.6.2
Not reproducable on latest Testflight. Hope to ahve a new app store release in the next day or two
Area
apps/mobile
Steps to reproduce
(Note: On the initial task draft screen, typing a message and immediately tapping Send works on the first tap without this issue.)
Actual behavior
Tapping the Send button while the composer text input is focused does not dispatch the message. The tap is swallowed / consumed by the blur/dismiss gesture, collapsing the composer or dismissing the keyboard without triggering the send action. The user must tap outside the text box first to dismiss the keyboard, and only then does the Send button respond to taps.
Expected behavior
Tapping the Send button while typing should immediately dispatch the message on the first tap, without requiring the user to blur the input beforehand.
Workaround
Tap anywhere outside the composer input box into the transcript feed to dismiss the keyboard and blur the composer first, then tap the Send button.
Supporting investigation
Source inspection of
apps/mobile:ThreadDetailScreen.tsx, the feed is wrapped with touch gesture handlers (BlurTargetViewwithonTouchStart/onTouchEndtriggeringcollapseComposer()), andLegendListis configured withkeyboardDismissMode="none".ThreadComposer.tsx, when typing, the composer is in an expanded state (isExpanded = true) withinKeyboardStickyView. When the Send button is tapped while the native text editor is the active first responder, the tap event triggers input blur and layout transitions (COMPOSER_LAYOUT_TRANSITION) beforeComposerActionButton'sonPresscallback can fire.NewTaskDraftScreen.tsx(where the initial message works on first tap) does not render the activeThreadFeed/LegendListtouch responder overlay behind the composer.Environment