Repository navigation
feat(mobile): hardware keyboard send and recent chats on the app icon - #2380
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A shortcut tapped while the app was closed fired before the navigator and Host session were ready, so the app stayed on Chats. Hold it until the saved Host has loaded, as push routing does. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
main is red: #2382 added a direct primitives Tooltip import after #2386 required every tooltip to use ds/tooltip. No-ops once main carries the same fix. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
|
Generated by Claude Code |
…2380 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Under the scene life cycle Expo forwards the launch shortcut as a performActionFor event before any JS listener exists, and expo-quick-actions only read launchOptions, so QuickActions.initial was empty and the app stayed on Chats. Patch it to keep the first unobserved shortcut as the initial action. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF
…nshots Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Android phone result: FAIL on hardware Enter with the default IME; shortcuts PASS (Xiaomi, Android 16 / HyperOS 3, isolated QA Host, deepseek-v4.1-flash), release build of main Screenshots: 2380-android-keyboard/phone (commit 2b8b398)
Finding 1 (blocking for the feature): with the phone's default IME (WeChat keyboard / WeType), a physical keyboard's Enter and Ctrl+Enter only insert a newline in both the composer and the full-screen draft. The IME consumes the key and re-emits it as its own event, so the native check treats it as an on-screen key and lets it through. Tested with a temporary HID keyboard (removed afterwards); other IMEs not tried. Finding 2: the shortcuts use the default Android placeholder icon, not the Bot avatar. Shortcut order (Mira, Nova, QA Lounge) matched recency, and both warm and cold start open the right chat. Generated by Claude Code |
…#2401 (#2422) * fix(mobile): Android hardware Enter with WeType, attachment ✕, flick-up and shortcut icons - Treat an input-method Enter that echoes a hardware Enter as that key, so Enter and Ctrl+Enter send with WeType and similar input methods. - Stop the hidden measuring text in the composer from taking taps meant for the attachment ✕ and the mention list. - Lower the Android flick-up speed to 0.3 dp/ms. - Use the launcher icon for Android app shortcuts, which cannot draw SF Symbols. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF * docs(changes): link #2422 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF * fix(ci): keep the recent-chats test out of the root typecheck recent-chats.ts now imports react-native, whose timer globals clash with Node's in the root program, like the other excluded mobile tests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF * fix(mobile): show shared image thumbnails and hide the keyboard on Send to Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF * fix(mobile): send when an input method types the newline for a hardware Enter WeType on HyperOS types a newline into the field instead of sending the Enter key again. The view now watches the focused field and turns a newline typed within 500 ms of a sending hardware Enter into a send. Also recheck the clipboard once Android gives the window focus back, and name shared files that arrive as bare media ids after their type. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF * fix(mobile): keep the keyboard down while Send to is open Android can bring the keyboard back for the chat underneath after the share sheet opens. Hide it again whenever it shows or the app becomes active. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF --------- Co-authored-by: Claude <noreply@anthropic.com>
Requested by Vain · project thread
Before: with a hardware keyboard (iPad, or an Android phone with a keyboard paired), sending meant tapping the send button on screen, and on Android Enter only added a new line. Long-pressing the app icon showed only the system items.
After:
These are the next native QoL items Vain approved after #2364. Share-to-Bot comes in its own PR.
How:
modules/hardware-send, wraps the composer field.UIKeyCommandfor ⌘↩ fromkeyCommands. UIKit collects key commands along the responder chain, so the shortcut works only while the field inside is focused.dispatchKeyEventbefore the focusedEditTextgets it. It ignores events that come from the on-screen keyboard or from a virtual device.View.expo-quick-actions(6.0.2) sets the dynamic shortcut items.setItemsonly when the list changes.performActionForevent before any JS listener exists. The library filledinitialonly fromlaunchOptions, so a cold-start shortcut was dropped. A small pnpm patch keeps the first unobserved shortcut asinitial.main:release-notes-view.tsxnow gets its tooltip from the sharedds/tooltipwrapper (from fix(release): upgrade in place when DSH refuses an installed deepseekbot, and simplify the update notice #2382 against feat(client): show panel header action tooltips instantly #2386). The fix does nothing oncemainhas it.Screenshots (iOS Simulator)
https://raw.githubusercontent.com/BotHarness/DeepSeekBot/2d2f47c5999aa414af684c09daa6f928f7ffa8bb/.github/pr-screenshots/2380-hardware-send/2380-quick-actions-light.png"width="240">https://raw.githubusercontent.com/BotHarness/DeepSeekBot/2d2f47c5999aa414af684c09daa6f928f7ffa8bb/.github/pr-screenshots/2380-hardware-send/2380-quick-actions-dark.png"width="240">Notes
pnpm lint,pnpm format:check, root and mobiletsc, and the mobile vitest suite pass.HardwareSendTest, run by the Android native module job).🤖 Generated with Claude Code
https://claude.ai/code/session_01TYsJ1DZQ7Vd8sKVs6MMhdF