Files
5960453fe0 feat(mobile): implement forced app update via Remote Config (#7299)
* feat(mobile): implement forced app update via Firebase Remote Config

Add version gating on cold start using Firebase Remote Config with
per-platform keys (min_required_version_ios/android, recommended_version_ios/android).
Force update shows a blocking full-screen, soft update shows a dismissable bottom sheet.
Fail-open design ensures the app never locks users out on fetch failure.

* fix(mobile): codescene

* fix(mobile): address PR review comments

- Fix misleading comment in soft-update E2E test to match assertion
- Add caret prefix to @react-native-firebase/remote-config for consistency

* fix(mobile): package.json deps

* fix(mobile): guard navigation effects until app update check completes

Prevent useInitialNavigationScreen from calling router.replace() while
the Stack navigator is unmounted (isLoading=true). Also remove unused
setE2eRemoteConfigScenario dead code and fix inaccurate E2E comment.

fix(mobile): switch to const

fix(mobile): pin firebase packages to exact 23.3.1

Yarn hardened mode (enabled on public PRs) re-resolves ^23.3.1 to
23.8.6 causing lockfile mismatch with --immutable. Pinning to exact
versions ensures consistent resolution across local and CI.

fix(mobile): remove unreachable E2E mock scenarios

Simplify remoteConfigService.e2e.ts by removing the Scenario type and
unused force_update/soft_update entries that became dead code after
setE2eRemoteConfigScenario was removed.

fix(mobile): dependencies

fix(mobile): address PR review - dead code and soft update check

- Decouple soft update check from min version validation so an invalid
  min_required_version doesn't silently suppress the soft update prompt
- Remove unused AppUpdateEvent type export
- Remove unused isInitialized getter from both remoteConfigService files

fix(mobile): broken navigation

for some unknown reason the isLoading block was preventing the “get started” button on the onboarding screen from working. I know it is wild, but no idea what is going so reverting this change for now.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-03-03 17:49:19 +01:00

46 lines
1.1 KiB
YAML

appId: ${APP_ID}
tags:
- app-update
- smoke
---
# Force Update Screen E2E Test
# Verifies that when a force update is required, the blocking screen
# is shown with the correct UI elements and the update button is present.
- runFlow:
file: ../../utils/setup/app-start.yml
# Set up an onboarded account so the app loads normally first
- tapOn:
id: 'e2eOnboardedAccount'
# Wait for the home screen to confirm app loaded normally
- assertVisible:
id: 'home-tab'
# Trigger force update scenario via hidden test control
- tapOn:
id: 'e2eForceUpdate'
# ============================================
# Verify Force Update Screen
# ============================================
# The full-screen blocking UI should now be visible
- assertVisible:
id: 'force-update-screen'
# Verify the heading text
- assertVisible: 'Update required'
# Verify the description text
- assertVisible: '.*Please update to continue using the app.*'
# Verify the update button is present
- assertVisible:
id: 'force-update-button'
# Verify the home tab is no longer visible (screen is blocking)
- assertNotVisible:
id: 'home-tab'