Skip to content

chore: upgrade to React Native 0.83.10 and Expo SDK 55#7481

Open
diegolmello wants to merge 11 commits into
developfrom
chore/rn-0.83-expo-55
Open

chore: upgrade to React Native 0.83.10 and Expo SDK 55#7481
diegolmello wants to merge 11 commits into
developfrom
chore/rn-0.83-expo-55

Conversation

@diegolmello

@diegolmello diegolmello commented Jul 9, 2026

Copy link
Copy Markdown
Member

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-55 into develop. Per the "no half upgrades" model, the whole epic lands in a single merge.

Bundled work:

  • Framework bump — RN 0.83.10 + Expo SDK 55, Gradle 9, bridgeless MainApplication host, native config re-merge.
  • nitro-modules 0.35.9 + react-native-mmkv 4.3.1 lockstep.
  • patch-package patches re-validated / regenerated against the target versions.
  • @rocket.chat/mobile-crypto rebuilt on BouncyCastle.
  • LaTeX math rendering re-enabled on a WebView-based KaTeX renderer (react-native-katex), replacing the abandoned native library removed during the bump.
  • react-native-image-crop-picker fork forward-ported.
  • ios/Podfile.lock finalized (dropped the stale EXAV / expo-av pod).
  • Post-upgrade audit fixes: expo-font added as a direct dependency (peer of @expo/vector-icons), duplicate CADisableMinimumFrameDurationOnPhone key removed from Info.plist. react-native-keyboard-controller stays 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

  • Native iOS + Android store builds pass (this PR's gated build lanes).
  • E2E build + Maestro shards pass on both platforms.
  • App boots; login, room list, and messaging work. LaTeX math renders typeset via the WebView KaTeX component.

Screenshots

Types of changes

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

Checklist

  • Lint and unit tests pass locally with my changes

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

    • Enhanced Markdown math rendering: inline and block KaTeX now render consistently with improved block formula sizing.
  • Bug Fixes

    • Improved audio recording/playback compatibility across the app.
    • Fixed Android external storage permission handling for newer Android versions (scoped-storage).
  • Chores / Maintenance

    • Updated CI CocoaPods cache keying and refreshed iOS/Android build/test configuration, including updated Jest mocks and added KaTeX rendering tests.

…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.
@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR upgrades React Native and Expo integration, adds an expo-av compatibility shim, migrates media consumers, rewrites KaTeX Markdown rendering, updates native patches and build wiring, and adjusts related tests and mocks.

Changes

RN 0.83 / Expo 55 Native Build and Dependency Upgrade

Layer / File(s) Summary
Dependencies and native patches
package.json, patches/*.patch
React Native, Expo, tooling, and ecosystem packages are upgraded; native patches update repository, asset, filesystem, accessibility, architecture, and gesture-handler behavior.
Android Gradle and application wiring
android/build.gradle, android/settings.gradle, android/gradle/wrapper/gradle-wrapper.properties, android/app/...
Expo autolinking and React Native Gradle integration are updated, Gradle targets 9.0.0, MainApplication uses a lazy ReactHost, and scoped-storage permission wiring is added.
iOS runtime and build wiring
ios/AppDelegate.swift, ios/Podfile, ios/RocketChat.xcodeproj/project.pbxproj, ios/RocketChatRN/Info.plist, .github/actions/*
Expo factory wiring, privacy bundles, Hermes embedding, frame-duration configuration, Podfile content, and CocoaPods cache keys are updated.

expo-av Shim Migration

Layer / File(s) Summary
Shim implementation
app/lib/methods/helpers/expoAvShim.ts
Defines the audio, recording, permission, playback, video, type, enum, and constant surfaces used by the application.
Application media imports
app/containers/..., app/lib/..., app/views/...
Media consumers switch audio and video imports from expo-av to the local shim.
Shim test boundaries
jest.setup.js, app/**/*.test.*
Jest setup and media tests mock the shim module, with the obsolete math-view mock removed.

Markdown Rendering and Small Application Fixes

Layer / File(s) Summary
KaTeX Markdown rendering
app/containers/markdown/components/*, app/externalModules.d.ts
Block KaTeX uses WebView rendering and height tracking, inline KaTeX uses InlineCode, and math-view wiring is removed.
Theme and Linking test adjustments
app/lib/methods/helpers/theme.ts, app/containers/LoginServices/LoginServices.test.tsx
Theme selection accepts only light or dark system schemes, and the Linking mock uses an ES-module default export.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

Suggested labels: type: chore

Suggested reviewers: OtavioStasiak, Rohit3523

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Title check ✅ Passed The title clearly summarizes the main change: a coordinated upgrade to React Native 0.83.10 and Expo SDK 55.

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (2)
  • EXPO-55: Request failed with status code 401
  • NATIVE-1234: Request failed with status code 401

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
.github/actions/upload-ios/action.yml (1)

54-61: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Consider restoring restore-keys for cache fallback.

The old pods-v1 cache configuration included restore-keys for partial cache matching, but the new pods-v2 configuration omits them. Without restore-keys, every Podfile.lock change results in a full cache miss and a complete pod install download. Adding a prefix-based restore-keys fallback 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

📥 Commits

Reviewing files that changed from the base of the PR and between 1a2c8c6 and 4c9f063.

⛔ Files ignored due to path filters (27)
  • app/containers/Avatar/__snapshots__/Avatar.test.tsx.snap is excluded by !**/*.snap
  • app/containers/Chip/__snapshots__/Chip.test.tsx.snap is excluded by !**/*.snap
  • app/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snap is excluded by !**/*.snap
  • app/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snap is excluded by !**/*.snap
  • app/containers/NewMediaCall/__snapshots__/FilterHeader.test.tsx.snap is excluded by !**/*.snap
  • app/containers/NewMediaCall/__snapshots__/PeerItem.test.tsx.snap is excluded by !**/*.snap
  • app/containers/NewMediaCall/__snapshots__/PeerList.test.tsx.snap is excluded by !**/*.snap
  • app/containers/NewMediaCall/__snapshots__/SelectedPeer.test.tsx.snap is excluded by !**/*.snap
  • app/containers/ReactionsList/__snapshots__/ReactionsList.test.tsx.snap is excluded by !**/*.snap
  • app/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snap is excluded by !**/*.snap
  • app/containers/SearchBox/__snapshots__/SearchBox.test.tsx.snap is excluded by !**/*.snap
  • app/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snap is excluded by !**/*.snap
  • app/containers/TextInput/__snapshots__/TextInput.test.tsx.snap is excluded by !**/*.snap
  • app/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snap is excluded by !**/*.snap
  • app/containers/markdown/__snapshots__/Markdown.test.tsx.snap is excluded by !**/*.snap
  • app/containers/message/__snapshots__/Message.test.tsx.snap is excluded by !**/*.snap
  • app/views/CallView/__snapshots__/index.test.tsx.snap is excluded by !**/*.snap
  • app/views/CallView/components/Dialpad/__snapshots__/Dialpad.test.tsx.snap is excluded by !**/*.snap
  • app/views/CallView/components/__snapshots__/CallerInfo.test.tsx.snap is excluded by !**/*.snap
  • app/views/DiscussionsView/__snapshots__/Item.test.tsx.snap is excluded by !**/*.snap
  • app/views/NewMessageView/__snapshots__/Item.test.tsx.snap is excluded by !**/*.snap
  • app/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snap is excluded by !**/*.snap
  • app/views/RoomInfoView/components/__snapshots__/RoomInfoViewAvatar.test.tsx.snap is excluded by !**/*.snap
  • app/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snap is excluded by !**/*.snap
  • app/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snap is excluded by !**/*.snap
  • ios/Podfile.lock is excluded by !**/*.lock
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (44)
  • .github/actions/build-ios/action.yml
  • .github/actions/upload-ios/action.yml
  • android/app/src/main/AndroidManifest.xml
  • android/app/src/main/java/chat/rocket/reactnative/MainApplication.kt
  • android/build.gradle
  • android/gradle/wrapper/gradle-wrapper.properties
  • android/settings.gradle
  • app/containers/AudioPlayer/index.tsx
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsx
  • app/containers/Ringer/index.tsx
  • app/containers/markdown/components/Inline.tsx
  • app/containers/markdown/components/Katex.tsx
  • app/externalModules.d.ts
  • app/lib/constants/audio.ts
  • app/lib/methods/AudioManager.ts
  • app/lib/methods/helpers/expoAvShim.ts
  • app/lib/methods/helpers/theme.ts
  • app/lib/services/voip/playCallEndedSound.test.ts
  • app/lib/services/voip/playCallEndedSound.ts
  • app/views/AttachmentView.test.tsx
  • app/views/AttachmentView.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/CallView/index.test.tsx
  • app/views/CallView/index.tsx
  • app/views/ShareView/Preview.tsx
  • ios/AppDelegate.swift
  • ios/Podfile
  • ios/RocketChat.xcodeproj/project.pbxproj
  • ios/RocketChatRN/Info.plist
  • jest.setup.js
  • package.json
  • patches/@react-native-cookies+cookies+6.2.1.patch
  • patches/expo-asset+55.0.17.patch
  • patches/expo-file-system+55.0.23.patch
  • patches/expo-font+55.0.8.patch
  • patches/react-native+0.83.10.patch
  • patches/react-native-gesture-handler+2.30.1.patch
  • patches/react-native-mmkv+4.3.1.patch
  • patches/react-native-restart+0.0.22.patch
  • patches/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.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/lib/constants/audio.ts
  • app/containers/markdown/components/Inline.tsx
  • app/views/AttachmentView.test.tsx
  • app/lib/services/voip/playCallEndedSound.ts
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/containers/Ringer/index.tsx
  • app/lib/methods/helpers/theme.ts
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/AttachmentView.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/lib/methods/helpers/expoAvShim.ts
  • app/lib/methods/AudioManager.ts
  • app/lib/services/voip/playCallEndedSound.test.ts
  • jest.setup.js
  • app/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 the app/ 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.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/lib/constants/audio.ts
  • app/containers/markdown/components/Inline.tsx
  • app/views/AttachmentView.test.tsx
  • app/lib/services/voip/playCallEndedSound.ts
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/containers/Ringer/index.tsx
  • app/lib/methods/helpers/theme.ts
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/AttachmentView.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/lib/methods/helpers/expoAvShim.ts
  • app/lib/methods/AudioManager.ts
  • app/lib/services/voip/playCallEndedSound.test.ts
  • app/containers/markdown/components/Katex.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use the project's ESLint setup (@rocket.chat/eslint-config with React, React Native, TypeScript, and Jest plugins) for code quality and style compliance

Files:

  • app/containers/NewMediaCall/VoipCallLifecycle.integration.test.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/lib/constants/audio.ts
  • app/containers/markdown/components/Inline.tsx
  • app/views/AttachmentView.test.tsx
  • app/lib/services/voip/playCallEndedSound.ts
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/containers/Ringer/index.tsx
  • app/lib/methods/helpers/theme.ts
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/AttachmentView.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/lib/methods/helpers/expoAvShim.ts
  • app/lib/methods/AudioManager.ts
  • app/lib/services/voip/playCallEndedSound.test.ts
  • jest.setup.js
  • app/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.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/containers/markdown/components/Inline.tsx
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/containers/Ringer/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/containers/markdown/components/Katex.tsx
app/views/**/*.tsx

📄 CodeRabbit inference engine (CLAUDE.md)

Place screen components under app/views/

Files:

  • app/views/AttachmentView.test.tsx
  • app/views/CallView/index.test.tsx
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/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.ts
  • app/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.patch
  • patches/react-native-restart+0.0.22.patch
  • patches/expo-file-system+55.0.23.patch
  • patches/expo-asset+55.0.17.patch
  • patches/react-native-gesture-handler+2.30.1.patch
  • patches/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.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/lib/constants/audio.ts
  • app/containers/markdown/components/Inline.tsx
  • app/views/AttachmentView.test.tsx
  • app/lib/services/voip/playCallEndedSound.ts
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/containers/Ringer/index.tsx
  • app/lib/methods/helpers/theme.ts
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/AttachmentView.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/lib/methods/helpers/expoAvShim.ts
  • app/lib/methods/AudioManager.ts
  • app/lib/services/voip/playCallEndedSound.test.ts
  • app/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.tsx
  • app/views/AttachmentView.test.tsx
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/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.tsx
  • app/containers/MessageComposer/components/RecordAudio/Duration.tsx
  • app/containers/markdown/components/Inline.tsx
  • app/views/AttachmentView.test.tsx
  • app/containers/LoginServices/LoginServices.test.tsx
  • app/views/CallView/index.test.tsx
  • app/containers/Ringer/index.tsx
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
  • app/containers/AudioPlayer/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/views/AttachmentView.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/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.tsx
  • app/views/CallView/index.test.tsx
  • app/views/ShareView/Preview.tsx
  • app/views/CallView/index.tsx
  • app/views/CallView/components/Dialpad/DialpadContext.tsx
  • app/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 Correctness

Keep openURL assertions on the top-level Linking import. Direct access to react-native/Libraries/Linking/Linking.openURL will be undefined with this mock shape; use the exported Linking object instead.

app/containers/markdown/components/Katex.tsx (2)

11-17: LGTM!


4-5: 🩺 Stability & Availability

Verify import path casing and export shapes. Confirm ./code matches the actual filename casing and that Code is 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-font can stay in buildFromSource buildFromSource is independent of patch files, so the missing expo-font patch 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 & Availability

Drop the gradle.properties check RN 0.83 makes New Architecture mandatory and Hermes the default, so newArchEnabled/hermesEnabled no 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 Expo addition and the removal of bindReactNativeFactory are the documented/expected changes for the Expo SDK 55 / RN 0.83 migration (Expo removed bindReactNativeFactory upstream since recreateRootView now lives inside ExpoReactNativeFactory, and public import is the fix for the "ambiguous implicit access level" warning introduced by Expo 55's ExpoModulesProvider.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 & Availability

Check the Hermes pin in ios/Podfile.lock. RN 0.83.10 uses the prebuilt hermesvm.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 & Availability

Static client needs a single-writer guarantee

This is now process-wide mutable state. If setOkHttpClient can 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 & Availability

Confirm userEnabled is declared on the button hierarchy. canBecomeFocused uses self.userEnabled; make sure that property exists on RNGestureHandlerButton or 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

scheduleOnUI should only be a no-op if no tests depend on its callback
If any code under test relies on scheduleOnUI side 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 & Availability

Check the getURI() return pathrecordingRef.current?.getURI() is cast to string before getInfoAsync; if the shim can return undefined, 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

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

iOS Build Available

Rocket.Chat 4.75.0.109334

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
package.json (1)

103-103: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Pin the react-native-katex git 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-picker fork 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

📥 Commits

Reviewing files that changed from the base of the PR and between 159457e and a0ff89a.

⛔ Files ignored due to path filters (2)
  • app/containers/message/__snapshots__/Message.test.tsx.snap is excluded by !**/*.snap
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (3)
  • app/containers/markdown/components/Katex.test.tsx
  • app/containers/markdown/components/Katex.tsx
  • package.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.tsx
  • app/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 the app/ 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.tsx
  • app/containers/markdown/components/Katex.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use the project's ESLint setup (@rocket.chat/eslint-config with React, React Native, TypeScript, and Jest plugins) for code quality and style compliance

Files:

  • app/containers/markdown/components/Katex.test.tsx
  • app/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.tsx
  • app/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.tsx
  • app/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.tsx
  • app/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 Correctness

Double-check the WebView sizing. flex: 1 can override the measured height here 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

Comment on lines +14 to +24
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>
)
};
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 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"
fi

Repository: 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:


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.

@github-actions

Copy link
Copy Markdown

iOS Build Available

Rocket.Chat 4.75.0.109340

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