chore: upgrade to React Native 0.83.10 and Expo SDK 55#7481
chore: upgrade to React Native 0.83.10 and Expo SDK 55#7481diegolmello wants to merge 11 commits into
Conversation
…7460) react-native-math-view 3.9.5 is abandoned and is the only native module in the math render path, making it a build risk for the RN 0.83 new-arch bump. Remove react-native-math-view and react-native-katex and degrade KaTeX message-parser nodes to raw LaTeX source rendered via the existing markdown code renderer: block wrapped in $$...$$, inline in $...$. The reader still sees the expression, just not typeset. react-native-webview is kept (used elsewhere). Re-introducing typeset math rendering is tracked as a follow-up.
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThis PR upgrades React Native and Expo integration, adds an ChangesRN 0.83 / Expo 55 Native Build and Dependency Upgrade
expo-av Shim Migration
Markdown Rendering and Small Application Fixes
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Warning Review ran into problems🔥 ProblemsErrors were encountered while retrieving linked issues. Errors (2)
Git: Failed to clone repository. Please run the 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 |
# Conflicts: # package.json # pnpm-lock.yaml
There was a problem hiding this comment.
🧹 Nitpick comments (1)
.github/actions/upload-ios/action.yml (1)
54-61: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winConsider restoring
restore-keysfor cache fallback.The old
pods-v1cache configuration includedrestore-keysfor partial cache matching, but the newpods-v2configuration omits them. Withoutrestore-keys, everyPodfile.lockchange results in a full cache miss and a completepod installdownload. Adding a prefix-basedrestore-keysfallback would allow incremental pod installs when the lock file changes.♻️ Suggested addition
path: | ~/.pods ios/Pods key: pods-v2-${{ hashFiles('ios/Podfile.lock') }} + restore-keys: | + pods-v2-🤖 Prompt for 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. In @.github/actions/upload-ios/action.yml around lines 54 - 61, The Pod Cache step in the upload-ios action drops cache fallback by omitting restore-keys, so any Podfile.lock change forces a full miss. Update the cache configuration in the Pod Cache block to add a prefix-based restore-keys fallback alongside the existing pods-v2 key, preserving partial matches for incremental pod installs when the lock file changes.
🤖 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.
Nitpick comments:
In @.github/actions/upload-ios/action.yml:
- Around line 54-61: The Pod Cache step in the upload-ios action drops cache
fallback by omitting restore-keys, so any Podfile.lock change forces a full
miss. Update the cache configuration in the Pod Cache block to add a
prefix-based restore-keys fallback alongside the existing pods-v2 key,
preserving partial matches for incremental pod installs when the lock file
changes.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: c39b07b3-73b7-4064-b84a-7329e1085197
⛔ Files ignored due to path filters (27)
app/containers/Avatar/__snapshots__/Avatar.test.tsx.snapis excluded by!**/*.snapapp/containers/Chip/__snapshots__/Chip.test.tsx.snapis excluded by!**/*.snapapp/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snapis excluded by!**/*.snapapp/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snapis excluded by!**/*.snapapp/containers/NewMediaCall/__snapshots__/FilterHeader.test.tsx.snapis excluded by!**/*.snapapp/containers/NewMediaCall/__snapshots__/PeerItem.test.tsx.snapis excluded by!**/*.snapapp/containers/NewMediaCall/__snapshots__/PeerList.test.tsx.snapis excluded by!**/*.snapapp/containers/NewMediaCall/__snapshots__/SelectedPeer.test.tsx.snapis excluded by!**/*.snapapp/containers/ReactionsList/__snapshots__/ReactionsList.test.tsx.snapis excluded by!**/*.snapapp/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snapis excluded by!**/*.snapapp/containers/SearchBox/__snapshots__/SearchBox.test.tsx.snapis excluded by!**/*.snapapp/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snapis excluded by!**/*.snapapp/containers/TextInput/__snapshots__/TextInput.test.tsx.snapis excluded by!**/*.snapapp/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snapis excluded by!**/*.snapapp/containers/markdown/__snapshots__/Markdown.test.tsx.snapis excluded by!**/*.snapapp/containers/message/__snapshots__/Message.test.tsx.snapis excluded by!**/*.snapapp/views/CallView/__snapshots__/index.test.tsx.snapis excluded by!**/*.snapapp/views/CallView/components/Dialpad/__snapshots__/Dialpad.test.tsx.snapis excluded by!**/*.snapapp/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snapis excluded by!**/*.snapapp/views/DiscussionsView/__snapshots__/Item.test.tsx.snapis excluded by!**/*.snapapp/views/NewMessageView/__snapshots__/Item.test.tsx.snapis excluded by!**/*.snapapp/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snapis excluded by!**/*.snapapp/views/RoomInfoView/components/__snapshots__/RoomInfoViewAvatar.test.tsx.snapis excluded by!**/*.snapapp/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snapis excluded by!**/*.snapapp/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snapis excluded by!**/*.snapios/Podfile.lockis excluded by!**/*.lockpnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (44)
.github/actions/build-ios/action.yml.github/actions/upload-ios/action.ymlandroid/app/src/main/AndroidManifest.xmlandroid/app/src/main/java/chat/rocket/reactnative/MainApplication.ktandroid/build.gradleandroid/gradle/wrapper/gradle-wrapper.propertiesandroid/settings.gradleapp/containers/AudioPlayer/index.tsxapp/containers/LoginServices/LoginServices.test.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/Ringer/index.tsxapp/containers/markdown/components/Inline.tsxapp/containers/markdown/components/Katex.tsxapp/externalModules.d.tsapp/lib/constants/audio.tsapp/lib/methods/AudioManager.tsapp/lib/methods/helpers/expoAvShim.tsapp/lib/methods/helpers/theme.tsapp/lib/services/voip/playCallEndedSound.test.tsapp/lib/services/voip/playCallEndedSound.tsapp/views/AttachmentView.test.tsxapp/views/AttachmentView.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/CallView/index.test.tsxapp/views/CallView/index.tsxapp/views/ShareView/Preview.tsxios/AppDelegate.swiftios/Podfileios/RocketChat.xcodeproj/project.pbxprojios/RocketChatRN/Info.plistjest.setup.jspackage.jsonpatches/@react-native-cookies+cookies+6.2.1.patchpatches/expo-asset+55.0.17.patchpatches/expo-file-system+55.0.23.patchpatches/expo-font+55.0.8.patchpatches/react-native+0.83.10.patchpatches/react-native-gesture-handler+2.30.1.patchpatches/react-native-mmkv+4.3.1.patchpatches/react-native-restart+0.0.22.patchpatches/react-native-webview+13.16.0.patch
💤 Files with no reviewable changes (2)
- app/externalModules.d.ts
- ios/Podfile
📜 Review details
🧰 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/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/lib/constants/audio.tsapp/containers/markdown/components/Inline.tsxapp/views/AttachmentView.test.tsxapp/lib/services/voip/playCallEndedSound.tsapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/containers/Ringer/index.tsxapp/lib/methods/helpers/theme.tsapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/lib/methods/helpers/expoAvShim.tsapp/lib/methods/AudioManager.tsapp/lib/services/voip/playCallEndedSound.test.tsjest.setup.jsapp/containers/markdown/components/Katex.tsx
**/*.{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
**/*.{ts,tsx}: Use TypeScript in strict mode, with imports resolved from theapp/baseUrl
Follow the repository's TypeScript/React Native code style enforced by Prettier: tabs, single quotes, 130-character width, no trailing commas, omit arrow-function parens when possible, and keep brackets on the same line
Files:
app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/lib/constants/audio.tsapp/containers/markdown/components/Inline.tsxapp/views/AttachmentView.test.tsxapp/lib/services/voip/playCallEndedSound.tsapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/containers/Ringer/index.tsxapp/lib/methods/helpers/theme.tsapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/lib/methods/helpers/expoAvShim.tsapp/lib/methods/AudioManager.tsapp/lib/services/voip/playCallEndedSound.test.tsapp/containers/markdown/components/Katex.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use the project's ESLint setup (
@rocket.chat/eslint-configwith React, React Native, TypeScript, and Jest plugins) for code quality and style compliance
Files:
app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/lib/constants/audio.tsapp/containers/markdown/components/Inline.tsxapp/views/AttachmentView.test.tsxapp/lib/services/voip/playCallEndedSound.tsapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/containers/Ringer/index.tsxapp/lib/methods/helpers/theme.tsapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/lib/methods/helpers/expoAvShim.tsapp/lib/methods/AudioManager.tsapp/lib/services/voip/playCallEndedSound.test.tsjest.setup.jsapp/containers/markdown/components/Katex.tsx
app/containers/**/*.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
Place reusable UI components under
app/containers/
Files:
app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/containers/markdown/components/Inline.tsxapp/containers/LoginServices/LoginServices.test.tsxapp/containers/Ringer/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/containers/markdown/components/Katex.tsx
app/views/**/*.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
Place screen components under
app/views/
Files:
app/views/AttachmentView.test.tsxapp/views/CallView/index.test.tsxapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsx
app/lib/services/voip/**/*.ts
📄 CodeRabbit inference engine (CLAUDE.md)
Keep WebRTC VoIP audio-calling logic under
app/lib/services/voip/, using Zustand stores rather than Redux
Files:
app/lib/services/voip/playCallEndedSound.tsapp/lib/services/voip/playCallEndedSound.test.ts
🧠 Learnings (8)
📚 Learning: 2026-05-05T21:08:33.177Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7298
File: patches/@rocket.chat+sdk+1.3.3-mobile.patch:79-79
Timestamp: 2026-05-05T21:08:33.177Z
Learning: In the RocketChat/Rocket.Chat.ReactNative repo, for patches under patches/*.patch (especially those touching rocket.chat/sdk), remember that the patching sandbox's node_modules reflects the pre-patch state. Grepping node_modules for symbols (e.g., userDisconnectCloseCode = 4000 in node_modules/rocket.chat/sdk/lib/drivers/ddp.ts) can yield false positives. Review patches by inspecting the diff and applying it to a fresh copy of the SDK or diffing against the SDK source, rather than relying on node_modules. Ensure the patch actually introduces/updates symbols in the SDK source and run the test suite to validate behavior after applying the patch.
Applied to files:
patches/@react-native-cookies+cookies+6.2.1.patchpatches/react-native-restart+0.0.22.patchpatches/expo-file-system+55.0.23.patchpatches/expo-asset+55.0.17.patchpatches/react-native-gesture-handler+2.30.1.patchpatches/react-native+0.83.10.patch
📚 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/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/lib/constants/audio.tsapp/containers/markdown/components/Inline.tsxapp/views/AttachmentView.test.tsxapp/lib/services/voip/playCallEndedSound.tsapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/containers/Ringer/index.tsxapp/lib/methods/helpers/theme.tsapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/lib/methods/helpers/expoAvShim.tsapp/lib/methods/AudioManager.tsapp/lib/services/voip/playCallEndedSound.test.tsapp/containers/markdown/components/Katex.tsx
📚 Learning: 2026-06-25T18:37:25.526Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7434
File: app/views/ScreenLockConfigView.test.tsx:16-22
Timestamp: 2026-06-25T18:37:25.526Z
Learning: In Rocket.Chat ReactNative tests that mock selectors for `useAppSelector`, don’t require the mocked selector input to be typed as `IApplicationState` when the fixture only includes a partial Redux state slice (e.g., only `server` and `settings`). Requiring the full `IApplicationState` type in that scenario forces unsafe `as IApplicationState` casts and undermines type-safety. For these narrowly scoped selector-mock fixtures, use a less strict type (e.g., `any`) to keep the mock focused on the slice under test.
Applied to files:
app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/views/AttachmentView.test.tsxapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/lib/services/voip/playCallEndedSound.test.ts
📚 Learning: 2026-06-25T18:37:44.793Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7434
File: app/views/ScreenLockConfigView.tsx:101-141
Timestamp: 2026-06-25T18:37:44.793Z
Learning: In the Rocket.Chat React Native codebase, do not treat passing an `async` function directly to an event prop in React/React Native UI components (e.g., `onPress={async () => ...}` in TSX) as a “floating promises” CI-blocking lint issue—this repo does not enable the ESLint `no-floating-promises` rule (while `no-void` is enforced). Only raise robustness follow-ups when there are genuinely unhandled promise paths (e.g., fire-and-forget calls like `save()` that return a Promise that is neither awaited nor handled), and prefer making sure failure paths are explicitly handled/reported rather than blocking on lint-style floating-promise concerns.
Applied to files:
app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsxapp/containers/MessageComposer/components/RecordAudio/Duration.tsxapp/containers/markdown/components/Inline.tsxapp/views/AttachmentView.test.tsxapp/containers/LoginServices/LoginServices.test.tsxapp/views/CallView/index.test.tsxapp/containers/Ringer/index.tsxapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/AudioPlayer/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsxapp/containers/MessageComposer/components/Buttons/MicOrSendButton.tsxapp/containers/markdown/components/Katex.tsx
📚 Learning: 2026-06-24T22:58:43.390Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7157
File: app/views/MessagesView/index.tsx:392-392
Timestamp: 2026-06-24T22:58:43.390Z
Learning: When wrapping a React Native component (e.g., via `withSafeAreaInsets`) ensure `hoistNonReactStatics` is only required if the wrapped component actually defines static properties/methods that consumers rely on. If the component has no statics (as in `app/views/MessagesView/index.tsx`), you can omit `hoistNonReactStatics` for this case.
Applied to files:
app/views/AttachmentView.test.tsxapp/views/CallView/index.test.tsxapp/views/ShareView/Preview.tsxapp/views/CallView/index.tsxapp/views/CallView/components/Dialpad/DialpadContext.tsxapp/views/AttachmentView.tsx
📚 Learning: 2026-03-30T15:49:26.708Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6875
File: app/containers/RoomItem/Actions.tsx:12-12
Timestamp: 2026-03-30T15:49:26.708Z
Learning: In Rocket.Chat.ReactNative, do not rely on `react-native-worklets` v0.6.1 exporting a built-in Jest mock (e.g., `react-native-worklets/lib/module/mock` does not exist for this version). Instead, add the Jest manual mock in your repo’s `jest.setup.js`/`jest.setup.ts`, mocking `react-native-worklets` to provide `scheduleOnRN: jest.fn((fn, ...args) => fn(...args))`. This ensures Jest can import the module and that `scheduleOnRN` executes the passed function during tests.
Applied to files:
jest.setup.js
📚 Learning: 2026-02-05T13:55:00.974Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6930
File: package.json:101-101
Timestamp: 2026-02-05T13:55:00.974Z
Learning: In this repository, the dependency on react-native-image-crop-picker should reference the RocketChat fork (RocketChat/react-native-image-crop-picker) with explicit commit pins, not the upstream ivpusic/react-native-image-crop-picker. Update package.json dependencies (and any lockfile) to point to the fork URL and a specific commit, ensuring edge-to-edge Android fixes are included. This pattern should apply to all package.json files in the repo that declare this dependency.
Applied to files:
package.json
📚 Learning: 2026-05-07T17:47:14.516Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7303
File: package.json:5-5
Timestamp: 2026-05-07T17:47:14.516Z
Learning: When reviewing pnpm `packageManager` version pins in any `package.json` (e.g., `"packageManager": "pnpm@<version>"`), don’t rely solely on web-search results to determine whether a version exists. For very recently published versions, cross-check the target version against the official pnpm release page (https://github.com/pnpm/pnpm/releases) and the npm registry page for pnpm (https://www.npmjs.com/package/pnpm) before flagging the pinned version as non-existent.
Applied to files:
package.json
🔇 Additional comments (43)
app/lib/methods/helpers/theme.ts (1)
25-25: LGTM!app/containers/LoginServices/LoginServices.test.tsx (1)
22-25: 🎯 Functional CorrectnessKeep
openURLassertions on the top-levelLinkingimport. Direct access toreact-native/Libraries/Linking/Linking.openURL will beundefinedwith this mock shape; use the exportedLinkingobject instead.app/containers/markdown/components/Katex.tsx (2)
11-17: LGTM!
4-5: 🩺 Stability & AvailabilityVerify import path casing and export shapes. Confirm
./codematches the actual filename casing and thatCodeis exported as a named export; otherwise this will fail on case-sensitive filesystems.app/containers/markdown/components/Inline.tsx (1)
14-14: LGTM!Also applies to: 72-72
package.json (2)
35-38: LGTM!Also applies to: 62-77, 86-88, 100-122, 158-158, 171-174, 186-186, 197-197, 210-217
219-229: 📐 Maintainability & Code Quality
expo-fontcan stay inbuildFromSourcebuildFromSourceis independent of patch files, so the missingexpo-fontpatch does not make this entry suspicious.> Likely an incorrect or invalid review comment.android/build.gradle (1)
52-52: LGTM!android/gradle/wrapper/gradle-wrapper.properties (1)
3-3: LGTM!android/settings.gradle (1)
1-41: LGTM!android/app/src/main/AndroidManifest.xml (1)
7-11: LGTM!android/app/src/main/java/chat/rocket/reactnative/MainApplication.kt (1)
39-54: 🩺 Stability & AvailabilityDrop the
gradle.propertiescheck RN 0.83 makes New Architecture mandatory and Hermes the default, sonewArchEnabled/hermesEnabledno longer drive this path.> Likely an incorrect or invalid review comment.patches/@react-native-cookies+cookies+6.2.1.patch (1)
1-23: LGTM!patches/expo-asset+55.0.17.patch (1)
15-25: LGTM!ios/AppDelegate.swift (1)
1-1: LGTM!Confirmed via search that both the
public import Expoaddition and the removal ofbindReactNativeFactoryare the documented/expected changes for the Expo SDK 55 / RN 0.83 migration (Expo removedbindReactNativeFactoryupstream sincerecreateRootViewnow lives insideExpoReactNativeFactory, andpublic importis the fix for the "ambiguous implicit access level" warning introduced by Expo 55'sExpoModulesProvider.swift).Also applies to: 14-14, 41-45, 91-91
ios/RocketChat.xcodeproj/project.pbxproj (2)
1277-1288: LGTM!Also applies to: 1312-1323, 1436-1447, 1471-1482
1557-1562: 🩺 Stability & AvailabilityCheck the Hermes pin in
ios/Podfile.lock. RN 0.83.10 uses the prebuilthermesvm.framework, so this path change is expected; a stale pin is what would trigger a missing-framework build failure.ios/RocketChatRN/Info.plist (1)
5-6: LGTM!patches/expo-file-system+55.0.23.patch (1)
4-21: 🩺 Stability & AvailabilityStatic
clientneeds a single-writer guaranteeThis is now process-wide mutable state. If
setOkHttpClientcan run after requests start, make the field thread-safe (@Volatile/synchronized) or keep it instance-scoped; otherwise document that it is set once during startup and never changed.patches/react-native+0.83.10.patch (1)
4-14: LGTM!Also applies to: 15-24
patches/react-native-gesture-handler+2.30.1.patch (2)
14-53: LGTM!
9-11: 🩺 Stability & AvailabilityConfirm
userEnabledis declared on the button hierarchy.canBecomeFocusedusesself.userEnabled; make sure that property exists onRNGestureHandlerButtonor one of its superclasses before relying on it here.patches/react-native-restart+0.0.22.patch (1)
1-22: LGTM!.github/actions/build-ios/action.yml (1)
55-61: LGTM!app/lib/methods/helpers/expoAvShim.ts (1)
1-220: LGTM!app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsx (1)
160-160: LGTM!app/lib/services/voip/playCallEndedSound.test.ts (1)
9-9: LGTM!Also applies to: 27-27
app/views/AttachmentView.test.tsx (1)
21-21: LGTM!app/views/CallView/index.test.tsx (1)
654-654: LGTM!jest.setup.js (2)
94-94: LGTM!
32-33: 🩺 Stability & Availability
scheduleOnUIshould only be a no-op if no tests depend on its callback
If any code under test relies onscheduleOnUIside effects, this mock will silently skip that path.app/containers/AudioPlayer/index.tsx (1)
7-7: LGTM!app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx (1)
5-5: LGTM!app/containers/MessageComposer/components/RecordAudio/Duration.tsx (1)
4-4: LGTM!app/views/ShareView/Preview.tsx (1)
7-7: LGTM!app/lib/services/voip/playCallEndedSound.ts (1)
1-1: LGTM!app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx (1)
7-7: 🩺 Stability & AvailabilityCheck the
getURI()return path —recordingRef.current?.getURI()is cast tostringbeforegetInfoAsync; if the shim can returnundefined, the send flow still has an unsafe runtime path.app/containers/Ringer/index.tsx (1)
3-3: LGTM!app/lib/constants/audio.ts (1)
1-7: LGTM!app/lib/methods/AudioManager.ts (1)
3-3: LGTM!app/views/AttachmentView.tsx (1)
9-9: LGTM!app/views/CallView/components/Dialpad/DialpadContext.tsx (1)
2-3: LGTM!app/views/CallView/index.tsx (1)
3-3: LGTM!Also applies to: 54-54
|
Android Build Available Rocket.Chat 4.75.0.109333 Internal App Sharing: https://play.google.com/apps/test/RQQ8k09hlnQ/ahAO29uNRLFPjI8kitO1-Ap1PHQP_ryL4m9YQBt6z4CJiTkty4KYn4Y2HuXqZl6VTq7n9l9rERa4NT3Y2eObd1HGWl |
|
iOS Build Available Rocket.Chat 4.75.0.109334 |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
package.json (1)
103-103: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPin the
react-native-katexgit dependency to a specific commit.The git URL lacks a commit hash, so builds are non-reproducible — any push to the fork's default branch changes what gets installed. Based on learnings, fork dependencies in this repo should use explicit commit pins (e.g., the
react-native-image-crop-pickerfork is pinned this way).- "react-native-katex": "git+https://github.com/RocketChat/react-native-katex.git", + "react-native-katex": "git+https://github.com/RocketChat/react-native-katex.git#<commit-sha>",🤖 Prompt for 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. In `@package.json` at line 103, Pin the react-native-katex dependency in package.json to a specific immutable commit hash by appending the commit reference to its git URL, matching the explicit commit-pinning convention used by other fork dependencies such as react-native-image-crop-picker.Source: Learnings
🤖 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/containers/markdown/components/Katex.test.tsx`:
- Around line 14-24: Update the `react-native-katex` mock to capture `onMessage`
separately instead of passing it to the mocked `View`; retain the callback in
test-scoped state and invoke it explicitly in the resize assertion while keeping
the `View` limited to supported props.
---
Nitpick comments:
In `@package.json`:
- Line 103: Pin the react-native-katex dependency in package.json to a specific
immutable commit hash by appending the commit reference to its git URL, matching
the explicit commit-pinning convention used by other fork dependencies such as
react-native-image-crop-picker.
🪄 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: 9dbc23bd-b88e-4aec-b19f-aa6ca444335c
⛔ Files ignored due to path filters (2)
app/containers/message/__snapshots__/Message.test.tsx.snapis excluded by!**/*.snappnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (3)
app/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsxpackage.json
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
- GitHub Check: CodeRabbit / Review
- GitHub Check: ESLint and Test / run-eslint-and-test
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{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/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
**/*.{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
**/*.{ts,tsx}: Use TypeScript in strict mode, with imports resolved from theapp/baseUrl
Follow the repository's TypeScript/React Native code style enforced by Prettier: tabs, single quotes, 130-character width, no trailing commas, omit arrow-function parens when possible, and keep brackets on the same line
Files:
app/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use the project's ESLint setup (
@rocket.chat/eslint-configwith React, React Native, TypeScript, and Jest plugins) for code quality and style compliance
Files:
app/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
app/containers/**/*.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
Place reusable UI components under
app/containers/
Files:
app/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
🧠 Learnings (5)
📚 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/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
📚 Learning: 2026-06-25T18:37:25.526Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7434
File: app/views/ScreenLockConfigView.test.tsx:16-22
Timestamp: 2026-06-25T18:37:25.526Z
Learning: In Rocket.Chat ReactNative tests that mock selectors for `useAppSelector`, don’t require the mocked selector input to be typed as `IApplicationState` when the fixture only includes a partial Redux state slice (e.g., only `server` and `settings`). Requiring the full `IApplicationState` type in that scenario forces unsafe `as IApplicationState` casts and undermines type-safety. For these narrowly scoped selector-mock fixtures, use a less strict type (e.g., `any`) to keep the mock focused on the slice under test.
Applied to files:
app/containers/markdown/components/Katex.test.tsx
📚 Learning: 2026-06-25T18:37:44.793Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7434
File: app/views/ScreenLockConfigView.tsx:101-141
Timestamp: 2026-06-25T18:37:44.793Z
Learning: In the Rocket.Chat React Native codebase, do not treat passing an `async` function directly to an event prop in React/React Native UI components (e.g., `onPress={async () => ...}` in TSX) as a “floating promises” CI-blocking lint issue—this repo does not enable the ESLint `no-floating-promises` rule (while `no-void` is enforced). Only raise robustness follow-ups when there are genuinely unhandled promise paths (e.g., fire-and-forget calls like `save()` that return a Promise that is neither awaited nor handled), and prefer making sure failure paths are explicitly handled/reported rather than blocking on lint-style floating-promise concerns.
Applied to files:
app/containers/markdown/components/Katex.test.tsxapp/containers/markdown/components/Katex.tsx
📚 Learning: 2026-02-05T13:55:00.974Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6930
File: package.json:101-101
Timestamp: 2026-02-05T13:55:00.974Z
Learning: In this repository, the dependency on react-native-image-crop-picker should reference the RocketChat fork (RocketChat/react-native-image-crop-picker) with explicit commit pins, not the upstream ivpusic/react-native-image-crop-picker. Update package.json dependencies (and any lockfile) to point to the fork URL and a specific commit, ensuring edge-to-edge Android fixes are included. This pattern should apply to all package.json files in the repo that declare this dependency.
Applied to files:
package.json
📚 Learning: 2026-05-07T17:47:14.516Z
Learnt from: diegolmello
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7303
File: package.json:5-5
Timestamp: 2026-05-07T17:47:14.516Z
Learning: When reviewing pnpm `packageManager` version pins in any `package.json` (e.g., `"packageManager": "pnpm@<version>"`), don’t rely solely on web-search results to determine whether a version exists. For very recently published versions, cross-check the target version against the official pnpm release page (https://github.com/pnpm/pnpm/releases) and the npm registry page for pnpm (https://www.npmjs.com/package/pnpm) before flagging the pinned version as non-existent.
Applied to files:
package.json
🔇 Additional comments (3)
app/containers/markdown/components/Katex.tsx (2)
2-54: LGTM!Also applies to: 56-58
55-55: 🎯 Functional CorrectnessDouble-check the WebView sizing.
flex: 1can override the measuredheighthere if the parent doesn’t constrain the view.app/containers/markdown/components/Katex.test.tsx (1)
1-13: LGTM!Also applies to: 25-47, 49-52
| jest.mock('react-native-katex', () => { | ||
| const { View } = require('react-native'); | ||
| return { | ||
| __esModule: true, | ||
| default: ({ expression, onMessage, style }: IKatexMockProps) => ( | ||
| <View testID='katex-webview' onMessage={onMessage} style={style}> | ||
| {expression} | ||
| </View> | ||
| ) | ||
| }; | ||
| }); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT
curl -fsSL https://registry.npmjs.org/react-native/-/react-native-0.83.10.tgz |
tar -xz -C "$tmp"
if rg -n '\bonMessage\??:' \
"$tmp/package/Libraries/Components/View" \
"$tmp/package/types_generated/Libraries/Components/View"; then
echo "Unexpected: onMessage is declared by ViewProps"
exit 1
else
echo "Confirmed: ViewProps does not declare onMessage"
fiRepository: RocketChat/Rocket.Chat.ReactNative
Length of output: 2020
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== file =="
if [ -f app/containers/markdown/components/Katex.test.tsx ]; then
sed -n '1,220p' app/containers/markdown/components/Katex.test.tsx | nl -ba
else
echo "file missing"
fi
echo
echo "== references =="
rg -n "react-native-katex|katex-webview|onMessage|WebViewMessageEvent|IKatexMockProps" app/containers/markdown/components app -g '!**/node_modules/**'Repository: RocketChat/Rocket.Chat.ReactNative
Length of output: 1991
🌐 Web query:
React Native ViewProps onMessage prop react-native-katex mock View onMessage TypeScript
💡 Result:
The standard React Native View component does not have an onMessage prop [1][2][3]. The onMessage prop is a feature specific to the WebView component [4][5], typically used to handle messages sent from web content to the native application via window.ReactNativeWebView.postMessage [6][5]. Regarding react-native-katex, because it internally uses a WebView to render mathematical expressions [7][6], any onMessage prop you see associated with it is passed down to that underlying WebView component. If you are attempting to mock this component in a testing environment (such as with Jest or React Native Testing Library), you should mock it as a View or a container that accepts props, and if you need to simulate the message-passing behavior, you can manually trigger the callback function provided to the onMessage prop [8]. Example of how to mock a component with an onMessage prop in tests: jest.mock('react-native-katex', => { const React = require('react'); const { View } = require('react-native'); return jest.fn(({ onMessage,...props }) => ( <View {...props} testID="katex-mock" />)); }); In this mock, the onMessage prop is intercepted and can be called manually in your tests using fireEvent or direct function invocation to simulate the bridge between the WebView and your component logic [8].
Citations:
- 1: https://reactnative.dev/docs/view
- 2: https://github.com/facebook/react-native/blob/972a30db/packages/react-native/Libraries/Components/View/ViewPropTypes.d.ts
- 3: https://reactnative.dev/docs/0.80/view
- 4: https://archive.reactnative.dev/docs/0.53/webview
- 5: https://making.close.com/posts/react-native-webviews/
- 6: https://unpkg.com/react-native-latex-equation@0.2.1/SKILL.md
- 7: https://github.com/RocketChat/react-native-katex
- 8: https://coolsoftware.dev/blog/testing-react-native-webview-with-react-native-testing-library/
Don't pass onMessage through the mocked View in app/containers/markdown/components/Katex.test.tsx. View doesn't accept that prop, so capture the callback separately and invoke it from the resize assertion instead.
🤖 Prompt for 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.
In `@app/containers/markdown/components/Katex.test.tsx` around lines 14 - 24,
Update the `react-native-katex` mock to capture `onMessage` separately instead
of passing it to the mocked `View`; retain the callback in test-scoped state and
invoke it explicitly in the resize assertion while keeping the `View` limited to
supported props.
…e/rn-0.83-expo-55 # Conflicts: # package.json # pnpm-lock.yaml
… Tab navigation on Android
|
iOS Build Available Rocket.Chat 4.75.0.109340 |
Proposed changes
Coordinated merge of the React Native 0.81 → 0.83.10 / Expo SDK 54 → 55 upgrade from the long-lived integration branch
chore/rn-0.83-expo-55intodevelop. Per the "no half upgrades" model, the whole epic lands in a single merge.Bundled work:
MainApplicationhost, native config re-merge.nitro-modules0.35.9 +react-native-mmkv4.3.1 lockstep.patch-packagepatches re-validated / regenerated against the target versions.@rocket.chat/mobile-cryptorebuilt on BouncyCastle.react-native-katex), replacing the abandoned native library removed during the bump.react-native-image-crop-pickerfork forward-ported.ios/Podfile.lockfinalized (dropped the staleEXAV/ expo-av pod).expo-fontadded as a direct dependency (peer of@expo/vector-icons), duplicateCADisableMinimumFrameDurationOnPhonekey removed fromInfo.plist.react-native-keyboard-controllerstays pinned at 1.18.5 — the SDK 55-aligned 1.20.7 breaks hardware-keyboard Tab navigation on Android (e2e shard 14); re-bump tracked as follow-up.Issue(s)
https://rocketchat.atlassian.net/browse/NATIVE-1234
How to test or reproduce
Screenshots
Types of changes
Checklist
Further comments
This is the epic's single coordinated merge to
develop. Merge should wait on QA sign-off — VoIP native-trio smoke and the QA / Jest snapshot / Maestro gates.Summary by CodeRabbit
New Features
Bug Fixes
Chores / Maintenance