Skip to content

feat: Show confirmation modal with compiled warnings when changing settings#40909

Merged
KevLehman merged 5 commits into
chore/confirm-modal-store-changefrom
chore/confirm-modal-store-change-suggestion
Jun 12, 2026
Merged

feat: Show confirmation modal with compiled warnings when changing settings#40909
KevLehman merged 5 commits into
chore/confirm-modal-store-changefrom
chore/confirm-modal-store-change-suggestion

Conversation

@gabriellsh

@gabriellsh gabriellsh commented Jun 11, 2026

Copy link
Copy Markdown
Member

Proposed changes (including videos or screenshots)

Issue(s)

Steps to test or reproduce

Further comments

Summary by CodeRabbit

  • New Features

    • Confirmation modal shown for settings with alerts before saving.
    • Workspace URL and hashed workspace URL added to server info.
  • Bug Fixes

    • Memory leak in CodeMirror for code-type settings fixed.
    • Security hotfix applied.
  • Improvements

    • Stricter authorization for GDPR export file downloads.
    • Improved Apple OAuth token validation and client‑id handling.
  • Tests

    • Added/expanded tests for Apple OAuth, settings confirmation flow, and file upload access.
  • Documentation

    • New English localization strings for confirmation and ABAC alerts.
  • Refactor

    • Storybook and provider structure reorganized for consistency.

@gabriellsh gabriellsh requested a review from a team as a code owner June 11, 2026 19:07
@dionisio-bot

dionisio-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Looks like this PR is not ready to merge, because of the following issues:

  • This PR is missing the 'stat: QA assured' label
  • This PR is missing the required milestone or project

Please fix the issues and try again

If you have any trouble, please check the PR guidelines

@changeset-bot

changeset-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 5af1e11

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

This PR includes changesets to release 16 packages
Name Type
@rocket.chat/meteor Minor
@rocket.chat/i18n Minor
@rocket.chat/mock-providers Patch
@rocket.chat/ui-contexts Major
@rocket.chat/web-ui-registration Major
@rocket.chat/uikit-playground Patch
@rocket.chat/fuselage-ui-kit Major
@rocket.chat/gazzodown Major
@rocket.chat/livechat Patch
@rocket.chat/ui-avatar Major
@rocket.chat/ui-client Major
@rocket.chat/ui-video-conf Major
@rocket.chat/ui-voip Major
@rocket.chat/ui-composer Major
@rocket.chat/core-typings Minor
@rocket.chat/rest-typings Minor

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

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e2f33600-4baf-48bc-b949-51e53a456ccf

📥 Commits

Reviewing files that changed from the base of the PR and between af88e7b and 5af1e11.

📒 Files selected for processing (4)
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • packages/i18n/src/locales/en.i18n.json
  • packages/ui-contexts/src/SettingsContext.ts
  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
📜 Recent review details
⏰ 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). (2)
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: CodeQL-Build
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

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

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
  • packages/ui-contexts/src/SettingsContext.ts
🧠 Learnings (4)
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In the Rocket.Chat repository, do not reference Biome lint rules in code review feedback. Biome is not used even if biome.json exists; only reference Biome rules if there is explicit, project-wide usage documented. For TypeScript files, review lint implications without Biome guidance unless the project enables Biome rules.

Applied to files:

  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
  • packages/ui-contexts/src/SettingsContext.ts
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In this repository (RocketChat/Rocket.Chat), Biome lint rules are not used even if a biome.json exists. When reviewing TypeScript files (e.g., packages/ui-voip/src/providers/useMediaSession.ts), ensure lint suggestions do not reference Biome-specific rules. Rely on general ESLint/TypeScript lint rules and project conventions instead.

Applied to files:

  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
  • packages/ui-contexts/src/SettingsContext.ts
📚 Learning: 2026-03-04T14:16:40.911Z
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 39304
File: packages/ui-contexts/src/ActionManagerContext.ts:26-26
Timestamp: 2026-03-04T14:16:40.911Z
Learning: In TypeScript files where you document accepted union constituents that ultimately resolve to the same primitive, consider using an explicit union type like UiKit.ModalView['id'] | UiKit.BannerView['viewId'] | UiKit.ContextualBarView['id'] to communicate the accepted values. Include a deliberate inline eslint-disable-next-line typescript-eslint/no-duplicate-type-constituents comment if needed to prevent false positives, and do not remove it. This pattern improves readability and intent without changing runtime behavior; apply this guidance to all relevant files under packages/ui-contexts/src/**/*.ts where such unions document input types.

Applied to files:

  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
  • packages/ui-contexts/src/SettingsContext.ts
📚 Learning: 2026-05-06T12:21:44.083Z
Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 40256
File: apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx:121-149
Timestamp: 2026-05-06T12:21:44.083Z
Learning: Field wrappers in rocket.chat/fuselage-forms (Field, FieldLabel, FieldRow, FieldError, FieldHint) auto-create htmlFor/id associations, aria-describedby, and role="alert" for errors. Do not manually set htmlFor, id, aria-describedby, or role attributes when using these wrappers. This automatic wiring does not apply to plain rocket.chat/fuselage components, which require explicit ID wiring per the accessibility docs. In code reviews, prefer using fuselage-forms wrappers for form fields and verify there is no unnecessary manual ID/aria wiring in files that use these wrappers. If a component uses plain fuselage components, ensure proper id wiring as per docs.

Applied to files:

  • packages/ui-contexts/src/hooks/useSettingsDispatch.ts
  • packages/ui-contexts/src/SettingsContext.ts
🔇 Additional comments (2)
packages/ui-contexts/src/SettingsContext.ts (1)

21-21: LGTM!

packages/ui-contexts/src/hooks/useSettingsDispatch.ts (1)

6-7: LGTM!


Walkthrough

Adds a settings-confirmation modal flow and wires it into SettingsProvider; reworks Apple OAuth signing/verification to Node crypto with JWKS caching and clientId validation; tightens file-download authorization with request identity extraction; migrates Storybook config and many stories to object-based format; and adds server info fields and changesets.

Changes

Settings Change Confirmation Flow

Layer / File(s) Summary
Alert modal hook and provider hierarchy
apps/meteor/client/hooks/useShowSettingAlerts.tsx, apps/meteor/client/providers/MeteorProvider.tsx
New useShowSettingAlerts hook displays a localized danger modal with per-setting alert content. ModalProvider is re-nested to wrap the provider stack.
Settings save gating via alert checks
apps/meteor/client/providers/SettingsProvider.tsx
SettingsProvider dispatch computes changed setting ids, collects settings with alert, calls showAlerts, and aborts saving when the user does not confirm.
ABAC setting usage and tests/translation
packages/i18n/src/locales/en.i18n.json, apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
Adds i18n keys and extends SettingField tests to mock modal behavior and assert confirm/cancel flows.

Apple OAuth JWT Verification & Client Secret Generation

Layer / File(s) Summary
JWT verification and JWKS caching
apps/meteor/app/apple/lib/handleIdentityToken.ts, apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
Replaces jsrsasign with Node crypto: implements JWKS fetch/cache with refresh fallback, decodes/verifies JWT exp/iss/aud (including clientId), and verifies RSA-SHA256 signatures. Tests cover audience mismatch, valid token, and default audience handling.
Client secret generation with Node.js crypto
apps/meteor/app/apple/server/appleOauthRegisterService.ts
Generates Apple client secret using Node crypto with base64url helpers, normalizes settings, checks completeness, and upserts service configuration with try/catch fallback.
Login handler with client ID validation
apps/meteor/app/apple/server/AppleCustomOAuth.ts, apps/meteor/app/apple/server/loginHandler.ts, apps/meteor/app/apple/server/loginHandler.spec.ts
Login handler reads clientId from settings and passes it into handleIdentityToken; request handling simplified to use identityToken/fullName and respects email returned by Apple. Tests added for behaviors including empty clientId propagation.

File Upload Authorization & Request User ID Extraction

Layer / File(s) Summary
Request user ID extraction and validation
apps/meteor/app/file-upload/server/lib/FileUpload.ts
Adds FileUpload.getRequestUserId to extract credentials from query/cookies or headers, validate token, and return the authenticated user id.
User data file download authorization
apps/meteor/app/file-upload/server/lib/FileUpload.ts
UserDataFiles.onRead now enforces ownership by comparing request user id to file.userId and returns 403 otherwise; room-directives checks receive the file object.
File upload authorization test coverage
apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
Adds tests for livechat file access decisions, getRequestUserId credential shapes, and owner/non-owner/unauthenticated UserDataFiles.onRead behavior and headers.

Storybook Configuration & Story Pattern Migration

Layer / File(s) Summary
Storybook decorator, config, and preview refactoring
apps/meteor/.storybook/decorators.tsx, apps/meteor/.storybook/main.ts, apps/meteor/.storybook/preview.ts
Renames/simplifies local decorator, switches main.ts to baseConfig(...) and adds swiper aliases, and consolidates preview.ts into a default preview object importing shared config and CSS.
Story file pattern migration to StoryObj
apps/meteor/client/components/*/*.stories.tsx (many files)
Converts function/template-based stories to object-style StoryObj exports with inline args/render/parameters and updates action imports to storybook/actions where applicable.

Server API Updates & Release Changesets

Layer / File(s) Summary
Server info workspace URL fields
apps/meteor/app/api/server/lib/getServerInfo.ts
getServerInfo now returns workspaceUrl and hashedWorkspaceUrl via License helpers.
Changeset entries for release notes
.changeset/all-readers-reply.md, .changeset/bumpy-coats-reply.md, .changeset/rich-bananas-shine.md
Adds three changeset markdown files declaring minor and patch bumps with short descriptions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • ggazzo
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main feature: adding a confirmation modal that displays warnings/alerts when settings are changed, which matches the core implementation across multiple files.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch chore/confirm-modal-store-change-suggestion

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.

@coderabbitai coderabbitai Bot added the type: feature Pull requests that introduces new feature label Jun 11, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
apps/meteor/client/hooks/useShowSettingAlerts.tsx (3)

53-53: 💤 Low value

Parameter shadowing reduces readability.

The destructured { _id } parameter shadows _id from line 45. Consider using a different name for clarity.

♻️ Proposed fix
-const newValue = changedSettings.find(({ _id }) => _id === persistedSetting._id)?.value;
+const newValue = changedSettings.find((cs) => cs._id === persistedSetting._id)?.value;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/client/hooks/useShowSettingAlerts.tsx` at line 53, The
destructured parameter {_id} in the find callback shadows the
persistedSetting._id variable and hurts readability; update the callback in the
assignment to newValue to use a distinct name (e.g., destructure as { _id:
changedId } or use item._id) so the comparison explicitly reads changedId ===
persistedSetting._id, keeping changedSettings, persistedSetting, and newValue as
the referenced symbols.

31-42: ⚡ Quick win

Inconsistent use of return before setModal(null).

Lines 37 and 41 include return before setModal(null), but line 33 does not. Since setModal returns void, the return is unnecessary. Remove it for consistency.

♻️ Proposed fix
 					onCancel={() => {
 						resolve(false);
-						return setModal(null);
+						setModal(null);
 					}}
 					onClose={() => {
 						resolve(false);
-						return setModal(null);
+						setModal(null);
 					}}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/client/hooks/useShowSettingAlerts.tsx` around lines 31 - 42, The
onCancel and onClose handlers use an unnecessary `return` before calling
setModal(null); since setModal returns void, remove the `return` so all three
handlers (onConfirm, onCancel, onClose) consistently call setModal(null) after
resolving (resolve(false) for cancel/close, resolve(true) for confirm) — update
the onCancel and onClose functions that reference setModal and resolve to match
the onConfirm pattern.

58-60: ⚡ Quick win

TODO: Hardcoded English labels need i18n.

The "From:" and "To:" labels are hardcoded and not translated. These should use i18n keys for proper localization.

♻️ Proposed fix
-					{/* TODO i18n */}
-					<div>From: {getSettingValueDisplay(persistedSetting.value)}</div>
-					<div>To: {getSettingValueDisplay(newValue)}</div>
+					<div>{t('From')}: {getSettingValueDisplay(persistedSetting.value)}</div>
+					<div>{t('To')}: {getSettingValueDisplay(newValue)}</div>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/client/hooks/useShowSettingAlerts.tsx` around lines 58 - 60,
Replace the hardcoded "From:" and "To:" labels in useShowSettingAlerts.tsx with
calls to the app's i18n translation function (e.g., t or useTranslation) so the
labels are localized (for example t('settings.from') and t('settings.to')),
keeping the existing getSettingValueDisplay(persistedSetting.value) and
getSettingValueDisplay(newValue) usage; also add the corresponding keys
("settings.from", "settings.to") to the locale resource files for all supported
languages.
🤖 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 `@apps/meteor/client/providers/SettingsProvider.tsx`:
- Around line 106-122: The code calls showAlerts(alerts, ...) even when alerts
is empty, causing an unnecessary modal; change the logic in the SettingsProvider
block that computes changedSettingIds and alerts (references: changedSettingIds,
cachedCollection.store.getState(), alerts) to only call showAlerts when
alerts.length > 0 and otherwise treat the change as accepted (e.g., set accepted
= true or skip awaiting showAlerts), keeping the existing Enterprise_License
invalidate behavior (queryClient.invalidateQueries) and the subsequent check
against accepted unchanged.

---

Nitpick comments:
In `@apps/meteor/client/hooks/useShowSettingAlerts.tsx`:
- Line 53: The destructured parameter {_id} in the find callback shadows the
persistedSetting._id variable and hurts readability; update the callback in the
assignment to newValue to use a distinct name (e.g., destructure as { _id:
changedId } or use item._id) so the comparison explicitly reads changedId ===
persistedSetting._id, keeping changedSettings, persistedSetting, and newValue as
the referenced symbols.
- Around line 31-42: The onCancel and onClose handlers use an unnecessary
`return` before calling setModal(null); since setModal returns void, remove the
`return` so all three handlers (onConfirm, onCancel, onClose) consistently call
setModal(null) after resolving (resolve(false) for cancel/close, resolve(true)
for confirm) — update the onCancel and onClose functions that reference setModal
and resolve to match the onConfirm pattern.
- Around line 58-60: Replace the hardcoded "From:" and "To:" labels in
useShowSettingAlerts.tsx with calls to the app's i18n translation function
(e.g., t or useTranslation) so the labels are localized (for example
t('settings.from') and t('settings.to')), keeping the existing
getSettingValueDisplay(persistedSetting.value) and
getSettingValueDisplay(newValue) usage; also add the corresponding keys
("settings.from", "settings.to") to the locale resource files for all supported
languages.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 49d4ecc4-50ee-46df-9891-4b9a0d339be9

📥 Commits

Reviewing files that changed from the base of the PR and between ef81453 and 9d99fab.

📒 Files selected for processing (6)
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/providers/MeteorProvider.tsx
  • apps/meteor/client/providers/SettingsProvider.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx
  • packages/i18n/src/locales/en.i18n.json
📜 Review details
⏰ 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). (2)
  • GitHub Check: cubic · AI code reviewer
  • GitHub Check: Hacktron Security Check
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js}

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

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • apps/meteor/client/providers/MeteorProvider.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
  • apps/meteor/client/providers/SettingsProvider.tsx
🧠 Learnings (3)
📚 Learning: 2026-03-27T14:52:56.865Z
Learnt from: dougfabris
Repo: RocketChat/Rocket.Chat PR: 39892
File: apps/meteor/client/views/room/contextualBar/Threads/Thread.tsx:150-155
Timestamp: 2026-03-27T14:52:56.865Z
Learning: In Rocket.Chat, there are two different `ModalBackdrop` components with different prop APIs. During review, confirm the import source: (1) `rocket.chat/fuselage` `ModalBackdrop` uses `ModalBackdropProps` based on `BoxProps` (so it supports `onClick` and other Box/DOM props) and does not have an `onDismiss` prop; (2) `rocket.chat/ui-client` `ModalBackdrop` uses a narrower props interface like `{ children?: ReactNode; onDismiss?: () => void }` and handles Escape keypress and outside mouse-up, and it does not forward arbitrary DOM props such as `onClick`. Flag mismatched props (e.g., `onDismiss` passed to the fuselage component or `onClick` passed to the ui-client component) and ensure the usage matches the correct component being imported.

Applied to files:

  • apps/meteor/client/providers/MeteorProvider.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
  • apps/meteor/client/providers/SettingsProvider.tsx
📚 Learning: 2026-05-06T12:21:44.083Z
Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 40256
File: apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx:121-149
Timestamp: 2026-05-06T12:21:44.083Z
Learning: Field wrappers in rocket.chat/fuselage-forms (Field, FieldLabel, FieldRow, FieldError, FieldHint) auto-create htmlFor/id associations, aria-describedby, and role="alert" for errors. Do not manually set htmlFor, id, aria-describedby, or role attributes when using these wrappers. This automatic wiring does not apply to plain rocket.chat/fuselage components, which require explicit ID wiring per the accessibility docs. In code reviews, prefer using fuselage-forms wrappers for form fields and verify there is no unnecessary manual ID/aria wiring in files that use these wrappers. If a component uses plain fuselage components, ensure proper id wiring as per docs.

Applied to files:

  • apps/meteor/client/providers/MeteorProvider.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
  • apps/meteor/client/providers/SettingsProvider.tsx
📚 Learning: 2026-03-06T18:10:15.268Z
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 39397
File: packages/gazzodown/src/code/CodeBlock.spec.tsx:47-68
Timestamp: 2026-03-06T18:10:15.268Z
Learning: In tests (especially those using testing-library/dom/jsdom) for Rocket.Chat components, the HTML <code> element has an implicit ARIA role of 'code'. Therefore, screen.getByRole('code') or screen.findByRole('code') will locate <code> elements even without a role attribute. Do not flag findByRole('code') as invalid in reviews; prefer using the implicit role instead of adding role="code" unless necessary for accessibility.

Applied to files:

  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx
🔇 Additional comments (5)
apps/meteor/client/providers/MeteorProvider.tsx (1)

32-70: LGTM!

apps/meteor/client/providers/SettingsProvider.tsx (1)

125-125: LGTM!

apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx (1)

21-38: Re-check ABAC_Attribute_Store i18n + modal precedence

  • The i18n keys ABAC_Attribute_Store_Switch_Title, ABAC_Attribute_Store_Switch_Confirm, and ABAC_Attribute_Store_Switch_Alert are present in packages/i18n/src/locales/en.i18n.json.
  • ABAC_Attribute_Store is defined with alert: 'ABAC_Attribute_Store_Switch_Alert' in apps/meteor/ee/server/settings/abac.ts, so apps/meteor/client/providers/SettingsProvider.tsx + apps/meteor/client/hooks/useShowSettingAlerts.tsx will show the standard Confirm_setting_change GenericModal whenever this setting is part of the changed ids.
  • apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx passes renderConfirmModal for ABAC_Attribute_Store, but apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.tsx doesn’t reference renderConfirmModal (it only uses the setting’s alert for an inline callout). Confirm how renderConfirmModal interacts with the SettingsProvider alert modal (avoid double prompts / ensure clear precedence).
packages/i18n/src/locales/en.i18n.json (1)

34-35: LGTM!

apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingField.spec.tsx (1)

3-3: LGTM!

Also applies to: 21-21, 26-26, 36-37, 63-118

Comment thread apps/meteor/client/providers/SettingsProvider.tsx

@cubic-dev-ai cubic-dev-ai 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.

3 issues found across 6 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread apps/meteor/client/providers/SettingsProvider.tsx Outdated
Comment thread apps/meteor/client/hooks/useShowSettingAlerts.tsx Outdated
Comment thread apps/meteor/client/hooks/useShowSettingAlerts.tsx Outdated
@KevLehman KevLehman force-pushed the chore/confirm-modal-store-change-suggestion branch from 9d99fab to af88e7b Compare June 12, 2026 21:30
@KevLehman KevLehman requested review from a team as code owners June 12, 2026 21:30
@hacktron-app

hacktron-app Bot commented Jun 12, 2026

Copy link
Copy Markdown

⏭️ Hacktron Security Check — Skipped

Reason: This PR exceeds Hacktron's 200-file review cap and will not be scanned. Split the PR into smaller changes for review coverage.

Split the PR into smaller commits or open separate PRs for unrelated changes.

@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: 3

🧹 Nitpick comments (4)
apps/meteor/app/apple/lib/handleIdentityToken.ts (1)

73-74: 🔒 Security & Privacy | 💤 Low value

Consider validating the JWT algorithm claim.

The header's alg is parsed but not validated against the expected RS256. While the hardcoded RSA-SHA256 verification is safe against algorithm confusion attacks (invalid signatures still fail), explicit validation is defense-in-depth and would fail fast with a clear error for malformed tokens.

🛡️ Proposed fix
 const header = JSON.parse(decodeBase64Url(headerB64));
+if (header.alg !== 'RS256') {
+	console.error(`Unsupported JWT algorithm: ${header.alg}. Expected RS256`);
+	return null;
+}
 const payload = JSON.parse(decodeBase64Url(payloadB64)) as AppleJWTPayload;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/app/apple/lib/handleIdentityToken.ts` around lines 73 - 74,
Validate the JWT header's alg claim after parsing (the header variable in
handleIdentityToken) by checking header.alg === "RS256" and throw or return a
clear error if it differs; this should be done before calling the existing
RSA-SHA256 verification logic (and before using decodeBase64Url output or
verifySignature) to fail fast on algorithm confusion and provide a clear message
for malformed tokens.
apps/meteor/app/file-upload/server/lib/FileUpload.ts (1)

101-101: 📐 Maintainability & Code Quality | ⚡ Quick win

Remove the implementation comment added at Line 101.

Please move this rationale to tests/PR context and keep implementation code comment-free.
As per coding guidelines, "Avoid code comments in the implementation."

♻️ Suggested diff
-				// UserDataFiles are GDPR data exports — only the owner of the export may download it.
 				const uid = await FileUpload.getRequestUserId(req);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/app/file-upload/server/lib/FileUpload.ts` at line 101, Remove the
implementation comment at the top of FileUpload.ts (the line reading
"UserDataFiles are GDPR data exports — only the owner of the export may download
it."); delete this in-file rationale from the FileUpload class/module and
instead add the explanation to the PR description or a test file (e.g., a README
or tests/NOTE) so the implementation remains comment-free per guidelines.

Source: Coding guidelines

apps/meteor/client/components/UserCard/UserCard.stories.tsx (1)

37-108: 📐 Maintainability & Code Quality | ⚡ Quick win

Drop as any casts and type stories with StoryObj<typeof meta>.

At Line 43 and repeated through Line 108, as any removes compile-time checks for story args. Prefer typed CSF3 stories so invalid prop shapes are caught.

Proposed refactor
-import type { Meta } from '`@storybook/react`';
+import type { Meta, StoryObj } from '`@storybook/react`';
@@
-export default {
+const meta = {
 	component: UserCard,
@@
-} satisfies Meta<typeof UserCard>;
+} satisfies Meta<typeof UserCard>;
+
+export default meta;
+type Story = StoryObj<typeof meta>;
@@
-export const Example = {};
+export const Example: Story = {};
@@
-export const Nickname = {
+export const Nickname: Story = {
 	args: {
 		user: {
 			...user,
 			nickname: 'nicknamenickname',
 		},
-	} as any,
+	},
 };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/client/components/UserCard/UserCard.stories.tsx` around lines 37
- 108, The stories use unsafe "as any" casts (e.g., Nickname, LargeName,
NoRoles, NoActions, NoLocalTime, NoBio, NoBioAndNoLocalTime,
NoBioNoLocalTimeNoRoles) which bypass type checking; change to typed CSF3
stories by defining a Story type like "type Story = StoryObj<typeof meta>"
(where meta is your Storybook meta export) and annotate each exported story as
"const Nickname: Story = { args: { user: { ... } } }" (and likewise for
LargeName, NoRoles, etc.), removing all "as any" casts so args are statically
validated.
apps/meteor/.storybook/main.ts (1)

21-23: 📐 Maintainability & Code Quality | ⚡ Quick win

Remove inline implementation comments added in this TypeScript file.

These new comments conflict with the repository rule for **/*.{ts,tsx,js} files.

As per coding guidelines, **/*.{ts,tsx,js} should “Avoid code comments in the implementation”.

Also applies to: 30-30

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/meteor/.storybook/main.ts` around lines 21 - 23, Remove the inline
implementation comment block that begins with "Meteor's bundler ignores the
`exports` field, so source code reaches into swiper's internals via deep file
paths. Webpack honors `exports` and rejects them, so map each subpath to the
actual file." in main.ts; delete that comment (and the similar inline comment
around the swiper subpath mapping) so the file no longer contains implementation
comments and only retains the actual mapping/configuration code.

Source: Coding guidelines

🤖 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 `@apps/meteor/.storybook/main.ts`:
- Around line 24-26: The webpack alias for the Swiper react package is pointing
'swiper/swiper-react$' at the TypeScript declaration file (swiper-react.d.ts)
which breaks runtime resolution; update the alias so 'swiper/swiper-react$'
resolves to the runtime JS (swiper-react.mjs) instead of the .d.ts file,
adjusting the aliases near the swiperRoot variable and the aliases object in
main.ts so both 'swiper/swiper-react.mjs$' and 'swiper/swiper-react$' map to
join(swiperRoot, 'swiper-react.mjs') (remove the .d.ts mapping).

In `@apps/meteor/app/file-upload/server/lib/FileUpload.ts`:
- Around line 458-475: The query and header credential values (rc_uid, rc_token,
headers['x-user-id'], headers['x-auth-token']) may be string[] at runtime but
are being type-cast to string and passed into hashLoginToken and
Users.findOneByIdAndLoginToken; normalize each credential by coercing arrays to
a single string (e.g., if Array.isArray(value) take value[0] or otherwise
convert to string) for rc_uid/rc_token after URL.parse and for
headers['x-user-id']/headers['x-auth-token'] before assigning uid/authToken,
then use those normalized strings when calling hashLoginToken and
Users.findOneByIdAndLoginToken.

In `@apps/meteor/client/hooks/useShowSettingAlerts.tsx`:
- Around line 13-16: The modal is opened unconditionally even when all entries
in persistedSettingsWithAlert lack an alert; fix by first filtering
persistedSettingsWithAlert for items with a non-empty alert (the same check used
around the skipped entries at the 35-38 logic), and if that filtered list is
empty immediately call resolve(true) and return without calling
setModal/GenericModal; otherwise proceed to open the modal as before. Ensure you
update the handler that receives persistedSettingsWithAlert so it uses this
short-circuit check before invoking setModal.

---

Nitpick comments:
In `@apps/meteor/.storybook/main.ts`:
- Around line 21-23: Remove the inline implementation comment block that begins
with "Meteor's bundler ignores the `exports` field, so source code reaches into
swiper's internals via deep file paths. Webpack honors `exports` and rejects
them, so map each subpath to the actual file." in main.ts; delete that comment
(and the similar inline comment around the swiper subpath mapping) so the file
no longer contains implementation comments and only retains the actual
mapping/configuration code.

In `@apps/meteor/app/apple/lib/handleIdentityToken.ts`:
- Around line 73-74: Validate the JWT header's alg claim after parsing (the
header variable in handleIdentityToken) by checking header.alg === "RS256" and
throw or return a clear error if it differs; this should be done before calling
the existing RSA-SHA256 verification logic (and before using decodeBase64Url
output or verifySignature) to fail fast on algorithm confusion and provide a
clear message for malformed tokens.

In `@apps/meteor/app/file-upload/server/lib/FileUpload.ts`:
- Line 101: Remove the implementation comment at the top of FileUpload.ts (the
line reading "UserDataFiles are GDPR data exports — only the owner of the export
may download it."); delete this in-file rationale from the FileUpload
class/module and instead add the explanation to the PR description or a test
file (e.g., a README or tests/NOTE) so the implementation remains comment-free
per guidelines.

In `@apps/meteor/client/components/UserCard/UserCard.stories.tsx`:
- Around line 37-108: The stories use unsafe "as any" casts (e.g., Nickname,
LargeName, NoRoles, NoActions, NoLocalTime, NoBio, NoBioAndNoLocalTime,
NoBioNoLocalTimeNoRoles) which bypass type checking; change to typed CSF3
stories by defining a Story type like "type Story = StoryObj<typeof meta>"
(where meta is your Storybook meta export) and annotate each exported story as
"const Nickname: Story = { args: { user: { ... } } }" (and likewise for
LargeName, NoRoles, etc.), removing all "as any" casts so args are statically
validated.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 087d49a2-f8d9-4e0b-b392-fad40c302b24

📥 Commits

Reviewing files that changed from the base of the PR and between 9d99fab and af88e7b.

⛔ Files ignored due to path filters (1)
  • apps/meteor/.storybook/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (34)
  • .changeset/all-readers-reply.md
  • .changeset/bumpy-coats-reply.md
  • .changeset/rich-bananas-shine.md
  • apps/meteor/.storybook/decorators.tsx
  • apps/meteor/.storybook/logo.svg.d.ts
  • apps/meteor/.storybook/main.ts
  • apps/meteor/.storybook/preview.ts
  • apps/meteor/app/api/server/lib/getServerInfo.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.ts
  • apps/meteor/app/apple/server/AppleCustomOAuth.ts
  • apps/meteor/app/apple/server/appleOauthRegisterService.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
  • apps/meteor/client/components/ABAC/ABACUpsellModal/ABACUpsellModal.stories.tsx
  • apps/meteor/client/components/CreateDiscussion/CreateDiscussion.stories.tsx
  • apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.stories.tsx
  • apps/meteor/client/components/ListItem.stories.tsx
  • apps/meteor/client/components/SidebarToggler/SidebarTogglerButton.stories.tsx
  • apps/meteor/client/components/UserAutoCompleteMultiple/UserAvatarChip.stories.tsx
  • apps/meteor/client/components/UserCard/UserCard.stories.tsx
  • apps/meteor/client/components/UserInfo/UserInfo.stories.tsx
  • apps/meteor/client/components/connectionStatus/ConnectionStatusBar.stories.tsx
  • apps/meteor/client/components/dataView/Counter.stories.tsx
  • apps/meteor/client/components/dataView/CounterSet.stories.tsx
  • apps/meteor/client/components/dataView/NegativeGrowthSymbol.stories.tsx
  • apps/meteor/client/components/dataView/PositiveGrowthSymbol.stories.tsx
  • apps/meteor/client/components/message/content/actions/MessageAction.stories.tsx
  • apps/meteor/client/components/message/header/MessageRoles.stories.tsx
  • apps/meteor/client/components/message/toolbar/items/actions/Timestamp/TimestampPicker/TimestampPicker.stories.tsx
  • apps/meteor/client/components/message/variants/threadPreview/ThreadMessagePreviewBody.stories.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
💤 Files with no reviewable changes (1)
  • apps/meteor/.storybook/logo.svg.d.ts
✅ Files skipped from review due to trivial changes (6)
  • .changeset/bumpy-coats-reply.md
  • apps/meteor/client/components/UserAutoCompleteMultiple/UserAvatarChip.stories.tsx
  • apps/meteor/client/components/ABAC/ABACUpsellModal/ABACUpsellModal.stories.tsx
  • apps/meteor/client/components/CreateDiscussion/CreateDiscussion.stories.tsx
  • .changeset/all-readers-reply.md
  • .changeset/rich-bananas-shine.md
📜 Review details
⏰ 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). (1)
  • GitHub Check: CodeQL-Build
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js}

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

**/*.{ts,tsx,js}: Write concise, technical TypeScript/JavaScript with accurate typing in Playwright tests
Avoid code comments in the implementation

Files:

  • apps/meteor/client/components/message/variants/threadPreview/ThreadMessagePreviewBody.stories.tsx
  • apps/meteor/app/api/server/lib/getServerInfo.ts
  • apps/meteor/client/components/message/toolbar/items/actions/Timestamp/TimestampPicker/TimestampPicker.stories.tsx
  • apps/meteor/client/components/dataView/CounterSet.stories.tsx
  • apps/meteor/client/components/message/content/actions/MessageAction.stories.tsx
  • apps/meteor/app/apple/server/AppleCustomOAuth.ts
  • apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.stories.tsx
  • apps/meteor/client/components/dataView/NegativeGrowthSymbol.stories.tsx
  • apps/meteor/client/components/message/header/MessageRoles.stories.tsx
  • apps/meteor/client/components/UserInfo/UserInfo.stories.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/components/dataView/Counter.stories.tsx
  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/client/components/dataView/PositiveGrowthSymbol.stories.tsx
  • apps/meteor/client/components/connectionStatus/ConnectionStatusBar.stories.tsx
  • apps/meteor/client/components/UserCard/UserCard.stories.tsx
  • apps/meteor/app/apple/lib/handleIdentityToken.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
  • apps/meteor/client/components/SidebarToggler/SidebarTogglerButton.stories.tsx
  • apps/meteor/client/components/ListItem.stories.tsx
  • apps/meteor/app/apple/server/appleOauthRegisterService.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
**/*.spec.ts

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

**/*.spec.ts: Use descriptive test names that clearly communicate expected behavior in Playwright tests
Use .spec.ts extension for test files (e.g., login.spec.ts)

Files:

  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
🧠 Learnings (6)
📚 Learning: 2026-03-27T14:52:56.865Z
Learnt from: dougfabris
Repo: RocketChat/Rocket.Chat PR: 39892
File: apps/meteor/client/views/room/contextualBar/Threads/Thread.tsx:150-155
Timestamp: 2026-03-27T14:52:56.865Z
Learning: In Rocket.Chat, there are two different `ModalBackdrop` components with different prop APIs. During review, confirm the import source: (1) `rocket.chat/fuselage` `ModalBackdrop` uses `ModalBackdropProps` based on `BoxProps` (so it supports `onClick` and other Box/DOM props) and does not have an `onDismiss` prop; (2) `rocket.chat/ui-client` `ModalBackdrop` uses a narrower props interface like `{ children?: ReactNode; onDismiss?: () => void }` and handles Escape keypress and outside mouse-up, and it does not forward arbitrary DOM props such as `onClick`. Flag mismatched props (e.g., `onDismiss` passed to the fuselage component or `onClick` passed to the ui-client component) and ensure the usage matches the correct component being imported.

Applied to files:

  • apps/meteor/client/components/message/variants/threadPreview/ThreadMessagePreviewBody.stories.tsx
  • apps/meteor/client/components/message/toolbar/items/actions/Timestamp/TimestampPicker/TimestampPicker.stories.tsx
  • apps/meteor/client/components/dataView/CounterSet.stories.tsx
  • apps/meteor/client/components/message/content/actions/MessageAction.stories.tsx
  • apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.stories.tsx
  • apps/meteor/client/components/dataView/NegativeGrowthSymbol.stories.tsx
  • apps/meteor/client/components/message/header/MessageRoles.stories.tsx
  • apps/meteor/client/components/UserInfo/UserInfo.stories.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/components/dataView/Counter.stories.tsx
  • apps/meteor/client/components/dataView/PositiveGrowthSymbol.stories.tsx
  • apps/meteor/client/components/connectionStatus/ConnectionStatusBar.stories.tsx
  • apps/meteor/client/components/UserCard/UserCard.stories.tsx
  • apps/meteor/client/components/SidebarToggler/SidebarTogglerButton.stories.tsx
  • apps/meteor/client/components/ListItem.stories.tsx
📚 Learning: 2026-05-06T12:21:44.083Z
Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 40256
File: apps/meteor/client/components/CreateDiscussion/CreateDiscussion.tsx:121-149
Timestamp: 2026-05-06T12:21:44.083Z
Learning: Field wrappers in rocket.chat/fuselage-forms (Field, FieldLabel, FieldRow, FieldError, FieldHint) auto-create htmlFor/id associations, aria-describedby, and role="alert" for errors. Do not manually set htmlFor, id, aria-describedby, or role attributes when using these wrappers. This automatic wiring does not apply to plain rocket.chat/fuselage components, which require explicit ID wiring per the accessibility docs. In code reviews, prefer using fuselage-forms wrappers for form fields and verify there is no unnecessary manual ID/aria wiring in files that use these wrappers. If a component uses plain fuselage components, ensure proper id wiring as per docs.

Applied to files:

  • apps/meteor/client/components/message/variants/threadPreview/ThreadMessagePreviewBody.stories.tsx
  • apps/meteor/app/api/server/lib/getServerInfo.ts
  • apps/meteor/client/components/message/toolbar/items/actions/Timestamp/TimestampPicker/TimestampPicker.stories.tsx
  • apps/meteor/client/components/dataView/CounterSet.stories.tsx
  • apps/meteor/client/components/message/content/actions/MessageAction.stories.tsx
  • apps/meteor/app/apple/server/AppleCustomOAuth.ts
  • apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.stories.tsx
  • apps/meteor/client/components/dataView/NegativeGrowthSymbol.stories.tsx
  • apps/meteor/client/components/message/header/MessageRoles.stories.tsx
  • apps/meteor/client/components/UserInfo/UserInfo.stories.tsx
  • apps/meteor/client/hooks/useShowSettingAlerts.tsx
  • apps/meteor/client/components/dataView/Counter.stories.tsx
  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/client/components/dataView/PositiveGrowthSymbol.stories.tsx
  • apps/meteor/client/components/connectionStatus/ConnectionStatusBar.stories.tsx
  • apps/meteor/client/components/UserCard/UserCard.stories.tsx
  • apps/meteor/app/apple/lib/handleIdentityToken.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
  • apps/meteor/client/components/SidebarToggler/SidebarTogglerButton.stories.tsx
  • apps/meteor/client/components/ListItem.stories.tsx
  • apps/meteor/app/apple/server/appleOauthRegisterService.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In the Rocket.Chat repository, do not reference Biome lint rules in code review feedback. Biome is not used even if biome.json exists; only reference Biome rules if there is explicit, project-wide usage documented. For TypeScript files, review lint implications without Biome guidance unless the project enables Biome rules.

Applied to files:

  • apps/meteor/app/api/server/lib/getServerInfo.ts
  • apps/meteor/app/apple/server/AppleCustomOAuth.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
  • apps/meteor/app/apple/server/appleOauthRegisterService.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
📚 Learning: 2026-02-26T19:25:44.063Z
Learnt from: gabriellsh
Repo: RocketChat/Rocket.Chat PR: 38778
File: packages/ui-voip/src/providers/useMediaSession.ts:192-192
Timestamp: 2026-02-26T19:25:44.063Z
Learning: In this repository (RocketChat/Rocket.Chat), Biome lint rules are not used even if a biome.json exists. When reviewing TypeScript files (e.g., packages/ui-voip/src/providers/useMediaSession.ts), ensure lint suggestions do not reference Biome-specific rules. Rely on general ESLint/TypeScript lint rules and project conventions instead.

Applied to files:

  • apps/meteor/app/api/server/lib/getServerInfo.ts
  • apps/meteor/app/apple/server/AppleCustomOAuth.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/apple/lib/handleIdentityToken.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
  • apps/meteor/app/apple/server/appleOauthRegisterService.ts
  • apps/meteor/app/apple/server/loginHandler.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.ts
📚 Learning: 2026-02-24T19:22:48.358Z
Learnt from: juliajforesti
Repo: RocketChat/Rocket.Chat PR: 38493
File: apps/meteor/tests/e2e/omnichannel/omnichannel-send-pdf-transcript.spec.ts:66-67
Timestamp: 2026-02-24T19:22:48.358Z
Learning: In Playwright end-to-end tests (e.g., under apps/meteor/tests/e2e/...), prefer locating elements by translated text (getByText) and ARIA roles (getByRole) over data-qa attributes. If translation values change, update the corresponding test locators accordingly. Never use data-qa locators. This guideline applies to all Playwright e2e test specs in the repository and helps keep tests robust to UI text changes and accessible semantics.

Applied to files:

  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
📚 Learning: 2026-03-06T18:10:15.268Z
Learnt from: tassoevan
Repo: RocketChat/Rocket.Chat PR: 39397
File: packages/gazzodown/src/code/CodeBlock.spec.tsx:47-68
Timestamp: 2026-03-06T18:10:15.268Z
Learning: In tests (especially those using testing-library/dom/jsdom) for Rocket.Chat components, the HTML <code> element has an implicit ARIA role of 'code'. Therefore, screen.getByRole('code') or screen.findByRole('code') will locate <code> elements even without a role attribute. Do not flag findByRole('code') as invalid in reviews; prefer using the implicit role instead of adding role="code" unless necessary for accessibility.

Applied to files:

  • apps/meteor/app/apple/lib/handleIdentityToken.spec.ts
  • apps/meteor/app/apple/server/loginHandler.spec.ts
  • apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts
🔇 Additional comments (39)
apps/meteor/client/hooks/useShowSettingAlerts.tsx (1)

16-33: LGTM!

Also applies to: 40-71

apps/meteor/app/api/server/lib/getServerInfo.ts (1)

2-2: LGTM!

Also applies to: 19-20

apps/meteor/app/apple/lib/handleIdentityToken.ts (5)

1-29: LGTM!


31-61: LGTM!


63-65: LGTM!


117-139: LGTM!


141-166: LGTM!

apps/meteor/app/apple/server/appleOauthRegisterService.ts (5)

1-10: LGTM!


11-32: LGTM!


49-69: LGTM!


71-108: LGTM!


109-123: LGTM!

apps/meteor/app/apple/server/AppleCustomOAuth.ts (1)

5-6: LGTM!

Also applies to: 19-22

apps/meteor/app/apple/server/loginHandler.ts (1)

16-37: LGTM!

apps/meteor/app/apple/lib/handleIdentityToken.spec.ts (4)

1-31: LGTM!


32-44: LGTM!


46-88: LGTM!


90-133: LGTM!

apps/meteor/app/apple/server/loginHandler.spec.ts (4)

1-62: LGTM!


63-83: LGTM!


85-105: LGTM!


107-124: LGTM!

apps/meteor/app/file-upload/server/lib/FileUpload.ts (1)

499-499: LGTM!

apps/meteor/app/file-upload/server/lib/FileUpload.spec.ts (1)

291-359: LGTM!

Also applies to: 362-470

apps/meteor/.storybook/decorators.tsx (1)

11-25: LGTM!

apps/meteor/.storybook/preview.ts (1)

1-17: LGTM!

apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.stories.tsx (1)

2-2: LGTM!

apps/meteor/client/components/UserInfo/UserInfo.stories.tsx (1)

36-71: LGTM!

apps/meteor/client/components/ListItem.stories.tsx (1)

2-2: LGTM!

Also applies to: 45-68, 70-92

apps/meteor/client/components/dataView/Counter.stories.tsx (1)

15-40: LGTM!

apps/meteor/client/components/dataView/CounterSet.stories.tsx (1)

1-1: LGTM!

Also applies to: 13-23

apps/meteor/client/components/dataView/NegativeGrowthSymbol.stories.tsx (1)

2-2: LGTM!

Also applies to: 22-24

apps/meteor/client/components/dataView/PositiveGrowthSymbol.stories.tsx (1)

2-2: LGTM!

Also applies to: 22-24

apps/meteor/client/components/message/header/MessageRoles.stories.tsx (1)

2-2: LGTM!

Also applies to: 11-22

apps/meteor/client/components/SidebarToggler/SidebarTogglerButton.stories.tsx (1)

2-2: LGTM!

Also applies to: 16-16, 18-21

apps/meteor/client/components/connectionStatus/ConnectionStatusBar.stories.tsx (1)

4-4: LGTM!

Also applies to: 26-36, 38-48, 50-60, 62-72, 74-84

apps/meteor/client/components/message/content/actions/MessageAction.stories.tsx (1)

1-2: LGTM!

Also applies to: 13-18

apps/meteor/client/components/message/toolbar/items/actions/Timestamp/TimestampPicker/TimestampPicker.stories.tsx (1)

3-3: LGTM!

apps/meteor/client/components/message/variants/threadPreview/ThreadMessagePreviewBody.stories.tsx (1)

2-2: LGTM!

Also applies to: 28-28

Comment thread apps/meteor/.storybook/main.ts
Comment thread apps/meteor/app/file-upload/server/lib/FileUpload.ts
Comment thread apps/meteor/client/hooks/useShowSettingAlerts.tsx
@KevLehman KevLehman force-pushed the chore/confirm-modal-store-change branch from ef81453 to 57c3a34 Compare June 12, 2026 21:49
@KevLehman KevLehman merged commit d98549e into chore/confirm-modal-store-change Jun 12, 2026
7 checks passed
@KevLehman KevLehman deleted the chore/confirm-modal-store-change-suggestion branch June 12, 2026 22:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: feature Pull requests that introduces new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants