chore: begin Experimental app sunset#7320
Conversation
PR1 of the phased Experimental → Official migration.
- Adds an English-only DeprecationModal shown on every launch in Experimental
builds (gated by !isOfficial) pointing users to the official App Store and
Play Store listings.
- Repoints E2E to Official: new build_official_simulator fastlane lane,
assembleOfficialRelease on Android, IS_OFFICIAL=YES PlistBuddy on iOS,
Official keystore secrets, and Official APK / .app artifact paths.
- Templates all .maestro flow files appId to ${APP_ID}, with the value
injected per-platform by run-maestro.sh (chat.rocket.ios on iOS,
chat.rocket.android on Android).
No deletions of Experimental build infra, code paths, or store records —
those come in PR2 and PR3 once current Experimental users have migrated.
WalkthroughThis PR transitions the app from experimental to official builds. CI workflows now produce official Android APK and iOS simulator artifacts; Maestro tests are parameterized with APP_ID and run-maestro.sh passes APP_ID to maestro; a DeprecationModal is added and mounted for non-official builds. ChangesOfficial Build Migration
🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labelstype: feature, type: chore 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Warning Review ran into problems🔥 ProblemsErrors were encountered while retrieving linked issues. Errors (1)
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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/scripts/run-maestro.sh:
- Line 74: The APK install command currently swallows failures with "|| true";
update the invocation of adb install -r "app-official-release.apk" to stop
ignoring errors — remove the "|| true" and allow the non-zero exit to fail the
job (or replace it with explicit error handling that logs the failure and exits
non-zero). Locate the line containing the adb install command and ensure
failures are not masked so downstream steps cannot proceed with a missing or
stale app.
In @.github/workflows/e2e-build-ios.yml:
- Line 110: The gym call in the build_official_simulator fastlane lane is
missing the output_name, causing the produced artifact to be RocketChat.app
while the workflow expects Rocket.Chat.app; update the gym configuration inside
the build_official_simulator lane (the gym invocation that uses the RocketChat
scheme) to include output_name: "Rocket.Chat" to match the build_official lane
and ensure the uploaded artifact path matches.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 7d930dcc-eb92-4113-af70-d93cda509212
📒 Files selected for processing (108)
.github/scripts/run-maestro.sh.github/workflows/e2e-build-android.yml.github/workflows/e2e-build-ios.yml.github/workflows/maestro-android.yml.maestro/config.yml.maestro/helpers/create-account.yaml.maestro/helpers/erase-text.yaml.maestro/helpers/go-back.yaml.maestro/helpers/hide-keyboard.yaml.maestro/helpers/launch-app.yaml.maestro/helpers/login-with-deeplink.yaml.maestro/helpers/login.yaml.maestro/helpers/logout.yaml.maestro/helpers/navigate-to-login.yaml.maestro/helpers/navigate-to-recent-room.yaml.maestro/helpers/navigate-to-register.yaml.maestro/helpers/navigate-to-room-action.yaml.maestro/helpers/navigate-to-room.yaml.maestro/helpers/navigate-to-workspace.yaml.maestro/helpers/open-deeplink.yaml.maestro/helpers/search-and-navigate-room.yaml.maestro/helpers/search-room.yaml.maestro/helpers/send-message.yaml.maestro/helpers/setup.yaml.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml.maestro/tests/assorted/accessibility-and-appearance.yaml.maestro/tests/assorted/broadcast.yaml.maestro/tests/assorted/change-avatar.yaml.maestro/tests/assorted/changeserver.yaml.maestro/tests/assorted/deeplink.yaml.maestro/tests/assorted/delete-server.yaml.maestro/tests/assorted/display-perf.yaml.maestro/tests/assorted/i18n.yaml.maestro/tests/assorted/in-app-notification.yaml.maestro/tests/assorted/join-from-directory.yaml.maestro/tests/assorted/join-protected-room.yaml.maestro/tests/assorted/join-public-room.yaml.maestro/tests/assorted/profile.yaml.maestro/tests/assorted/setting.yaml.maestro/tests/assorted/status.yaml.maestro/tests/assorted/user-preferences.yaml.maestro/tests/assorted/utils/check-server.yaml.maestro/tests/assorted/utils/go-to-accessibility-appearance.yaml.maestro/tests/assorted/utils/go-to-display-pref.yaml.maestro/tests/assorted/utils/go-to-room-list.yaml.maestro/tests/assorted/utils/go-to-user-preference.yaml.maestro/tests/assorted/utils/nav-to-language.yaml.maestro/tests/e2ee/e2e-encryption.yaml.maestro/tests/e2ee/flows/accept-new-key-and-verify.yaml.maestro/tests/e2ee/flows/check-encrypted-room-without-key.yaml.maestro/tests/e2ee/flows/create-e2ee-room.yaml.maestro/tests/e2ee/flows/edit-message-and-verify.yaml.maestro/tests/e2ee/flows/enter-key-read-and-send.yaml.maestro/tests/e2ee/flows/quote-message.yaml.maestro/tests/e2ee/flows/reset-keys-and-send.yaml.maestro/tests/e2ee/flows/send-and-verify-message.yaml.maestro/tests/e2ee/flows/setup-user.yaml.maestro/tests/e2ee/flows/verify-message-unread.yaml.maestro/tests/e2ee/flows/verify-messages-read.yaml.maestro/tests/e2ee/utils/change-e2ee-key.yaml.maestro/tests/e2ee/utils/enter-e2e-key.yaml.maestro/tests/e2ee/utils/navigate-to-e2ee-security.yaml.maestro/tests/e2ee/utils/reset-e2ee-key.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-components.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-onboarding.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-room.yaml.maestro/tests/onboarding/change-password.yaml.maestro/tests/onboarding/forgot-password.yaml.maestro/tests/onboarding/legal.yaml.maestro/tests/onboarding/login/invalid-credentials.yaml.maestro/tests/onboarding/login/login.yaml.maestro/tests/onboarding/register/create-account.yaml.maestro/tests/onboarding/register/email-used.yaml.maestro/tests/onboarding/register/username-used.yaml.maestro/tests/onboarding/roomslist.yaml.maestro/tests/onboarding/server-history.yaml.maestro/tests/onboarding/workspace/invalid-workspace.yaml.maestro/tests/onboarding/workspace/valid-workspace.yaml.maestro/tests/room/create-dm-group.yaml.maestro/tests/room/create-room.yaml.maestro/tests/room/discussion.yaml.maestro/tests/room/ignoreuser.yaml.maestro/tests/room/jump-to-message.yaml.maestro/tests/room/mark-as-unread.yaml.maestro/tests/room/message-markdown-click.yaml.maestro/tests/room/room-actions.yaml.maestro/tests/room/room-info.yaml.maestro/tests/room/room-last-message-thread-50-plus.yaml.maestro/tests/room/room.yaml.maestro/tests/room/search-member.yaml.maestro/tests/room/search.yaml.maestro/tests/room/share-message.yaml.maestro/tests/room/threads.yaml.maestro/tests/room/unread-badge.yaml.maestro/tests/room/utils/clear-cache.yaml.maestro/tests/room/utils/expect-thread-messages.yaml.maestro/tests/room/utils/navigate-to-info-view.yaml.maestro/tests/room/utils/navigate-to-room-info.yaml.maestro/tests/teams/convert-team.yaml.maestro/tests/teams/create-team.yaml.maestro/tests/teams/team.yaml.maestro/tests/teams/utils/close-action-sheet.yaml.maestro/tests/teams/utils/create-channel.yaml.maestro/tests/teams/utils/open-action-sheet.yamlapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.tsapp/index.tsxios/fastlane/Fastfile
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: ESLint and Test / run-eslint-and-test
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{js,ts,jsx,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{js,ts,jsx,tsx}: Use descriptive names for functions, variables, and classes that clearly convey their purpose
Write comments that explain the 'why' behind code decisions, not the 'what'
Keep functions small and focused on a single responsibility
Use const by default, let when reassignment is needed, and avoid var
Prefer async/await over .then() chains for handling asynchronous operations
Use explicit error handling with try/catch blocks for async operations
Avoid deeply nested code; refactor complex logic into helper functions
Files:
app/index.tsxapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Use TypeScript for type safety; add explicit type annotations to function parameters and return types
Prefer interfaces over type aliases for defining object shapes in TypeScript
Use enums for sets of related constants rather than magic strings or numbers
Files:
app/index.tsxapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
**/*.{ts,tsx,js,jsx,json}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Prettier formatting with tabs, single quotes, 130 character width, no trailing commas, avoid arrow parens, and bracket same line
Files:
app/index.tsxapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use ESLint with
@rocket.chat/eslint-configbase including React, React Native, TypeScript, and Jest plugins
Files:
app/index.tsxapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
app/index.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
Configure Redux provider, theme, navigation, and notifications setup in 'app/index.tsx'
Files:
app/index.tsx
app/containers/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Place reusable UI components in 'app/containers/' directory
Files:
app/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
🧠 Learnings (3)
📚 Learning: 2026-03-05T14:28:10.004Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6997
File: .maestro/tests/room/message-markdown-click.yaml:28-39
Timestamp: 2026-03-05T14:28:10.004Z
Learning: In Maestro YAML selector fields (text, id) within the Rocket.Chat React Native repository, use the contains pattern '.*keyword.*' (leading and trailing '.*') for matching text. The pattern '.*keyword*.' is incorrect and will fail to match cases where the keyword appears at the end of the element's text. This guideline applies to all Maestro YAML selector fields across the codebase.
Applied to files:
.maestro/tests/assorted/utils/nav-to-language.yaml.maestro/tests/assorted/join-protected-room.yaml.maestro/tests/e2ee/flows/setup-user.yaml.maestro/tests/e2ee/flows/quote-message.yaml.maestro/tests/onboarding/register/username-used.yaml.maestro/tests/assorted/profile.yaml.maestro/tests/teams/create-team.yaml.maestro/tests/assorted/utils/go-to-accessibility-appearance.yaml.maestro/tests/assorted/delete-server.yaml.maestro/tests/room/mark-as-unread.yaml.maestro/tests/assorted/in-app-notification.yaml.maestro/tests/onboarding/register/create-account.yaml.maestro/tests/assorted/change-avatar.yaml.maestro/tests/assorted/join-from-directory.yaml.maestro/tests/assorted/setting.yaml.maestro/tests/room/create-dm-group.yaml.maestro/tests/onboarding/server-history.yaml.maestro/tests/assorted/i18n.yaml.maestro/tests/e2ee/flows/edit-message-and-verify.yaml.maestro/tests/e2ee/flows/accept-new-key-and-verify.yaml.maestro/tests/e2ee/utils/reset-e2ee-key.yaml.maestro/tests/onboarding/forgot-password.yaml.maestro/tests/room/search.yaml.maestro/tests/room/search-member.yaml.maestro/tests/e2ee/flows/create-e2ee-room.yaml.maestro/tests/e2ee/flows/reset-keys-and-send.yaml.maestro/tests/assorted/utils/go-to-user-preference.yaml.maestro/tests/room/share-message.yaml.maestro/tests/room/ignoreuser.yaml.maestro/tests/e2ee/flows/check-encrypted-room-without-key.yaml.maestro/tests/onboarding/workspace/valid-workspace.yaml.maestro/tests/room/create-room.yaml.maestro/tests/teams/convert-team.yaml.maestro/tests/room/message-markdown-click.yaml.maestro/tests/room/unread-badge.yaml.maestro/tests/e2ee/flows/enter-key-read-and-send.yaml.maestro/tests/e2ee/e2e-encryption.yaml.maestro/tests/teams/utils/open-action-sheet.yaml.maestro/tests/assorted/status.yaml.maestro/tests/room/room.yaml.maestro/tests/assorted/broadcast.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-onboarding.yaml.maestro/tests/teams/team.yaml.maestro/tests/room/threads.yaml.maestro/tests/assorted/utils/check-server.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-components.yaml.maestro/tests/keyboardNavigation/keyboard-navigation-room.yaml.maestro/tests/e2ee/utils/navigate-to-e2ee-security.yaml.maestro/tests/assorted/display-perf.yaml.maestro/tests/room/room-last-message-thread-50-plus.yaml.maestro/tests/assorted/accessibility-and-appearance.yaml.maestro/tests/onboarding/legal.yaml.maestro/tests/assorted/user-preferences.yaml.maestro/tests/e2ee/utils/change-e2ee-key.yaml.maestro/tests/teams/utils/close-action-sheet.yaml.maestro/tests/onboarding/login/login.yaml.maestro/tests/room/utils/navigate-to-info-view.yaml.maestro/tests/e2ee/utils/enter-e2e-key.yaml.maestro/tests/onboarding/change-password.yaml.maestro/tests/room/discussion.yaml.maestro/tests/onboarding/roomslist.yaml.maestro/tests/assorted/join-public-room.yaml.maestro/tests/teams/utils/create-channel.yaml.maestro/tests/onboarding/register/email-used.yaml.maestro/tests/room/jump-to-message.yaml.maestro/tests/assorted/changeserver.yaml.maestro/tests/e2ee/flows/verify-message-unread.yaml.maestro/tests/e2ee/flows/verify-messages-read.yaml.maestro/tests/e2ee/flows/send-and-verify-message.yaml.maestro/tests/room/utils/navigate-to-room-info.yaml.maestro/tests/room/room-actions.yaml.maestro/tests/room/room-info.yaml.maestro/tests/assorted/utils/go-to-room-list.yaml.maestro/tests/assorted/deeplink.yaml.maestro/tests/room/utils/expect-thread-messages.yaml.maestro/tests/onboarding/workspace/invalid-workspace.yaml.maestro/tests/room/utils/clear-cache.yaml.maestro/tests/onboarding/login/invalid-credentials.yaml.maestro/tests/assorted/utils/go-to-display-pref.yaml
📚 Learning: 2026-03-17T19:15:26.536Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6970
File: .maestro/tests/room/share-message.yaml:77-79
Timestamp: 2026-03-17T19:15:26.536Z
Learning: In YAML test files under .maestro/tests/room, use tapping the empty area (e.g., tapOn: point: 5%,10%) to dismiss both the bottom sheet and keyboard when needed. Do not rely on action-sheet-handle alone if the keyboard also needs to be dismissed in the same step. This pattern is acceptable for tests where a single tap should close both UI elements.
Applied to files:
.maestro/tests/room/mark-as-unread.yaml.maestro/tests/room/create-dm-group.yaml.maestro/tests/room/search.yaml.maestro/tests/room/search-member.yaml.maestro/tests/room/share-message.yaml.maestro/tests/room/ignoreuser.yaml.maestro/tests/room/create-room.yaml.maestro/tests/room/message-markdown-click.yaml.maestro/tests/room/unread-badge.yaml.maestro/tests/room/room.yaml.maestro/tests/room/threads.yaml.maestro/tests/room/room-last-message-thread-50-plus.yaml.maestro/tests/room/discussion.yaml.maestro/tests/room/jump-to-message.yaml.maestro/tests/room/room-actions.yaml.maestro/tests/room/room-info.yaml
📚 Learning: 2026-04-30T17:07:51.020Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7274
File: app/lib/services/voip/MediaCallEvents.ts:0-0
Timestamp: 2026-04-30T17:07:51.020Z
Learning: In this Rocket.Chat React Native codebase, the ESLint rule `no-void: error` is enforced. When you see a promise returned from an async call that is not awaited (a “floating promise”), do not silence it with the `void somePromise()` pattern. Instead, handle the promise explicitly by attaching `.catch(...)` (or otherwise awaiting/handling the error) so unhandled-rejection risks are addressed in a way that satisfies the existing ESLint configuration.
Applied to files:
app/index.tsxapp/containers/DeprecationModal/index.tsxapp/containers/DeprecationModal/styles.ts
🔇 Additional comments (113)
.maestro/helpers/logout.yaml (1)
1-1: LGTM — consistent parameterization..maestro/tests/room/discussion.yaml (1)
1-1: LGTM — correct parameterization..maestro/helpers/setup.yaml (1)
1-1: LGTM — parameterization applied correctly..maestro/tests/keyboardNavigation/keyboard-navigation-room.yaml (1)
1-1: LGTM — correct change..maestro/helpers/navigate-to-recent-room.yaml (1)
1-1: LGTM — correct parameterization..maestro/tests/e2ee/flows/verify-message-unread.yaml (1)
1-1: LGTM — parameterization correct..maestro/helpers/erase-text.yaml (1)
1-1: LGTM — parameterization applied consistently..maestro/tests/room/room.yaml (1)
1-1: LGTM — appId correctly parameterized.The change to
appId: ${APP_ID}enables runtime selection of the target app identifier, aligning with the PR's Official/Experimental build transition. All Maestro test and helper files have been updated consistently with this parameterization..maestro/tests/e2ee/utils/reset-e2ee-key.yaml (1)
1-1: LGTM!
appIdtemplating aligns with the PR-wide approach of injectingAPP_IDviarun-maestro.sh..maestro/tests/e2ee/flows/setup-user.yaml (1)
1-1: LGTM!Consistent with the per-platform
APP_IDinjection used across the Maestro suite..maestro/tests/e2ee/flows/reset-keys-and-send.yaml (1)
1-1: LGTM!
appId: ${APP_ID}is consistent with the rest of the Maestro flows in this PR..maestro/tests/room/utils/expect-thread-messages.yaml (1)
1-1: LGTM!
appIdparameterization matches the PR-wide templating..maestro/tests/room/utils/clear-cache.yaml (1)
1-1: LGTM!Consistent
${APP_ID}substitution; runtime app id will be supplied byrun-maestro.sh..maestro/tests/onboarding/workspace/invalid-workspace.yaml (1)
1-1: LGTM!
appIdtemplating aligns with the rest of the Maestro suite..maestro/helpers/navigate-to-room-action.yaml (1)
1-1: LGTM!Helper now correctly inherits
APP_IDfrom the runner environment..maestro/tests/assorted/utils/go-to-accessibility-appearance.yaml (1)
1-1: LGTM!
appId: ${APP_ID}matches the PR-wide Maestro parameterization..github/workflows/e2e-build-android.yml (1)
6-13: Official Android E2E build wiring looks consistent.The secret names, Gradle properties, assemble task, and uploaded artifact path all align with the Official flavor migration and are coherent end-to-end.
Also applies to: 20-21, 63-66, 75-76, 80-83, 87-87, 94-95
.maestro/tests/teams/team.yaml (1)
1-1: Good move to runtime appId injection.Using
${APP_ID}here keeps this flow portable across Official Android/iOS targets without duplicating test files..maestro/tests/e2ee/utils/change-e2ee-key.yaml (1)
1-1: Looks good — utility flow now follows shared app targeting.
appId: ${APP_ID}is consistent with the new Maestro runner contract..maestro/tests/room/room-info.yaml (1)
1-1: Approved: room-info flow is now environment-driven.Switching to
${APP_ID}correctly decouples this flow from the old experimental bundle id..maestro/tests/onboarding/change-password.yaml (1)
1-1: Nice update for cross-target onboarding E2E.
appId: ${APP_ID}keeps this test compatible with Official package/bundle IDs..maestro/tests/room/threads.yaml (1)
1-1: Approved — thread flow now correctly uses dynamic app targeting.This aligns with the APP_ID-driven Maestro execution path.
.maestro/tests/room/utils/navigate-to-room-info.yaml (1)
1-1: Looks correct.Using
${APP_ID}in this utility prevents hardcoded bundle/package coupling and matches the broader Maestro migration..maestro/tests/assorted/utils/check-server.yaml (1)
1-1: Approved: appId parameterization is correct here too.This keeps assorted utility flows aligned with runtime APP_ID selection.
.github/workflows/maestro-android.yml (1)
45-45: Artifact rename is correctly aligned with the official E2E flow.Line 45 now matches the official Android artifact naming used by the upstream build workflow.
.maestro/helpers/navigate-to-login.yaml (1)
1-1: DynamicappIdwiring looks correct.Line 1 correctly makes this helper reusable across official Android/iOS package identifiers.
.maestro/tests/room/ignoreuser.yaml (1)
1-1: Good change to parameterize app targeting.Line 1 correctly removes hard-coding and allows this flow to run against the injected app id.
.maestro/helpers/navigate-to-register.yaml (1)
1-1:appIdtemplating is correctly applied here.Line 1 is consistent with the PR-wide Maestro runtime injection strategy.
.maestro/tests/keyboardNavigation/keyboard-navigation-components.yaml (1)
1-1: Nice improvement: this test now targets the injected app id.Line 1 keeps the flow portable between official Android/iOS runs.
.maestro/tests/assorted/utils/go-to-user-preference.yaml (1)
1-1: Utility flow now correctly uses runtimeAPP_ID.Line 1 is a clean and appropriate migration away from the hard-coded package id.
.maestro/tests/assorted/user-preferences.yaml (1)
1-1: Looks good — app targeting is now properly configurable.Line 1 aligns this test with the shared
${APP_ID}mechanism used by the runner..maestro/tests/room/jump-to-message.yaml (1)
1-1: Correct migration to dynamicappId.Line 1 is consistent with the official-vs-experimental test targeting strategy in this PR.
.maestro/tests/assorted/utils/nav-to-language.yaml (1)
1-1: Good appId parameterization.Using
${APP_ID}here is the right move for cross-platform/official-target Maestro execution..maestro/tests/teams/create-team.yaml (1)
1-1: Looks correct.
appId: ${APP_ID}is consistent with runtime injection and keeps this flow environment-agnostic..maestro/tests/e2ee/flows/create-e2ee-room.yaml (1)
1-1: Approved appId templating.This correctly decouples the flow from a hard-coded bundle/package id.
.maestro/tests/room/create-dm-group.yaml (1)
1-1: LGTM for this segment.
appIdis correctly parameterized for the shared Maestro runner setup..maestro/tests/assorted/join-public-room.yaml (1)
1-1: Good change.This keeps the flow aligned with APP_ID-driven execution in CI/local Maestro runs.
.maestro/tests/assorted/broadcast.yaml (1)
1-1: Approved.Parameterizing
appIdhere is correct and matches the repo-wide Maestro update..maestro/tests/e2ee/utils/enter-e2e-key.yaml (1)
1-1: Looks good.
${APP_ID}is the right target abstraction for this utility flow..maestro/tests/room/search.yaml (1)
1-1: Approved app target templating.This update is consistent and correctly removes hard-coded app id coupling.
.maestro/tests/onboarding/workspace/valid-workspace.yaml (1)
1-1: Good parameterization of app target.Switching to
${APP_ID}here is consistent with cross-platform Maestro execution and keeps this flow reusable..maestro/tests/e2ee/flows/verify-messages-read.yaml (1)
1-1: Looks good.
appIdtemplating with${APP_ID}matches the CI/runtime injection model..maestro/tests/e2ee/flows/enter-key-read-and-send.yaml (1)
1-1: Approved.This keeps the flow portable across official/experimental app IDs without duplicating test files.
.maestro/tests/assorted/change-avatar.yaml (1)
1-1: Nice update.Using
${APP_ID}here is aligned with the phased migration and shared Maestro runner behavior..maestro/tests/assorted/changeserver.yaml (1)
1-1: LGTM.
appIdindirection is correctly applied for this flow..maestro/tests/room/room-last-message-thread-50-plus.yaml (1)
1-1: Good change.This keeps the room flow executable against whichever app package/bundle CI injects.
.maestro/tests/assorted/deeplink.yaml (1)
1-1: Consistent app targeting across launch/reset points.Great job replacing both
appIdand allstopApptargets with${APP_ID}; this avoids drift between configured test target and process-control steps.Also applies to: 21-21, 34-34, 68-68, 92-92, 103-103, 114-114, 165-165, 176-176, 188-188, 246-246, 304-304
.maestro/tests/assorted/display-perf.yaml (1)
1-1: Approved.
appIdparameterization is correctly applied and matches the PR migration strategy..maestro/helpers/open-deeplink.yaml (1)
1-1: LGTM! Correct parameterization of app identifier.The switch to
appId: ${APP_ID}correctly enables runtime configuration of the target app, aligning with the PR's E2E infrastructure changes whererun-maestro.shsupplies the app identifier per platform..maestro/tests/teams/utils/close-action-sheet.yaml (1)
1-1: LGTM! Parameterization applied correctly.The app identifier is now properly templated for runtime configuration.
.maestro/tests/room/room-actions.yaml (1)
1-1: LGTM! App identifier correctly parameterized.The test suite will now target the runtime-configured app package.
.maestro/tests/assorted/accessibility-and-appearance.yaml (1)
1-1: LGTM! Consistent with the parameterization pattern.The accessibility test now uses the runtime app identifier.
.maestro/tests/room/utils/navigate-to-info-view.yaml (1)
1-1: LGTM! Parameterization correctly applied.The utility now targets the configured app identifier.
.maestro/tests/keyboardNavigation/keyboard-navigation-onboarding.yaml (1)
1-1: LGTM! App identifier parameterization is correct.The keyboard navigation test will now use the runtime-provided app package.
.maestro/config.yml (1)
1-1: LGTM! Global configuration correctly parameterized.The root Maestro configuration now uses
${APP_ID}, which will be supplied by the CI runner script. This enables the test suite to target either Official or Experimental builds based on the runtime context..maestro/tests/teams/utils/create-channel.yaml (1)
1-1: LGTM! Parameterization correctly applied.The channel creation utility now uses the runtime app identifier, consistent with the PR-wide Maestro configuration changes.
.maestro/tests/onboarding/register/create-account.yaml (1)
1-1: Good parameterization of Maestro app target.Switching to
${APP_ID}here matches the CI-driven app selection and keeps this flow portable across Official iOS/Android builds..maestro/tests/e2ee/flows/send-and-verify-message.yaml (1)
1-1: Looks correct.Using
${APP_ID}removes hard-coded package dependency and fits the updated Maestro runner contract..maestro/tests/e2ee/flows/quote-message.yaml (1)
1-1: Nice update.
appId: ${APP_ID}is the right move for reusable E2EE flows across build variants..maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml (1)
1-1: Approved.This keeps the flow aligned with runtime app-id injection and avoids hard-coded bundle identifiers.
.maestro/tests/e2ee/utils/navigate-to-e2ee-security.yaml (1)
1-1: Good change.Dynamic
APP_IDusage here is consistent with the new Maestro execution model..maestro/tests/teams/utils/open-action-sheet.yaml (1)
1-1: LGTM for this segment.Using
${APP_ID}is appropriate for shared team utility flows..maestro/tests/assorted/utils/go-to-display-pref.yaml (1)
1-1: Approved.This update correctly aligns the utility flow with environment-driven app selection.
.maestro/tests/assorted/in-app-notification.yaml (1)
1-1: Looks good.
appIdtemplating is correctly applied and consistent with the rest of the PR’s Maestro updates..maestro/tests/assorted/profile.yaml (1)
1-1: Good appId parameterization for cross-build Maestro runs.Using
${APP_ID}here is aligned with the runtime-injected app targeting strategy..maestro/tests/onboarding/server-history.yaml (1)
1-1: Looks good — this keeps the flow environment-driven.
appId: ${APP_ID}is the right move for platform/package switching in CI..maestro/tests/room/message-markdown-click.yaml (1)
1-1: Approved: dynamic appId is correct for this flow.This change keeps the same test logic while enabling runtime app target selection.
.maestro/helpers/search-room.yaml (1)
1-1: LGTM.
appId: ${APP_ID}is consistent with reusable helper execution across targets..maestro/tests/e2ee/flows/edit-message-and-verify.yaml (1)
1-1: Nice change — this flow now follows the shared APP_ID contract.No issues in this modified segment.
.maestro/tests/assorted/status.yaml (1)
1-1: Approved.Using
${APP_ID}here is consistent and correct for CI-driven Maestro targeting..maestro/helpers/hide-keyboard.yaml (1)
1-1: Looks good.This keeps the helper portable between official/experimental app identifiers.
.maestro/tests/onboarding/login/invalid-credentials.yaml (1)
1-1: Approved change.
appId: ${APP_ID}correctly externalizes the target app bundle/package for this onboarding flow..maestro/tests/assorted/join-protected-room.yaml (1)
1-1: LGTM! Clean parameterization.The
appIdis now correctly templated via${APP_ID}, enabling runtime targeting of Official or Experimental builds as injected by.github/scripts/run-maestro.sh..maestro/tests/room/create-room.yaml (1)
1-1: LGTM! Parameterization consistent.The
appIdtemplating matches the pattern across all updated Maestro flows..maestro/tests/onboarding/roomslist.yaml (1)
1-1: LGTM!.maestro/helpers/create-account.yaml (1)
1-1: LGTM!.maestro/tests/room/mark-as-unread.yaml (1)
1-1: LGTM!.maestro/tests/onboarding/forgot-password.yaml (1)
1-1: LGTM!.maestro/tests/onboarding/legal.yaml (1)
1-1: LGTM!.maestro/tests/assorted/setting.yaml (1)
1-1: LGTM!.maestro/tests/onboarding/login/login.yaml (1)
1-1:appIdparameterization looks correct.Using
${APP_ID}here is aligned with cross-platform Maestro execution in this PR..maestro/tests/e2ee/flows/check-encrypted-room-without-key.yaml (1)
1-1: Good update to dynamicappId.This keeps the flow reusable across Android/iOS official IDs.
.maestro/helpers/search-and-navigate-room.yaml (1)
1-1: Looks good.Switching to
${APP_ID}is the right move for shared helper portability..maestro/helpers/launch-app.yaml (1)
1-1: ApprovedappIdtemplating.No concerns with this change in the launch helper.
.maestro/helpers/go-back.yaml (1)
1-1: Nice consistency improvement.
${APP_ID}here matches the repo-wide Maestro app targeting strategy..maestro/tests/onboarding/register/email-used.yaml (1)
1-1: Change is correct.
appId: ${APP_ID}fits the new Maestro env-driven execution model..maestro/tests/onboarding/register/username-used.yaml (1)
1-1: LGTM forappIdtemplating.This keeps the test aligned with platform-specific package IDs.
.maestro/tests/e2ee/e2e-encryption.yaml (1)
1-1: Approved.Using
${APP_ID}at the top level is the correct change for this E2EE suite entrypoint..maestro/helpers/navigate-to-room.yaml (1)
1-1: LGTM! Correct parameterization for multi-build support.The change from a hardcoded app ID to
${APP_ID}correctly enables the helper to target either Official or Experimental builds based on the environment variable injected by the Maestro runner..maestro/tests/teams/convert-team.yaml (1)
1-1: LGTM! Parameterization aligns with E2E migration.The
appIdparameterization is correctly implemented and consistent with the PR's goal of repointing E2E tests to Official builds..maestro/tests/assorted/i18n.yaml (1)
1-1: LGTM! Consistent parameterization.The app ID parameterization is correctly applied, matching the pattern used across all Maestro test files in this PR.
.maestro/helpers/navigate-to-workspace.yaml (1)
1-1: LGTM! Correct parameterization.The
${APP_ID}variable substitution is properly implemented for the workspace navigation helper..maestro/helpers/send-message.yaml (1)
1-1: LGTM! Parameterization applied correctly.The app ID is now properly templated to support dynamic build targeting.
.maestro/helpers/login.yaml (1)
1-1: LGTM! Consistent with Maestro flow templating.The parameterized app ID enables this helper to work with both Official and Experimental builds as injected by the runner script.
.maestro/tests/room/unread-badge.yaml (1)
1-1: LGTM! Parameterization correctly applied.The app ID templating allows this Android-specific test to target the correct build variant based on the runner's environment configuration.
.maestro/tests/room/search-member.yaml (1)
1-1: LGTM! Final parameterization complete.The app ID is correctly templated, completing the consistent parameterization pattern across all Maestro test files in this PR.
.maestro/tests/assorted/join-from-directory.yaml (1)
1-1: Good appId parameterization.Using
${APP_ID}here keeps the flow portable across Official/Experimental targets and CI environments..maestro/tests/room/share-message.yaml (1)
1-1: Looks good.
appId: ${APP_ID}is the right move for cross-platform/cross-build Maestro execution..maestro/tests/assorted/utils/go-to-room-list.yaml (1)
1-1: Approved appId templating.This keeps the util flow compatible with runtime app targeting.
.maestro/tests/e2ee/flows/accept-new-key-and-verify.yaml (1)
1-1: Nice update.Using
${APP_ID}here aligns this flow with the new Maestro runtime configuration..maestro/tests/assorted/delete-server.yaml (1)
1-1: Good consistency improvement.
appIdtemplating is correctly applied for this flow as well..github/scripts/run-maestro.sh (1)
12-16: APP_ID propagation is implemented correctly.The package selection plus
-e APP_ID="$APP_ID"in both main and rerun paths is consistent and well-scoped.Also applies to: 80-80, 88-88, 150-150, 157-157
.maestro/helpers/login-with-deeplink.yaml (1)
1-1: Good helper alignment with dynamic app target.Using
${APP_ID}forappId,stopApp, andclearStatekeeps this helper consistent with the new E2E app selection flow.Also applies to: 7-7, 12-12
app/containers/DeprecationModal/styles.ts (1)
1-59: LGTM! Clean and well-structured stylesheet.The style definitions follow a clear hierarchy and composition pattern. The use of shared styles for typography and alignment promotes consistency, and the explicit typography scale (fontSize + lineHeight) ensures predictable text rendering across platforms.
app/containers/DeprecationModal/index.tsx (2)
36-42: Excellent error handling pattern.The async
onOpenStorefunction correctly wrapsLinking.openURLin try-catch. Since errors are caught internally, the returned promise will never reject, making it safe to call from theonPresshandler without explicit promise chaining. This pattern satisfies the no-void ESLint rule while keeping error handling localized.
24-90: Well-implemented deprecation modal with excellent UX considerations.The component demonstrates thoughtful design:
- Early return optimization (lines 29-31) prevents rendering overhead for official builds
- Platform-specific handling with appropriate App Store/Play Store URLs and button labels
- Fallback UX with
selectableURL text (line 67) for manual copying if the deep link fails- Proper theming integration and master-detail layout awareness
- Accessibility considerations with
aria-hiddenbackdrop and test IDs- Clean state management with controlled visibility that can be dismissed
The intentional display on every launch aligns with the PR objective to encourage migration from Experimental to Official builds.
app/index.tsx (1)
14-14: LGTM! Appropriate placement in the component tree.The
DeprecationModalis correctly imported and rendered at the root level, positioned after other overlay components (Loading, Toast, InAppNotification). This placement ensures:
- The modal has access to all required contexts (Theme, Redux store, Dimensions)
- It renders on top of other UI elements as a blocking notice
- The separation of concerns is maintained by letting the modal manage its own visibility logic internally
As per coding guidelines, the component is properly located in
app/containers/for reusable UI components.Also applies to: 271-271
ios/fastlane/Fastfile (3)
161-177: LGTM! The simulator build lane is well-structured.The implementation correctly mirrors the experimental simulator lane while adapting for official builds. The codesigning is properly disabled via both
skip_codesigning: trueandCODE_SIGNING_ALLOWED=NO, which is appropriate for simulator targets.
161-177: AI summary uses incorrect parameter name.The AI summary states
codesigning_disabled: true, but the actual code correctly usesskip_codesigning: true(line 169), which is the valid parameter for thegymaction.
163-163: No issues found with the prepare script.The script
../../scripts/prepare_ios_official.shexists atscripts/prepare_ios_official.shand has execute permissions (-rwxr-xr-x). No action needed..github/workflows/e2e-build-ios.yml (3)
86-86: LGTM! Correct lane invocation.The switch from
build_experimental_simulatortobuild_official_simulatorcorrectly matches the new Fastlane lane added in the Fastfile.
76-77: ⚡ Quick winVerify whether iOS E2E should use BUGSNAG_KEY_OFFICIAL for consistency.
The iOS E2E workflow uses
secrets.BUGSNAG_KEY, but the Android E2E workflow usessecrets.BUGSNAG_KEY_OFFICIALfor official builds. Both workflows mark their builds as official (IS_OFFICIAL YES), yet they reference different secret variables. If official E2E builds require separate Bugsnag API keys for proper error tracking segregation, iOS should also useBUGSNAG_KEY_OFFICIALto maintain consistency across platforms.
78-80: ⚡ Quick winNo action needed. The Watch app has no
Info.plistfile and its code does not reference or use theIS_OFFICIALflag. The Watch app uses a separateDatabaseimplementation that does not check this value, unlike the main app targets that use the sharedios/Shared/RocketChat/Database.swiftcode.> Likely an incorrect or invalid review comment.
Without output_name the Official scheme produces RocketChat.app while e2e-build-ios.yml uploads from Rocket.Chat.app, causing the artifact step to fail and breaking the Maestro iOS install path. Mirrors the existing output_name in the build_official lane.
|
iOS Build Available Rocket.Chat Experimental 4.73.0.108845 |
|
Android Build Available Rocket.Chat Experimental 4.73.0.108847 Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNQRcoPOcms4LkCf0eWSOx_wOoXk1aJg2WkKhqwhfQ1Zi6F6ufagwuo-y5CZ6beEhYTqmfopfjJeGVUdvqsC |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@app/i18n/locales/hi-IN.json`:
- Around line 326-331: The PR added Hindi translations (keys like
"Experimental_retirement_continue", "Experimental_retirement_description",
"Experimental_retirement_open_app_store",
"Experimental_retirement_open_play_store",
"Experimental_retirement_or_open_manually", "Experimental_retirement_title") but
the description claims the DeprecationModal is "English-only"; decide which is
correct and fix accordingly: if the modal is truly English-only, remove these
hi-IN.json entries to avoid dead translations; if the modal supports i18n,
update the PR description to state it's multilingual and ensure the
DeprecationModal uses the i18n keys (e.g., DeprecationModal should call the
translation keys above) and keep the Hindi strings.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 9a3d0141-7ade-43e8-a81c-9ca188927f9a
📒 Files selected for processing (26)
app/containers/DeprecationModal/index.tsxapp/i18n/locales/ar.jsonapp/i18n/locales/bn-IN.jsonapp/i18n/locales/cs.jsonapp/i18n/locales/de.jsonapp/i18n/locales/en.jsonapp/i18n/locales/es.jsonapp/i18n/locales/fi.jsonapp/i18n/locales/fr.jsonapp/i18n/locales/hi-IN.jsonapp/i18n/locales/hu.jsonapp/i18n/locales/it.jsonapp/i18n/locales/ja.jsonapp/i18n/locales/nl.jsonapp/i18n/locales/nn.jsonapp/i18n/locales/no.jsonapp/i18n/locales/pt-BR.jsonapp/i18n/locales/pt-PT.jsonapp/i18n/locales/ru.jsonapp/i18n/locales/sl-SI.jsonapp/i18n/locales/sv.jsonapp/i18n/locales/ta-IN.jsonapp/i18n/locales/te-IN.jsonapp/i18n/locales/tr.jsonapp/i18n/locales/zh-CN.jsonapp/i18n/locales/zh-TW.json
✅ Files skipped from review due to trivial changes (10)
- app/i18n/locales/en.json
- app/i18n/locales/pt-PT.json
- app/i18n/locales/it.json
- app/i18n/locales/sv.json
- app/i18n/locales/de.json
- app/i18n/locales/zh-CN.json
- app/i18n/locales/pt-BR.json
- app/i18n/locales/nn.json
- app/i18n/locales/es.json
- app/i18n/locales/sl-SI.json
🚧 Files skipped from review as they are similar to previous changes (1)
- app/containers/DeprecationModal/index.tsx
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: ESLint and Test / run-eslint-and-test
- GitHub Check: format
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js,jsx,json}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Prettier formatting with tabs, single quotes, 130 character width, no trailing commas, avoid arrow parens, and bracket same line
Files:
app/i18n/locales/ru.jsonapp/i18n/locales/hu.jsonapp/i18n/locales/no.jsonapp/i18n/locales/fr.jsonapp/i18n/locales/hi-IN.jsonapp/i18n/locales/ja.jsonapp/i18n/locales/nl.jsonapp/i18n/locales/fi.jsonapp/i18n/locales/ar.jsonapp/i18n/locales/ta-IN.jsonapp/i18n/locales/cs.jsonapp/i18n/locales/zh-TW.jsonapp/i18n/locales/te-IN.jsonapp/i18n/locales/tr.jsonapp/i18n/locales/bn-IN.json
app/i18n/**/*.{ts,tsx,json}
📄 CodeRabbit inference engine (CLAUDE.md)
Place i18n configuration and locale files in 'app/i18n/' directory with support for 40+ locales and RTL
Files:
app/i18n/locales/ru.jsonapp/i18n/locales/hu.jsonapp/i18n/locales/no.jsonapp/i18n/locales/fr.jsonapp/i18n/locales/hi-IN.jsonapp/i18n/locales/ja.jsonapp/i18n/locales/nl.jsonapp/i18n/locales/fi.jsonapp/i18n/locales/ar.jsonapp/i18n/locales/ta-IN.jsonapp/i18n/locales/cs.jsonapp/i18n/locales/zh-TW.jsonapp/i18n/locales/te-IN.jsonapp/i18n/locales/tr.jsonapp/i18n/locales/bn-IN.json
🔇 Additional comments (14)
app/i18n/locales/ar.json (1)
220-225: LGTM!app/i18n/locales/ta-IN.json (1)
326-331: LGTM!app/i18n/locales/fi.json (1)
305-310: LGTM!app/i18n/locales/ja.json (1)
220-225: LGTM!app/i18n/locales/no.json (1)
351-356: LGTM!app/i18n/locales/ru.json (1)
296-301: Inconsistency: Russian translations added despite "English-only" requirement.The PR objectives explicitly state: "Adds an English-only DeprecationModal at app root". However, this file adds Russian translations for the retirement modal (
Experimental_retirement_*keys).Please clarify whether:
- The PR objectives are outdated and the modal should support multiple locales in PR1, or
- These translations should be deferred to a later PR phase
app/i18n/locales/te-IN.json (1)
325-330: LGTM!app/i18n/locales/fr.json (1)
272-277: Inconsistency with PR objectives: French translations present despite "English-only" claim.The PR objectives explicitly state that the DeprecationModal is "English-only," but this file adds French translations for all six retirement modal strings. While adding translations is appropriate for a multi-locale application, the PR description should be updated to reflect that localized strings are included, or these translations should be removed if the modal is truly intended to be English-only.
app/i18n/locales/zh-TW.json (1)
236-241: Inconsistency: PR claims "English-only DeprecationModal" but Traditional Chinese translations are being added.The PR objectives explicitly state: "Adds an English-only DeprecationModal at app root" — however, this file introduces Traditional Chinese translations for all six
Experimental_retirement_*keys. If these translations are intentionally part of this PR (perhaps for immediate i18n support or future-proofing), the PR description should be updated to reflect that the modal supports multiple locales, not just English.app/i18n/locales/hu.json (1)
326-331: PR objectives claim "English-only" but translations are being added to 25+ locales.The PR objectives state: "Adds an English-only DeprecationModal at app root". However, the
Experimental_retirement_*keys are being added to 25 locale files, including English, Hungarian, German, French, Spanish, Portuguese, Russian, Japanese, Chinese, Arabic, Hindi, and many others—a comprehensive multi-language localization effort.Clarify whether the "English-only" objective in the PR description is outdated or if the scope has changed. If the modal should support 25+ languages, update the PR objectives to reflect this.
app/i18n/locales/cs.json (1)
346-351: Inconsistency: Translations added despite "English-only" modal.The PR objectives explicitly state: "Adds an English-only DeprecationModal at app root," yet Czech translations for the deprecation modal are being added here (and per the AI summary, across other locale files as well).
This creates an inconsistency that requires clarification:
- If the modal is truly English-only, these translations are unnecessary and should be removed
- If the modal supports localization, the PR objectives should be updated to reflect this
- If these translations are for future use, that intent should be documented
Additionally, since the PR objectives note "The modal will be removed in PR3," these translations appear to be temporary, which may not justify the localization effort across 40+ locales.
app/i18n/locales/bn-IN.json (1)
326-331: ⚡ Quick winModal supports i18n—Bengali translations are correct.
The DeprecationModal component (
app/containers/DeprecationModal/index.tsx) usesi18n.t()to load translations for all six keys, making this a multi-language feature. Bengali translations in this file are properly integrated and used by the component. The modal is not English-only; this is a full internationalization implementation across 24+ locales.> Likely an incorrect or invalid review comment.app/i18n/locales/nl.json (1)
272-277: No changes needed - implementation is correct.The DeprecationModal is properly internationalized using i18n, not English-only. The modal code actively calls
i18n.t()for all six text elements:
Experimental_retirement_titleExperimental_retirement_descriptionExperimental_retirement_continueExperimental_retirement_open_app_storeExperimental_retirement_open_play_storeExperimental_retirement_or_open_manuallyThe addition of these keys to all 25 locale files is correct and necessary for the modal to function across languages.
> Likely an incorrect or invalid review comment.app/i18n/locales/tr.json (1)
232-237: Clarify scope: Turkish translations added despite "English-only" modal.The PR objectives state the DeprecationModal is "English-only," but this file adds Turkish translations for all the modal's i18n keys. If the modal is truly English-only in this PR phase, these translations would be unused. If translations are intentionally included for future phases or immediate use, the PR objectives should reflect that scope.
|
Android Build Available Rocket.Chat Experimental 4.73.0.108890 Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNQmyH5Rp6r4_HC_jAEyGFc3gXOpV9CekQNmEPgP5iqiKUXhnCzAYxNZIRIIB2OOXmI69CVyf_ZIwa0ZfNq2 |
|
iOS Build Available Rocket.Chat Experimental 4.73.0.108892 |
Proposed changes
PR1 of the phased Experimental → Official migration documented in the design doc.
This PR is additive and redirective — no Experimental build infra, code paths, or store records are deleted yet. The next PRs (PR2 stops publishing, PR3 deletes code) ship once current Experimental users have had time to migrate.
What this PR does:
app/containers/DeprecationModal/shown on every launch in Experimental builds only (gated by!isOfficial). Points users to the Official App Store / Play Store listing with a deep-link button and copy-paste fallback URL. Mounted inapp/index.tsxalongside the other root overlays. Copy is fully translated to all 25 locales inLANGUAGES(app/i18n/index.ts) under theExperimental_retirement_*keys. PR3 removes it.build_official_simulatorfastlane lane (mirrorsbuild_experimental_simulator, schemeRocketChat, skips codesigning).e2e-build-ios.ymlnow callsbuild_official_simulator, setsIS_OFFICIAL=YESvia PlistBuddy on the three Info.plists, and uploadsRocket.Chat.app.e2e-build-android.ymlnow callsassembleOfficialRelease, uses theKEYSTORE_OFFICIAL_*/BUGSNAG_KEY_OFFICIALsecrets, setsAPPLICATION_ID=chat.rocket.android, and uploads as artifactAndroid Official APK.maestro-android.ymldownloadsAndroid Official APK.run-maestro.shinstallsapp-official-release.apk, drives thechat.rocket.androidpackage, and passes-e APP_ID=...(chat.rocket.ioson iOS,chat.rocket.androidon Android) to everymaestro testinvocation including reruns..maestro/**/*.{yaml,yml}files now useappId: ${APP_ID}instead of the hard-coded experimental bundle id. The runner injects per-platform via-e APP_ID.What this PR explicitly does NOT touch (intentional, per the phased plan):
.github/actions/build-{android,ios}/action.yml,upload-{android,ios}/action.yml,upload-internal-android/action.yml— still drive the Experimental publish jobs.build-pr.yml/build-develop.yml— still fan out to 4 builds (Android+iOS × Official+Experimental); merging this PR todevelopis what triggers the modal to current Experimental users via the existing auto-publish.scripts/prepare_ios_official.sh, Experimental Xcode targets / asset catalogs, Androidexperimentalflavor, JSisOfficialswitch, Info.plistIS_OFFICIALdefaults, store records, GH secrets / environments.Issue(s)
https://rocketchat.atlassian.net/browse/NATIVE-1120
How to test or reproduce
Modal:
IS_OFFICIAL=NO(default Experimental build) on iOS and Android. Modal should appear on every launch with the store-deep-link button and copy-paste URL.IS_OFFICIAL=YES). Modal should NOT appear.setLanguageat runtime) to any locale inLANGUAGES(e.g.pt-BR,de,ja,ar) and confirm title/description/button labels render in that language.E2E:
e2e-build-androidande2e-build-iosjobs in this PR run produce Official-signed builds, and the Maestro shards drive them via thechat.rocket.ios/chat.rocket.androidids.cd ios && bundle exec fastlane ios build_official_simulatorshould produceRocket.Chat.appunderios/fastlane/build/*.xcarchive/Products/Applications/.Screenshots
n/a — modal copy and screenshots can be added after Reviewer verification on Experimental simulator.
Types of changes
Checklist
Further comments
Open Q raised in design review: Maestro Android currently uses a Release/signed APK. If a debug build works for E2E, switching this PR (or a follow-up) to
assembleOfficialDebugwould drop the keystore dependency — strict simplification. Left as-is for now to keep the change small and match prior behavior.Coupling reminder for PR3:
scripts/prepare_ios_official.shandbuild-ios/action.yml'sPlistBuddy IS_OFFICIAL YESstep are intentionally retained — they remain load-bearing for the Official CI lanes until the pbxproj rewrite lands.