You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After the Phase 9.5 chrome strip made HeadlessHost invisible, Goktug's
testing showed the user still sees a solid-white screen because the
headless flow enters via RAMP.TOKEN_SELECTION — an opaque V2 stack card
that sits between the consumer screen and the now-transparent Host.
Resolution: add a new outer slot RAMP.HEADLESS_ENTRY in MainNavigator
that mounts the same TokenListRoutes component as TOKEN_SELECTION, but
wraps it in the JS-stack transparent-overlay preset that BridgeModals,
EarnModals, MoneyModals, StakeModals, and PerpsModals already use:
options={{
...clearStackNavigatorOptionsWithTransitionAnimation,
presentation: 'transparentModal',
}}
useHeadlessBuy.startHeadlessBuy now navigates to HEADLESS_ENTRY instead
of TOKEN_SELECTION; the nested-screen descriptor that lands directly on
HEADLESS_HOST stays unchanged. UB2's entry through TOKEN_SELECTION is
untouched.
Slack thread:
https://consensys.slack.com/archives/C0AK3NXRM7W/p1778577403631269
Copy file name to clipboardExpand all lines: CHANGELOG.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
### Changed
11
+
12
+
- Made the Ramp Headless Host invisible so consumer-rendered loading UI is visible during a headless buy; added a transparent `RAMP.HEADLESS_ENTRY` outer route so the headless flow no longer renders an opaque V2 stack card on top of the consumer screen (Phase 9.5).
Deliverable: HeadlessHost is invisible (or bottom-sheet) and MMPay's TPC renders the only user-visible loading UI during a headless buy. Phase 8's dismissal contract continues to work unchanged.
623
623
624
+
### Phase 9.5 follow-ups (driven by Goktug's May 12 2026 testing feedback)
625
+
626
+
Goktug tested the chrome-stripped Host on May 12 and filed three complaints in the [follow-up thread](https://consensys.slack.com/archives/C0AK3NXRM7W/p1778577403631269).
After the chrome strip, the user still saw a solid-white screen because [MainNavigator.js:1172-1175](../../Nav/Main/MainNavigator.js) mounts the headless flow under `RAMP.TOKEN_SELECTION`, an opaque V2 stack card. The card sits between the consumer screen and the transparent Host.
631
+
632
+
Resolution: add a new outer slot `RAMP.HEADLESS_ENTRY` (in [Routes.ts](../../../../constants/navigation/Routes.ts)) that mounts the same `TokenListRoutes` component but with the JS-stack transparent-overlay preset:
This is the same pattern MainNavigator already uses for `BridgeModals`, `EarnModals`, `MoneyModals`, `StakeModals`, and `PerpsModals`. UB2's entry through `RAMP.TOKEN_SELECTION` stays untouched.
646
+
647
+
`useHeadlessBuy.startHeadlessBuy` now navigates to `RAMP.HEADLESS_ENTRY` instead of `RAMP.TOKEN_SELECTION`; the nested-screen descriptor (`{ screen: TOKEN_SELECTION, params: { screen: HEADLESS_HOST, ... } }`) is unchanged so it still lands directly on the Host.
648
+
649
+
Safety net for the unverified `beforeRemove` + `transparentModal` interaction: Phase 8's `useHeadlessSessionDismissal` fires `closeSession({ reason: 'user_dismissed' })` on unmount when `HEADLESS_HOST` is no longer in the navigator tree. `closeSession` idempotency means both paths can fire without producing duplicate `onClose` callbacks.
0 commit comments