Skip to content

chore(runway): cherry-pick fix: compliance modal appear once on asset page cp-7.74.0#29208

Merged
chloeYue merged 1 commit into
release/7.74.00from
runway-cherry-pick-7.74.0-1776882373
Apr 23, 2026
Merged

chore(runway): cherry-pick fix: compliance modal appear once on asset page cp-7.74.0#29208
chloeYue merged 1 commit into
release/7.74.00from
runway-cherry-pick-7.74.0-1776882373

Conversation

@runway-github
Copy link
Copy Markdown
Contributor

@runway-github runway-github Bot commented Apr 22, 2026

Description

On the token details (spot assets) page, tapping Long or Short
when a wallet is OFAC-blocked would open the AccessRestrictedModal
correctly the first time, but pressing either button again would do
nothing — the modal could never be reopened without leaving and
re-entering the screen.

Root cause: TokenDetailsActions sets a navigationLockRef to
true on every button tap to prevent rapid double-navigation. It is
cleared by three paths: screen refocus, navigation state change, or an
explicit resetNavigationLockRef callback passed in from the parent.
When useComplianceGate's gate() detects a blocked wallet it shows
AccessRestrictedModal (rendered at the app root by
AccessRestrictedProvider) and returns early — no navigation occurs,
the screen never blurs, and the external reset was never called. The
lock stayed true permanently, silently swallowing all subsequent
Long/Short presses.

Fix: Added .finally(() => resetNavigationLockRef.current?.()) to
both handleLongPress and handleShortPress in
AssetOverviewContent.tsx. This mirrors what the geo-block path already
does inside closeEligibilityModal. The call is a safe no-op when
handlePerpsAction navigates away, since the focus/state listeners also
clear the lock in that case.

Additionally, AccessRestrictedModal was migrated from the legacy
internal BottomSheet component to the BottomSheet exported by
@metamask/design-system-react-native, which is the single source of
truth for bottom sheets in the codebase. The
shouldNavigateBack={false} prop was also removed — the design-system
BottomSheet does not expose this prop and the modal is rendered at the
app root so no back-navigation is possible regardless.

Changelog

CHANGELOG entry: Fixed an issue where the access-restricted compliance
modal could not be reopened after being dismissed on the token details
page.

Related issues

No issue: bug fix for observed regression on the compliance-gated
Long/Short buttons on the token details screen.

Manual testing steps

Feature: Access-restricted compliance modal on the token details page

  Background:
    Given I am logged into MetaMask Mobile
    And my wallet address is flagged as OFAC-blocked (compliance check returns blocked)
    And I am on the token details page for a token that has a Perps market (e.g. ETH)

  Scenario: user can reopen the compliance modal after dismissing it
    Given I see the Long and Short action buttons

    When user taps the Long button
    Then the access-restricted bottom sheet modal appears

    When user dismisses the modal by tapping the close button
    Then the modal is dismissed

    When user taps the Long button again
    Then the access-restricted bottom sheet modal appears again

  Scenario: user can open the compliance modal via the Short button after a previous dismissal
    Given I see the Long and Short action buttons

    When user taps the Short button
    Then the access-restricted bottom sheet modal appears

    When user dismisses the modal by tapping the close button
    Then the modal is dismissed

    When user taps the Short button again
    Then the access-restricted bottom sheet modal appears again

Screenshots/Recordings

Before

N/A

After

N/A

Pre-merge author checklist

Performance checks (if applicable)

  • I've tested on Android
    • Ideally on a mid-range device; emulator is acceptable
  • I've tested with a power user scenario
  • Use these power-user
    SRPs

    to import wallets with many accounts and tokens
  • I've instrumented key operations with Sentry traces for production
    performance metrics
  • See trace() for usage and
    addToken
    for an example

For performance guidelines and tooling, see the Performance
Guide
.

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the
    app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described
    in the ticket it closes and includes the necessary testing evidence such
    as recordings and or screenshots.

Note

Low Risk
Low risk bug fix that only adjusts button press flow and a modal
implementation; main risk is unintended double-tap navigation if the
lock is cleared too aggressively.

Overview
Fixes an issue where Long/Short on the token details screen could
only open the compliance access-restricted modal once by ensuring the
TokenDetailsActions navigation lock is always released when
useComplianceGate().gate() completes (including non-navigating paths).

Migrates AccessRestrictedModal to use the design-system
BottomSheet component and removes the unsupported shouldNavigateBack
prop. Adds tests to assert repeated Long/Short presses re-invoke
gate() when it resolves without navigating.

Reviewed by Cursor Bugbot for commit
5a47cb7. Bugbot is set up for automated
code reviews on this repo. Configure
here.

[0b88c75](https://github.com/MetaMask/metamask-mobile/commit/0b88c751672d3b14769528aedb5ef13cf3cc3488)

… page cp-7.74.0 (#29201)

<!--
Please submit this PR as a draft initially.

Do not mark it as "Ready for review" until this PR meets the canonical
Definition of Ready For Review in `docs/readme/ready-for-review.md`.

In short: the template must be materially complete (not just section
titles
present), all status checks must be currently passing, and the only
expected
follow-up commits must be reviewer-driven.
-->

## **Description**

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

On the token details (spot assets) page, tapping **Long** or **Short**
when a wallet is OFAC-blocked would open the `AccessRestrictedModal`
correctly the first time, but pressing either button again would do
nothing — the modal could never be reopened without leaving and
re-entering the screen.

**Root cause:** `TokenDetailsActions` sets a `navigationLockRef` to
`true` on every button tap to prevent rapid double-navigation. It is
cleared by three paths: screen refocus, navigation state change, or an
explicit `resetNavigationLockRef` callback passed in from the parent.
When `useComplianceGate`'s `gate()` detects a blocked wallet it shows
`AccessRestrictedModal` (rendered at the app root by
`AccessRestrictedProvider`) and returns early — no navigation occurs,
the screen never blurs, and the external reset was never called. The
lock stayed `true` permanently, silently swallowing all subsequent
Long/Short presses.

**Fix:** Added `.finally(() => resetNavigationLockRef.current?.())` to
both `handleLongPress` and `handleShortPress` in
`AssetOverviewContent.tsx`. This mirrors what the geo-block path already
does inside `closeEligibilityModal`. The call is a safe no-op when
`handlePerpsAction` navigates away, since the focus/state listeners also
clear the lock in that case.

Additionally, `AccessRestrictedModal` was migrated from the legacy
internal `BottomSheet` component to the `BottomSheet` exported by
`@metamask/design-system-react-native`, which is the single source of
truth for bottom sheets in the codebase. The
`shouldNavigateBack={false}` prop was also removed — the design-system
`BottomSheet` does not expose this prop and the modal is rendered at the
app root so no back-navigation is possible regardless.

## **Changelog**

CHANGELOG entry: Fixed an issue where the access-restricted compliance
modal could not be reopened after being dismissed on the token details
page.

## **Related issues**

No issue: bug fix for observed regression on the compliance-gated
Long/Short buttons on the token details screen.

## **Manual testing steps**

```gherkin
Feature: Access-restricted compliance modal on the token details page

  Background:
    Given I am logged into MetaMask Mobile
    And my wallet address is flagged as OFAC-blocked (compliance check returns blocked)
    And I am on the token details page for a token that has a Perps market (e.g. ETH)

  Scenario: user can reopen the compliance modal after dismissing it
    Given I see the Long and Short action buttons

    When user taps the Long button
    Then the access-restricted bottom sheet modal appears

    When user dismisses the modal by tapping the close button
    Then the modal is dismissed

    When user taps the Long button again
    Then the access-restricted bottom sheet modal appears again

  Scenario: user can open the compliance modal via the Short button after a previous dismissal
    Given I see the Long and Short action buttons

    When user taps the Short button
    Then the access-restricted bottom sheet modal appears

    When user dismisses the modal by tapping the close button
    Then the modal is dismissed

    When user taps the Short button again
    Then the access-restricted bottom sheet modal appears again
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

N/A

### **After**

N/A

## **Pre-merge author checklist**

<!--
Every checklist item must be consciously assessed before marking this PR
as
"Ready for review". A checked box means you deliberately considered that
responsibility, not that you literally performed every action listed.

Unchecked boxes are ambiguous: they are not an implicit "N/A" and they
are not
a silent "skip". See `docs/readme/ready-for-review.md` for the full
checklist
semantics.
-->

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

#### Performance checks (if applicable)

- [x] I've tested on Android
  - Ideally on a mid-range device; emulator is acceptable
- [x] I've tested with a power user scenario
- Use these [power-user
SRPs](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/edit-v2/401401446401?draftShareId=9d77e1e1-4bdc-4be1-9ebb-ccd916988d93)
to import wallets with many accounts and tokens
- [x] I've instrumented key operations with Sentry traces for production
performance metrics
- See [`trace()`](/app/util/trace.ts) for usage and
[`addToken`](/app/components/Views/AddAsset/components/AddCustomToken/AddCustomToken.tsx#L274)
for an example

For performance guidelines and tooling, see the [Performance
Guide](https://consensyssoftware.atlassian.net/wiki/spaces/TL1/pages/400085549067/Performance+Guide+for+Engineers).

## **Pre-merge reviewer checklist**

<!--
Reviewer checklist items follow the same semantics as the author
checklist: an
unchecked box is ambiguous, a checked box means the reviewer consciously
assessed that responsibility. See `docs/readme/ready-for-review.md`.
-->

- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Low risk bug fix that only adjusts button press flow and a modal
implementation; main risk is unintended double-tap navigation if the
lock is cleared too aggressively.
> 
> **Overview**
> Fixes an issue where `Long`/`Short` on the token details screen could
only open the compliance access-restricted modal once by ensuring the
`TokenDetailsActions` navigation lock is always released when
`useComplianceGate().gate()` completes (including non-navigating paths).
> 
> Migrates `AccessRestrictedModal` to use the design-system
`BottomSheet` component and removes the unsupported `shouldNavigateBack`
prop. Adds tests to assert repeated `Long`/`Short` presses re-invoke
`gate()` when it resolves without navigating.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
5a47cb7. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
@runway-github runway-github Bot requested a review from a team as a code owner April 22, 2026 18:26
@github-actions
Copy link
Copy Markdown
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@metamaskbotv2 metamaskbotv2 Bot added the team-bots Bot team (for MetaMask Bot, Runway Bot, etc.) label Apr 22, 2026
@github-actions github-actions Bot added the risk-high Extensive testing required · High bug introduction risk label Apr 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

⏭️ Smart E2E selection skipped - PR targets a release branch (release/*)

All E2E tests pre-selected.

View GitHub Actions results

@sonarqubecloud
Copy link
Copy Markdown

Copy link
Copy Markdown
Contributor

@chloeYue chloeYue left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@github-actions
Copy link
Copy Markdown
Contributor

E2E Fixture Validation — Schema is up to date
12 value mismatches detected (expected — fixture represents an existing user).
View details

@chloeYue chloeYue merged commit bae7faf into release/7.74.00 Apr 23, 2026
267 of 270 checks passed
@chloeYue chloeYue deleted the runway-cherry-pick-7.74.0-1776882373 branch April 23, 2026 09:40
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

risk-high Extensive testing required · High bug introduction risk size-S team-bots Bot team (for MetaMask Bot, Runway Bot, etc.)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants