Skip to content

chore: begin Experimental app sunset#7320

Open
diegolmello wants to merge 3 commits into
developfrom
remove-experimental-pr1-begin-sunset
Open

chore: begin Experimental app sunset#7320
diegolmello wants to merge 3 commits into
developfrom
remove-experimental-pr1-begin-sunset

Conversation

@diegolmello
Copy link
Copy Markdown
Member

@diegolmello diegolmello commented May 11, 2026

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:

  1. DeprecationModal — new 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 in app/index.tsx alongside the other root overlays. Copy is fully translated to all 25 locales in LANGUAGES (app/i18n/index.ts) under the Experimental_retirement_* keys. PR3 removes it.
  2. Repoint E2E to Official:
    • New build_official_simulator fastlane lane (mirrors build_experimental_simulator, scheme RocketChat, skips codesigning).
    • e2e-build-ios.yml now calls build_official_simulator, sets IS_OFFICIAL=YES via PlistBuddy on the three Info.plists, and uploads Rocket.Chat.app.
    • e2e-build-android.yml now calls assembleOfficialRelease, uses the KEYSTORE_OFFICIAL_* / BUGSNAG_KEY_OFFICIAL secrets, sets APPLICATION_ID=chat.rocket.android, and uploads as artifact Android Official APK.
    • maestro-android.yml downloads Android Official APK.
    • run-maestro.sh installs app-official-release.apk, drives the chat.rocket.android package, and passes -e APP_ID=... (chat.rocket.ios on iOS, chat.rocket.android on Android) to every maestro test invocation including reruns.
  3. Maestro flow templating — all .maestro/**/*.{yaml,yml} files now use appId: ${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 to develop is what triggers the modal to current Experimental users via the existing auto-publish.
  • scripts/prepare_ios_official.sh, Experimental Xcode targets / asset catalogs, Android experimental flavor, JS isOfficial switch, Info.plist IS_OFFICIAL defaults, store records, GH secrets / environments.

Issue(s)

https://rocketchat.atlassian.net/browse/NATIVE-1120

How to test or reproduce

experimental-modal

Modal:

  • Build the app with 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.
  • Build the Official variant (or run with IS_OFFICIAL=YES). Modal should NOT appear.
  • Switch device language (or setLanguage at runtime) to any locale in LANGUAGES (e.g. pt-BR, de, ja, ar) and confirm title/description/button labels render in that language.

E2E:

  • CI: the e2e-build-android and e2e-build-ios jobs in this PR run produce Official-signed builds, and the Maestro shards drive them via the chat.rocket.ios / chat.rocket.android ids.
  • Locally: cd ios && bundle exec fastlane ios build_official_simulator should produce Rocket.Chat.app under ios/fastlane/build/*.xcarchive/Products/Applications/.

Screenshots

n/a — modal copy and screenshots can be added after Reviewer verification on Experimental simulator.

Types of changes

  • Improvement (non-breaking change which improves a current function)

Checklist

  • I have read the CONTRIBUTING doc
  • I have signed the CLA
  • Lint and unit tests pass locally with my changes
  • I have added tests that prove my fix is effective or that my feature works (if applicable) — modal is throwaway code that PR3 deletes; verified manually instead
  • I have added necessary documentation (if applicable)
  • Any dependent changes have been merged and published in downstream modules

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 assembleOfficialDebug would 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.sh and build-ios/action.yml's PlistBuddy IS_OFFICIAL YES step are intentionally retained — they remain load-bearing for the Official CI lanes until the pbxproj rewrite lands.

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.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 11, 2026

Walkthrough

This 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.

Changes

Official Build Migration

Layer / File(s) Summary
Android Official Build
.github/workflows/e2e-build-android.yml
Workflow secrets switched to KEYSTORE_OFFICIAL_* and BUGSNAG_KEY_OFFICIAL. Gradle build changed from assembleExperimentalRelease to assembleOfficialRelease, and uploaded artifact renamed to "Android Official APK" with official output path.
iOS Official Build
.github/workflows/e2e-build-ios.yml
Sets IS_OFFICIAL=YES in app targets and writes Bugsnag API key into multiple Info.plist files. Fastlane invocation switches from build_experimental_simulator to build_official_simulator. Uploaded artifact path changes to official Rocket.Chat.app bundle.
Fastlane iOS Simulator Lane
ios/fastlane/Fastfile
New build_official_simulator lane runs official preparation script and builds the RocketChat simulator scheme with codesigning disabled and parallelized compilation.
Maestro Test Runner
.github/scripts/run-maestro.sh
Introduces APP_ID variable (chat.rocket.android for Android, chat.rocket.ios for iOS). Main and rerun maestro test invocations pass -e APP_ID="$APP_ID" to target the correct app identifier and Android path installs app-official-release.apk.
Test Artifact Download
.github/workflows/maestro-android.yml
Artifact download target renamed from "Android Experimental APK" to "Android Official APK".
Maestro Core Config
.maestro/config.yml
appId field changed from hardcoded chat.rocket.reactnative to ${APP_ID} environment variable.
Maestro Helpers & Tests
.maestro/helpers/*, .maestro/tests/*
Many YAML helpers and tests (login, setup, navigate, e2ee flows, room/team tests, utilities) parameterized with ${APP_ID} instead of hardcoded chat.rocket.reactnative; several stopApp steps updated and a few action sequences removed.
Deprecation Modal Component
app/containers/DeprecationModal/index.tsx, styles.ts
New memoized React Native modal renders only for non-official builds. Displays retirement notice with platform-specific store links (App Store or Google Play), themed styling, and dismiss/open-store actions with error logging.
App Root Integration
app/index.tsx
DeprecationModal imported and rendered inside Root component alongside InAppNotification, Toast, and Loading.

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

type: feature, type: chore

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'chore: begin Experimental app sunset' accurately summarizes the main objective of this changeset - initiating the sunset/deprecation of the Experimental app build with a deprecation modal and E2E test migration to official builds.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (1)
  • NATIVE-1118: Request failed with status code 401

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between fca8b8e and 2abc670.

📒 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.yaml
  • app/containers/DeprecationModal/index.tsx
  • app/containers/DeprecationModal/styles.ts
  • app/index.tsx
  • ios/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.tsx
  • app/containers/DeprecationModal/index.tsx
  • app/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.tsx
  • app/containers/DeprecationModal/index.tsx
  • app/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.tsx
  • app/containers/DeprecationModal/index.tsx
  • app/containers/DeprecationModal/styles.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use ESLint with @rocket.chat/eslint-config base including React, React Native, TypeScript, and Jest plugins

Files:

  • app/index.tsx
  • app/containers/DeprecationModal/index.tsx
  • app/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.tsx
  • app/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.tsx
  • app/containers/DeprecationModal/index.tsx
  • app/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!

appId templating aligns with the PR-wide approach of injecting APP_ID via run-maestro.sh.

.maestro/tests/e2ee/flows/setup-user.yaml (1)

1-1: LGTM!

Consistent with the per-platform APP_ID injection 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!

appId parameterization 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 by run-maestro.sh.

.maestro/tests/onboarding/workspace/invalid-workspace.yaml (1)

1-1: LGTM!

appId templating aligns with the rest of the Maestro suite.

.maestro/helpers/navigate-to-room-action.yaml (1)

1-1: LGTM!

Helper now correctly inherits APP_ID from 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: Dynamic appId wiring 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: appId templating 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 runtime APP_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 dynamic appId.

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.

appId is 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 appId here 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.

appId templating 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.

appId indirection 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 appId and all stopApp targets 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.

appId parameterization 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 where run-maestro.sh supplies 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_ID usage 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.

appId templating 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 appId is 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 appId templating 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: appId parameterization 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 dynamic appId.

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: Approved appId templating.

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 for appId templating.

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 appId parameterization 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.

appId templating 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} for appId, stopApp, and clearState keeps 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 onOpenStore function correctly wraps Linking.openURL in try-catch. Since errors are caught internally, the returned promise will never reject, making it safe to call from the onPress handler 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 selectable URL text (line 67) for manual copying if the deep link fails
  • Proper theming integration and master-detail layout awareness
  • Accessibility considerations with aria-hidden backdrop 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 DeprecationModal is 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: true and CODE_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 uses skip_codesigning: true (line 169), which is the valid parameter for the gym action.


163-163: No issues found with the prepare script.

The script ../../scripts/prepare_ios_official.sh exists at scripts/prepare_ios_official.sh and 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_simulator to build_official_simulator correctly matches the new Fastlane lane added in the Fastfile.


76-77: ⚡ Quick win

Verify whether iOS E2E should use BUGSNAG_KEY_OFFICIAL for consistency.

The iOS E2E workflow uses secrets.BUGSNAG_KEY, but the Android E2E workflow uses secrets.BUGSNAG_KEY_OFFICIAL for 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 use BUGSNAG_KEY_OFFICIAL to maintain consistency across platforms.


78-80: ⚡ Quick win

No action needed. The Watch app has no Info.plist file and its code does not reference or use the IS_OFFICIAL flag. The Watch app uses a separate Database implementation that does not check this value, unlike the main app targets that use the shared ios/Shared/RocketChat/Database.swift code.

			> Likely an incorrect or invalid review comment.

Comment thread .github/scripts/run-maestro.sh
Comment thread .github/workflows/e2e-build-ios.yml
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.
@diegolmello diegolmello temporarily deployed to approve_e2e_testing May 11, 2026 20:05 — with GitHub Actions Inactive
@diegolmello diegolmello temporarily deployed to experimental_ios_build May 11, 2026 20:10 — with GitHub Actions Inactive
@diegolmello diegolmello had a problem deploying to official_android_build May 11, 2026 20:10 — with GitHub Actions Error
@diegolmello diegolmello temporarily deployed to experimental_android_build May 11, 2026 20:10 — with GitHub Actions Inactive
@github-actions
Copy link
Copy Markdown

iOS Build Available

Rocket.Chat Experimental 4.73.0.108845

@diegolmello diegolmello had a problem deploying to upload_experimental_android May 11, 2026 21:25 — with GitHub Actions Error
@github-actions
Copy link
Copy Markdown

Android Build Available

Rocket.Chat Experimental 4.73.0.108847

Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNQRcoPOcms4LkCf0eWSOx_wOoXk1aJg2WkKhqwhfQ1Zi6F6ufagwuo-y5CZ6beEhYTqmfopfjJeGVUdvqsC

@diegolmello diegolmello requested a deployment to approve_e2e_testing May 12, 2026 21:00 — with GitHub Actions Waiting
@diegolmello diegolmello deployed to experimental_android_build May 12, 2026 21:05 — with GitHub Actions Active
@diegolmello diegolmello deployed to experimental_ios_build May 12, 2026 21:05 — with GitHub Actions Active
@diegolmello diegolmello requested a deployment to official_android_build May 12, 2026 21:05 — with GitHub Actions Waiting
@diegolmello diegolmello requested a deployment to official_ios_build May 12, 2026 21:05 — with GitHub Actions Waiting
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between 18db7de and f0e1e35.

📒 Files selected for processing (26)
  • app/containers/DeprecationModal/index.tsx
  • app/i18n/locales/ar.json
  • app/i18n/locales/bn-IN.json
  • app/i18n/locales/cs.json
  • app/i18n/locales/de.json
  • app/i18n/locales/en.json
  • app/i18n/locales/es.json
  • app/i18n/locales/fi.json
  • app/i18n/locales/fr.json
  • app/i18n/locales/hi-IN.json
  • app/i18n/locales/hu.json
  • app/i18n/locales/it.json
  • app/i18n/locales/ja.json
  • app/i18n/locales/nl.json
  • app/i18n/locales/nn.json
  • app/i18n/locales/no.json
  • app/i18n/locales/pt-BR.json
  • app/i18n/locales/pt-PT.json
  • app/i18n/locales/ru.json
  • app/i18n/locales/sl-SI.json
  • app/i18n/locales/sv.json
  • app/i18n/locales/ta-IN.json
  • app/i18n/locales/te-IN.json
  • app/i18n/locales/tr.json
  • app/i18n/locales/zh-CN.json
  • app/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.json
  • app/i18n/locales/hu.json
  • app/i18n/locales/no.json
  • app/i18n/locales/fr.json
  • app/i18n/locales/hi-IN.json
  • app/i18n/locales/ja.json
  • app/i18n/locales/nl.json
  • app/i18n/locales/fi.json
  • app/i18n/locales/ar.json
  • app/i18n/locales/ta-IN.json
  • app/i18n/locales/cs.json
  • app/i18n/locales/zh-TW.json
  • app/i18n/locales/te-IN.json
  • app/i18n/locales/tr.json
  • app/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.json
  • app/i18n/locales/hu.json
  • app/i18n/locales/no.json
  • app/i18n/locales/fr.json
  • app/i18n/locales/hi-IN.json
  • app/i18n/locales/ja.json
  • app/i18n/locales/nl.json
  • app/i18n/locales/fi.json
  • app/i18n/locales/ar.json
  • app/i18n/locales/ta-IN.json
  • app/i18n/locales/cs.json
  • app/i18n/locales/zh-TW.json
  • app/i18n/locales/te-IN.json
  • app/i18n/locales/tr.json
  • app/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:

  1. The PR objectives are outdated and the modal should support multiple locales in PR1, or
  2. 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 win

Modal supports i18n—Bengali translations are correct.

The DeprecationModal component (app/containers/DeprecationModal/index.tsx) uses i18n.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_title
  • Experimental_retirement_description
  • Experimental_retirement_continue
  • Experimental_retirement_open_app_store
  • Experimental_retirement_open_play_store
  • Experimental_retirement_or_open_manually

The 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.

Comment thread app/i18n/locales/hi-IN.json
@github-actions
Copy link
Copy Markdown

Android Build Available

Rocket.Chat Experimental 4.73.0.108890

Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNQmyH5Rp6r4_HC_jAEyGFc3gXOpV9CekQNmEPgP5iqiKUXhnCzAYxNZIRIIB2OOXmI69CVyf_ZIwa0ZfNq2

@github-actions
Copy link
Copy Markdown

iOS Build Available

Rocket.Chat Experimental 4.73.0.108892

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant