Skip to content

Conversation

@juliajforesti
Copy link
Contributor

@juliajforesti juliajforesti commented Oct 30, 2025

Proposed changes (including videos or screenshots)

Create links module that holds all external links and replace them.

Issue(s)

Steps to test or reproduce

Further comments

Summary by CodeRabbit

  • Refactor

    • Centralized external links so documentation, support, and sales URLs are driven from a single source; updated UI to use these shared link values.
  • Localization

    • Translation strings updated to use dynamic URL placeholders for documentation and help links; fingerprint/security learn-more links now configurable.
  • Tests

    • E2E test fixtures updated to reference centralized link values.

@dionisio-bot
Copy link
Contributor

dionisio-bot bot commented Oct 30, 2025

Looks like this PR is ready to merge! 🎉
If you have any trouble, please check the PR guidelines

@changeset-bot
Copy link

changeset-bot bot commented Oct 30, 2025

⚠️ No Changeset found

Latest commit: 0114d6a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 30, 2025

Walkthrough

Centralizes external URLs by adding a typed links module and updating many client components, tests, and i18n strings to consume URLs from that module or via template placeholders instead of hard-coded strings; a small server string literal change and one type/guard update were also made.

Changes

Cohort / File(s) Summary
Links module
apps/meteor/client/lib/links.ts
Add GO_ROCKET_CHAT_PREFIX and export a large, typed links const organizing external URLs (as const).
Type/guard & tiny server fix
apps/meteor/client/lib/createSidebarItems.ts, apps/meteor/app/cloud/server/functions/getCheckoutUrl.ts
Update Item.href type and isGoRocketChatLink to use GO_ROCKET_CHAT_PREFIX; simplify fallback literal from template to plain string.
Fingerprint modals / i18n injection
apps/meteor/client/components/FingerprintChangeModal.tsx, apps/meteor/client/components/FingerprintChangeModalConfirmation.tsx, packages/i18n/src/locales/*.i18n.json
Inject fingerPrintChangedFaq from links into translated HTML and update i18n entries to use {{fingerPrintChangedFaq}}.
Upsell / sales / pricing links
apps/meteor/client/components/GenericUpsellModal/hooks/useUpsellActions.ts, apps/meteor/client/views/admin/subscription/utils/links.ts, apps/meteor/client/views/admin/settings/Setting/Setting.tsx, ...
Replace hard-coded contact/pricing/trial/addons URLs with values sourced from links.go and related centralized keys.
Omnichannel docs & webhooks
apps/meteor/client/components/Omnichannel/OutboundMessage/constants.ts, apps/meteor/client/omnichannel/**/...tsx
Replace many hard-coded omnichannel docs/contact links with links.go.omnichannelDocs, links.webhooks, etc.
Sidebar / footer / banners
apps/meteor/client/sidebar/**, apps/meteor/client/sidebarv2/**, apps/meteor/client/sidebar/sections/*
Replace hard-coded rocket.chat, airgapped, pricing, and related banner/footer URLs with links.* values.
Home / marketplace / apps / update flows
apps/meteor/client/views/home/cards/*.tsx, apps/meteor/client/views/marketplace/**, apps/meteor/client/views/marketplace/sidebarItems.tsx
Centralize desktop/mobile/download/docs/update URLs to links constants.
E2E / room / federation
apps/meteor/client/views/e2e/**, apps/meteor/client/views/room/**, apps/meteor/client/views/room/composer/**
Replace E2E/federation docs URLs with links.go.* entries.
Setup / registration / privacy/terms / voip
apps/meteor/client/views/setupWizard/**, apps/meteor/client/voip/modals/DeviceSettingsModal.tsx, apps/meteor/client/views/admin/workspace/VersionCard/**
Use links.terms, links.privacy, links.desktopAppDownload, and other links entries instead of literals.
Numerous omnichannel tables & lists
many files under apps/meteor/client/views/omnichannel/** (e.g., AgentsTable.tsx, MonitorsTable.tsx, UnitsTable.tsx, TagsTable.tsx, etc.)
Replace “learn more” / no-results hard-coded URLs with links.go.omnichannelDocs.
Tests
apps/meteor/tests/e2e/calendar.spec.ts, apps/meteor/tests/e2e/presence.spec.ts
Use links.rocketChat / links.rocketChatUpdated instead of literal meeting URL strings.
i18n locale updates (many files)
packages/i18n/src/locales/{...}.i18n.json
Replace hard-coded docs/go URLs in translation values with template placeholders {{retentionPolicyUrl}} and {{fingerPrintChangedFaq}}; a few locale keys were removed/altered.

Sequence Diagram(s)

No sequence diagrams provided.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Focus review on:
    • apps/meteor/client/lib/links.ts for correctness, value shapes, and const assertions.
    • Type changes in createSidebarItems.ts and isGoRocketChatLink runtime behavior.
    • i18n modifications for correct placeholder names and accidental deletions (notably sr / sk-SK).
    • A sample of updated components (imports/compilation) and the tests updated to reference links.

Possibly related PRs

Suggested labels

stat: ready to merge, stat: QA assured

Suggested reviewers

  • dougfabris
  • aleksandernsilva

Poem

🐇 I hopped through code and chased each link,
Replaced the strings before you'd blink.
Docs, sales, guides now live in one place —
A tidy map for every chase. ✨

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'chore: links module' accurately summarizes the main change: the creation and integration of a centralized links module throughout the codebase. The title is concise, clear, and directly reflects the primary objective of the PR—consolidating external link management into a dedicated module. While it doesn't detail every file touched, it effectively captures the essence of the refactoring effort.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch chore/links

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 2d05524 and 9bfda6c.

📒 Files selected for processing (1)
  • packages/i18n/src/locales/ta-IN.i18n.json (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: 📦 Build Packages
  • GitHub Check: CodeQL-Build
  • GitHub Check: CodeQL-Build

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@codecov
Copy link

codecov bot commented Oct 30, 2025

Codecov Report

❌ Patch coverage is 95.04950% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.02%. Comparing base (8e99ec6) to head (0114d6a).
⚠️ Report is 2 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop   #37347      +/-   ##
===========================================
+ Coverage    66.94%   68.02%   +1.08%     
===========================================
  Files         3412     3359      -53     
  Lines       117434   115376    -2058     
  Branches     21503    20846     -657     
===========================================
- Hits         78611    78481     -130     
+ Misses       36147    34217    -1930     
- Partials      2676     2678       +2     
Flag Coverage Δ
e2e 57.47% <89.28%> (-0.01%) ⬇️
unit 72.08% <97.59%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@juliajforesti juliajforesti added this to the 7.12.0 milestone Oct 30, 2025
@juliajforesti juliajforesti marked this pull request as ready for review October 31, 2025 18:04
@juliajforesti juliajforesti requested review from a team as code owners October 31, 2025 18:04
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 12

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx (1)

99-106: Harden window.open with noopener/noreferrer to prevent reverse-tabnabbing

The window.open call at line 102 lacks security hardening for external links. Add the third parameter to include noopener and noreferrer:

-                    window.open(RELEASES_EXTERNAL_LINK, '_blank');
+                    window.open(RELEASES_EXTERNAL_LINK, '_blank', 'noopener,noreferrer');

Additionally, the codebase has at least two other instances with the same vulnerability:

  • apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx:91
  • apps/meteor/client/views/admin/AdministrationRouter.tsx:41

Both should receive the same hardening treatment for consistency and security.

🧹 Nitpick comments (4)
packages/i18n/src/locales/fa.i18n.json (1)

2086-2086: Consider adding quotes around the href placeholder for robustness.

The updated RetentionPolicyRoom_ReadTheDocs string uses an unquoted template placeholder in the anchor href: href={{retentionPolicyUrl}}. While this may work depending on your templating framework, best practice for HTML attributes is to quote placeholder values: href="{{retentionPolicyUrl}}". This ensures better compatibility and guards against potential parsing issues.

apps/meteor/client/sidebar/sections/OverMacLimitSection.tsx (1)

11-11: Consider simplifying: useEffectEvent is unnecessary here.

Since links.go.pricing is a constant with no reactive dependencies, you can simplify this to an inline arrow function.

Apply this diff to simplify:

-	const handleClick = useEffectEvent(() => window.open(links.go.pricing));

And update line 18:

-			onClick={handleClick}
+			onClick={() => window.open(links.go.pricing)}

Then remove the useEffectEvent import from line 2:

-import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
packages/i18n/src/locales/sv.i18n.json (1)

5283-5283: Quote href attribute and add rel="noopener noreferrer" for security best practice.

The variable fingerPrintChangedFaq is properly supplied at git/apps/meteor/client/lib/links.ts:17 and passed through the translation function in FingerprintChangeModal.tsx:39 and FingerprintChangeModalConfirmation.tsx:47. The HTML is sanitized via DOMPurify before DOM insertion, which mitigates XSS risks. However, quoting the href attribute and adding rel="noopener noreferrer" follows HTML and security best practices for target="_blank" links:

-  "Unique_ID_change_detected_learn_more_link": "<a href={{fingerPrintChangedFaq}} target=\"_blank\">Läs mer om detta</a>",
+  "Unique_ID_change_detected_learn_more_link": "<a href=\"{{fingerPrintChangedFaq}}\" target=\"_blank\" rel=\"noopener noreferrer\">Läs mer om detta</a>",

Verify manually for similar unquoted href patterns in other i18n locale files.

apps/meteor/client/components/GenericUpsellModal/hooks/useUpsellActions.ts (1)

6-10: Use of links.go.contactSales is appropriate; minor consistency nit.

Adopting the centralized sales link is good. Optional: you use two hook vars (handleOpenLink and openExternalLink) for the same purpose; consider using one for consistency.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 5c57e84 and 7feb226.

📒 Files selected for processing (107)
  • apps/meteor/app/cloud/server/functions/getCheckoutUrl.ts (1 hunks)
  • apps/meteor/client/components/FingerprintChangeModal.tsx (2 hunks)
  • apps/meteor/client/components/FingerprintChangeModalConfirmation.tsx (2 hunks)
  • apps/meteor/client/components/GenericUpsellModal/hooks/useUpsellActions.ts (1 hunks)
  • apps/meteor/client/components/Omnichannel/OutboundMessage/constants.ts (1 hunks)
  • apps/meteor/client/lib/createSidebarItems.ts (2 hunks)
  • apps/meteor/client/lib/links.ts (1 hunks)
  • apps/meteor/client/omnichannel/cannedResponses/CannedResponsesTable.tsx (2 hunks)
  • apps/meteor/client/omnichannel/monitors/MonitorsTable.tsx (2 hunks)
  • apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx (2 hunks)
  • apps/meteor/client/omnichannel/tags/TagsTable.tsx (2 hunks)
  • apps/meteor/client/omnichannel/units/UnitsTable.tsx (2 hunks)
  • apps/meteor/client/sidebar/footer/SidebarFooterWatermark.tsx (2 hunks)
  • apps/meteor/client/sidebar/sections/AirGappedRestrictionBanner/AirGappedRestrictionBanner.tsx (1 hunks)
  • apps/meteor/client/sidebar/sections/OverMacLimitSection.tsx (1 hunks)
  • apps/meteor/client/sidebarv2/footer/SidebarFooterWatermark.tsx (2 hunks)
  • apps/meteor/client/sidebarv2/sections/AirGappedRestrictionBanner/AirGappedRestrictionBanner.tsx (2 hunks)
  • apps/meteor/client/views/account/accessibility/AccessibilityPage.tsx (2 hunks)
  • apps/meteor/client/views/admin/customUserStatus/CustomUserStatusService.tsx (3 hunks)
  • apps/meteor/client/views/admin/settings/Setting/Setting.tsx (1 hunks)
  • apps/meteor/client/views/admin/settings/groups/LDAPGroupPage.tsx (2 hunks)
  • apps/meteor/client/views/admin/subscription/utils/links.ts (1 hunks)
  • apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx (1 hunks)
  • apps/meteor/client/views/admin/workspace/VersionCard/modals/RegisterWorkspaceModal.tsx (1 hunks)
  • apps/meteor/client/views/admin/workspace/VersionCard/modals/RegisterWorkspaceSetupModal/RegisterWorkspaceSetupStepOneModal.tsx (2 hunks)
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx (1 hunks)
  • apps/meteor/client/views/home/cards/DesktopAppsCard.tsx (1 hunks)
  • apps/meteor/client/views/home/cards/DocumentationCard.tsx (1 hunks)
  • apps/meteor/client/views/home/cards/MobileAppsCard.tsx (1 hunks)
  • apps/meteor/client/views/marketplace/AppsPage/UnsupportedEmptyState.tsx (2 hunks)
  • apps/meteor/client/views/marketplace/components/UninstallGrandfatheredAppModal/UninstallGrandfatheredAppModal.tsx (2 hunks)
  • apps/meteor/client/views/marketplace/components/UpdateRocketChatButton.tsx (1 hunks)
  • apps/meteor/client/views/marketplace/sidebarItems.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/businessHours/BusinessHoursDisabledPage.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/currentChats/CurrentChatsPage.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/directory/chats/ChatsTable/ChatsTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx (2 hunks)
  • apps/meteor/client/views/omnichannel/webhooks/WebhooksPage.tsx (2 hunks)
  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx (1 hunks)
  • apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederationInvalidVersion.tsx (1 hunks)
  • apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx (2 hunks)
  • apps/meteor/client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsers.stories.tsx (2 hunks)
  • apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx (1 hunks)
  • apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx (2 hunks)
  • apps/meteor/client/voip/modals/DeviceSettingsModal.tsx (2 hunks)
  • apps/meteor/tests/e2e/calendar.spec.ts (2 hunks)
  • apps/meteor/tests/e2e/presence.spec.ts (5 hunks)
  • packages/i18n/src/locales/af.i18n.json (1 hunks)
  • packages/i18n/src/locales/ar.i18n.json (1 hunks)
  • packages/i18n/src/locales/az.i18n.json (1 hunks)
  • packages/i18n/src/locales/be-BY.i18n.json (1 hunks)
  • packages/i18n/src/locales/bg.i18n.json (1 hunks)
  • packages/i18n/src/locales/bs.i18n.json (1 hunks)
  • packages/i18n/src/locales/ca.i18n.json (1 hunks)
  • packages/i18n/src/locales/cs.i18n.json (1 hunks)
  • packages/i18n/src/locales/cy.i18n.json (1 hunks)
  • packages/i18n/src/locales/da.i18n.json (1 hunks)
  • packages/i18n/src/locales/de-AT.i18n.json (1 hunks)
  • packages/i18n/src/locales/de-IN.i18n.json (1 hunks)
  • packages/i18n/src/locales/de.i18n.json (1 hunks)
  • packages/i18n/src/locales/el.i18n.json (1 hunks)
  • packages/i18n/src/locales/en.i18n.json (2 hunks)
  • packages/i18n/src/locales/eo.i18n.json (1 hunks)
  • packages/i18n/src/locales/es.i18n.json (1 hunks)
  • packages/i18n/src/locales/fa.i18n.json (1 hunks)
  • packages/i18n/src/locales/fi.i18n.json (1 hunks)
  • packages/i18n/src/locales/fr.i18n.json (1 hunks)
  • packages/i18n/src/locales/hi-IN.i18n.json (2 hunks)
  • packages/i18n/src/locales/hr.i18n.json (1 hunks)
  • packages/i18n/src/locales/hu.i18n.json (1 hunks)
  • packages/i18n/src/locales/id.i18n.json (1 hunks)
  • packages/i18n/src/locales/it.i18n.json (1 hunks)
  • packages/i18n/src/locales/ja.i18n.json (1 hunks)
  • packages/i18n/src/locales/ka-GE.i18n.json (1 hunks)
  • packages/i18n/src/locales/km.i18n.json (1 hunks)
  • packages/i18n/src/locales/ko.i18n.json (1 hunks)
  • packages/i18n/src/locales/ku.i18n.json (1 hunks)
  • packages/i18n/src/locales/lo.i18n.json (1 hunks)
  • packages/i18n/src/locales/lt.i18n.json (1 hunks)
  • packages/i18n/src/locales/lv.i18n.json (1 hunks)
  • packages/i18n/src/locales/mn.i18n.json (1 hunks)
  • packages/i18n/src/locales/ms-MY.i18n.json (1 hunks)
  • packages/i18n/src/locales/nb.i18n.json (2 hunks)
  • packages/i18n/src/locales/nl.i18n.json (1 hunks)
  • packages/i18n/src/locales/nn.i18n.json (2 hunks)
  • packages/i18n/src/locales/pl.i18n.json (1 hunks)
  • packages/i18n/src/locales/pt-BR.i18n.json (2 hunks)
  • packages/i18n/src/locales/pt.i18n.json (1 hunks)
  • packages/i18n/src/locales/ro.i18n.json (1 hunks)
  • packages/i18n/src/locales/ru.i18n.json (1 hunks)
  • packages/i18n/src/locales/sk-SK.i18n.json (0 hunks)
  • packages/i18n/src/locales/sl-SI.i18n.json (1 hunks)
  • packages/i18n/src/locales/sq.i18n.json (1 hunks)
  • packages/i18n/src/locales/sr.i18n.json (0 hunks)
  • packages/i18n/src/locales/sv.i18n.json (2 hunks)
  • packages/i18n/src/locales/ta-IN.i18n.json (1 hunks)
  • packages/i18n/src/locales/th-TH.i18n.json (1 hunks)
  • packages/i18n/src/locales/tr.i18n.json (1 hunks)
  • packages/i18n/src/locales/uk.i18n.json (1 hunks)
  • packages/i18n/src/locales/vi-VN.i18n.json (1 hunks)
⛔ Files not processed due to max files limit (3)
  • packages/i18n/src/locales/zh-HK.i18n.json
  • packages/i18n/src/locales/zh-TW.i18n.json
  • packages/i18n/src/locales/zh.i18n.json
💤 Files with no reviewable changes (2)
  • packages/i18n/src/locales/sk-SK.i18n.json
  • packages/i18n/src/locales/sr.i18n.json
🧰 Additional context used
📓 Path-based instructions (3)
apps/meteor/tests/e2e/**/*.spec.ts

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

apps/meteor/tests/e2e/**/*.spec.ts: All Playwright test files must be located under apps/meteor/tests/e2e/ and use the .spec.ts extension (e.g., login.spec.ts)
Use descriptive test names that clearly communicate expected behavior
Use test.beforeAll() and test.afterAll() for setup and teardown
Use test.step() to organize complex test scenarios
Group related tests in the same file
Utilize Playwright fixtures (test, page, expect) consistently
Prefer web-first assertions (e.g., toBeVisible, toHaveText)
Use expect matchers (toEqual, toContain, toBeTruthy, toHaveLength, etc.) instead of assert statements
Maintain test isolation between test cases
Ensure a clean state for each test execution
Ensure tests run reliably in parallel without shared state conflicts

Files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
apps/meteor/tests/e2e/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

apps/meteor/tests/e2e/**/*.{ts,tsx,js,jsx}: Write concise, technical TypeScript/JavaScript with accurate typing
Follow DRY by extracting reusable logic into helper functions or page objects
Avoid code comments in the implementation

Files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
apps/meteor/tests/e2e/**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/playwright.mdc)

apps/meteor/tests/e2e/**/*.{ts,tsx}: Avoid using page.locator(); prefer semantic locators like page.getByRole, page.getByLabel, page.getByText, and page.getByTitle
Store commonly used locators in variables/constants for reuse
Use page.waitFor() with specific conditions and avoid hardcoded timeouts
Implement proper wait strategies for dynamic content
Follow the Page Object Model pattern consistently

Files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
🧠 Learnings (22)
📚 Learning: 2025-09-16T22:09:18.041Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/test-cases.mdc:0-0
Timestamp: 2025-09-16T22:09:18.041Z
Learning: Use Rocket.Chat primary documentation and provided reference files for guidance

Applied to files:

  • apps/meteor/client/lib/links.ts
  • apps/meteor/client/components/Omnichannel/OutboundMessage/constants.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Use descriptive test names that clearly communicate expected behavior

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Ensure tests run reliably in parallel without shared state conflicts

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Utilize Playwright fixtures (test, page, expect) consistently

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Maintain test isolation between test cases

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Ensure a clean state for each test execution

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Use expect matchers (toEqual, toContain, toBeTruthy, toHaveLength, etc.) instead of assert statements

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx} : Implement proper wait strategies for dynamic content

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Prefer web-first assertions (e.g., toBeVisible, toHaveText)

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : All Playwright test files must be located under apps/meteor/tests/e2e/ and use the .spec.ts extension (e.g., login.spec.ts)

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Group related tests in the same file

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx} : Follow the Page Object Model pattern consistently

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx} : Store commonly used locators in variables/constants for reuse

Applied to files:

  • apps/meteor/tests/e2e/presence.spec.ts
  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx
  • apps/meteor/tests/e2e/calendar.spec.ts
  • apps/meteor/client/views/home/cards/MobileAppsCard.tsx
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx,js,jsx} : Avoid code comments in the implementation

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx
  • apps/meteor/tests/e2e/calendar.spec.ts
  • apps/meteor/client/views/home/cards/MobileAppsCard.tsx
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx} : Avoid using page.locator(); prefer semantic locators like page.getByRole, page.getByLabel, page.getByText, and page.getByTitle

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/client/views/account/accessibility/AccessibilityPage.tsx
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx,js,jsx} : Write concise, technical TypeScript/JavaScript with accurate typing

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/page-objects/**/*.ts : Utilize and place Page Object implementations under apps/meteor/tests/e2e/page-objects/

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.{ts,tsx,js,jsx} : Follow DRY by extracting reusable logic into helper functions or page objects

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx
  • apps/meteor/tests/e2e/calendar.spec.ts
📚 Learning: 2025-10-28T16:53:42.761Z
Learnt from: ricardogarim
Repo: RocketChat/Rocket.Chat PR: 37205
File: ee/packages/federation-matrix/src/FederationMatrix.ts:296-301
Timestamp: 2025-10-28T16:53:42.761Z
Learning: In the Rocket.Chat federation-matrix integration (ee/packages/federation-matrix/), the createRoom method from rocket.chat/federation-sdk will support a 4-argument signature (userId, roomName, visibility, displayName) in newer versions. Code using this 4-argument call is forward-compatible with planned library updates and should not be flagged as an error.

Applied to files:

  • apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx
  • apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederationInvalidVersion.tsx
📚 Learning: 2025-10-06T20:32:23.658Z
Learnt from: d-gubert
Repo: RocketChat/Rocket.Chat PR: 37152
File: packages/apps-engine/tests/test-data/utilities.ts:557-573
Timestamp: 2025-10-06T20:32:23.658Z
Learning: In packages/apps-engine/tests/test-data/utilities.ts, the field name `isSubscripbedViaBundle` in the `IMarketplaceSubscriptionInfo` type should not be flagged as a typo, as it may match the upstream API's field name.

Applied to files:

  • apps/meteor/client/views/admin/subscription/utils/links.ts
📚 Learning: 2025-09-19T15:15:04.642Z
Learnt from: rodrigok
Repo: RocketChat/Rocket.Chat PR: 36991
File: apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts:219-221
Timestamp: 2025-09-19T15:15:04.642Z
Learning: The Federation_Matrix_homeserver_domain setting in apps/meteor/server/services/federation/infrastructure/rocket-chat/adapters/Settings.ts is part of the old federation system and is being deprecated/removed, so configuration issues with this setting should not be flagged for improvement.

Applied to files:

  • apps/meteor/client/views/admin/settings/Setting/Setting.tsx
  • apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederationInvalidVersion.tsx
📚 Learning: 2025-09-16T22:08:51.490Z
Learnt from: CR
Repo: RocketChat/Rocket.Chat PR: 0
File: .cursor/rules/playwright.mdc:0-0
Timestamp: 2025-09-16T22:08:51.490Z
Learning: Applies to apps/meteor/tests/e2e/**/*.spec.ts : Use test.beforeAll() and test.afterAll() for setup and teardown

Applied to files:

  • apps/meteor/tests/e2e/calendar.spec.ts
🧬 Code graph analysis (52)
apps/meteor/client/omnichannel/cannedResponses/CannedResponsesTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/sidebar/sections/AirGappedRestrictionBanner/AirGappedRestrictionBanner.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/omnichannel/monitors/MonitorsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/workspace/VersionCard/modals/RegisterWorkspaceModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/sidebarv2/sections/AirGappedRestrictionBanner/AirGappedRestrictionBanner.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/omnichannel/units/UnitsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/businessHours/BusinessHoursDisabledPage.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/home/cards/DocumentationCard.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/omnichannel/slaPolicies/SlaTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/tests/e2e/presence.spec.ts (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/sidebar/footer/SidebarFooterWatermark.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/webhooks/WebhooksPage.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/room/E2EESetup/RoomE2EENotAllowed.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/account/accessibility/AccessibilityPage.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/marketplace/components/UninstallGrandfatheredAppModal/UninstallGrandfatheredAppModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/currentChats/CurrentChatsPage.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/home/cards/DesktopAppsCard.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/voip/modals/DeviceSettingsModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/subscription/utils/links.ts (2)
apps/meteor/client/components/Omnichannel/OutboundMessage/constants.ts (1)
  • CONTACT_SALES_LINK (4-4)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/customUserStatus/CustomUserStatusService.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/contactInfo/AdvancedContactModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/room/contextualBar/RoomMembers/InviteUsers/InviteUsers.stories.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/components/GenericUpsellModal/hooks/useUpsellActions.ts (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/omnichannel/directory/chats/ChatsTable/ChatsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/settings/Setting/Setting.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/components/Omnichannel/OutboundMessage/constants.ts (2)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/subscription/utils/links.ts (1)
  • CONTACT_SALES_LINK (3-3)
apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/workspace/VersionCard/modals/RegisterWorkspaceSetupModal/RegisterWorkspaceSetupStepOneModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/workspace/VersionCard/VersionCard.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/tests/e2e/calendar.spec.ts (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/marketplace/components/UpdateRocketChatButton.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/marketplace/AppsPage/UnsupportedEmptyState.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/sidebarv2/footer/SidebarFooterWatermark.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/sidebar/sections/OverMacLimitSection.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/omnichannel/tags/TagsTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/admin/settings/groups/LDAPGroupPage.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/components/FingerprintChangeModal.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/room/composer/ComposerFederation/ComposerFederationInvalidVersion.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/marketplace/sidebarItems.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/views/home/cards/MobileAppsCard.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/components/FingerprintChangeModalConfirmation.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)
apps/meteor/client/lib/createSidebarItems.ts (2)
packages/ui-contexts/src/RouterContext.ts (1)
  • LocationPathname (16-16)
apps/meteor/client/lib/links.ts (1)
  • GO_ROCKET_CHAT_PREFIX (1-1)
apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx (1)
apps/meteor/client/lib/links.ts (1)
  • links (3-46)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (3)
packages/i18n/src/locales/de.i18n.json (1)

3457-3457: Insert the missing space after the closing link; verify quoted href is allowed.

Fix the typography; current string lacks a space after . Also, please confirm that quoting the href placeholder matches your i18n/template processing conventions.

-  "RetentionPolicyRoom_ReadTheDocs": "Achtung! Eine fehlerhafte Anpassung dieser Einstellungen kann den gesamten Nachrichtenverlauf zerstören. Bitte lesen Sie die Dokumentation, bevor Sie das Feature <a href=\"{{retentionPolicyUrl}}\">hier</a>aktivieren.",
+  "RetentionPolicyRoom_ReadTheDocs": "Achtung! Eine fehlerhafte Anpassung dieser Einstellungen kann den gesamten Nachrichtenverlauf zerstören. Bitte lesen Sie die Dokumentation, bevor Sie das Feature <a href=\"{{retentionPolicyUrl}}\">hier</a> aktivieren.",
packages/i18n/src/locales/af.i18n.json (1)

1815-1815: Spacing issue remains unfixed—duplicate of previous review.

The spacing issue flagged in the past review still exists on line 1815. There is a missing space between the closing </a> tag and the word "verander". The text currently reads:

...hier</a>verander.

It should read:

...hier</a> verander.

See the previous review for details and suggested fix.

packages/i18n/src/locales/en.i18n.json (1)

5392-5392: Quote the href value (consistency and robustness).

Use quotes around the interpolated URL to avoid edge cases with special chars and match surrounding patterns.

Apply this diff:

-  "Unique_ID_change_detected_learn_more_link": "<a href={{fingerPrintChangedFaq}} target=\"_blank\">Learn more</a>",
+  "Unique_ID_change_detected_learn_more_link": "<a href=\"{{fingerPrintChangedFaq}}\" target=\"_blank\">Learn more</a>",

Optionally add rel for safety:

-  "Unique_ID_change_detected_learn_more_link": "<a href=\"{{fingerPrintChangedFaq}}\" target=\"_blank\">Learn more</a>",
+  "Unique_ID_change_detected_learn_more_link": "<a href=\"{{fingerPrintChangedFaq}}\" target=\"_blank\" rel=\"noopener noreferrer\">Learn more</a>",

To catch any other unquoted hrefs:

#!/bin/bash
rg -nP 'href=\{\{[^}]+\}\}' packages/i18n/src/locales --glob '*.json' -C1
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 7feb226 and 2d05524.

📒 Files selected for processing (55)
  • apps/meteor/client/lib/links.ts (1 hunks)
  • packages/i18n/src/locales/af.i18n.json (1 hunks)
  • packages/i18n/src/locales/ar.i18n.json (1 hunks)
  • packages/i18n/src/locales/az.i18n.json (1 hunks)
  • packages/i18n/src/locales/be-BY.i18n.json (1 hunks)
  • packages/i18n/src/locales/bg.i18n.json (1 hunks)
  • packages/i18n/src/locales/bs.i18n.json (1 hunks)
  • packages/i18n/src/locales/ca.i18n.json (1 hunks)
  • packages/i18n/src/locales/cs.i18n.json (1 hunks)
  • packages/i18n/src/locales/cy.i18n.json (1 hunks)
  • packages/i18n/src/locales/da.i18n.json (1 hunks)
  • packages/i18n/src/locales/de-AT.i18n.json (1 hunks)
  • packages/i18n/src/locales/de-IN.i18n.json (1 hunks)
  • packages/i18n/src/locales/de.i18n.json (1 hunks)
  • packages/i18n/src/locales/el.i18n.json (1 hunks)
  • packages/i18n/src/locales/en.i18n.json (2 hunks)
  • packages/i18n/src/locales/eo.i18n.json (1 hunks)
  • packages/i18n/src/locales/es.i18n.json (1 hunks)
  • packages/i18n/src/locales/fa.i18n.json (1 hunks)
  • packages/i18n/src/locales/fi.i18n.json (1 hunks)
  • packages/i18n/src/locales/fr.i18n.json (1 hunks)
  • packages/i18n/src/locales/hi-IN.i18n.json (2 hunks)
  • packages/i18n/src/locales/hr.i18n.json (1 hunks)
  • packages/i18n/src/locales/hu.i18n.json (1 hunks)
  • packages/i18n/src/locales/id.i18n.json (1 hunks)
  • packages/i18n/src/locales/it.i18n.json (1 hunks)
  • packages/i18n/src/locales/ja.i18n.json (1 hunks)
  • packages/i18n/src/locales/ka-GE.i18n.json (1 hunks)
  • packages/i18n/src/locales/km.i18n.json (1 hunks)
  • packages/i18n/src/locales/ko.i18n.json (1 hunks)
  • packages/i18n/src/locales/ku.i18n.json (1 hunks)
  • packages/i18n/src/locales/lo.i18n.json (1 hunks)
  • packages/i18n/src/locales/lt.i18n.json (1 hunks)
  • packages/i18n/src/locales/lv.i18n.json (1 hunks)
  • packages/i18n/src/locales/mn.i18n.json (1 hunks)
  • packages/i18n/src/locales/ms-MY.i18n.json (1 hunks)
  • packages/i18n/src/locales/nb.i18n.json (2 hunks)
  • packages/i18n/src/locales/nl.i18n.json (1 hunks)
  • packages/i18n/src/locales/nn.i18n.json (2 hunks)
  • packages/i18n/src/locales/pl.i18n.json (1 hunks)
  • packages/i18n/src/locales/pt-BR.i18n.json (2 hunks)
  • packages/i18n/src/locales/pt.i18n.json (1 hunks)
  • packages/i18n/src/locales/ro.i18n.json (1 hunks)
  • packages/i18n/src/locales/ru.i18n.json (1 hunks)
  • packages/i18n/src/locales/sl-SI.i18n.json (1 hunks)
  • packages/i18n/src/locales/sq.i18n.json (1 hunks)
  • packages/i18n/src/locales/sv.i18n.json (2 hunks)
  • packages/i18n/src/locales/ta-IN.i18n.json (1 hunks)
  • packages/i18n/src/locales/th-TH.i18n.json (1 hunks)
  • packages/i18n/src/locales/tr.i18n.json (1 hunks)
  • packages/i18n/src/locales/uk.i18n.json (1 hunks)
  • packages/i18n/src/locales/vi-VN.i18n.json (1 hunks)
  • packages/i18n/src/locales/zh-HK.i18n.json (1 hunks)
  • packages/i18n/src/locales/zh-TW.i18n.json (1 hunks)
  • packages/i18n/src/locales/zh.i18n.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (37)
  • packages/i18n/src/locales/th-TH.i18n.json
  • packages/i18n/src/locales/az.i18n.json
  • packages/i18n/src/locales/ar.i18n.json
  • packages/i18n/src/locales/pt.i18n.json
  • packages/i18n/src/locales/eo.i18n.json
  • packages/i18n/src/locales/fr.i18n.json
  • packages/i18n/src/locales/pt-BR.i18n.json
  • packages/i18n/src/locales/sl-SI.i18n.json
  • packages/i18n/src/locales/mn.i18n.json
  • apps/meteor/client/lib/links.ts
  • packages/i18n/src/locales/el.i18n.json
  • packages/i18n/src/locales/hu.i18n.json
  • packages/i18n/src/locales/ko.i18n.json
  • packages/i18n/src/locales/ru.i18n.json
  • packages/i18n/src/locales/hi-IN.i18n.json
  • packages/i18n/src/locales/fa.i18n.json
  • packages/i18n/src/locales/cs.i18n.json
  • packages/i18n/src/locales/ta-IN.i18n.json
  • packages/i18n/src/locales/nb.i18n.json
  • packages/i18n/src/locales/fi.i18n.json
  • packages/i18n/src/locales/lv.i18n.json
  • packages/i18n/src/locales/be-BY.i18n.json
  • packages/i18n/src/locales/lt.i18n.json
  • packages/i18n/src/locales/ja.i18n.json
  • packages/i18n/src/locales/es.i18n.json
  • packages/i18n/src/locales/lo.i18n.json
  • packages/i18n/src/locales/cy.i18n.json
  • packages/i18n/src/locales/id.i18n.json
  • packages/i18n/src/locales/ku.i18n.json
  • packages/i18n/src/locales/ca.i18n.json
  • packages/i18n/src/locales/sv.i18n.json
  • packages/i18n/src/locales/nl.i18n.json
  • packages/i18n/src/locales/de-AT.i18n.json
  • packages/i18n/src/locales/ka-GE.i18n.json
  • packages/i18n/src/locales/nn.i18n.json
  • packages/i18n/src/locales/da.i18n.json
  • packages/i18n/src/locales/pl.i18n.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: 📦 Build Packages
  • GitHub Check: CodeQL-Build
  • GitHub Check: CodeQL-Build
🔇 Additional comments (15)
packages/i18n/src/locales/hr.i18n.json (1)

1930-1930: Localization update correctly enables dynamic URL injection.

The change replaces the hard-coded href with a {{retentionPolicyUrl}} template placeholder, enabling runtime injection of the centralized URL from the links module. The Croatian translation text and HTML structure remain intact. This aligns with the PR's objective to centralize external URL management.

packages/i18n/src/locales/sq.i18n.json (1)

1813-1813: Clean alignment with centralized links module pattern.

The replacement of a hard-coded URL with the {{retentionPolicyUrl}} template placeholder is consistent with the PR's objective to centralize external links. The HTML structure and template syntax are correct.

packages/i18n/src/locales/vi-VN.i18n.json (1)

1905-1905: ✓ Approve: Template variable correctly replaces hardcoded URL.

The change at line 1905 properly updates RetentionPolicyRoom_ReadTheDocs to use the dynamic placeholder {{retentionPolicyUrl}} instead of an inline hardcoded documentation link. This aligns with the PR objective to centralize external link management.

The template syntax is correct, HTML structure is preserved, and the Vietnamese translation remains unchanged and readable.

packages/i18n/src/locales/de-IN.i18n.json (1)

2059-2059: Successfully centralizes retention policy documentation URL to dynamic placeholder.

The translation string correctly replaces the hard-coded URL with the {{retentionPolicyUrl}} template placeholder. This aligns with the PR's objective to centralize external links via a dedicated links module, enabling URL management from a single source rather than scattered throughout i18n files.

packages/i18n/src/locales/it.i18n.json (1)

2259-2259: ✓ Appropriate use of template placeholder for URL management in i18n.

The change replaces a hardcoded documentation URL with the {{retentionPolicyUrl}} placeholder, which is the correct pattern for i18n files. This decouples the localized UI text from dynamic link values, allowing the URL to be centrally managed via the links module while keeping translations clean and maintainable.

packages/i18n/src/locales/zh.i18n.json (1)

2716-2716: Template placeholder correctly replaces hard-coded URL.

The translation string for RetentionPolicyRoom_ReadTheDocs now uses {{retentionPolicyUrl}} as a dynamic template variable instead of a hard-coded URL. The HTML anchor structure is preserved, and the Chinese text remains accurate. This change aligns with the PR's objective to centralize external link management.

packages/i18n/src/locales/uk.i18n.json (1)

2277-2277: Centralize external link reference correctly.

The replacement of the hard-coded documentation URL with {{retentionPolicyUrl}} placeholder aligns with the PR objective to centralize external links. The Ukrainian translation and HTML structure are preserved correctly.

Verification needed: Confirm that the links module (apps/meteor/client/lib/links.ts) exports a retentionPolicyUrl constant and that the template substitution logic properly resolves this placeholder at runtime.

packages/i18n/src/locales/ms-MY.i18n.json (1)

1816-1816: Verify that {{retentionPolicyUrl}} placeholder is properly defined and interpolated at runtime.

The change replaces a hard-coded documentation URL with the {{retentionPolicyUrl}} template placeholder, which is consistent with the PR's link centralization goal. Ensure that:

  1. The placeholder is defined in the links module referenced by the PR (e.g., packages/links or similar).
  2. The i18n system properly interpolates this placeholder before rendering the HTML string to users.
  3. All other locales have been updated consistently with the same placeholder (not different URLs).
packages/i18n/src/locales/tr.i18n.json (1)

2156-2156: Correct centralized URL placeholder implementation for Turkish locale.

The change replaces the hardcoded documentation URL with a dynamic {{retentionPolicyUrl}} placeholder, aligning with the PR's objective to centralize link management. The Turkish translation structure and semantics are preserved correctly.

Verify that the component or view rendering this i18n string properly injects the retentionPolicyUrl variable from the centralized links module (e.g., from apps/meteor/client/lib/links.ts or similar).

packages/i18n/src/locales/bs.i18n.json (1)

1809-1809: ✓ Localization placeholder substitution looks good.

The change correctly replaces the hardcoded documentation URL with the {{retentionPolicyUrl}} template placeholder, aligning with the PR's centralized links module approach. The string remains valid JSON with proper HTML escaping.

To ensure this integrates correctly with the links module, verify that:

  • The placeholder {{retentionPolicyUrl}} is defined and populated at runtime by the links module
  • All language files (not just bs.i18n.json) use the same placeholder name consistently
packages/i18n/src/locales/bg.i18n.json (1)

1812-1812: ✓ Replace hardcoded URL with template placeholder for centralized link management.

This change aligns with the PR's goal to centralize external links. The {{retentionPolicyUrl}} placeholder syntax is consistent with other dynamic template variables in localization files.

Please verify that:

  1. The template variable {{retentionPolicyUrl}} is properly injected at runtime by the component that renders this localization string.
  2. This placeholder is defined in the centralized links module mentioned in the PR objectives, and a corresponding value is provided during template rendering.
packages/i18n/src/locales/zh-TW.i18n.json (1)

3011-3011: URL externalization applied correctly to locale string.

The hard-coded documentation URL has been successfully replaced with the {{retentionPolicyUrl}} template variable. The HTML structure and translation text remain intact. This change aligns with the PR objective to centralize external links.

packages/i18n/src/locales/km.i18n.json (1)

2093-2093: Verify placeholder name matches centralized links module.

The template placeholder syntax {{retentionPolicyUrl}} looks correct and the HTML structure is preserved. However, this change requires verification that:

  1. The constant retentionPolicyUrl is defined and exported from the centralized links module
  2. The placeholder name is consistent with naming conventions used elsewhere in the links module (e.g., camelCase with descriptive suffix Url)

Note: The file contains mixed placeholder styles—some entries use [Bracket_Style] (e.g., [Verification_Url] at line 2591) while this change uses {{BraceStyle}}. Consider whether this inconsistency should be addressed across the i18n files for clarity.

packages/i18n/src/locales/ro.i18n.json (1)

1813-1813: Verify that the {{retentionPolicyUrl}} placeholder is properly resolved at runtime.

The placeholder format {{retentionPolicyUrl}} differs from the file's email template placeholders ([Site_Name], [email], etc.) but aligns with other HTML content placeholders (e.g., {{download_link}} at line 2212). Ensure that the code rendering this translation string properly substitutes {{retentionPolicyUrl}} with the actual URL from the centralized links module.

Verify that related UI components (e.g., EditRoomInfo.tsx mentioned in the PR context) have been updated to pass retentionPolicyUrl when rendering this translation, and test end-to-end to confirm the link renders correctly.

packages/i18n/src/locales/en.i18n.json (1)

4427-4427: LGTM — href now quoted.

The interpolation is correctly quoted and consistent with the file’s pattern. No further action needed.

@tassoevan tassoevan modified the milestones: 7.12.0, 7.13.0 Nov 3, 2025
@tassoevan tassoevan added the stat: QA assured Means it has been tested and approved by a company insider label Nov 3, 2025
@dionisio-bot dionisio-bot bot added the stat: ready to merge PR tested and approved waiting for merge label Nov 3, 2025
@dionisio-bot dionisio-bot bot removed the stat: ready to merge PR tested and approved waiting for merge label Nov 3, 2025
@ggazzo ggazzo merged commit c61d14d into develop Nov 4, 2025
83 of 86 checks passed
@ggazzo ggazzo deleted the chore/links branch November 4, 2025 14:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stat: QA assured Means it has been tested and approved by a company insider

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants