Skip to content

feat: code quality enforcement (hooks, ESLint rules, style guide)#336

Open
Just-Insane wants to merge 9 commits intodevfrom
feat/code-quality
Open

feat: code quality enforcement (hooks, ESLint rules, style guide)#336
Just-Insane wants to merge 9 commits intodevfrom
feat/code-quality

Conversation

@Just-Insane
Copy link
Collaborator

@Just-Insane Just-Insane commented Mar 17, 2026

Summary

Adds four layers of code quality enforcement to keep the codebase consistent.

Pre-commit hooks

  • Install husky + lint-staged — staged TS/JS files are auto-fixed with ESLint and formatted with Prettier on every commit

ESLint rules

  • @typescript-eslint/consistent-type-definitions — enforces type aliases over interface declarations
  • @typescript-eslint/consistent-type-imports — enforces import type / inline type modifier on type-only imports
  • no-restricted-properties — bans direct localStorage access inside src/app/components/** and src/app/features/**; use atoms or state utilities from src/app/state/ instead

Note: declare module augmentation files (slate.d.ts, matrix-sdk-events.d.ts) are exempt via targeted eslint-disable-next-line comments — both rules break module augmentation patterns that require real (non-type) imports and interface for declaration merging.

Codebase-wide lint fix

  • Applied pnpm lint:fix to enforce the two new type-import rules across ~500 existing files (0 new errors, 38 pre-existing no-console warnings remain)

State utilities

  • src/app/state/sentryStorage.ts — centralises Sentry opt-in preference reads/writes (plain functions, not atoms, so instrument.ts can call them synchronously before React mounts)
  • src/app/state/mediaVolume.ts — centralises media volume persistence

Test coverage enforcement

  • Coverage thresholds locked in vitest.config.ts and enforced by CI (pnpm test:coverage). Current baseline: ≥ 1.5% statements/functions/lines, ≥ 1% branches. These numbers are a floor — they should only ever be raised, never lowered.
  • Missing-tests advisory: On every PR, CI diffs changed logic files and posts a comment listing any without a .test.* counterpart. Advisory only — does not block merging. If tests aren't warranted (config tweaks, pure UI restyling), note it in the PR description.

Docs

  • docs/CODE_QUALITY.md — canonical reference covering TypeScript conventions, import ordering, naming, React patterns, Jotai/localStorage state patterns, vanilla-extract styling, testing policy (coverage thresholds + missing-tests advisory), and a full enforcement-layer table
  • Linked from CONTRIBUTING.md
  • Fixed stale upstream link in the PR template

Checklist

  • pnpm lint passes (0 errors)
  • All direct localStorage calls in components/features removed
  • Pre-commit hook verified working
  • Module augmentation .d.ts files exempted with targeted comments (no TS errors)
  • Coverage thresholds locked in vitest.config.ts
  • Coverage CI job added to quality-checks.yml
  • Missing-tests advisory CI job added to quality-checks.yml

… guards)

- Add husky + lint-staged pre-commit hooks (eslint --fix, prettier --write)
- Enable @typescript-eslint/consistent-type-definitions (type over interface)
- Enable @typescript-eslint/consistent-type-imports (inline type imports)
- Add ESLint rule banning direct localStorage in components/features
- Apply type-imports codebase-wide lint fix (~500 files)
- Add sentryStorage and mediaVolume utilities in src/app/state/
- Fix all direct localStorage violations in components/features
The consistent-type-definitions and consistent-type-imports rules
converted two module augmentation patterns in ways TypeScript doesn't
support:

- slate.d.ts: import { type X } from augmented module breaks the
  declare module augmentation; must use regular imports. Also reverts
  interface CustomTypes to interface (type aliases don't support
  declaration merging that Slate relies on).
- matrix-sdk-events.d.ts: type alias cannot merge with existing
  interface declarations in matrix-js-sdk; must use interface.

Add eslint-disable-next-line comments to suppress the rules at these
specific locations where they must be violated.
- Add vitest coverage thresholds (statements/functions/lines: 1.5%,
  branches: 1%) — locked at current baseline, never to be lowered
- Add 'coverage' CI job that runs pnpm test:coverage on every PR/push
- Add 'missing-tests' CI job that comments on PRs listing any changed
  logic files that have no corresponding .test. file (advisory, not
  blocking, to allow deliberate exceptions)
@Worldwave
Copy link

worried bot sounds

@Just-Insane Just-Insane marked this pull request as ready for review March 17, 2026 17:20
@Just-Insane Just-Insane requested review from 7w1 and hazre as code owners March 17, 2026 17:20
Copy link
Collaborator

@hazre hazre left a comment

Choose a reason for hiding this comment

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

Uh github comments seem to be very spammy, I would maybe add a deduplication thing. I've done it for knope and cf previews. Also maybe it should only mention files touched by the PR.

@Just-Insane
Copy link
Collaborator Author

Uh github comments seem to be very spammy, I would maybe add a deduplication thing. I've done it for knope and cf previews. Also maybe it should only mention files touched by the PR.

Will do - and those files are all touched by the PR, needed to be updated to pass the new lint rules

@github-actions
Copy link
Contributor

github-actions bot commented Mar 17, 2026

⚠️ Logic changes without tests

The following changed files have no corresponding .test. file.
Consider adding tests — or note in your PR description why tests are not needed for these changes.

  • src/app/components/AccountDataEditor.tsx
  • src/app/components/ActionUIA.tsx
  • src/app/components/AuthFlowsLoader.tsx
  • src/app/components/BackRouteHandler.tsx
  • src/app/components/BackupRestore.tsx
  • src/app/components/CallEmbedProvider.tsx
  • src/app/components/ConfirmPasswordMatch.tsx
  • src/app/components/DeviceVerification.tsx
  • src/app/components/DeviceVerificationSetup.tsx
  • src/app/components/DeviceVerificationStatus.ts
  • src/app/components/HexColorPickerPopOut.tsx
  • src/app/components/JoinRulesSwitcher.tsx
  • src/app/components/ManualVerification.tsx
  • src/app/components/Modal500.tsx
  • src/app/components/Pdf-viewer/PdfViewer.tsx
  • src/app/components/RenderMessageContent.tsx
  • src/app/components/RoomNotificationSwitcher.tsx
  • src/app/components/RoomSummaryLoader.tsx
  • src/app/components/RoomUnreadProvider.tsx
  • src/app/components/SecretStorage.tsx
  • src/app/components/ServerConfigsLoader.tsx
  • src/app/components/SpecVersionsLoader.tsx
  • src/app/components/SupportedUIAFlowsLoader.tsx
  • src/app/components/SwipeableChatWrapper.tsx
  • src/app/components/SwipeableMessageWrapper.tsx
  • src/app/components/SwipeableOverlayWrapper.tsx
  • src/app/components/UIAFlowOverlay.tsx
  • src/app/components/UseStateProvider.tsx
  • src/app/components/UserRoomProfileRenderer.tsx
  • src/app/components/create-room/AdditionalCreatorInput.tsx
  • src/app/components/create-room/CreateRoomAccessSelector.tsx
  • src/app/components/create-room/CreateRoomAliasInput.tsx
  • src/app/components/create-room/CreateRoomTypeSelector.tsx
  • src/app/components/create-room/RoomVersionSelector.tsx
  • src/app/components/create-room/utils.ts
  • src/app/components/cutout-card/CutoutCard.tsx
  • src/app/components/editor/Editor.tsx
  • src/app/components/editor/Elements.tsx
  • src/app/components/editor/Toolbar.tsx
  • src/app/components/editor/autocomplete/AutocompleteMenu.tsx
  • src/app/components/editor/autocomplete/AutocompleteNotice.tsx
  • src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx
  • src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx
  • src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx
  • src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx
  • src/app/components/editor/autocomplete/autocompleteQuery.ts
  • src/app/components/editor/input.ts
  • src/app/components/editor/keyboard.ts
  • src/app/components/editor/output.ts
  • src/app/components/editor/utils.ts
  • src/app/components/emoji-board/EmojiBoard.tsx
  • src/app/components/emoji-board/components/Group.tsx
  • src/app/components/emoji-board/components/Item.tsx
  • src/app/components/emoji-board/components/Layout.tsx
  • src/app/components/emoji-board/components/Preview.tsx
  • src/app/components/emoji-board/components/SearchInput.tsx
  • src/app/components/emoji-board/components/Sidebar.tsx
  • src/app/components/emoji-board/components/Tabs.tsx
  • src/app/components/emoji-board/useEmojiGroupIcons.ts
  • src/app/components/event-history/EventHistory.tsx
  • src/app/components/event-readers/EventReaders.tsx
  • src/app/components/image-pack-view/ImagePackContent.tsx
  • src/app/components/image-pack-view/ImagePackView.tsx
  • src/app/components/image-pack-view/ImageTile.tsx
  • src/app/components/image-pack-view/PackMeta.tsx
  • src/app/components/image-pack-view/RoomImagePack.tsx
  • src/app/components/image-pack-view/UsageSwitcher.tsx
  • src/app/components/image-pack-view/UserImagePack.tsx
  • src/app/components/image-viewer/ImageViewer.tsx
  • src/app/components/info-card/InfoCard.tsx
  • src/app/components/invite-user-prompt/InviteUserPrompt.tsx
  • src/app/components/join-address-prompt/JoinAddressPrompt.tsx
  • src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx
  • src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx
  • src/app/components/media/Image.tsx
  • src/app/components/media/MediaControls.tsx
  • src/app/components/media/Video.tsx
  • src/app/components/member-tile/MemberTile.tsx
  • src/app/components/message/FileHeader.tsx
  • src/app/components/message/MsgTypeRenderers.tsx
  • src/app/components/message/Reaction.tsx
  • src/app/components/message/RenderBody.tsx
  • src/app/components/message/Reply.tsx
  • src/app/components/message/Time.tsx
  • src/app/components/message/attachment/Attachment.css.ts
  • src/app/components/message/content/AudioContent.tsx
  • src/app/components/message/content/EventContent.tsx
  • src/app/components/message/content/FileContent.tsx
  • src/app/components/message/content/ImageContent.tsx
  • src/app/components/message/content/ThumbnailContent.tsx
  • src/app/components/message/content/VideoContent.tsx
  • src/app/components/message/layout/Bubble.tsx
  • src/app/components/message/layout/Compact.tsx
  • src/app/components/message/layout/Modern.tsx
  • src/app/components/message/layout/layout.css.ts
  • src/app/components/message/modals/MessageDelete.tsx
  • src/app/components/message/modals/MessageEditHistory.tsx
  • src/app/components/message/modals/MessageForward.tsx
  • src/app/components/message/modals/MessageReactions.tsx
  • src/app/components/message/modals/MessageReadRecipts.tsx
  • src/app/components/message/modals/MessageReport.tsx
  • src/app/components/message/modals/MessageSource.tsx
  • src/app/components/message/placeholder/CompactPlaceholder.tsx
  • src/app/components/message/placeholder/DefaultPlaceholder.tsx
  • src/app/components/message/placeholder/LinePlaceholder.css.ts
  • src/app/components/nav/NavCategory.tsx
  • src/app/components/nav/NavCategoryHeader.tsx
  • src/app/components/nav/NavEmptyLayout.tsx
  • src/app/components/nav/NavItem.tsx
  • src/app/components/nav/NavItemContent.tsx
  • src/app/components/nav/NavItemOptions.tsx
  • src/app/components/nav/styles.css.ts
  • src/app/components/notification-banner/NotificationBanner.tsx
  • src/app/components/page/Page.tsx
  • src/app/components/page/style.css.ts
  • src/app/components/password-input/PasswordInput.tsx
  • src/app/components/power/PowerSelector.tsx
  • src/app/components/power/style.css.ts
  • src/app/components/presence/Presence.tsx
  • src/app/components/room-avatar/AvatarImage.tsx
  • src/app/components/room-avatar/RoomAvatar.tsx
  • src/app/components/room-card/RoomCard.tsx
  • src/app/components/room-intro/RoomIntro.tsx
  • src/app/components/scroll-top-container/ScrollTopContainer.tsx
  • src/app/components/sequence-card/SequenceCard.tsx
  • src/app/components/sequence-card/style.css.ts
  • src/app/components/setting-tile/SettingTile.tsx
  • src/app/components/sidebar/Sidebar.css.ts
  • src/app/components/sidebar/SidebarContent.tsx
  • src/app/components/sidebar/SidebarItem.tsx
  • src/app/components/splash-screen/SplashScreen.tsx
  • src/app/components/stacked-avatar/styles.css.ts
  • src/app/components/text-viewer/TextViewer.tsx
  • src/app/components/time-date/PickerColumn.tsx
  • src/app/components/uia-stages/DummyStage.tsx
  • src/app/components/uia-stages/EmailStage.tsx
  • src/app/components/uia-stages/PasswordStage.tsx
  • src/app/components/uia-stages/ReCaptchaStage.tsx
  • src/app/components/uia-stages/RegistrationTokenStage.tsx
  • src/app/components/uia-stages/SSOStage.tsx
  • src/app/components/uia-stages/TermsStage.tsx
  • src/app/components/uia-stages/types.ts
  • src/app/components/unread-badge/UnreadBadge.tsx
  • src/app/components/upload-board/UploadBoard.tsx
  • src/app/components/upload-card/CompactUploadCardRenderer.tsx
  • src/app/components/upload-card/UploadCard.css.ts
  • src/app/components/upload-card/UploadCard.tsx
  • src/app/components/upload-card/UploadCardRenderer.tsx
  • src/app/components/upload-card/UploadDescriptionEditor.tsx
  • src/app/components/url-preview/UrlPreviewCard.tsx
  • src/app/components/user-avatar/UserAvatar.tsx
  • src/app/components/user-profile/CreatorChip.tsx
  • src/app/components/user-profile/PowerChip.tsx
  • src/app/components/user-profile/UserChips.tsx
  • src/app/components/user-profile/UserHero.tsx
  • src/app/components/user-profile/UserRoomProfile.tsx
  • src/app/components/virtualizer/VirtualTile.tsx
  • src/app/features/add-existing/AddExisting.tsx
  • src/app/features/call-status/CallControl.tsx
  • src/app/features/call-status/CallRoomName.tsx
  • src/app/features/call-status/CallStatus.tsx
  • src/app/features/call-status/LiveChip.tsx
  • src/app/features/call-status/MemberGlance.tsx
  • src/app/features/call-status/MemberSpeaking.tsx
  • src/app/features/call/CallControls.tsx
  • src/app/features/call/CallMemberCard.tsx
  • src/app/features/call/CallView.tsx
  • src/app/features/common-settings/cosmetics/Cosmetics.tsx
  • src/app/features/common-settings/developer-tools/DevelopTools.tsx
  • src/app/features/common-settings/developer-tools/SendRoomEvent.tsx
  • src/app/features/common-settings/developer-tools/StateEventEditor.tsx
  • src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx
  • src/app/features/common-settings/emojis-stickers/RoomPacks.tsx
  • src/app/features/common-settings/general/RoomAddress.tsx
  • src/app/features/common-settings/general/RoomEncryption.tsx
  • src/app/features/common-settings/general/RoomHistoryVisibility.tsx
  • src/app/features/common-settings/general/RoomJoinRules.tsx
  • src/app/features/common-settings/general/RoomProfile.tsx
  • src/app/features/common-settings/general/RoomPublish.tsx
  • src/app/features/common-settings/general/RoomUpgrade.tsx
  • src/app/features/common-settings/members/Members.tsx
  • src/app/features/common-settings/permissions/PermissionGroups.tsx
  • src/app/features/common-settings/permissions/Powers.tsx
  • src/app/features/common-settings/permissions/PowersEditor.tsx
  • src/app/features/common-settings/permissions/types.ts
  • src/app/features/create-chat/CreateChat.tsx
  • src/app/features/create-room/CreateRoom.tsx
  • src/app/features/create-room/CreateRoomModal.tsx
  • src/app/features/create-space/CreateSpace.tsx
  • src/app/features/create-space/CreateSpaceModal.tsx
  • src/app/features/lobby/DnD.tsx
  • src/app/features/lobby/HierarchyItemMenu.tsx
  • src/app/features/lobby/Lobby.tsx
  • src/app/features/lobby/LobbyHeader.tsx
  • src/app/features/lobby/RoomItem.tsx
  • src/app/features/lobby/SpaceHierarchy.tsx
  • src/app/features/lobby/SpaceItem.tsx
  • src/app/features/message-search/MessageSearch.tsx
  • src/app/features/message-search/SearchFilters.tsx
  • src/app/features/message-search/SearchInput.tsx
  • src/app/features/message-search/SearchResultGroup.tsx
  • src/app/features/message-search/useMessageSearch.ts
  • src/app/features/room-nav/RoomNavItem.tsx
  • src/app/features/room-nav/RoomNavUser.tsx
  • src/app/features/room-settings/RoomSettings.tsx
  • src/app/features/room-settings/RoomSettingsRenderer.tsx
  • src/app/features/room-settings/permissions/usePermissionItems.ts
  • src/app/features/room/CommandAutocomplete.tsx
  • src/app/features/room/MembersDrawer.tsx
  • src/app/features/room/RoomCallButton.tsx
  • src/app/features/room/RoomInput.tsx
  • src/app/features/room/RoomInputPlaceholder.tsx
  • src/app/features/room/RoomTimeline.css.ts
  • src/app/features/room/RoomTimeline.tsx
  • src/app/features/room/RoomViewFollowing.tsx
  • src/app/features/room/RoomViewHeader.tsx
  • src/app/features/room/RoomViewTyping.tsx
  • src/app/features/room/ThreadBrowser.tsx
  • src/app/features/room/ThreadDrawer.tsx
  • src/app/features/room/jump-to-time/JumpToTime.tsx
  • src/app/features/room/message/EncryptedContent.tsx
  • src/app/features/room/message/Message.tsx
  • src/app/features/room/message/MessageEditor.tsx
  • src/app/features/room/message/Reactions.tsx
  • src/app/features/room/msgContent.ts
  • src/app/features/room/reaction-viewer/ReactionViewer.tsx
  • src/app/features/room/room-pin-menu/RoomPinMenu.tsx
  • src/app/features/room/schedule-send/SchedulePickerDialog.tsx
  • src/app/features/room/schedule-send/ScheduledMessagesList.tsx
  • src/app/features/search/Search.tsx
  • src/app/features/settings/Settings.tsx
  • src/app/features/settings/account/BioEditor.tsx
  • src/app/features/settings/account/IgnoredUserList.tsx
  • src/app/features/settings/account/Profile.tsx
  • src/app/features/settings/account/PronounEditor.tsx
  • src/app/features/settings/account/StatusEditor.tsx
  • src/app/features/settings/account/TimezoneEditor.tsx
  • src/app/features/settings/cosmetics/Cosmetics.tsx
  • src/app/features/settings/cosmetics/Themes.tsx
  • src/app/features/settings/developer-tools/DebugLogViewer.tsx
  • src/app/features/settings/developer-tools/DevelopTools.tsx
  • src/app/features/settings/developer-tools/SentrySettings.tsx
  • src/app/features/settings/developer-tools/SyncDiagnostics.tsx
  • src/app/features/settings/devices/DeviceTile.tsx
  • src/app/features/settings/devices/LocalBackup.tsx
  • src/app/features/settings/devices/OtherDevices.tsx
  • src/app/features/settings/devices/Verification.tsx
  • src/app/features/settings/emojis-stickers/EmojisStickers.tsx
  • src/app/features/settings/emojis-stickers/GlobalPacks.tsx
  • src/app/features/settings/general/General.tsx
  • src/app/features/settings/notifications/AllMessages.tsx
  • src/app/features/settings/notifications/KeywordMessages.tsx
  • src/app/features/settings/notifications/NotificationLevelsHint.tsx
  • src/app/features/settings/notifications/NotificationModeSwitcher.tsx
  • src/app/features/settings/notifications/PushNotifications.tsx
  • src/app/features/settings/notifications/SpecialMessages.tsx
  • src/app/features/settings/notifications/SystemNotification.tsx
  • src/app/features/space-settings/SpaceSettings.tsx
  • src/app/features/space-settings/SpaceSettingsRenderer.tsx
  • src/app/features/space-settings/permissions/usePermissionItems.ts
  • src/app/features/widgets/GenericWidgetDriver.ts
  • src/app/features/widgets/IntegrationManager.tsx
  • src/app/features/widgets/WidgetIframe.tsx
  • src/app/features/widgets/WidgetsDrawer.tsx
  • src/app/hooks/types.ts
  • src/app/hooks/useAccountData.ts
  • src/app/hooks/useAccountDataCallback.ts
  • src/app/hooks/useAppVisibility.ts
  • src/app/hooks/useAsyncSearch.ts
  • src/app/hooks/useAuthFlows.ts
  • src/app/hooks/useAuthMetadata.ts
  • src/app/hooks/useAutoDiscoveryInfo.ts
  • src/app/hooks/useCall.ts
  • src/app/hooks/useCallEmbed.ts
  • src/app/hooks/useCallSignaling.ts
  • src/app/hooks/useCallSpeakers.ts
  • src/app/hooks/useCapabilities.ts
  • src/app/hooks/useCategoryHandler.ts
  • src/app/hooks/useCommands.ts
  • src/app/hooks/useComposingCheck.ts
  • src/app/hooks/useCrossSigning.ts
  • src/app/hooks/useDateFormat.ts
  • src/app/hooks/useDeviceList.ts
  • src/app/hooks/useDeviceVerificationStatus.ts
  • src/app/hooks/useDirectUsers.ts
  • src/app/hooks/useFileDrop.ts
  • src/app/hooks/useFilePasteHandler.ts
  • src/app/hooks/useGetRoom.ts
  • src/app/hooks/useGroupDMMembers.ts
  • src/app/hooks/useImagePackRooms.ts
  • src/app/hooks/useImagePacks.ts
  • src/app/hooks/useIntegrationManager.ts
  • src/app/hooks/useKeyBackup.ts
  • src/app/hooks/useLivekitSupport.ts
  • src/app/hooks/useLocalRoomSummary.ts
  • src/app/hooks/useMatrixClient.ts
  • src/app/hooks/useMatrixEventRenderer.ts
  • src/app/hooks/useMediaConfig.ts
  • src/app/hooks/useMemberEventParser.tsx
  • src/app/hooks/useMemberFilter.ts
  • src/app/hooks/useMemberPowerCompare.ts
  • src/app/hooks/useMemberPowerTag.ts
  • src/app/hooks/useMemberSort.ts
  • src/app/hooks/useMembership.ts
  • src/app/hooks/useMentionClickHandler.ts
  • src/app/hooks/useMessageSpacing.ts
  • src/app/hooks/useMutualRooms.ts
  • src/app/hooks/useNickname.ts
  • src/app/hooks/useNotificationMode.ts
  • src/app/hooks/useParsedLoginFlows.ts
  • src/app/hooks/usePasswordEmail.ts
  • src/app/hooks/usePowerLevelTags.ts
  • src/app/hooks/usePowerLevels.ts
  • src/app/hooks/usePushRule.ts
  • src/app/hooks/useRecentEmoji.ts
  • src/app/hooks/useRegisterEmail.ts
  • src/app/hooks/useRoom.ts
  • src/app/hooks/useRoomAccountData.ts
  • src/app/hooks/useRoomAliases.ts
  • src/app/hooks/useRoomCreators.ts
  • src/app/hooks/useRoomCreatorsTag.ts
  • src/app/hooks/useRoomEvent.ts
  • src/app/hooks/useRoomEventReaders.ts
  • src/app/hooks/useRoomLatestRenderedEvent.ts
  • src/app/hooks/useRoomMembers.ts
  • src/app/hooks/useRoomMeta.ts
  • src/app/hooks/useRoomNavigate.ts
  • src/app/hooks/useRoomPermissions.ts
  • src/app/hooks/useRoomPinnedEvents.ts
  • src/app/hooks/useRoomState.ts
  • src/app/hooks/useRoomTypingMembers.ts
  • src/app/hooks/useRoomWidgets.ts
  • src/app/hooks/useRoomsNotificationPreferences.ts
  • src/app/hooks/useSableCosmetics.ts
  • src/app/hooks/useSecretStorage.ts
  • src/app/hooks/useSessionProfiles.ts
  • src/app/hooks/useSidebarItems.ts
  • src/app/hooks/useSpace.ts
  • src/app/hooks/useSpaceHierarchy.ts
  • src/app/hooks/useSpecVersions.ts
  • src/app/hooks/useSpoilerClickHandler.ts
  • src/app/hooks/useStateEvent.ts
  • src/app/hooks/useStateEventCallback.ts
  • src/app/hooks/useSyncState.ts
  • src/app/hooks/useTextAreaCodeEditor.ts
  • src/app/hooks/useTextAreaIntent.ts
  • src/app/hooks/useTypingStatusUpdater.ts
  • src/app/hooks/useUIAFlows.ts
  • src/app/hooks/useUserPresence.ts
  • src/app/hooks/useUserProfile.ts
  • src/app/hooks/useVerificationRequest.ts
  • src/app/hooks/useVirtualPaginator.ts
  • src/app/i18n.ts
  • src/app/pages/FeatureCheck.tsx
  • src/app/pages/MobileFriendly.tsx
  • src/app/pages/Router.tsx
  • src/app/pages/ThemeManager.tsx
  • src/app/pages/auth/SSOLogin.tsx
  • src/app/pages/auth/ServerPicker.tsx
  • src/app/pages/auth/login/Login.tsx
  • src/app/pages/auth/login/PasswordLoginForm.tsx
  • src/app/pages/auth/login/TokenLogin.tsx
  • src/app/pages/auth/login/loginUtil.ts
  • src/app/pages/auth/register/PasswordRegisterForm.tsx
  • src/app/pages/auth/register/Register.tsx
  • src/app/pages/auth/register/registerUtil.ts
  • src/app/pages/auth/reset-password/PasswordResetForm.tsx
  • src/app/pages/auth/reset-password/ResetPassword.tsx
  • src/app/pages/auth/reset-password/resetPasswordUtil.ts
  • src/app/pages/client/AutoDiscovery.tsx
  • src/app/pages/client/BackgroundNotifications.tsx
  • src/app/pages/client/ClientBindAtoms.ts
  • src/app/pages/client/ClientInitStorageAtom.tsx
  • src/app/pages/client/ClientLayout.tsx
  • src/app/pages/client/ClientNonUIFeatures.tsx
  • src/app/pages/client/ClientRoomsNotificationPreferences.tsx
  • src/app/pages/client/ClientRoot.tsx
  • src/app/pages/client/SpecVersions.tsx
  • src/app/pages/client/SyncStatus.tsx
  • src/app/pages/client/direct/Direct.tsx
  • src/app/pages/client/direct/RoomProvider.tsx
  • src/app/pages/client/explore/Explore.tsx
  • src/app/pages/client/explore/Server.tsx
  • src/app/pages/client/home/Home.tsx
  • src/app/pages/client/home/RoomProvider.tsx
  • src/app/pages/client/inbox/Invites.tsx
  • src/app/pages/client/inbox/Notifications.tsx
  • src/app/pages/client/sidebar/AccountSwitcherTab.tsx
  • src/app/pages/client/sidebar/CreateTab.tsx
  • src/app/pages/client/sidebar/DirectDMsList.tsx
  • src/app/pages/client/sidebar/DirectTab.tsx
  • src/app/pages/client/sidebar/HomeTab.tsx
  • src/app/pages/client/sidebar/SpaceTabs.tsx
  • src/app/pages/client/space/RoomProvider.tsx
  • src/app/pages/client/space/Space.tsx
  • src/app/pages/client/space/SpaceProvider.tsx
  • src/app/pages/pathSearchParam.ts
  • src/app/pages/pathUtils.ts
  • src/app/plugins/call/CallControl.ts
  • src/app/plugins/call/CallEmbed.ts
  • src/app/plugins/call/CallWidgetDriver.ts
  • src/app/plugins/call/hooks.ts
  • src/app/plugins/custom-emoji/ImagePack.ts
  • src/app/plugins/custom-emoji/PackImageReader.ts
  • src/app/plugins/custom-emoji/PackImagesReader.ts
  • src/app/plugins/custom-emoji/PackMetaReader.ts
  • src/app/plugins/custom-emoji/imagePackCache.ts
  • src/app/plugins/custom-emoji/types.ts
  • src/app/plugins/custom-emoji/utils.ts
  • src/app/plugins/emoji.ts
  • src/app/plugins/markdown/block/parser.ts
  • src/app/plugins/markdown/block/rules.ts
  • src/app/plugins/markdown/block/runner.ts
  • src/app/plugins/markdown/block/type.ts
  • src/app/plugins/markdown/inline/parser.ts
  • src/app/plugins/markdown/inline/rules.ts
  • src/app/plugins/markdown/inline/runner.ts
  • src/app/plugins/markdown/inline/type.ts
  • src/app/plugins/millify.ts
  • src/app/plugins/react-custom-html-parser.tsx
  • src/app/plugins/react-prism/ReactPrism.tsx
  • src/app/plugins/recent-emoji.ts
  • src/app/plugins/text-area/Operations.ts
  • src/app/plugins/text-area/TextArea.ts
  • src/app/plugins/text-area/TextAreaOperations.ts
  • src/app/plugins/text-area/mods/Intent.ts
  • src/app/plugins/utils.ts
  • src/app/plugins/via-servers.ts
  • src/app/state/backupRestore.ts
  • src/app/state/callEmbed.ts
  • src/app/state/callPreferences.ts
  • src/app/state/closedLobbyCategories.ts
  • src/app/state/closedNavCategories.ts
  • src/app/state/createRoomModal.ts
  • src/app/state/hooks/callPreferences.ts
  • src/app/state/hooks/closedLobbyCategories.ts
  • src/app/state/hooks/closedNavCategories.ts
  • src/app/state/hooks/createRoomModal.ts
  • src/app/state/hooks/createSpaceModal.ts
  • src/app/state/hooks/navToActivePath.ts
  • src/app/state/hooks/openedSidebarFolder.ts
  • src/app/state/hooks/roomList.ts
  • src/app/state/hooks/roomSettings.ts
  • src/app/state/hooks/settings.ts
  • src/app/state/hooks/spaceSettings.ts
  • src/app/state/hooks/unread.ts
  • src/app/state/hooks/useBindAtoms.ts
  • src/app/state/hooks/userRoomProfile.ts
  • src/app/state/mDirectList.ts
  • src/app/state/mediaVolume.ts
  • src/app/state/modal.ts
  • src/app/state/navToActivePath.ts
  • src/app/state/nicknames.ts
  • src/app/state/openedSidebarFolder.ts
  • src/app/state/room-list/inviteList.ts
  • src/app/state/room-list/roomList.ts
  • src/app/state/room-list/utils.ts
  • src/app/state/room/roomInputDrafts.ts
  • src/app/state/room/roomToParents.ts
  • src/app/state/room/roomToUnread.ts
  • src/app/state/sentryStorage.ts
  • src/app/state/sessions.ts
  • src/app/state/settings.ts
  • src/app/state/typingMembers.ts
  • src/app/state/upload.ts
  • src/app/state/userRoomProfile.ts
  • src/app/styles/ContainerColor.css.ts
  • src/app/utils/addStickerToDefaultStickerPack.ts
  • src/app/utils/debugLogger.ts
  • src/app/utils/delayedEvents.ts
  • src/app/utils/keyboard.ts
  • src/app/utils/matrix-crypto.ts
  • src/app/utils/matrix-uia.ts
  • src/app/utils/matrix.ts
  • src/app/utils/notifications.ts
  • src/app/utils/room.ts
  • src/app/utils/sendFeedbackToUser.ts
  • src/client/initMatrix.ts
  • src/client/slidingSync.ts
  • src/types/matrix/common.ts
  • src/types/matrix/room.ts

@SableClient SableClient deleted a comment from github-actions bot Mar 17, 2026
@SableClient SableClient deleted a comment from github-actions bot Mar 17, 2026
@SableClient SableClient deleted a comment from github-actions bot Mar 17, 2026
@Just-Insane Just-Insane requested a review from hazre March 17, 2026 18:03
@Just-Insane
Copy link
Collaborator Author

@hazre should update a single comment now. Also, as mentioned, all of those files were touched (they needed to be updated to match the new quality rules).

@github-actions
Copy link
Contributor

Deploying with  Cloudflare Workers  Cloudflare Workers

Status Preview URL Commit Alias Updated (UTC)
✅ Deployment successful! https://pr-336-sable.raspy-dream-bb1d.workers.dev d6f6376 pr-336 Tue, 17 Mar 2026 18:49:38 GMT

@Just-Insane Just-Insane enabled auto-merge March 17, 2026 18:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants