Overview
Fix Transfer to card and audit every numeric-keyboard screen for the same iOS outside-tap dismissal failure.
Root cause
The form used a plain View, which provides no outside-tap keyboard-dismiss behavior. iOS decimal-pad keyboards have no Done button, so the keyboard remained visible after tapping other rows.
Fix
- Use
ScrollViewwithkeyboardShouldPersistTaps='handled'so buttons, selectors, MAX, and currency chips still receive the first tap while the keyboard is open. - Wrap each affected scroll surface in
KeyboardDismissAreaso tapping non-input content still dismisses the keyboard. KeepkeyboardDismissMode='on-drag'where it was already present. -
KeyboardDismissAreaaccepts an optionalclassName, allowing the Send confirmation and Cash deposit amount screens to retain their exact NativeWind padding tokens. Withdraw v2 keeps its scroll indicator hidden. - Wallet Send:
handleSendnow callsKeyboard.dismiss()before registering the deposit / opening the AppKit prompt, so the keyboard never covers the signing prompt or error toast.
Review responses (Khanh Pham)
- Maestro chỉ có screenshot, chưa assert keyboard đã đóng:
fe/.maestro/app/batch2/transfer-keyboard-dismiss.yamlnow asserts, not just screenshots: numeric row1is visible while the keyboard is open andassertNotVisibleafter the outside tap, on both Transfer (tapFee) and Supply (tapAlready supplied). The typed value is anchored with^99$before the keyboard assertion so a missed focus fails loudly, and the one-tap asset-selector reopen after dismissal is still asserted. - WalletSend đánh dấu
handlednhưnghandleSendchưa dismiss keyboard trước khi mở prompt/toast: fixed indeposit-wallet-send-form.tsx;Keyboard.dismiss()is the first statement ofhandleSend. New regression testdismisses the keyboard before starting the wallet send flowfails on the old code and passes with the fix.
Verification
- Before the fix: Maestro screenshot showed the keyboard still visible after tapping
Fee. After the fix: the same flow completes and the new keyboard assertions pass. - Supply outside-tap dismissal is verified, and its asset selector still opens with one tap after reopening the keyboard.
- Login succeeds with one tap immediately after password input; the same Maestro flow failed before these review fixes.
- Full Jest: 1640/1640 tests pass across 155 suites.
pnpm type-check: pass.pnpm lint: 0 errors (remaining warnings pre-date this branch). - Maestro flow
transfer-keyboard-dismiss: every step COMPLETED on the iOS simulator, including the new keyboard assertions. - Current
origin/developis merged and the Cardholder conflict is resolved.