Skip to content

chore: switch React Compiler to infer mode - #7545

Merged
diegolmello merged 5 commits into
developfrom
remove-use-memo
Aug 4, 2026
Merged

chore: switch React Compiler to infer mode#7545
diegolmello merged 5 commits into
developfrom
remove-use-memo

Conversation

@diegolmello

@diegolmello diegolmello commented Aug 4, 2026

Copy link
Copy Markdown
Member

Proposed changes

React Compiler ran in annotation mode: only the 172 files hand-marked with 'use memo' were compiled — 201 functions of the ~1,300 the compiler can cover. Every new component was uncompiled unless the author remembered the directive, so most of the app missed the compiler's memoization and the directive set drifted out of date.

This PR switches babel-plugin-react-compiler to compilationMode: 'infer' (the compiler's own default), so every component and hook is compiled automatically, and deletes the now-redundant directives. The compiler skips what it cannot prove safe, so unmodified code keeps working uncompiled.

Measured evidence:

  • Compile inventory: 201 → 1,097 compiled functions (+896), zero transform errors. The 126 bail-outs are safe by design (top reasons: "This value cannot be modified", "Cannot access refs during render") — those components render uncompiled.
  • Version: plugin bumped to 1.0.0 stable in the same PR. Deltas vs the previous rc.3 measured as trivial (−3 compiled functions, −2 bails, identical gates).
  • Jest: the plugin moves into a babel overrides entry with exclude matching jest.setup.js and test files, so jest.mock() factories keep working while app source stays compiled under jest. (The exclude form is required: babel merges an override's plugins with the root list instead of replacing it.)
  • Hook tests: the three suites that fail only under infer (useShortnameToUnicode, usePreviewFormatText, useNewMediaCall) now call hooks through renderHook, the pattern five other hook suites already use.
  • Directives: 'use memo' stripped from all 172 files, deletions-only. The directives are inert under infer; keeping them implies annotation mode still matters.

Escape hatch: any component that misbehaves at runtime can opt out with 'use no memo', recorded here. None were needed.

Issue(s)

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

How to test or reproduce

Gates: pnpm format-lint, tsc, and the full jest suite against compiled app code — 227/227 suites (2,066 tests, 411 snapshots).

Device smoke checks (debug build of this branch, Android API 34 emulator, open.rocket.chat):

  • RoomView — open a room, scroll history (older pages load), send a message (receipt flips to read), receive a REST-posted message live via stream (~2s), add a 👍 reaction from the long-press actions sheet, open a thread and send a thread reply
  • RoomsListView — realtime reorder (the room jumps to top on stream receive), unread badges, search filtering

All flows pass. One anomaly observed, not attributable to this PR: the rocketchat://auth deeplink stalled before dispatching login (the deepLinking saga is untouched here and is not a compiled component); flagged for a separate develop-side investigation.

Screenshots

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)
  • I have added necessary documentation (if applicable)
  • Any dependent changes have been merged and published in downstream modules

Further comments

No re-render A/B was run: the risk bar for this change is behavior parity, not perf measurement. If a NO-GO-grade surprise appears later, the revert is one config value; the directive strip is cosmetic and can stay.

Summary by CodeRabbit

  • Refactor

    • Updated rendering optimization across navigation, messaging, rooms, calls, and settings without changing visible functionality or interactions.
    • Removed obsolete optimization directives throughout the app.
  • Bug Fixes

    • Improved rendering-tool configuration compatibility by applying it selectively outside test files.
  • Tests

    • Modernized hook tests while preserving existing coverage and assertions.
  • Chores

    • Updated rendering optimization tooling to its stable release.

@diegolmello
diegolmello temporarily deployed to approve_e2e_testing August 4, 2026 16:57 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4f68b55e-7366-47c6-b9c1-6e7999785605

📥 Commits

Reviewing files that changed from the base of the PR and between 7b8a8f5 and e5153e9.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (178)
  • app/AppContainer.tsx
  • app/containers/ActionSheet/BottomSheetContent.tsx
  • app/containers/ActionSheet/Handle.tsx
  • app/containers/ActionSheet/Item.tsx
  • app/containers/ActionSheet/Provider.tsx
  • app/containers/AltTextLabel.tsx
  • app/containers/Header/components/HeaderBackButton.tsx
  • app/containers/Header/components/HeaderButton/HeaderButtonItem.tsx
  • app/containers/Header/components/HeaderContainer/index.tsx
  • app/containers/Header/components/HeaderTitle/index.tsx
  • app/containers/Header/index.tsx
  • app/containers/List/ListContainer.tsx
  • app/containers/List/ListHeader.tsx
  • app/containers/List/ListIcon.tsx
  • app/containers/List/ListInfo.tsx
  • app/containers/List/ListItem.tsx
  • app/containers/List/ListSection.tsx
  • app/containers/List/ListSeparator.tsx
  • app/containers/MediaCallHeader/MediaCallHeader.tsx
  • app/containers/MediaCallHeader/components/Collapse.tsx
  • app/containers/MediaCallHeader/components/EndCall.tsx
  • app/containers/MediaCallHeader/components/Subtitle.tsx
  • app/containers/MediaCallHeader/components/Timer.tsx
  • app/containers/MediaCallHeader/components/Title.tsx
  • app/containers/MessageComposer/MessageComposer.tsx
  • app/containers/MessageComposer/MessageComposerContainer.tsx
  • app/containers/MessageComposer/components/Attachments/ComposerAttachments.tsx
  • app/containers/MessageComposer/components/Autocomplete/Autocomplete.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteCannedResponse.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteEmoji.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItem.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItemLoading.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompletePreview.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteSlashCommand.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteUserRoom.tsx
  • app/containers/MessageComposer/components/Autocomplete/styles.ts
  • app/containers/MessageComposer/components/Buttons/ActionsButton.tsx
  • app/containers/MessageComposer/components/Buttons/BaseButton.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/containers/MessageComposer/components/CancelEdit.tsx
  • app/containers/MessageComposer/components/EmojiSearchbar.tsx
  • app/containers/MessageComposer/components/MessageComposerContent.tsx
  • app/containers/MessageComposer/components/Quotes/Quote.tsx
  • app/containers/MessageComposer/components/Quotes/Quotes.tsx
  • app/containers/MessageComposer/components/RecordAudio/ReviewButton.tsx
  • app/containers/MessageComposer/components/SendThreadToChannel.tsx
  • app/containers/MessageComposer/components/Toolbar/Container.tsx
  • app/containers/MessageComposer/components/Toolbar/Default.tsx
  • app/containers/MessageComposer/components/Toolbar/EmojiKeyboard.tsx
  • app/containers/MessageComposer/components/Toolbar/Markdown.tsx
  • app/containers/MessageComposer/components/Toolbar/Toolbar.tsx
  • app/containers/MessageComposer/components/Unfocused/Left.tsx
  • app/containers/MessageComposer/components/Unfocused/Right.tsx
  • app/containers/MessageComposer/context.tsx
  • app/containers/MessageComposer/hooks/useAutoSaveDraft.ts
  • app/containers/MessageComposer/hooks/useCanUploadFile.ts
  • app/containers/MessageComposer/hooks/useChooseMedia.ts
  • app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx
  • app/containers/MessageComposer/hooks/useIOSBackSwipeHandler.ts
  • app/containers/MessageComposer/hooks/useMessage.ts
  • app/containers/RoomHeader/RoomHeader.tsx
  • app/containers/RoomItem/RoomItem.tsx
  • app/containers/Status/StatusRows.tsx
  • app/containers/markdown/components/Heading.tsx
  • app/containers/markdown/components/inline/Bold.tsx
  • app/containers/markdown/components/inline/Italic.tsx
  • app/containers/markdown/components/inline/Strike.tsx
  • app/containers/markdown/index.tsx
  • app/containers/message/components/Attachments/AttachedActions.tsx
  • app/containers/message/components/Attachments/Attachments.tsx
  • app/containers/message/components/Attachments/Audio.tsx
  • app/containers/message/components/Attachments/CollapsibleQuote.tsx
  • app/containers/message/components/Attachments/Image/Button.tsx
  • app/containers/message/components/Attachments/Image/Container.tsx
  • app/containers/message/components/Attachments/Image/Image.tsx
  • app/containers/message/components/Attachments/Image/ImageBadge.tsx
  • app/containers/message/components/Attachments/Quote.tsx
  • app/containers/message/components/Attachments/Reply.tsx
  • app/containers/message/components/Attachments/Video.tsx
  • app/containers/message/components/Blocks.ts
  • app/containers/message/components/Broadcast.tsx
  • app/containers/message/components/CallButton.tsx
  • app/containers/message/components/Content/ContentWrapper.tsx
  • app/containers/message/components/Content/EncryptedContent.tsx
  • app/containers/message/components/Content/IgnoredContent.tsx
  • app/containers/message/components/Content/InfoContent.tsx
  • app/containers/message/components/Content/MarkdownContent.tsx
  • app/containers/message/components/Content/PreviewContent.tsx
  • app/containers/message/components/Content/index.tsx
  • app/containers/message/components/Discussion.tsx
  • app/containers/message/components/Emoji.tsx
  • app/containers/message/components/Layout/BlocksLayout.tsx
  • app/containers/message/components/Layout/ContentLayout.tsx
  • app/containers/message/components/Layout/DiscussionLayout.tsx
  • app/containers/message/components/Layout/JitsiLayout.tsx
  • app/containers/message/components/Layout/PreviewLayout.tsx
  • app/containers/message/components/Layout/StandardLayout.tsx
  • app/containers/message/components/Layout/index.tsx
  • app/containers/message/components/Message/CompactMessage.tsx
  • app/containers/message/components/Message/FullMessage.tsx
  • app/containers/message/components/Message/Message.tsx
  • app/containers/message/components/MessageAccessibleIndex.tsx
  • app/containers/message/components/MessageAvatar.tsx
  • app/containers/message/components/OverlayComponent.tsx
  • app/containers/message/components/Preview.tsx
  • app/containers/message/components/Reactions.tsx
  • app/containers/message/components/RepliedThread.tsx
  • app/containers/message/components/RightIcons/Edited.tsx
  • app/containers/message/components/RightIcons/Encrypted.tsx
  • app/containers/message/components/RightIcons/MessageError.tsx
  • app/containers/message/components/RightIcons/Pinned.tsx
  • app/containers/message/components/RightIcons/ReadReceipt.tsx
  • app/containers/message/components/RightIcons/Translated.tsx
  • app/containers/message/components/RightIcons/index.tsx
  • app/containers/message/components/Thread.tsx
  • app/containers/message/components/Time.tsx
  • app/containers/message/components/Touchable/MessageActionTouchable.tsx
  • app/containers/message/components/Touchable/MessageTouchable.tsx
  • app/containers/message/components/Touchable/Touch.tsx
  • app/containers/message/components/Urls.tsx
  • app/containers/message/components/User.tsx
  • app/containers/message/components/WidthAwareView.tsx
  • app/containers/message/docs/ARCHITECTURE.md
  • app/containers/message/hooks/useFile.tsx
  • app/containers/message/hooks/useMediaAutoDownload.tsx
  • app/containers/message/hooks/useMessageAccessibilityActions.ts
  • app/containers/message/hooks/useMessageAccessibilityHint.ts
  • app/containers/message/index.tsx
  • app/containers/message/stores/MessageActionStore.tsx
  • app/containers/message/stores/MessageRoomStore.tsx
  • app/containers/message/stores/MessageStore.tsx
  • app/lib/hooks/useCustomEmoji.ts
  • app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
  • app/lib/hooks/useSubscription.ts
  • app/stacks/InsideStack.tsx
  • app/stacks/MasterDetailStack/ModalContainer.tsx
  • app/stacks/MasterDetailStack/index.tsx
  • app/stacks/OutsideStack.tsx
  • app/stacks/ShareExtensionStack.tsx
  • app/views/CallView/components/CallButtons.tsx
  • app/views/CallView/components/Dialpad/DialpadButton.tsx
  • app/views/CallView/index.tsx
  • app/views/DirectoryView/hooks/useDirectorySearch.ts
  • app/views/LanguageView/index.tsx
  • app/views/RoomInfoView/components/RoomInfoButtons.tsx
  • app/views/RoomView/List/index.tsx
  • app/views/RoomView/RoomProviders.tsx
  • app/views/RoomView/components/HeaderCallButton.tsx
  • app/views/RoomsListView/components/Container.tsx
  • app/views/RoomsListView/components/Header.tsx
  • app/views/RoomsListView/components/ListHeader.tsx
  • app/views/RoomsListView/components/SectionHeader.tsx
  • app/views/RoomsListView/components/ServersList.tsx
  • app/views/RoomsListView/components/TabletHeader.tsx
  • app/views/RoomsListView/contexts/RoomsSearchProvider.tsx
  • app/views/RoomsListView/hooks/useGetItemLayout.ts
  • app/views/RoomsListView/hooks/useHeader.tsx
  • app/views/RoomsListView/hooks/useRefresh.ts
  • app/views/RoomsListView/hooks/useSearch.ts
  • app/views/RoomsListView/hooks/useSubscriptions.ts
  • app/views/RoomsListView/index.tsx
  • app/views/SelectServerView.tsx
  • app/views/SettingsView/index.tsx
  • app/views/SidebarView/components/Admin.tsx
  • app/views/SidebarView/components/CustomStatus.tsx
  • app/views/SidebarView/components/Profile.tsx
  • app/views/SidebarView/components/Stacks.tsx
  • app/views/SidebarView/components/SupportedVersionsWarnItem.tsx
  • app/views/SidebarView/index.tsx
  • app/views/StatusView/ClearAfterPicker/ClearAfterSheetContent.tsx
  • app/views/StatusView/ClearAfterPicker/DatePickerSheetContent.tsx
  • app/views/StatusView/ClearAfterPicker/index.tsx
  • app/views/StatusView/FooterComponent.tsx
  • app/views/StatusView/index.tsx
  • babel.config.js
  • package.json

Walkthrough

This PR updates React Compiler configuration, upgrades the compiler package, removes local 'use memo' directives across application code, updates architecture documentation, and changes hook tests to use rendered hook instances.

Changes

React Compiler migration

Layer / File(s) Summary
Compiler configuration and documentation
babel.config.js, package.json, app/containers/message/docs/ARCHITECTURE.md
The React Compiler uses inferred compilation with test files excluded. The dependency uses version 1.0.0. Documentation now describes compiler-based memoization.
Hook test execution
app/lib/hooks/*/*.test.*
Hook tests use renderHook and mutable platform mocks instead of direct hook calls and module resets.
Application directive removal
app/containers/ActionSheet/*, app/containers/Header/*, app/containers/List/*, app/containers/MessageComposer/*, app/containers/markdown/*, app/lib/hooks/*
Local 'use memo' directives are removed without changes to component logic or public signatures.
Message rendering directive removal
app/containers/message/*
Local directives are removed from message components, layouts, attachments, providers, stores, and hooks.
Navigation and view directive removal
app/stacks/*, app/views/*
Local directives are removed from navigator callbacks, views, providers, and related hooks.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested labels: type: chore

Suggested reviewers: otaviostasiak

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: switching React Compiler from annotation mode to infer mode, which is the primary objective reflected across all file modifications.
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.

Warning

Review ran into problems

🔥 Problems

Errors were encountered while retrieving linked issues.

Errors (1)
  • NATIVE-1481: 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.

@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

🤖 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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx`:
- Around line 52-55: Update the declarations at
app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx:52-55,
app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts:25-28, and
app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts:25-28 to add
explicit parameter and return types: type the isAndroid getter as boolean,
renderPreviewFormatText as accepting string and returning string, and
renderShortnameToUnicode as accepting a string plus optional boolean and
returning string.
🪄 Autofix

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 Plus

Run ID: da88a175-0676-4e5e-b4cd-d376c4a2f3f3

📥 Commits

Reviewing files that changed from the base of the PR and between 8a4ca9d and 7b8a8f5.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (178)
  • app/AppContainer.tsx
  • app/containers/ActionSheet/BottomSheetContent.tsx
  • app/containers/ActionSheet/Handle.tsx
  • app/containers/ActionSheet/Item.tsx
  • app/containers/ActionSheet/Provider.tsx
  • app/containers/AltTextLabel.tsx
  • app/containers/Header/components/HeaderBackButton.tsx
  • app/containers/Header/components/HeaderButton/HeaderButtonItem.tsx
  • app/containers/Header/components/HeaderContainer/index.tsx
  • app/containers/Header/components/HeaderTitle/index.tsx
  • app/containers/Header/index.tsx
  • app/containers/List/ListContainer.tsx
  • app/containers/List/ListHeader.tsx
  • app/containers/List/ListIcon.tsx
  • app/containers/List/ListInfo.tsx
  • app/containers/List/ListItem.tsx
  • app/containers/List/ListSection.tsx
  • app/containers/List/ListSeparator.tsx
  • app/containers/MediaCallHeader/MediaCallHeader.tsx
  • app/containers/MediaCallHeader/components/Collapse.tsx
  • app/containers/MediaCallHeader/components/EndCall.tsx
  • app/containers/MediaCallHeader/components/Subtitle.tsx
  • app/containers/MediaCallHeader/components/Timer.tsx
  • app/containers/MediaCallHeader/components/Title.tsx
  • app/containers/MessageComposer/MessageComposer.tsx
  • app/containers/MessageComposer/MessageComposerContainer.tsx
  • app/containers/MessageComposer/components/Attachments/ComposerAttachments.tsx
  • app/containers/MessageComposer/components/Autocomplete/Autocomplete.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteCannedResponse.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteEmoji.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItem.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItemLoading.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompletePreview.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteSlashCommand.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteUserRoom.tsx
  • app/containers/MessageComposer/components/Autocomplete/styles.ts
  • app/containers/MessageComposer/components/Buttons/ActionsButton.tsx
  • app/containers/MessageComposer/components/Buttons/BaseButton.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/containers/MessageComposer/components/CancelEdit.tsx
  • app/containers/MessageComposer/components/EmojiSearchbar.tsx
  • app/containers/MessageComposer/components/MessageComposerContent.tsx
  • app/containers/MessageComposer/components/Quotes/Quote.tsx
  • app/containers/MessageComposer/components/Quotes/Quotes.tsx
  • app/containers/MessageComposer/components/RecordAudio/ReviewButton.tsx
  • app/containers/MessageComposer/components/SendThreadToChannel.tsx
  • app/containers/MessageComposer/components/Toolbar/Container.tsx
  • app/containers/MessageComposer/components/Toolbar/Default.tsx
  • app/containers/MessageComposer/components/Toolbar/EmojiKeyboard.tsx
  • app/containers/MessageComposer/components/Toolbar/Markdown.tsx
  • app/containers/MessageComposer/components/Toolbar/Toolbar.tsx
  • app/containers/MessageComposer/components/Unfocused/Left.tsx
  • app/containers/MessageComposer/components/Unfocused/Right.tsx
  • app/containers/MessageComposer/context.tsx
  • app/containers/MessageComposer/hooks/useAutoSaveDraft.ts
  • app/containers/MessageComposer/hooks/useCanUploadFile.ts
  • app/containers/MessageComposer/hooks/useChooseMedia.ts
  • app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx
  • app/containers/MessageComposer/hooks/useIOSBackSwipeHandler.ts
  • app/containers/MessageComposer/hooks/useMessage.ts
  • app/containers/RoomHeader/RoomHeader.tsx
  • app/containers/RoomItem/RoomItem.tsx
  • app/containers/Status/StatusRows.tsx
  • app/containers/markdown/components/Heading.tsx
  • app/containers/markdown/components/inline/Bold.tsx
  • app/containers/markdown/components/inline/Italic.tsx
  • app/containers/markdown/components/inline/Strike.tsx
  • app/containers/markdown/index.tsx
  • app/containers/message/components/Attachments/AttachedActions.tsx
  • app/containers/message/components/Attachments/Attachments.tsx
  • app/containers/message/components/Attachments/Audio.tsx
  • app/containers/message/components/Attachments/CollapsibleQuote.tsx
  • app/containers/message/components/Attachments/Image/Button.tsx
  • app/containers/message/components/Attachments/Image/Container.tsx
  • app/containers/message/components/Attachments/Image/Image.tsx
  • app/containers/message/components/Attachments/Image/ImageBadge.tsx
  • app/containers/message/components/Attachments/Quote.tsx
  • app/containers/message/components/Attachments/Reply.tsx
  • app/containers/message/components/Attachments/Video.tsx
  • app/containers/message/components/Blocks.ts
  • app/containers/message/components/Broadcast.tsx
  • app/containers/message/components/CallButton.tsx
  • app/containers/message/components/Content/ContentWrapper.tsx
  • app/containers/message/components/Content/EncryptedContent.tsx
  • app/containers/message/components/Content/IgnoredContent.tsx
  • app/containers/message/components/Content/InfoContent.tsx
  • app/containers/message/components/Content/MarkdownContent.tsx
  • app/containers/message/components/Content/PreviewContent.tsx
  • app/containers/message/components/Content/index.tsx
  • app/containers/message/components/Discussion.tsx
  • app/containers/message/components/Emoji.tsx
  • app/containers/message/components/Layout/BlocksLayout.tsx
  • app/containers/message/components/Layout/ContentLayout.tsx
  • app/containers/message/components/Layout/DiscussionLayout.tsx
  • app/containers/message/components/Layout/JitsiLayout.tsx
  • app/containers/message/components/Layout/PreviewLayout.tsx
  • app/containers/message/components/Layout/StandardLayout.tsx
  • app/containers/message/components/Layout/index.tsx
  • app/containers/message/components/Message/CompactMessage.tsx
  • app/containers/message/components/Message/FullMessage.tsx
  • app/containers/message/components/Message/Message.tsx
  • app/containers/message/components/MessageAccessibleIndex.tsx
  • app/containers/message/components/MessageAvatar.tsx
  • app/containers/message/components/OverlayComponent.tsx
  • app/containers/message/components/Preview.tsx
  • app/containers/message/components/Reactions.tsx
  • app/containers/message/components/RepliedThread.tsx
  • app/containers/message/components/RightIcons/Edited.tsx
  • app/containers/message/components/RightIcons/Encrypted.tsx
  • app/containers/message/components/RightIcons/MessageError.tsx
  • app/containers/message/components/RightIcons/Pinned.tsx
  • app/containers/message/components/RightIcons/ReadReceipt.tsx
  • app/containers/message/components/RightIcons/Translated.tsx
  • app/containers/message/components/RightIcons/index.tsx
  • app/containers/message/components/Thread.tsx
  • app/containers/message/components/Time.tsx
  • app/containers/message/components/Touchable/MessageActionTouchable.tsx
  • app/containers/message/components/Touchable/MessageTouchable.tsx
  • app/containers/message/components/Touchable/Touch.tsx
  • app/containers/message/components/Urls.tsx
  • app/containers/message/components/User.tsx
  • app/containers/message/components/WidthAwareView.tsx
  • app/containers/message/docs/ARCHITECTURE.md
  • app/containers/message/hooks/useFile.tsx
  • app/containers/message/hooks/useMediaAutoDownload.tsx
  • app/containers/message/hooks/useMessageAccessibilityActions.ts
  • app/containers/message/hooks/useMessageAccessibilityHint.ts
  • app/containers/message/index.tsx
  • app/containers/message/stores/MessageActionStore.tsx
  • app/containers/message/stores/MessageRoomStore.tsx
  • app/containers/message/stores/MessageStore.tsx
  • app/lib/hooks/useCustomEmoji.ts
  • app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
  • app/lib/hooks/useSubscription.ts
  • app/stacks/InsideStack.tsx
  • app/stacks/MasterDetailStack/ModalContainer.tsx
  • app/stacks/MasterDetailStack/index.tsx
  • app/stacks/OutsideStack.tsx
  • app/stacks/ShareExtensionStack.tsx
  • app/views/CallView/components/CallButtons.tsx
  • app/views/CallView/components/Dialpad/DialpadButton.tsx
  • app/views/CallView/index.tsx
  • app/views/DirectoryView/hooks/useDirectorySearch.ts
  • app/views/LanguageView/index.tsx
  • app/views/RoomInfoView/components/RoomInfoButtons.tsx
  • app/views/RoomView/List/index.tsx
  • app/views/RoomView/RoomProviders.tsx
  • app/views/RoomView/components/HeaderCallButton.tsx
  • app/views/RoomsListView/components/Container.tsx
  • app/views/RoomsListView/components/Header.tsx
  • app/views/RoomsListView/components/ListHeader.tsx
  • app/views/RoomsListView/components/SectionHeader.tsx
  • app/views/RoomsListView/components/ServersList.tsx
  • app/views/RoomsListView/components/TabletHeader.tsx
  • app/views/RoomsListView/contexts/RoomsSearchProvider.tsx
  • app/views/RoomsListView/hooks/useGetItemLayout.ts
  • app/views/RoomsListView/hooks/useHeader.tsx
  • app/views/RoomsListView/hooks/useRefresh.ts
  • app/views/RoomsListView/hooks/useSearch.ts
  • app/views/RoomsListView/hooks/useSubscriptions.ts
  • app/views/RoomsListView/index.tsx
  • app/views/SelectServerView.tsx
  • app/views/SettingsView/index.tsx
  • app/views/SidebarView/components/Admin.tsx
  • app/views/SidebarView/components/CustomStatus.tsx
  • app/views/SidebarView/components/Profile.tsx
  • app/views/SidebarView/components/Stacks.tsx
  • app/views/SidebarView/components/SupportedVersionsWarnItem.tsx
  • app/views/SidebarView/index.tsx
  • app/views/StatusView/ClearAfterPicker/ClearAfterSheetContent.tsx
  • app/views/StatusView/ClearAfterPicker/DatePickerSheetContent.tsx
  • app/views/StatusView/ClearAfterPicker/index.tsx
  • app/views/StatusView/FooterComponent.tsx
  • app/views/StatusView/index.tsx
  • babel.config.js
  • package.json
💤 Files with no reviewable changes (172)
  • app/containers/MessageComposer/components/SendThreadToChannel.tsx
  • app/containers/MediaCallHeader/components/EndCall.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteCannedResponse.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItem.tsx
  • app/containers/List/ListIcon.tsx
  • app/containers/MediaCallHeader/components/Timer.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteSlashCommand.tsx
  • app/containers/MessageComposer/components/Unfocused/Right.tsx
  • app/containers/MessageComposer/MessageComposerContainer.tsx
  • app/containers/message/components/Touchable/MessageActionTouchable.tsx
  • app/containers/MediaCallHeader/components/Title.tsx
  • app/containers/markdown/components/inline/Strike.tsx
  • app/containers/message/hooks/useFile.tsx
  • app/containers/message/components/RightIcons/index.tsx
  • app/containers/message/components/Message/Message.tsx
  • app/containers/message/components/Attachments/Image/Button.tsx
  • app/views/RoomView/RoomProviders.tsx
  • app/containers/message/components/Layout/PreviewLayout.tsx
  • app/containers/MessageComposer/components/Buttons/ActionsButton.tsx
  • app/containers/MessageComposer/components/EmojiSearchbar.tsx
  • app/containers/message/components/MessageAccessibleIndex.tsx
  • app/views/StatusView/FooterComponent.tsx
  • app/containers/message/components/RightIcons/Pinned.tsx
  • app/views/SidebarView/components/Admin.tsx
  • app/containers/MessageComposer/components/RecordAudio/ReviewButton.tsx
  • app/containers/MessageComposer/components/Buttons/MicOrSendButton.tsx
  • app/containers/MessageComposer/components/Attachments/ComposerAttachments.tsx
  • app/containers/message/components/OverlayComponent.tsx
  • app/containers/message/components/RightIcons/Translated.tsx
  • app/containers/message/components/Attachments/Audio.tsx
  • app/views/SidebarView/index.tsx
  • app/containers/message/components/Attachments/Attachments.tsx
  • app/containers/message/components/Discussion.tsx
  • app/containers/MessageComposer/components/Toolbar/Default.tsx
  • app/containers/MessageComposer/components/Toolbar/Container.tsx
  • app/containers/markdown/components/inline/Italic.tsx
  • app/containers/message/components/Layout/BlocksLayout.tsx
  • app/containers/Header/components/HeaderButton/HeaderButtonItem.tsx
  • app/containers/message/components/Layout/StandardLayout.tsx
  • app/containers/MediaCallHeader/MediaCallHeader.tsx
  • app/containers/List/ListSection.tsx
  • app/containers/MediaCallHeader/components/Collapse.tsx
  • app/containers/List/ListContainer.tsx
  • app/containers/message/components/Touchable/MessageTouchable.tsx
  • app/containers/List/ListSeparator.tsx
  • app/containers/message/components/Touchable/Touch.tsx
  • app/containers/MessageComposer/MessageComposer.tsx
  • app/containers/message/components/Layout/JitsiLayout.tsx
  • app/containers/MessageComposer/components/MessageComposerContent.tsx
  • app/containers/message/components/Attachments/Image/Image.tsx
  • app/views/DirectoryView/hooks/useDirectorySearch.ts
  • app/containers/MessageComposer/components/Autocomplete/AutocompletePreview.tsx
  • app/containers/ActionSheet/BottomSheetContent.tsx
  • app/containers/message/components/Attachments/Image/ImageBadge.tsx
  • app/views/RoomsListView/components/Container.tsx
  • app/containers/MessageComposer/components/Toolbar/Toolbar.tsx
  • app/containers/MessageComposer/components/Toolbar/Markdown.tsx
  • app/containers/markdown/index.tsx
  • app/views/StatusView/ClearAfterPicker/DatePickerSheetContent.tsx
  • app/containers/message/components/Time.tsx
  • app/containers/MessageComposer/components/Autocomplete/Autocomplete.tsx
  • app/containers/ActionSheet/Provider.tsx
  • app/containers/List/ListItem.tsx
  • app/views/SidebarView/components/CustomStatus.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteUserRoom.tsx
  • app/containers/MessageComposer/components/Autocomplete/styles.ts
  • app/containers/message/components/RightIcons/MessageError.tsx
  • app/containers/message/hooks/useMessageAccessibilityActions.ts
  • app/containers/message/components/MessageAvatar.tsx
  • app/views/SidebarView/components/Stacks.tsx
  • app/containers/List/ListInfo.tsx
  • app/AppContainer.tsx
  • app/views/RoomView/components/HeaderCallButton.tsx
  • app/containers/MessageComposer/components/Quotes/Quote.tsx
  • app/containers/Header/components/HeaderContainer/index.tsx
  • app/containers/List/ListHeader.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteItemLoading.tsx
  • app/views/CallView/index.tsx
  • app/containers/message/components/Layout/index.tsx
  • app/containers/message/components/Attachments/Video.tsx
  • app/containers/MessageComposer/components/Autocomplete/AutocompleteEmoji.tsx
  • app/containers/MediaCallHeader/components/Subtitle.tsx
  • app/containers/MessageComposer/components/Buttons/BaseButton.tsx
  • app/containers/message/components/Layout/ContentLayout.tsx
  • app/containers/message/components/Content/InfoContent.tsx
  • app/containers/message/components/RightIcons/Encrypted.tsx
  • app/containers/MessageComposer/components/Toolbar/EmojiKeyboard.tsx
  • app/containers/message/components/Thread.tsx
  • app/containers/message/components/Attachments/Image/Container.tsx
  • app/views/CallView/components/CallButtons.tsx
  • app/containers/MessageComposer/hooks/useMessage.ts
  • app/containers/message/components/RightIcons/ReadReceipt.tsx
  • app/containers/message/components/Content/index.tsx
  • app/containers/MessageComposer/hooks/useIOSBackSwipeHandler.ts
  • app/views/RoomView/List/index.tsx
  • app/containers/message/components/Content/IgnoredContent.tsx
  • app/stacks/ShareExtensionStack.tsx
  • app/containers/message/hooks/useMessageAccessibilityHint.ts
  • app/views/RoomsListView/components/Header.tsx
  • app/containers/message/components/Attachments/CollapsibleQuote.tsx
  • app/containers/message/components/Attachments/Quote.tsx
  • app/views/SidebarView/components/Profile.tsx
  • app/containers/message/components/Reactions.tsx
  • app/containers/AltTextLabel.tsx
  • app/containers/message/components/Preview.tsx
  • app/views/StatusView/ClearAfterPicker/ClearAfterSheetContent.tsx
  • app/containers/Header/components/HeaderTitle/index.tsx
  • app/containers/ActionSheet/Item.tsx
  • app/containers/message/components/RightIcons/Edited.tsx
  • app/stacks/OutsideStack.tsx
  • app/containers/Header/components/HeaderBackButton.tsx
  • app/containers/message/components/Message/FullMessage.tsx
  • app/containers/message/components/Message/CompactMessage.tsx
  • app/containers/MessageComposer/components/Quotes/Quotes.tsx
  • app/containers/message/components/Urls.tsx
  • app/views/RoomInfoView/components/RoomInfoButtons.tsx
  • app/views/SidebarView/components/SupportedVersionsWarnItem.tsx
  • app/containers/message/components/Emoji.tsx
  • app/containers/Header/index.tsx
  • app/views/StatusView/index.tsx
  • app/containers/message/components/RepliedThread.tsx
  • app/containers/message/components/Content/MarkdownContent.tsx
  • app/views/LanguageView/index.tsx
  • app/containers/message/hooks/useMediaAutoDownload.tsx
  • app/views/RoomsListView/contexts/RoomsSearchProvider.tsx
  • app/containers/message/components/Blocks.ts
  • app/containers/MessageComposer/hooks/useCanUploadFile.ts
  • app/views/CallView/components/Dialpad/DialpadButton.tsx
  • app/containers/message/components/CallButton.tsx
  • app/views/RoomsListView/components/ListHeader.tsx
  • app/containers/markdown/components/inline/Bold.tsx
  • app/containers/message/components/Attachments/AttachedActions.tsx
  • app/containers/markdown/components/Heading.tsx
  • app/containers/ActionSheet/Handle.tsx
  • app/containers/message/index.tsx
  • app/containers/message/stores/MessageActionStore.tsx
  • app/containers/message/components/WidthAwareView.tsx
  • app/views/RoomsListView/components/SectionHeader.tsx
  • app/containers/message/components/Broadcast.tsx
  • app/stacks/MasterDetailStack/ModalContainer.tsx
  • app/views/StatusView/ClearAfterPicker/index.tsx
  • app/containers/message/components/Content/ContentWrapper.tsx
  • app/views/RoomsListView/index.tsx
  • app/containers/message/components/Content/PreviewContent.tsx
  • app/lib/hooks/useSubscription.ts
  • app/containers/RoomHeader/RoomHeader.tsx
  • app/views/RoomsListView/hooks/useGetItemLayout.ts
  • app/views/RoomsListView/components/ServersList.tsx
  • app/containers/MessageComposer/hooks/useChooseMedia.ts
  • app/views/RoomsListView/hooks/useSubscriptions.ts
  • app/containers/MessageComposer/hooks/useAutoSaveDraft.ts
  • app/containers/MessageComposer/hooks/useEmojiKeyboard.tsx
  • app/containers/MessageComposer/context.tsx
  • app/containers/message/components/Layout/DiscussionLayout.tsx
  • app/containers/message/stores/MessageRoomStore.tsx
  • app/stacks/MasterDetailStack/index.tsx
  • app/containers/message/components/Attachments/Reply.tsx
  • app/views/SettingsView/index.tsx
  • app/containers/Status/StatusRows.tsx
  • app/views/RoomsListView/hooks/useRefresh.ts
  • app/containers/RoomItem/RoomItem.tsx
  • app/containers/MessageComposer/components/Unfocused/Left.tsx
  • app/containers/message/stores/MessageStore.tsx
  • app/views/RoomsListView/components/TabletHeader.tsx
  • app/views/SelectServerView.tsx
  • app/views/RoomsListView/hooks/useSearch.ts
  • app/stacks/InsideStack.tsx
  • app/containers/message/components/User.tsx
  • app/views/RoomsListView/hooks/useHeader.tsx
  • app/containers/MessageComposer/components/CancelEdit.tsx
  • app/lib/hooks/useCustomEmoji.ts
  • app/containers/message/components/Content/EncryptedContent.tsx
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: ESLint and Test / run-eslint-and-test
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
  • babel.config.js
**/*.{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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{js,jsx,ts,tsx}: Format JavaScript and TypeScript code with Oxfmt using the repository configuration: tabs, single quotes, 130-character width, no trailing commas, omitted arrow-function parentheses where possible, and same-line brackets.
Follow Oxlint rules configured in .oxlintrc.json, including the import, React, Jest, TypeScript, and React Native plugins.

Files:

  • app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
  • babel.config.js
🧠 Learnings (5)
📚 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
📚 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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts
📚 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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
  • app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts
  • app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.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/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
🔇 Additional comments (6)
babel.config.js (1)

9-23: LGTM!

package.json (1)

193-193: LGTM!

app/containers/message/docs/ARCHITECTURE.md (1)

40-42: LGTM!

app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx (1)

82-82: LGTM!

Also applies to: 281-285

app/lib/hooks/usePreviewFormatText/usePreviewFormatText.test.ts (1)

1-1: LGTM!

Also applies to: 30-86, 105-110, 129-134

app/lib/hooks/useShortnameToUnicode/useShortnameToUnicode.test.ts (1)

1-1: LGTM!

Also applies to: 30-76, 90-95, 109-109

Comment thread app/lib/hooks/useNewMediaCall/useNewMediaCall.test.tsx
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

iOS Build Available

Rocket.Chat 4.76.0.109497

@OtavioStasiak OtavioStasiak 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.

LGTM

Bump babel-plugin-react-compiler to 1.0.0 and switch compilationMode
from 'annotation' to 'infer'. The plugin moves into a babel overrides
entry whose exclude covers jest.setup.js and test files: babel merges
an override's plugins with the root list instead of replacing them, so
the exclude form is the only way to keep the compiler out of jest setup.
Under infer the compiled hooks need a component context, so
useShortnameToUnicode, usePreviewFormatText, and useNewMediaCall tests
now render via renderHook. The useNewMediaCall Android case drops
jest.resetModules in favor of a getter-based isAndroid mock:
re-requiring the hook loaded a second react copy whose dispatcher was
never set.
Under infer the directives are inert. Deletions only: 208 directive
lines and their adjacent blank lines across 172 files.
Matches the renderPreviewFormatText helper in the sibling suite.
@diegolmello
diegolmello merged commit 89071f3 into develop Aug 4, 2026
3 of 5 checks passed
@diegolmello
diegolmello deleted the remove-use-memo branch August 4, 2026 18:45
@diegolmello
diegolmello requested a deployment to approve_e2e_testing August 4, 2026 18:45 — with GitHub Actions Waiting
diegolmello added a commit that referenced this pull request Aug 31, 2026
* fix: render mentions, emojis, and inline elements inside headings (#6911)

* chore: OXC (#7515)

* chore: replace ESLint with Oxlint

Migrate linting from ESLint 8 to Oxlint. `pnpm lint` drops from ~1min to
~0.6s and 17 eslint packages are removed from devDependencies.

Config lives in `.oxlintrc.json`, generated with `@oxlint/migrate` from the
old `.eslintrc.js` and then tuned:

- `eslint-plugin-react-native` is loaded through `jsPlugins`, since Oxlint has
  no built-in equivalent.
- `import/extensions` is off. Its old options (`js: 'warning'`, ...) were not
  valid values for the rule, so it never reported anything under ESLint.
- `no-unused-vars` sets `caughtErrors: 'none'` to match the ESLint 8 default.
- `import/no-cycle` and the React Compiler rules report as warnings. They
  surface findings ESLint never showed, so they are not gated yet.

Rules with no Oxlint equivalent are dropped: `no-restricted-syntax` (the ban
on `React.*` member syntax), `import/order`, `import/no-unresolved` and
`import/named`.

ESLint 8 skipped dot-directories, so files under `.rnstorybook/` and
`.maestro/` were never linted. Oxlint does lint them, which surfaced four
violations that are fixed here.

The CI workflow keeps its filename and job id so branch protection checks
stay valid.

* chore: replace Prettier with Oxfmt

Migrate formatting from Prettier 2.8.8 to Oxfmt via `oxfmt --migrate prettier`.

- `.oxfmtrc.json` carries every previous Prettier option unchanged (tabs,
  single quotes, printWidth 130, no trailing comma, avoid arrow parens,
  bracketSameLine) plus the `.prettierignore` patterns as `ignorePatterns`.
  `sortPackageJson` is disabled to match previous behavior.
- `.prettierrc.js` and `.prettierignore` removed; `prettier` dropped from
  devDependencies.
- `prettier-lint` script renamed to `format-lint` and now runs `oxfmt`.
- 44 files reformatted: Oxfmt follows Prettier 3 style, so nested ternaries
  and `extends`/type-argument wrapping indent differently than under
  Prettier 2. No semantic changes.
- prettier.yml still ran `eslint --fix`, missed in the Oxlint migration; it
  now runs `oxfmt` and `oxlint --fix`. `react/exhaustive-deps` is allowed
  there because its autofix rewrites dependency arrays, which changes
  behavior and must not land unreviewed from CI.
- Workflow filename kept as prettier.yml to avoid disturbing branch
  protection checks, same as eslint.yml.

Verified: `pnpm lint` exit 0 (0 errors), `tsc` clean, 217/217 suites and
2032/2032 tests pass, `oxfmt --check` clean.

* chore: update lockfile for oxfmt

* chore: migrate typecheck to TypeScript 7.0 (#7516)

* chore: bump TypeScript to 6.0

Baseline hop ahead of the TypeScript 7.0 (native compiler) migration, so the
7.0 cut is a version swap against a config that is already 7.0-shaped.

TypeScript 6.0 raises both `moduleResolution: node10` and `baseUrl` as errors
rather than warnings, and `ignoreDeprecations: "6.0"` stops working in 7.0, so
clearing them properly is the only route:

- `moduleResolution` -> `bundler` (Metro is a bundler), which requires an
  esnext-shaped `module`.
- `baseUrl` removed. Exactly one import relied on it; it is now relative.
- `types` enumerated, since a resolution mode that honours package `exports`
  no longer auto-includes every `@types` package. `@types/node` becomes an
  explicit devDependency.

Honouring `exports` also stranded the bundled `.d.ts` of three dependencies
whose maps expose only JavaScript. Each gets a `types` condition via
patch-package; this is visible to the type checker only, as Metro ignores that
condition. A `paths` mapping was tried first and rejected, because the
jest-expo resolver reads `paths` and then loads those `.d.ts` files at runtime.

The inherited block of commented-out option documentation is dropped.

* chore: migrate typecheck to TypeScript 7.0

Replaces TypeScript 6.0.3 with the native Go compiler. The version is pinned
exactly, since the platform binaries ship as version-matched optional
dependencies; the lockfile records the linux-x64 target CI resolves.

Typecheck wall time drops from 5.77s on 5.9.3 to ~1.0s. No configuration
change was required: the 6.0 hop already left tsconfig in a 7.0-shaped state,
and the default parallelism saturates without `--checkers`.

`@react-navigation/core` needs a patch to type-check. TypeScript 7.0.2
resolves the mutual recursion between `StaticParamList` and
`ParamListForScreens` eagerly where earlier versions defer it, reports the
alias as circular, and degrades it to a non-generic symbol -- surfacing as
`TS2315: Type 'StaticParamList' is not generic` at our call sites. The patch
drops a `FlatType<>` wrapper from the alias, which only flattens intersections
for editor display, so the type is unchanged and the misfire stops.

* chore: Bump version to 4.76.0 (#7542)

* chore(ci): apply least privilege permission to GitHub Actions (#7350)

* chore: switch React Compiler to infer mode (#7545)

* ci: route Maestro e2e selection through sniffler impact analysis (#7476)

* fix(iOS): RoomItem Swipe not working after scroll (#7532)

* fix(ci): select shards for changes outside app and honor the release label (#7555)

* fix: delete background taller than its row on ServersHistory (#7536)

* fix: delete background taller than its row on server items

* chore: code improvements

---------

Co-authored-by: Diego Mello <diegolmello@gmail.com>

* fix: UIKit block messages rendering with smaller font size (#7531)

* fix: UIKit block messages rendering with smaller font size

* fix: snapshot

* fix(db): move deleteMessage finds and prepares inside the writer lock (#7550)

* fix: quote has no effect on older thread messages (#7535)

* fix: Quote has no effect on older thread messages

* fix: Quote has no effect on older thread messages

* chore: e2e test

* fix: e2e test

* chore: format code and fix lint issues

* fix(MessageComposer): resolve quoted thread messages and guard stale lookups

* fix: test

---------

Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>

* fix(db): move persistMessage lookups and prepares inside the writer lock (#7551)

* fix:  test case 11 and 12 flaky tests (#7564)

* fix: test

* fix: room last messa test

* fix: jumptomessage test

* chore: remove comments

* fix: jump to message e2e test iOS

* remove unused comment

* fix(db): move sendMessage reads and prepares inside the writer lock (#7546)

* fix(db): move sendMessage reads and prepares inside the writer lock

* fix: test improvements

* chore: remove comments

* fix: Admin Panel content hidden behind bottom navigation bar (#7538)

* feat: add tabular numbers (#7568)

* feat: tabular numbers across the app, upgrade Inter to 4.1

* update snapshot

* chore: pin @rocket.chat/sdk to a specific commit hash (#7569)

* fix(e2ee): re-fetch subscription inside the write in toggleRoomE2EE (#7554)

* fix(e2ee): re-fetch subscription inside the write in toggleRoomE2EE

* code improvements

* removed unused comment

* fix: run handleDelete finds and prepares inside the writer lock (#7552)

* fix: run handleDelete finds and prepares inside the writer lock

* chore: reuse mockWMDB

* fix: crop screen hidden behind navigation bar on iOS 26 (#7529)

* fix: re-fetch message inside the write in getThreadName (#7557)

* fix: re-fetch message inside the write in getThreadName

* fix: re-fetch message inside the write in getThreadName

* chore: new test cases

* remove unecessary async

* fix(db): move decryptPendingMessages prepares inside the writer lock (#7548)

* fix(db): move decryptPendingMessages prepares inside the writer lock

* code improvements

* chore: new test case encryption

* chore: format code and fix lint issues

---------

Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>

* fix(android): VideoConf notification accept and decline button hidden and touch not working (#7533)

* fix: in-app notification buttons ignoring taps on Android

* fix: Decline and Accept invisible on the incoming call notification

* fix: UIKit buttons not responding on some Android devices (#7573)

* fix: force Google account chooser on OAuth login (#7572)

* fix: ISO format support in markdown component (#6943)

* fix: resolve deep links by room id for channels and groups (#7111)

* Merge pull request #7570 from RocketChat/deeplink-saml-auth

feat: SAML deeplink auth

* fix: grant pull-requests write to build call sites in build-develop (#7599)

The reusable workflows build-android.yml and build-ios.yml declare
pull-requests: write on their upload jobs. GitHub validates these at
call time regardless of job conditionals, so build-develop.yml
(caller) must grant the permission or the workflow fails validation.
build-pr.yml already grants it; this mirrors that.

---------

Co-authored-by: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com>
Co-authored-by: Yasmim Nagat <117310290+yasnagat@users.noreply.github.com>
Co-authored-by: Otávio Stasiak <91474186+OtavioStasiak@users.noreply.github.com>
Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>
Co-authored-by: Yash Rajpal <58601732+yash-rajpal@users.noreply.github.com>
diegolmello added a commit that referenced this pull request Aug 31, 2026
* fix: render mentions, emojis, and inline elements inside headings (#6911)

* chore: OXC (#7515)

* chore: replace ESLint with Oxlint

Migrate linting from ESLint 8 to Oxlint. `pnpm lint` drops from ~1min to
~0.6s and 17 eslint packages are removed from devDependencies.

Config lives in `.oxlintrc.json`, generated with `@oxlint/migrate` from the
old `.eslintrc.js` and then tuned:

- `eslint-plugin-react-native` is loaded through `jsPlugins`, since Oxlint has
  no built-in equivalent.
- `import/extensions` is off. Its old options (`js: 'warning'`, ...) were not
  valid values for the rule, so it never reported anything under ESLint.
- `no-unused-vars` sets `caughtErrors: 'none'` to match the ESLint 8 default.
- `import/no-cycle` and the React Compiler rules report as warnings. They
  surface findings ESLint never showed, so they are not gated yet.

Rules with no Oxlint equivalent are dropped: `no-restricted-syntax` (the ban
on `React.*` member syntax), `import/order`, `import/no-unresolved` and
`import/named`.

ESLint 8 skipped dot-directories, so files under `.rnstorybook/` and
`.maestro/` were never linted. Oxlint does lint them, which surfaced four
violations that are fixed here.

The CI workflow keeps its filename and job id so branch protection checks
stay valid.

* chore: replace Prettier with Oxfmt

Migrate formatting from Prettier 2.8.8 to Oxfmt via `oxfmt --migrate prettier`.

- `.oxfmtrc.json` carries every previous Prettier option unchanged (tabs,
  single quotes, printWidth 130, no trailing comma, avoid arrow parens,
  bracketSameLine) plus the `.prettierignore` patterns as `ignorePatterns`.
  `sortPackageJson` is disabled to match previous behavior.
- `.prettierrc.js` and `.prettierignore` removed; `prettier` dropped from
  devDependencies.
- `prettier-lint` script renamed to `format-lint` and now runs `oxfmt`.
- 44 files reformatted: Oxfmt follows Prettier 3 style, so nested ternaries
  and `extends`/type-argument wrapping indent differently than under
  Prettier 2. No semantic changes.
- prettier.yml still ran `eslint --fix`, missed in the Oxlint migration; it
  now runs `oxfmt` and `oxlint --fix`. `react/exhaustive-deps` is allowed
  there because its autofix rewrites dependency arrays, which changes
  behavior and must not land unreviewed from CI.
- Workflow filename kept as prettier.yml to avoid disturbing branch
  protection checks, same as eslint.yml.

Verified: `pnpm lint` exit 0 (0 errors), `tsc` clean, 217/217 suites and
2032/2032 tests pass, `oxfmt --check` clean.

* chore: update lockfile for oxfmt

* chore: migrate typecheck to TypeScript 7.0 (#7516)

* chore: bump TypeScript to 6.0

Baseline hop ahead of the TypeScript 7.0 (native compiler) migration, so the
7.0 cut is a version swap against a config that is already 7.0-shaped.

TypeScript 6.0 raises both `moduleResolution: node10` and `baseUrl` as errors
rather than warnings, and `ignoreDeprecations: "6.0"` stops working in 7.0, so
clearing them properly is the only route:

- `moduleResolution` -> `bundler` (Metro is a bundler), which requires an
  esnext-shaped `module`.
- `baseUrl` removed. Exactly one import relied on it; it is now relative.
- `types` enumerated, since a resolution mode that honours package `exports`
  no longer auto-includes every `@types` package. `@types/node` becomes an
  explicit devDependency.

Honouring `exports` also stranded the bundled `.d.ts` of three dependencies
whose maps expose only JavaScript. Each gets a `types` condition via
patch-package; this is visible to the type checker only, as Metro ignores that
condition. A `paths` mapping was tried first and rejected, because the
jest-expo resolver reads `paths` and then loads those `.d.ts` files at runtime.

The inherited block of commented-out option documentation is dropped.

* chore: migrate typecheck to TypeScript 7.0

Replaces TypeScript 6.0.3 with the native Go compiler. The version is pinned
exactly, since the platform binaries ship as version-matched optional
dependencies; the lockfile records the linux-x64 target CI resolves.

Typecheck wall time drops from 5.77s on 5.9.3 to ~1.0s. No configuration
change was required: the 6.0 hop already left tsconfig in a 7.0-shaped state,
and the default parallelism saturates without `--checkers`.

`@react-navigation/core` needs a patch to type-check. TypeScript 7.0.2
resolves the mutual recursion between `StaticParamList` and
`ParamListForScreens` eagerly where earlier versions defer it, reports the
alias as circular, and degrades it to a non-generic symbol -- surfacing as
`TS2315: Type 'StaticParamList' is not generic` at our call sites. The patch
drops a `FlatType<>` wrapper from the alias, which only flattens intersections
for editor display, so the type is unchanged and the misfire stops.

* chore: Bump version to 4.76.0 (#7542)

* chore(ci): apply least privilege permission to GitHub Actions (#7350)

* chore: switch React Compiler to infer mode (#7545)

* ci: route Maestro e2e selection through sniffler impact analysis (#7476)

* fix(iOS): RoomItem Swipe not working after scroll (#7532)

* fix(ci): select shards for changes outside app and honor the release label (#7555)

* fix: delete background taller than its row on ServersHistory (#7536)

* fix: delete background taller than its row on server items

* chore: code improvements

---------

Co-authored-by: Diego Mello <diegolmello@gmail.com>

* fix: UIKit block messages rendering with smaller font size (#7531)

* fix: UIKit block messages rendering with smaller font size

* fix: snapshot

* fix(db): move deleteMessage finds and prepares inside the writer lock (#7550)

* fix: quote has no effect on older thread messages (#7535)

* fix: Quote has no effect on older thread messages

* fix: Quote has no effect on older thread messages

* chore: e2e test

* fix: e2e test

* chore: format code and fix lint issues

* fix(MessageComposer): resolve quoted thread messages and guard stale lookups

* fix: test

---------

Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>

* fix(db): move persistMessage lookups and prepares inside the writer lock (#7551)

* fix:  test case 11 and 12 flaky tests (#7564)

* fix: test

* fix: room last messa test

* fix: jumptomessage test

* chore: remove comments

* fix: jump to message e2e test iOS

* remove unused comment

* fix(db): move sendMessage reads and prepares inside the writer lock (#7546)

* fix(db): move sendMessage reads and prepares inside the writer lock

* fix: test improvements

* chore: remove comments

* fix: Admin Panel content hidden behind bottom navigation bar (#7538)

* feat: add tabular numbers (#7568)

* feat: tabular numbers across the app, upgrade Inter to 4.1

* update snapshot

* chore: pin @rocket.chat/sdk to a specific commit hash (#7569)

* fix(e2ee): re-fetch subscription inside the write in toggleRoomE2EE (#7554)

* fix(e2ee): re-fetch subscription inside the write in toggleRoomE2EE

* code improvements

* removed unused comment

* fix: run handleDelete finds and prepares inside the writer lock (#7552)

* fix: run handleDelete finds and prepares inside the writer lock

* chore: reuse mockWMDB

* fix: crop screen hidden behind navigation bar on iOS 26 (#7529)

* fix: re-fetch message inside the write in getThreadName (#7557)

* fix: re-fetch message inside the write in getThreadName

* fix: re-fetch message inside the write in getThreadName

* chore: new test cases

* remove unecessary async

* fix(db): move decryptPendingMessages prepares inside the writer lock (#7548)

* fix(db): move decryptPendingMessages prepares inside the writer lock

* code improvements

* chore: new test case encryption

* chore: format code and fix lint issues

---------

Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>

* fix(android): VideoConf notification accept and decline button hidden and touch not working (#7533)

* fix: in-app notification buttons ignoring taps on Android

* fix: Decline and Accept invisible on the incoming call notification

* fix: UIKit buttons not responding on some Android devices (#7573)

* fix: force Google account chooser on OAuth login (#7572)

* fix: ISO format support in markdown component (#6943)

* fix: resolve deep links by room id for channels and groups (#7111)

* Merge pull request #7570 from RocketChat/deeplink-saml-auth

feat: SAML deeplink auth

* fix: grant pull-requests write to build call sites in build-develop (#7599)

The reusable workflows build-android.yml and build-ios.yml declare
pull-requests: write on their upload jobs. GitHub validates these at
call time regardless of job conditionals, so build-develop.yml
(caller) must grant the permission or the workflow fails validation.
build-pr.yml already grants it; this mirrors that.

---------

Co-authored-by: Rohit Bansal <40559587+Rohit3523@users.noreply.github.com>
Co-authored-by: Yasmim Nagat <117310290+yasnagat@users.noreply.github.com>
Co-authored-by: Otávio Stasiak <91474186+OtavioStasiak@users.noreply.github.com>
Co-authored-by: OtavioStasiak <OtavioStasiak@users.noreply.github.com>
Co-authored-by: Yash Rajpal <58601732+yash-rajpal@users.noreply.github.com>
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.

2 participants