Skip to content

Conversation

@dougfabris
Copy link
Member

@dougfabris dougfabris commented Sep 11, 2025

Proposed changes (including videos or screenshots)

image image image image
image image
image

Issue(s)

Steps to test or reproduce

Further comments

CORE-1317

Summary by CodeRabbit

  • Style

    • Updated UI copy from “E2E” to “E2EE” across settings, actions, modals, toasts and buttons.
    • Renamed enable/disable labels, reset/change password wording, and refined password guidance (removed legacy placeholders).
    • Added a “Proceed with caution” annotation when disabling encryption.
    • Accessibility: error messages now use role="alert".
  • Chores

    • Refreshed translations for many locales and bumped minor versions for i18n and app packages.

@dionisio-bot
Copy link
Contributor

dionisio-bot bot commented Sep 11, 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 Sep 11, 2025

🦋 Changeset detected

Latest commit: dc5c55b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 40 packages
Name Type
@rocket.chat/i18n Minor
@rocket.chat/meteor Minor
@rocket.chat/mock-providers Patch
@rocket.chat/ui-contexts Major
@rocket.chat/web-ui-registration Major
@rocket.chat/omnichannel-transcript Patch
@rocket.chat/omnichannel-services Patch
@rocket.chat/fuselage-ui-kit Major
@rocket.chat/ui-client Major
@rocket.chat/ui-voip Major
@rocket.chat/uikit-playground Patch
@rocket.chat/gazzodown Major
@rocket.chat/livechat Patch
@rocket.chat/ui-avatar Major
@rocket.chat/ui-video-conf Major
@rocket.chat/queue-worker Patch
@rocket.chat/core-typings Minor
@rocket.chat/rest-typings Minor
@rocket.chat/api-client Patch
@rocket.chat/apps Patch
@rocket.chat/core-services Patch
@rocket.chat/cron Patch
@rocket.chat/ddp-client Patch
@rocket.chat/freeswitch Patch
@rocket.chat/http-router Patch
@rocket.chat/model-typings Patch
@rocket.chat/account-service Patch
@rocket.chat/authorization-service Patch
@rocket.chat/ddp-streamer Patch
@rocket.chat/presence-service Patch
@rocket.chat/stream-hub-service Patch
@rocket.chat/license Patch
@rocket.chat/pdf-worker Patch
@rocket.chat/presence Patch
rocketchat-services Patch
@rocket.chat/models Patch
@rocket.chat/network-broker Patch
@rocket.chat/omni-core-ee Patch
@rocket.chat/instance-status Patch
@rocket.chat/omni-core Patch

Not sure what this means? Click here to learn what changesets are.

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 11, 2025

Walkthrough

Standardizes and rewords E2E/E2EE UI copy and translation keys across client code and locales, updates some i18n usage in a security component, removes many deprecated E2E-related keys from non-English locales, and adds a changeset bumping @rocket.chat/i18n and @rocket.chat/meteor.

Changes

Cohort / File(s) Summary
Changeset
/.changeset/cold-colts-hear.md
Adds a changeset bumping minor versions for @rocket.chat/i18n and @rocket.chat/meteor; notes UI text replacements for E2E/E2EE communication.
Room toolbox / menu labels
apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts
Switched title translation keys from E2E_disable/E2E_enable to Disable_E2E_encryption/Enable_E2E_encryption (logic unchanged).
Core E2E flow messages
apps/meteor/client/lib/e2ee/rocketchat.e2e.ts
Replaced several toast/modal translation keys (e.g., End_To_End_Encryption_EnabledE2E_encryption_enabled, updated save/decode messages); no control-flow changes.
Account security UI
apps/meteor/client/views/account/security/EndToEnd.tsx
Switched to react-i18next (useTranslation, Trans), removed useForm mode, renamed many E2E keys/labels to E2EE, adjusted error roles to role="alert", and added a clickable hint invoking e2e.decodePrivateKeyFlow(); component export unchanged.
Admin reset action
apps/meteor/client/views/admin/users/hooks/useResetE2EEKeyAction.tsx
Changed action label key to Reset_E2EE_password; behavior and permission/modal logic unchanged.
Save E2EE password modal
apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx
Modal title translation key updated to Save_your_new_E2EE_password; structure unchanged.
Reset mutation toast
apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts
Success toast key changed to E2EE_password_reset; mutation flow unchanged.
Disable modal annotation
apps/meteor/client/views/room/modals/E2EEModals/DisableE2EEModal.tsx
Added annotation={t('Proceed_with_caution')} to GenericModal; no control-flow change.
English locale (adds/renames)
packages/i18n/src/locales/en.i18n.json
Renames and consolidates E2E → E2EE keys, adds new keys (e.g., Enable_E2E_encryption, Disable_E2E_encryption, E2E_encryption_enabled, New_E2EE_password, E2EE_password_reset, Proceed_with_caution, Change_E2EE_password), and updates related copy.
Non‑English locale removals
packages/i18n/src/locales/* (many files incl. af, ar, de, fr, zh, etc.)
Removes deprecated E2E/encryption password-related keys (placeholders, prompts, reset/disable texts) across many locale files; data-only deletions with no code logic changes.
E2EE-related tests / page objects
apps/meteor/tests/e2e/page-objects/*
Updated Playwright locators and accessors to match new labels (e.g., "Reset E2EE password", "New E2EE password", "Save your new E2EE password", "Disable/Enable E2E encryption"); removed obsolete selectors for deleted labels.

Sequence Diagram(s)

(Skipped — changes are text/i18n updates and minor UI hint wiring; no substantive new control-flow to diagram.)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Suggested labels

stat: QA assured

Suggested reviewers

  • cardoso

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title "feat: Improve E2E encryption UI texts" accurately and succinctly captures the PR's primary goal of changing end-to-end encryption UI copy and i18n keys across components and tests, matching the provided summary; it is concise, specific, and uses a conventional commit prefix suitable for history scanning.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

Poem

I nibbled on strings and keys today,
Swapped E2E for E2EE—hip hooray! 🥕
Tooltips tidied, toasts now sing,
Locales trimmed for lighter spring.
With careful paws and cautious tone,
Encryption’s message stands well-known.

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.

✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/e2ee-ui-comm

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

@dougfabris dougfabris added this to the 7.11.0 milestone Sep 11, 2025
@codecov
Copy link

codecov bot commented Sep 11, 2025

Codecov Report

❌ Patch coverage is 60.00000% with 6 lines in your changes missing coverage. Please review.
✅ Project coverage is 66.57%. Comparing base (feba290) to head (dc5c55b).

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff            @@
##           develop   #36923    +/-   ##
=========================================
  Coverage    66.57%   66.57%            
=========================================
  Files         3344     3344            
  Lines       114631   114634     +3     
  Branches     21091    21198   +107     
=========================================
+ Hits         76310    76321    +11     
+ Misses       35629    35624     -5     
+ Partials      2692     2689     -3     
Flag Coverage Δ
e2e 57.78% <69.23%> (+<0.01%) ⬆️
unit 71.24% <25.00%> (+0.01%) ⬆️

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.

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

Caution

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

⚠️ Outside diff range comments (2)
apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts (1)

13-23: Compose options handlers so logout/toast always run

Spreading ...options last lets a caller override onSuccess/onError, skipping the toast and logout. Compose them instead so defaults always run and still call user-provided handlers.

  return useMutation({
-    mutationFn: async () => resetE2eKey(),
-    onSuccess: () => {
-      dispatchToastMessage({ type: 'success', message: t('E2EE_password_reset') });
-      logout();
-    },
-    onError: (error) => {
-      dispatchToastMessage({ type: 'error', message: error });
-    },
-    ...options,
+    mutationFn: resetE2eKey,
+    ...options,
+    onSuccess: (data, variables, context) => {
+      dispatchToastMessage({ type: 'success', message: t('E2EE_password_reset') });
+      logout();
+      options?.onSuccess?.(data as any, variables as any, context as any);
+    },
+    onError: (error, variables, context) => {
+      dispatchToastMessage({ type: 'error', message: error });
+      options?.onError?.(error as any, variables as any, context as any);
+    },
   });
apps/meteor/client/views/account/security/EndToEnd.tsx (1)

28-33: Save button may never enable (validation mode issue).

isValid won’t update before submit with RHF’s default mode='onSubmit', but the button is disabled until isValid is true—deadlock.

   } = useForm({
     defaultValues: {
       password: '',
       passwordConfirm: '',
     },
+    mode: 'onChange',
   });
🧹 Nitpick comments (8)
apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts (1)

14-14: Minor: simplify mutationFn

No need for the async wrapper; pass the method directly.

- mutationFn: async () => resetE2eKey(),
+ mutationFn: resetE2eKey,
packages/i18n/src/locales/en.i18n.json (3)

1797-1797: Normalize HTML line breaks

Use self-closing
to match the rest of the file.

-  "E2E_Encryption_Password_Explanation": "E2EE allows you to create encrypted rooms or enable encryption on existing rooms. <br><br> The password to encode/decode messages is not saved on the server. Remember to securely store yours, as it will be required on other devices.",
+  "E2E_Encryption_Password_Explanation": "E2EE allows you to create encrypted rooms or enable encryption on existing rooms. <br/><br/> The password to encode/decode messages is not saved on the server. Remember to securely store yours, as it will be required on other devices.",

1781-1781: Unify duplicate translation keys: E2EE_password_reset vs Reset_E2EE_password

Both keys exist and are referenced: E2EE_password_reset — packages/i18n/src/locales/en.i18n.json:1781 (used in apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts), and Reset_E2EE_password — packages/i18n/src/locales/en.i18n.json:4337 (used by EnterE2EPasswordModal, account security UI, admin hooks, etc.). Action: replace t('E2EE_password_reset') → t('Reset_E2EE_password') (or pick a single canonical key) and remove the redundant en.i18n.json entry.


4557-4557: Save_your_new_E2EE_password — LGTM

RoomE2EESetup.tsx uses Save_your_encryption_password_to_access; SaveE2EPasswordModal.tsx and apps/meteor/client/lib/e2ee/rocketchat.e2e.ts use Save_your_new_E2EE_password; both keys exist in packages/i18n/src/locales/en.i18n.json (lines 4556–4557). Ensure reset and first-time flows use the same key/copy (or consolidate the keys) to avoid mixed wording.

.changeset/cold-colts-hear.md (1)

6-6: Polish the change description for clarity.

Wording reads awkwardly. Suggest:

-Replaces some texts in order to improve the E2E encryption communication on the UI
+Improve E2EE-related UI copy for clearer end-to-end encryption communication.
apps/meteor/client/views/room/modals/E2EEModals/DisableE2EEModal.tsx (1)

20-23: Align key naming with the new pattern (optional).

Other parts of the PR use Disable_E2E_encryption/Enable_E2E_encryption. Consider updating here for consistency:

-      title={t('E2E_disable_encryption')}
+      title={t('Disable_E2E_encryption')}
       variant='warning'
-      confirmText={t('E2E_disable_encryption')}
+      confirmText={t('Disable_E2E_encryption')}
apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts (1)

118-121: Confirm whether title expects an i18n key or a localized string.

If it expects a localized string, wrap with t(...); otherwise leave as-is:

-      title: enabledOnRoom ? 'Disable_E2E_encryption' : 'Enable_E2E_encryption',
+      title: t(enabledOnRoom ? 'Disable_E2E_encryption' : 'Enable_E2E_encryption'),
apps/meteor/client/lib/e2ee/rocketchat.e2e.ts (1)

415-418: Updated alert strings OK; avoid HTML in translations if possible.

Consider keeping translations plain text here; if HTML is necessary, render via React and sanitize, not string HTML.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 00611ac and 6fd2563.

📒 Files selected for processing (65)
  • .changeset/cold-colts-hear.md (1 hunks)
  • apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts (1 hunks)
  • apps/meteor/client/lib/e2ee/rocketchat.e2e.ts (4 hunks)
  • apps/meteor/client/views/account/security/EndToEnd.tsx (4 hunks)
  • apps/meteor/client/views/admin/users/hooks/useResetE2EEKeyAction.tsx (1 hunks)
  • apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx (1 hunks)
  • apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts (1 hunks)
  • apps/meteor/client/views/room/modals/E2EEModals/DisableE2EEModal.tsx (1 hunks)
  • packages/i18n/src/locales/af.i18n.json (0 hunks)
  • packages/i18n/src/locales/ar.i18n.json (0 hunks)
  • packages/i18n/src/locales/az.i18n.json (0 hunks)
  • packages/i18n/src/locales/be-BY.i18n.json (0 hunks)
  • packages/i18n/src/locales/bg.i18n.json (0 hunks)
  • packages/i18n/src/locales/bs.i18n.json (0 hunks)
  • packages/i18n/src/locales/ca.i18n.json (0 hunks)
  • packages/i18n/src/locales/cs.i18n.json (0 hunks)
  • packages/i18n/src/locales/cy.i18n.json (0 hunks)
  • packages/i18n/src/locales/da.i18n.json (0 hunks)
  • packages/i18n/src/locales/de-AT.i18n.json (0 hunks)
  • packages/i18n/src/locales/de-IN.i18n.json (1 hunks)
  • packages/i18n/src/locales/de.i18n.json (0 hunks)
  • packages/i18n/src/locales/el.i18n.json (0 hunks)
  • packages/i18n/src/locales/en.i18n.json (13 hunks)
  • packages/i18n/src/locales/eo.i18n.json (0 hunks)
  • packages/i18n/src/locales/es.i18n.json (0 hunks)
  • packages/i18n/src/locales/fa.i18n.json (0 hunks)
  • packages/i18n/src/locales/fi.i18n.json (0 hunks)
  • packages/i18n/src/locales/fr.i18n.json (0 hunks)
  • packages/i18n/src/locales/gl.i18n.json (0 hunks)
  • packages/i18n/src/locales/hi-IN.i18n.json (0 hunks)
  • packages/i18n/src/locales/hr.i18n.json (0 hunks)
  • packages/i18n/src/locales/hu.i18n.json (0 hunks)
  • packages/i18n/src/locales/id.i18n.json (0 hunks)
  • packages/i18n/src/locales/it.i18n.json (0 hunks)
  • packages/i18n/src/locales/ja.i18n.json (0 hunks)
  • packages/i18n/src/locales/ka-GE.i18n.json (0 hunks)
  • packages/i18n/src/locales/km.i18n.json (0 hunks)
  • packages/i18n/src/locales/ko.i18n.json (0 hunks)
  • packages/i18n/src/locales/ku.i18n.json (0 hunks)
  • packages/i18n/src/locales/lo.i18n.json (0 hunks)
  • packages/i18n/src/locales/lt.i18n.json (0 hunks)
  • packages/i18n/src/locales/lv.i18n.json (0 hunks)
  • packages/i18n/src/locales/mn.i18n.json (0 hunks)
  • packages/i18n/src/locales/ms-MY.i18n.json (0 hunks)
  • packages/i18n/src/locales/nb.i18n.json (0 hunks)
  • packages/i18n/src/locales/nl.i18n.json (0 hunks)
  • packages/i18n/src/locales/nn.i18n.json (0 hunks)
  • packages/i18n/src/locales/pl.i18n.json (0 hunks)
  • packages/i18n/src/locales/pt-BR.i18n.json (0 hunks)
  • packages/i18n/src/locales/pt.i18n.json (0 hunks)
  • packages/i18n/src/locales/ro.i18n.json (0 hunks)
  • packages/i18n/src/locales/ru.i18n.json (0 hunks)
  • packages/i18n/src/locales/sk-SK.i18n.json (0 hunks)
  • packages/i18n/src/locales/sl-SI.i18n.json (0 hunks)
  • packages/i18n/src/locales/sq.i18n.json (0 hunks)
  • packages/i18n/src/locales/sr.i18n.json (0 hunks)
  • packages/i18n/src/locales/sv.i18n.json (0 hunks)
  • packages/i18n/src/locales/ta-IN.i18n.json (0 hunks)
  • packages/i18n/src/locales/th-TH.i18n.json (0 hunks)
  • packages/i18n/src/locales/tr.i18n.json (0 hunks)
  • packages/i18n/src/locales/uk.i18n.json (0 hunks)
  • packages/i18n/src/locales/vi-VN.i18n.json (0 hunks)
  • packages/i18n/src/locales/zh-HK.i18n.json (0 hunks)
  • packages/i18n/src/locales/zh-TW.i18n.json (0 hunks)
  • packages/i18n/src/locales/zh.i18n.json (0 hunks)
💤 Files with no reviewable changes (55)
  • packages/i18n/src/locales/id.i18n.json
  • packages/i18n/src/locales/af.i18n.json
  • packages/i18n/src/locales/mn.i18n.json
  • packages/i18n/src/locales/sq.i18n.json
  • packages/i18n/src/locales/sk-SK.i18n.json
  • packages/i18n/src/locales/ro.i18n.json
  • packages/i18n/src/locales/ku.i18n.json
  • packages/i18n/src/locales/km.i18n.json
  • packages/i18n/src/locales/lt.i18n.json
  • packages/i18n/src/locales/de-AT.i18n.json
  • packages/i18n/src/locales/lo.i18n.json
  • packages/i18n/src/locales/gl.i18n.json
  • packages/i18n/src/locales/zh-HK.i18n.json
  • packages/i18n/src/locales/th-TH.i18n.json
  • packages/i18n/src/locales/bg.i18n.json
  • packages/i18n/src/locales/fa.i18n.json
  • packages/i18n/src/locales/ko.i18n.json
  • packages/i18n/src/locales/be-BY.i18n.json
  • packages/i18n/src/locales/hr.i18n.json
  • packages/i18n/src/locales/eo.i18n.json
  • packages/i18n/src/locales/bs.i18n.json
  • packages/i18n/src/locales/az.i18n.json
  • packages/i18n/src/locales/el.i18n.json
  • packages/i18n/src/locales/pt.i18n.json
  • packages/i18n/src/locales/lv.i18n.json
  • packages/i18n/src/locales/da.i18n.json
  • packages/i18n/src/locales/cs.i18n.json
  • packages/i18n/src/locales/vi-VN.i18n.json
  • packages/i18n/src/locales/sr.i18n.json
  • packages/i18n/src/locales/hu.i18n.json
  • packages/i18n/src/locales/sl-SI.i18n.json
  • packages/i18n/src/locales/ru.i18n.json
  • packages/i18n/src/locales/ar.i18n.json
  • packages/i18n/src/locales/zh-TW.i18n.json
  • packages/i18n/src/locales/ta-IN.i18n.json
  • packages/i18n/src/locales/cy.i18n.json
  • packages/i18n/src/locales/ca.i18n.json
  • packages/i18n/src/locales/fr.i18n.json
  • packages/i18n/src/locales/uk.i18n.json
  • packages/i18n/src/locales/nb.i18n.json
  • packages/i18n/src/locales/es.i18n.json
  • packages/i18n/src/locales/tr.i18n.json
  • packages/i18n/src/locales/pt-BR.i18n.json
  • packages/i18n/src/locales/it.i18n.json
  • packages/i18n/src/locales/ms-MY.i18n.json
  • packages/i18n/src/locales/ja.i18n.json
  • packages/i18n/src/locales/de.i18n.json
  • packages/i18n/src/locales/pl.i18n.json
  • packages/i18n/src/locales/nn.i18n.json
  • packages/i18n/src/locales/zh.i18n.json
  • packages/i18n/src/locales/sv.i18n.json
  • packages/i18n/src/locales/hi-IN.i18n.json
  • packages/i18n/src/locales/ka-GE.i18n.json
  • packages/i18n/src/locales/fi.i18n.json
  • packages/i18n/src/locales/nl.i18n.json
🧰 Additional context used
🧬 Code graph analysis (3)
apps/meteor/client/views/hooks/useResetE2EPasswordMutation.ts (1)
apps/meteor/client/lib/toast.ts (1)
  • dispatchToastMessage (22-25)
apps/meteor/client/lib/e2ee/rocketchat.e2e.ts (1)
apps/meteor/client/lib/toast.ts (1)
  • dispatchToastMessage (22-25)
apps/meteor/client/views/account/security/EndToEnd.tsx (2)
packages/livechat/src/components/Form/PasswordInput/index.tsx (1)
  • PasswordInput (23-48)
apps/meteor/client/lib/e2ee/rocketchat.e2e.ts (1)
  • e2e (897-897)
⏰ 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 (18)
packages/i18n/src/locales/de-IN.i18n.json (2)

3063-3063: LGTM: trailing newline fix

No issues with the EOF newline addition.


1043-1047: de-IN still uses legacy E2E keys — verification failed; re-run check or add E2EE translations

Automated verification errored (PCRE2 compile error then a bash conditional error), so I couldn't determine which E2EE keys used in code are missing from packages/i18n/src/locales/de-IN.i18n.json or which legacy E2E keys are unused.

  • Re-run the corrected Python-based check (ensure en.i18n.json resolves to packages/i18n/src/locales/en.i18n.json) and paste the output.
  • Or, copy missing E2EE keys from packages/i18n/src/locales/en.i18n.json into packages/i18n/src/locales/de-IN.i18n.json and prune legacy E2E keys with zero usages.
packages/i18n/src/locales/en.i18n.json (10)

1700-1700: Enable/Disable action key introduced — LGTM

Naming aligns with related E2E keys.


1707-1707: System message string symmetry with “Enabled”

Disabled_E2E_Encryption_for_this_room pairs well with Enabled_E2E_Encryption_for_this_room below. Good consistency.


1891-1891: New toggle label — LGTM


1910-1910: System message counterpart — LGTM


1925-1925: Instruction string with component markup — LGTM

Trans markup <1>…</1> looks correct for Trans component usage.


3558-3558: New_E2EE_password — LGTM

Matches naming of related keys.


1805-1805: Resolved — modal already uses Proceed_with_caution

DisableE2EEModal.tsx calls annotation={t('Proceed_with_caution')} (apps/meteor/client/views/room/modals/E2EEModals/DisableE2EEModal.tsx:26) and en.i18n.json contains "Proceed_with_caution" (packages/i18n/src/locales/en.i18n.json:4087); no action required.


5924-5924: Change_E2EE_password — LGTM

Verified: the change flow uses Enter_current_E2EE_password_to_set_new (packages/i18n/src/locales/en.i18n.json:1925) and EndToEnd references both keys (apps/meteor/client/views/account/security/EndToEnd.tsx:75,99).


1028-1029: Make "enter your password" E2EE-specific

The string in packages/i18n/src/locales/en.i18n.json (lines 1028–1029) is ambiguous in an E2EE context — change the value to be explicit (e.g. "Click here to enter your E2EE password") or add a distinct key (e.g. Click_here_to_enter_your_E2EE_password) and update callers accordingly. Confirm no callers still use the legacy key Click_here_to_enter_your_encryption_password.

Verify locally (example): git grep -n "Click_here_to_enter_your_password" || rg -nF "Click_here_to_enter_your_password"


1131-1131: New confirm key added — ensure usage consistent

  • Both keys exist in packages/i18n/src/locales/en.i18n.json: Confirm_new_E2EE_password and Confirm_new_password.
  • Repo-wide usage couldn't be determined here (rg returned "No files were searched"); verify code references (e.g. t('Confirm_new_E2EE_password') vs t('Confirm_new_password')) and ensure the E2EE-specific key is used only in E2EE contexts to avoid inconsistent phrasing.
apps/meteor/client/views/e2e/SaveE2EPasswordModal.tsx (1)

30-31: Title key rename looks good; validate locale coverage.

Confirm Save_your_new_E2EE_password exists in en and required locales to avoid key-fallbacks.

apps/meteor/client/views/room/modals/E2EEModals/DisableE2EEModal.tsx (1)

26-27: Nice UX nudge via annotation.

Adding Proceed_with_caution to the warning modal is appropriate.

apps/meteor/client/lib/e2ee/rocketchat.e2e.ts (3)

349-355: Key rename to E2E_encryption_enabled OK.

Matches the PR-wide terminology update. Ensure locale entries exist.


589-592: Guidance key rename OK.

Click_here_to_enter_your_password aligns with the new copy.


633-637: Consistent success toast key.

E2E_encryption_enabled rename looks consistent.

apps/meteor/client/views/account/security/EndToEnd.tsx (1)

116-118: Accessibility improvement acknowledged.

Switching to role='alert' on FieldError is appropriate.

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

🧹 Nitpick comments (10)
apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts (2)

21-21: Harden locator against wording/i18n drift; cover old and new labels

Match both legacy and new copy to avoid flaky tests during rollout; keep a single source of truth later.

Apply:

- super(page.getByRole('button', { name: 'Save your new E2EE password' }));
+ super(page.getByRole('button', { name: /Save your (new )?(E2EE|encryption) password/i }));

Also, the TODO about the “Enter your E2E password” typo suggests mixed terminology; once the translation is fixed to E2EE, align the locator similarly.

Also applies to: 27-29


46-46: Use tolerant match for the dialog title (supports legacy and new text)

Prevents test breakage across staggered environments.

- super(page.getByRole('dialog', { name: 'Save your new E2EE password' }));
+ super(page.getByRole('dialog', { name: /Save your (new )?(E2EE|encryption) password/i }));
apps/meteor/tests/e2e/page-objects/home-channel.ts (3)

89-89: Make dialog locator resilient to copy changes

Covers both “encryption” and “E2EE” variants.

- return this.page.getByRole('dialog', { name: 'Save your new E2EE password' });
+ return this.page.getByRole('dialog', { name: /Save (your )?(new )?(E2EE|encryption) password/i });

92-98: Verify intended dual labels aren’t colliding

There are two nearby controls: “Save E2EE password” (room button) vs “Save your new E2EE password” (banner). Confirm they’re distinct elements to avoid ambiguous matches. If not, unify copy or add data-qa test IDs.

Also applies to: 104-110


104-106: Rename getter to bannerSaveE2EEPassword and make locator tolerant

Rename the getter to match the E2EE wording and use a case-insensitive regex locator; update all call sites (found below).

- get bannerSaveEncryptionPassword(): Locator {
- 	return this.page.getByRole('button', { name: 'Save your new E2EE password' });
- }
+ get bannerSaveE2EEPassword(): Locator {
+ 	return this.page.getByRole('button', { name: /Save your (new )?E2EE password/i });
+ }

Call sites to update: apps/meteor/tests/e2e/e2e-encryption.spec.ts:961.
Run to find any others: rg -nP 'bannerSaveEncryptionPassword' -C2

apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts (1)

80-85: Prefer getByRole with regex; accept optional “encryption” suffix

Improves robustness across locales/copy tweaks and avoids the text selector’s exact-match semantics.

- return this.page.locator('role=menuitem[name="Disable E2E encryption"]');
+ return this.page.getByRole('menuitem', { name: /Disable E2E( encryption)?/i });
- return this.page.locator('role=menuitem[name="Enable E2E encryption"]');
+ return this.page.getByRole('menuitem', { name: /Enable E2E( encryption)?/i });
apps/meteor/tests/e2e/page-objects/account-profile.ts (1)

120-122: Rename getter to securityE2EEncryptionResetPasswordButton and update call sites

Rename the getter and broaden the locator to match both "password" and "key"; update usages listed below.

- get securityE2EEncryptionResetKeyButton(): Locator {
- 	return this.page.locator("role=button[name='Reset E2EE password']");
- }
+ get securityE2EEncryptionResetPasswordButton(): Locator {
+ 	return this.page.getByRole('button', { name: /Reset E2EE (password|key)/i });
+ }

Update call sites:

  • apps/meteor/tests/e2e/e2e-encryption.spec.ts:913
  • apps/meteor/tests/e2e/e2e-encryption.spec.ts:950
  • apps/meteor/tests/e2e/e2e-encryption.spec.ts:1086
apps/meteor/tests/e2e/page-objects/account-security.ts (3)

20-22: Accept both legacy “key” and new “password” labels

Smooths CI during staggered deploys.

- return this.page.getByRole('button', { name: 'Reset E2EE password' });
+ return this.page.getByRole('button', { name: /Reset E2EE (password|key)/i });

24-26: Tolerate legacy “encryption” wording for new password field

- return this.page.getByRole('textbox', { name: 'New E2EE password' });
+ return this.page.getByRole('textbox', { name: /New (E2EE|encryption) password/i });

28-30: Tolerate legacy “encryption” wording for confirmation field

- return this.page.getByRole('textbox', { name: 'Confirm new E2EE password' });
+ return this.page.getByRole('textbox', { name: /Confirm new (E2EE|encryption) password/i });
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6fd2563 and f8f8e12.

📒 Files selected for processing (6)
  • apps/meteor/client/views/account/security/EndToEnd.tsx (4 hunks)
  • apps/meteor/tests/e2e/page-objects/account-profile.ts (1 hunks)
  • apps/meteor/tests/e2e/page-objects/account-security.ts (1 hunks)
  • apps/meteor/tests/e2e/page-objects/fragments/e2ee.ts (2 hunks)
  • apps/meteor/tests/e2e/page-objects/fragments/home-flextab.ts (1 hunks)
  • apps/meteor/tests/e2e/page-objects/home-channel.ts (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/meteor/client/views/account/security/EndToEnd.tsx
⏰ 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

@dougfabris dougfabris marked this pull request as ready for review September 12, 2025 20:52
@dougfabris dougfabris requested a review from a team as a code owner September 12, 2025 20:53
@MartinSchoeler MartinSchoeler added the stat: QA assured Means it has been tested and approved by a company insider label Sep 15, 2025
@dionisio-bot dionisio-bot bot added the stat: ready to merge PR tested and approved waiting for merge label Sep 15, 2025
@kodiakhq kodiakhq bot merged commit 752e6d4 into develop Sep 15, 2025
49 checks passed
@kodiakhq kodiakhq bot deleted the feat/e2ee-ui-comm branch September 15, 2025 20:36
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 stat: ready to merge PR tested and approved waiting for merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants