From e22e5312d5b71634d99c358805c8b729bbb08924 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 11:58:39 -0400 Subject: [PATCH 1/8] docs: add code quality guide and fix PR template --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CONTRIBUTING.md | 2 + docs/CODE_QUALITY.md | 273 +++++++++++++++++++++++++++++++ 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 docs/CODE_QUALITY.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d481c26ba..e61af5f79 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,4 +1,4 @@ - + ### Description diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c417e2071..c3f9c79c4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,6 +47,8 @@ Also, we use [ESLint](https://eslint.org/) for clean and stylistically consisten If your change touches logic with testable behaviour, please include tests. See [docs/TESTING.md](./docs/TESTING.md) for a guide on how to write them. +For conventions on code style, naming, and project patterns, see [docs/CODE_QUALITY.md](./docs/CODE_QUALITY.md). + ## Restrictions on Generative AI Usage We expect and appreciate authentic engagement in our community. diff --git a/docs/CODE_QUALITY.md b/docs/CODE_QUALITY.md new file mode 100644 index 000000000..2c57bd26e --- /dev/null +++ b/docs/CODE_QUALITY.md @@ -0,0 +1,273 @@ +# Code Quality Guide + +This document describes the coding conventions and standards used throughout Sable. Most rules are enforced automatically — read this to understand the _why_ behind them and to get the conventions right the first time. + +## Enforcement layers + +| Layer | When it runs | What it checks | +| --------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------- | +| **Pre-commit hook** (`husky` + `lint-staged`) | On every `git commit` | ESLint (with auto-fix) + Prettier (with auto-fix) on staged files only | +| **CI quality checks** | On every PR and push to `dev` | Format, lint, typecheck, knip, tests, build | +| **Editor** | As you type | ESLint + Prettier via VS Code extensions | + +PRs are **not merged** unless all CI quality checks are green. The pre-commit hook auto-fixes formatting and many lint issues for you; if it cannot, the commit is blocked with a clear error message. + +To fix all violations in the entire repo at once: + +```sh +pnpm run lint:fix +pnpm run fmt +``` + +--- + +## TypeScript + +### Prefer `type` over `interface` + +Use `type` for all type declarations. `interface` is not used in this codebase. + +```ts +// ✅ correct +type RoomAvatarProps = { + roomId: string; + src?: string; +}; + +// ❌ incorrect +interface RoomAvatarProps { + roomId: string; + src?: string; +} +``` + +_Rule: `@typescript-eslint/consistent-type-definitions: ['error', 'type']` — auto-fixed on commit._ + +### Use `import type` for type-only imports + +When an import is used only as a type (not a value at runtime), annotate it with `type`. + +```ts +// ✅ correct +import { type MatrixClient, MatrixError } from '$types/matrix-sdk'; + +// ❌ incorrect +import { MatrixClient, MatrixError } from '$types/matrix-sdk'; +// (where MatrixClient is only used as a type annotation) +``` + +_Rule: `@typescript-eslint/consistent-type-imports` with `inline-type-imports` style — auto-fixed on commit._ + +### Strict null checks + +The project uses `strict: true` including `strictNullChecks`. Never use `as X` to work around nullability — handle the null/undefined case explicitly or use optional chaining. + +### Enums + +Use `enum` (string-valued) for sets of related constants, as it reads better in debug output and is refactor-safe: + +```ts +export enum AsyncStatus { + Idle = 'idle', + Loading = 'loading', + Success = 'success', + Error = 'error', +} +``` + +--- + +## Imports + +### Ordering + +Group imports in this order, with a blank line between each group: + +1. **External packages** — `react`, `folds`, `jotai`, `matrix-js-sdk`, etc. +2. **Internal path aliases** — `$types/*`, `$hooks/*`, `$components/*`, `$state/*`, `$utils/*`, `$features/*`, `$pages/*`, `$client/*` +3. **Relative imports** — `./Foo`, `../bar`, `* as css from './style.css'` + +```ts +// ✅ correct +import { useState } from 'react'; +import { Box, Text } from 'folds'; + +import { type MatrixClient } from '$types/matrix-sdk'; +import { useMatrixClient } from '$hooks/useMatrixClient'; + +import * as css from './style.css'; +``` + +### Path aliases + +Always prefer the `$`-prefixed path aliases over relative traversal for anything outside the current component's own directory: + +```ts +// ✅ correct +import { useMatrixClient } from '$hooks/useMatrixClient'; + +// ❌ incorrect +import { useMatrixClient } from '../../../hooks/useMatrixClient'; +``` + +--- + +## Naming conventions + +| Thing | Convention | Example | +| ----------------------- | ------------------------------------------ | ------------------------------------- | +| React component | `PascalCase` function | `export function RoomAvatar(...)` | +| Component props type | `[ComponentName]Props` | `type RoomAvatarProps = { ... }` | +| Custom hook | `use` prefix, `camelCase` | `useMatrixClient`, `useAsyncCallback` | +| Jotai atom (read/write) | `camelCase` + `Atom` suffix | `nicknamesAtom`, `settingsAtom` | +| Jotai write-only atom | `camelCase` + `Atom` suffix | `setNicknameAtom` | +| Jotai atom family | `camelCase` + `AtomFamily` suffix | `roomIdToOpenThreadAtomFamily` | +| Utility function | `camelCase` | `getMemberDisplayName`, `colorMXID` | +| Enum | `PascalCase` (type) + values `PascalCase` | `AsyncStatus.Loading` | +| CSS module file | `[ComponentName].css.ts` (vanilla-extract) | `RoomAvatar.css.ts` | +| File (component) | `PascalCase.tsx` | `RoomAvatar.tsx` | +| File (hook/util/state) | `camelCase.ts` | `useMatrixClient.ts`, `colorMXID.ts` | + +--- + +## React components + +### Named exports, not default exports + +Use named exports for all components, hooks, and utilities. Default exports make refactoring harder and are disabled by ESLint (`import-x/prefer-default-export: off`). + +```ts +// ✅ correct +export function RoomAvatar({ roomId, src }: RoomAvatarProps) { ... } + +// ❌ incorrect +export default function RoomAvatar(...) { ... } +``` + +### Keep components pure and focused + +- One component per file (small co-located sub-components are fine, but extract anything reusable) +- Derive values from props/state — avoid storing derived data in separate state +- Put complex logic in custom hooks, not inline inside JSX + +### Polymorphic components with `as` + +Reusable UI components that need to render as different HTML elements use the `as` helper from `folds`: + +```tsx +export const MemberTile = as<'button', MemberTileProps>( + ({ as: AsMemberTile = 'button', ...props }, ref) => +); +``` + +### No inline arrow functions in JSX where avoidable + +Handlers that only exist to call another function should be extracted: + +```tsx +// ✅ correct +const handleError = useCallback(() => setError(true), []); + + +// ❌ avoid for handlers that will cause child re-renders + setError(true)} /> +``` + +--- + +## State management (Jotai) + +State lives in `src/app/state/`. Atoms are the single source of truth — components read via `useAtomValue` and write via writable atoms or `useSetAtom`. + +```ts +// state/nicknames.ts +export const nicknamesAtom = atom({}); + +// Write atom encapsulates mutation + side effect +export const setNicknameAtom = atom( + null, + (get, set, userId, nick, mx) => { ... } +); +``` + +- **Don't** derive state in multiple components — put derived atoms in the state file +- **Don't** call Matrix SDK directly from components when an atom/hook already wraps it +- **Do** wait for `SyncState.Syncing` before rendering components that depend on account data (see `useSyncState`) + +### localStorage access + +**Direct `localStorage` calls are banned in `src/app/components/**`and`src/app/features/**`** — ESLint will error. Use one of the two approved patterns instead: + +**Reactive state that components read from JSX** → `atomWithLocalStorage` in a state file: + +```ts +// src/app/state/myFeature.ts +const baseAtom = atomWithLocalStorage(KEY, getLocalStorageItem, setLocalStorageItem); +export const myAtom = atom( + (get) => get(baseAtom), + (_get, set, value) => set(baseAtom, value) +); +``` + +**Values applied directly to DOM refs or needed before React mounts** → plain functions in a state file: + +```ts +// src/app/state/myFeature.ts +export const getMyValue = (): string | undefined => localStorage.getItem(MY_KEY) ?? undefined; +export const setMyValue = (v: string): void => { + localStorage.setItem(MY_KEY, v); +}; +``` + +Use `atomWithLocalStorage` for anything that drives UI renders. Use plain functions for things like Sentry init flags (read before React) or media volume (applied synchronously to a DOM element ref). See [src/app/state/sentryStorage.ts](../src/app/state/sentryStorage.ts) and [src/app/state/mediaVolume.ts](../src/app/state/mediaVolume.ts) for examples. + +--- + +## Styling (vanilla-extract) + +Styles live in co-located `*.css.ts` files alongside the component: + +```ts +// RoomAvatar.css.ts +import { style } from '@vanilla-extract/css'; +export const RoomAvatar = style({ borderRadius: '50%' }); +``` + +```tsx +// RoomAvatar.tsx +import * as css from './RoomAvatar.css'; +
; +``` + +- Never use inline `style={{}}` for anything that could be a static class +- Never import global CSS from within component files + +--- + +## Testing + +See [TESTING.md](./TESTING.md) for full details. Key conventions: + +- Tests live adjacent to the code they test, or under `src/test/` for shared fixtures +- Test files are named `*.test.ts` / `*.test.tsx` +- Use `@testing-library/react` for component tests — test behaviour, not implementation details +- If your change touches logic with a clear input/output, add or update a test + +--- + +## What the linter enforces automatically + +These rules run in CI and on every commit (and are auto-fixed when possible): + +| Rule | Enforced as | +| -------------------------------------------------------- | ---------------------------- | +| `@typescript-eslint/consistent-type-definitions` | error (auto-fix) | +| `@typescript-eslint/consistent-type-imports` | error (auto-fix) | +| `@typescript-eslint/no-unused-vars` | error (auto-fix for imports) | +| `@typescript-eslint/no-shadow` | error | +| `react-hooks/rules-of-hooks` | error | +| `react-hooks/exhaustive-deps` | error | +| `react/no-unstable-nested-components` | error | +| No direct `localStorage` in `components/` or `features/` | error | +| Prettier formatting | error (auto-fix) | +| Knip (dead exports / unused files) | error | From 442c0acf933ee3e660cb84bc2e62a23fe695b269 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 11:59:03 -0400 Subject: [PATCH 2/8] feat: add code quality enforcement (hooks, ESLint rules, localStorage 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 --- .husky/pre-commit | 1 + eslint.config.js | 28 ++- package.json | 15 +- pnpm-lock.yaml | 217 +++++++++++++++++- src/app/components/AccountDataEditor.tsx | 4 +- src/app/components/ActionUIA.tsx | 4 +- src/app/components/AuthFlowsLoader.tsx | 8 +- src/app/components/BackRouteHandler.tsx | 2 +- src/app/components/BackupRestore.tsx | 6 +- src/app/components/CallEmbedProvider.tsx | 4 +- src/app/components/ClientConfigLoader.tsx | 4 +- src/app/components/ConfirmPasswordMatch.tsx | 2 +- src/app/components/DeviceVerification.tsx | 8 +- .../components/DeviceVerificationSetup.tsx | 4 +- .../components/DeviceVerificationStatus.ts | 6 +- src/app/components/HexColorPickerPopOut.tsx | 4 +- src/app/components/JoinRulesSwitcher.tsx | 6 +- src/app/components/ManualVerification.tsx | 6 +- src/app/components/Modal500.tsx | 2 +- src/app/components/Pdf-viewer/PdfViewer.tsx | 4 +- src/app/components/RenderMessageContent.tsx | 4 +- .../components/RoomNotificationSwitcher.tsx | 4 +- src/app/components/RoomSummaryLoader.tsx | 8 +- src/app/components/RoomUnreadProvider.tsx | 4 +- src/app/components/SecretStorage.tsx | 7 +- src/app/components/ServerConfigsLoader.tsx | 10 +- src/app/components/SpecVersionsLoader.tsx | 4 +- .../components/SupportedUIAFlowsLoader.tsx | 4 +- src/app/components/SwipeableChatWrapper.tsx | 6 +- .../components/SwipeableMessageWrapper.tsx | 2 +- .../components/SwipeableOverlayWrapper.tsx | 6 +- src/app/components/UIAFlowOverlay.tsx | 2 +- src/app/components/UseStateProvider.tsx | 2 +- .../components/UserRoomProfileRenderer.tsx | 2 +- .../create-room/AdditionalCreatorInput.tsx | 10 +- .../create-room/CreateRoomAccessSelector.tsx | 2 +- .../create-room/CreateRoomAliasInput.tsx | 6 +- .../create-room/CreateRoomTypeSelector.tsx | 2 +- .../create-room/RoomVersionSelector.tsx | 4 +- src/app/components/create-room/utils.ts | 10 +- src/app/components/cutout-card/CutoutCard.tsx | 2 +- src/app/components/editor/Editor.tsx | 16 +- src/app/components/editor/Elements.tsx | 11 +- src/app/components/editor/Toolbar.tsx | 8 +- .../editor/autocomplete/AutocompleteMenu.tsx | 2 +- .../autocomplete/AutocompleteNotice.tsx | 2 +- .../autocomplete/BaseAutocompleteMenu.tsx | 2 +- .../autocomplete/EmoticonAutocomplete.tsx | 14 +- .../autocomplete/RoomMentionAutocomplete.tsx | 10 +- .../autocomplete/UserMentionAutocomplete.tsx | 14 +- .../editor/autocomplete/autocompleteQuery.ts | 2 +- src/app/components/editor/input.ts | 30 +-- src/app/components/editor/keyboard.ts | 2 +- src/app/components/editor/output.ts | 6 +- src/app/components/editor/slate.d.ts | 12 +- src/app/components/editor/utils.ts | 27 ++- src/app/components/emoji-board/EmojiBoard.tsx | 22 +- .../emoji-board/components/Group.tsx | 2 +- .../emoji-board/components/Item.tsx | 8 +- .../emoji-board/components/Layout.tsx | 2 +- .../emoji-board/components/Preview.tsx | 2 +- .../emoji-board/components/SearchInput.tsx | 2 +- .../emoji-board/components/Sidebar.tsx | 4 +- .../emoji-board/components/Tabs.tsx | 2 +- .../emoji-board/useEmojiGroupIcons.ts | 2 +- .../components/event-history/EventHistory.tsx | 6 +- .../components/event-readers/EventReaders.tsx | 2 +- .../image-pack-view/ImagePackContent.tsx | 12 +- .../image-pack-view/ImagePackView.tsx | 2 +- .../components/image-pack-view/ImageTile.tsx | 6 +- .../components/image-pack-view/PackMeta.tsx | 4 +- .../image-pack-view/RoomImagePack.tsx | 4 +- .../image-pack-view/UsageSwitcher.tsx | 15 +- .../image-pack-view/UserImagePack.tsx | 2 +- .../components/image-viewer/ImageViewer.tsx | 2 +- src/app/components/info-card/InfoCard.tsx | 4 +- .../invite-user-prompt/InviteUserPrompt.tsx | 10 +- .../join-address-prompt/JoinAddressPrompt.tsx | 2 +- .../leave-room-prompt/LeaveRoomPrompt.tsx | 2 +- .../leave-space-prompt/LeaveSpacePrompt.tsx | 2 +- src/app/components/media/Image.tsx | 2 +- src/app/components/media/MediaControls.tsx | 2 +- src/app/components/media/Video.tsx | 14 +- src/app/components/member-tile/MemberTile.tsx | 4 +- src/app/components/message/FileHeader.tsx | 4 +- .../components/message/MsgTypeRenderers.tsx | 24 +- src/app/components/message/Reaction.tsx | 2 +- src/app/components/message/RenderBody.tsx | 4 +- src/app/components/message/Reply.tsx | 4 +- src/app/components/message/Time.tsx | 2 +- .../message/attachment/Attachment.css.ts | 2 +- .../message/content/AudioContent.tsx | 19 +- .../message/content/EventContent.tsx | 4 +- .../message/content/FileContent.tsx | 6 +- .../message/content/ImageContent.tsx | 6 +- .../message/content/ThumbnailContent.tsx | 4 +- .../message/content/VideoContent.tsx | 8 +- src/app/components/message/layout/Bubble.tsx | 4 +- src/app/components/message/layout/Compact.tsx | 2 +- src/app/components/message/layout/Modern.tsx | 2 +- .../components/message/layout/layout.css.ts | 2 +- .../message/modals/MessageDelete.tsx | 4 +- .../message/modals/MessageEditHistory.tsx | 4 +- .../message/modals/MessageForward.tsx | 2 +- .../message/modals/MessageReactions.tsx | 4 +- .../message/modals/MessageReadRecipts.tsx | 4 +- .../message/modals/MessageReport.tsx | 4 +- .../message/modals/MessageSource.tsx | 4 +- .../placeholder/CompactPlaceholder.tsx | 2 +- .../placeholder/DefaultPlaceholder.tsx | 4 +- .../placeholder/LinePlaceholder.css.ts | 6 +- src/app/components/nav/NavCategory.tsx | 2 +- src/app/components/nav/NavCategoryHeader.tsx | 2 +- src/app/components/nav/NavEmptyLayout.tsx | 2 +- src/app/components/nav/NavItem.tsx | 2 +- src/app/components/nav/NavItemContent.tsx | 2 +- src/app/components/nav/NavItemOptions.tsx | 2 +- src/app/components/nav/styles.css.ts | 14 +- .../NotificationBanner.tsx | 4 +- src/app/components/page/Page.tsx | 2 +- src/app/components/page/style.css.ts | 2 +- .../password-input/PasswordInput.tsx | 2 +- src/app/components/power/PowerSelector.tsx | 6 +- src/app/components/power/style.css.ts | 2 +- src/app/components/presence/Presence.tsx | 6 +- .../components/room-avatar/AvatarImage.tsx | 2 +- src/app/components/room-avatar/RoomAvatar.tsx | 4 +- src/app/components/room-card/RoomCard.tsx | 4 +- src/app/components/room-intro/RoomIntro.tsx | 4 +- .../ScrollTopContainer.tsx | 2 +- .../components/sequence-card/SequenceCard.tsx | 4 +- src/app/components/sequence-card/style.css.ts | 2 +- .../components/setting-tile/SettingTile.tsx | 2 +- src/app/components/sidebar/Sidebar.css.ts | 2 +- src/app/components/sidebar/SidebarContent.tsx | 2 +- src/app/components/sidebar/SidebarItem.tsx | 2 +- .../components/splash-screen/SplashScreen.tsx | 2 +- .../components/stacked-avatar/styles.css.ts | 6 +- .../TelemetryConsentBanner.tsx | 11 +- src/app/components/text-viewer/TextViewer.tsx | 2 +- src/app/components/time-date/PickerColumn.tsx | 2 +- src/app/components/uia-stages/DummyStage.tsx | 2 +- src/app/components/uia-stages/EmailStage.tsx | 10 +- .../components/uia-stages/PasswordStage.tsx | 4 +- .../components/uia-stages/ReCaptchaStage.tsx | 2 +- .../uia-stages/RegistrationTokenStage.tsx | 4 +- src/app/components/uia-stages/SSOStage.tsx | 2 +- src/app/components/uia-stages/TermsStage.tsx | 2 +- src/app/components/uia-stages/types.ts | 4 +- .../components/unread-badge/UnreadBadge.tsx | 2 +- .../components/upload-board/UploadBoard.tsx | 9 +- .../upload-card/CompactUploadCardRenderer.tsx | 9 +- .../components/upload-card/UploadCard.css.ts | 2 +- src/app/components/upload-card/UploadCard.tsx | 2 +- .../upload-card/UploadCardRenderer.tsx | 16 +- .../upload-card/UploadDescriptionEditor.tsx | 6 +- .../components/url-preview/UrlPreviewCard.tsx | 2 +- src/app/components/user-avatar/UserAvatar.tsx | 2 +- .../components/user-profile/CreatorChip.tsx | 4 +- src/app/components/user-profile/PowerChip.tsx | 4 +- src/app/components/user-profile/UserChips.tsx | 8 +- src/app/components/user-profile/UserHero.tsx | 2 +- .../user-profile/UserRoomProfile.tsx | 10 +- .../components/virtualizer/VirtualTile.tsx | 2 +- src/app/features/add-existing/AddExisting.tsx | 12 +- src/app/features/call-status/CallControl.tsx | 2 +- src/app/features/call-status/CallRoomName.tsx | 2 +- src/app/features/call-status/CallStatus.tsx | 2 +- src/app/features/call-status/LiveChip.tsx | 8 +- src/app/features/call-status/MemberGlance.tsx | 4 +- .../features/call-status/MemberSpeaking.tsx | 2 +- src/app/features/call/CallControls.tsx | 6 +- src/app/features/call/CallMemberCard.tsx | 9 +- src/app/features/call/CallView.tsx | 4 +- .../common-settings/cosmetics/Cosmetics.tsx | 14 +- .../developer-tools/DevelopTools.tsx | 4 +- .../developer-tools/SendRoomEvent.tsx | 4 +- .../developer-tools/StateEventEditor.tsx | 6 +- .../emojis-stickers/EmojisStickers.tsx | 2 +- .../emojis-stickers/RoomPacks.tsx | 10 +- .../common-settings/general/RoomAddress.tsx | 6 +- .../general/RoomEncryption.tsx | 4 +- .../general/RoomHistoryVisibility.tsx | 10 +- .../common-settings/general/RoomJoinRules.tsx | 8 +- .../common-settings/general/RoomProfile.tsx | 8 +- .../common-settings/general/RoomPublish.tsx | 6 +- .../common-settings/general/RoomUpgrade.tsx | 6 +- .../common-settings/members/Members.tsx | 14 +- .../permissions/PermissionGroups.tsx | 6 +- .../common-settings/permissions/Powers.tsx | 8 +- .../permissions/PowersEditor.tsx | 18 +- .../common-settings/permissions/types.ts | 2 +- src/app/features/create-chat/CreateChat.tsx | 4 +- src/app/features/create-room/CreateRoom.tsx | 6 +- .../features/create-room/CreateRoomModal.tsx | 2 +- src/app/features/create-space/CreateSpace.tsx | 6 +- .../create-space/CreateSpaceModal.tsx | 2 +- src/app/features/lobby/DnD.tsx | 4 +- src/app/features/lobby/HierarchyItemMenu.tsx | 10 +- src/app/features/lobby/Lobby.tsx | 18 +- src/app/features/lobby/LobbyHeader.tsx | 6 +- src/app/features/lobby/RoomItem.tsx | 6 +- src/app/features/lobby/SpaceHierarchy.tsx | 14 +- src/app/features/lobby/SpaceItem.tsx | 8 +- .../features/message-search/MessageSearch.tsx | 6 +- .../features/message-search/SearchFilters.tsx | 14 +- .../features/message-search/SearchInput.tsx | 2 +- .../message-search/SearchResultGroup.tsx | 12 +- .../message-search/useMessageSearch.ts | 12 +- src/app/features/room-nav/RoomNavItem.tsx | 6 +- src/app/features/room-nav/RoomNavUser.tsx | 4 +- .../features/room-settings/RoomSettings.tsx | 2 +- .../room-settings/RoomSettingsRenderer.tsx | 2 +- .../permissions/usePermissionItems.ts | 2 +- src/app/features/room/CommandAutocomplete.tsx | 12 +- src/app/features/room/MembersDrawer.tsx | 14 +- src/app/features/room/RoomCallButton.tsx | 6 +- src/app/features/room/RoomInput.tsx | 47 ++-- .../features/room/RoomInputPlaceholder.tsx | 2 +- src/app/features/room/RoomTimeline.css.ts | 2 +- src/app/features/room/RoomTimeline.tsx | 44 ++-- src/app/features/room/RoomViewFollowing.tsx | 2 +- src/app/features/room/RoomViewHeader.tsx | 12 +- src/app/features/room/RoomViewTyping.tsx | 2 +- src/app/features/room/ThreadBrowser.tsx | 12 +- src/app/features/room/ThreadDrawer.tsx | 16 +- .../features/room/jump-to-time/JumpToTime.tsx | 6 +- .../room/message/EncryptedContent.tsx | 4 +- src/app/features/room/message/Message.tsx | 22 +- .../features/room/message/MessageEditor.tsx | 26 +-- src/app/features/room/message/Reactions.tsx | 5 +- src/app/features/room/msgContent.ts | 6 +- .../room/reaction-viewer/ReactionViewer.tsx | 2 +- .../room/room-pin-menu/RoomPinMenu.tsx | 21 +- .../schedule-send/SchedulePickerDialog.tsx | 4 +- .../schedule-send/ScheduledMessagesList.tsx | 2 +- src/app/features/search/Search.tsx | 14 +- src/app/features/settings/Settings.tsx | 2 +- .../features/settings/account/BioEditor.tsx | 6 +- .../settings/account/IgnoredUserList.tsx | 2 +- src/app/features/settings/account/Profile.tsx | 8 +- .../settings/account/PronounEditor.tsx | 2 +- .../settings/account/StatusEditor.tsx | 2 +- .../settings/account/TimezoneEditor.tsx | 6 +- .../features/settings/cosmetics/Cosmetics.tsx | 6 +- .../features/settings/cosmetics/Themes.tsx | 11 +- .../developer-tools/DebugLogViewer.tsx | 17 +- .../settings/developer-tools/DevelopTools.tsx | 2 +- .../developer-tools/SentrySettings.tsx | 5 +- .../developer-tools/SyncDiagnostics.tsx | 2 +- .../features/settings/devices/DeviceTile.tsx | 4 +- .../features/settings/devices/LocalBackup.tsx | 2 +- .../settings/devices/OtherDevices.tsx | 4 +- .../settings/devices/Verification.tsx | 10 +- .../emojis-stickers/EmojisStickers.tsx | 2 +- .../settings/emojis-stickers/GlobalPacks.tsx | 12 +- src/app/features/settings/general/General.tsx | 46 ++-- .../settings/notifications/AllMessages.tsx | 6 +- .../notifications/KeywordMessages.tsx | 12 +- .../notifications/NotificationLevelsHint.tsx | 15 +- .../NotificationModeSwitcher.tsx | 6 +- .../notifications/PushNotifications.tsx | 4 +- .../notifications/SpecialMessages.tsx | 6 +- .../notifications/SystemNotification.tsx | 2 +- .../features/space-settings/SpaceSettings.tsx | 2 +- .../space-settings/SpaceSettingsRenderer.tsx | 2 +- .../permissions/usePermissionItems.ts | 2 +- .../features/widgets/GenericWidgetDriver.ts | 10 +- .../features/widgets/IntegrationManager.tsx | 6 +- src/app/features/widgets/WidgetIframe.tsx | 20 +- src/app/features/widgets/WidgetsDrawer.tsx | 6 +- src/app/hooks/types.ts | 2 +- src/app/hooks/useAccountData.ts | 2 +- src/app/hooks/useAccountDataCallback.ts | 2 +- src/app/hooks/useAppVisibility.ts | 2 +- src/app/hooks/useAsyncCallback.ts | 9 +- src/app/hooks/useAsyncSearch.ts | 12 +- src/app/hooks/useAuthFlows.ts | 2 +- src/app/hooks/useAuthMetadata.ts | 2 +- src/app/hooks/useAutoDiscoveryInfo.ts | 2 +- src/app/hooks/useCall.ts | 4 +- src/app/hooks/useCallEmbed.ts | 8 +- src/app/hooks/useCallSignaling.ts | 4 +- src/app/hooks/useCallSpeakers.ts | 2 +- src/app/hooks/useCapabilities.ts | 2 +- src/app/hooks/useCategoryHandler.ts | 2 +- src/app/hooks/useCommands.ts | 10 +- src/app/hooks/useComposingCheck.ts | 8 +- src/app/hooks/useCrossSigning.ts | 2 +- src/app/hooks/useDateFormat.ts | 2 +- src/app/hooks/useDebounce.ts | 4 +- src/app/hooks/useDeviceList.ts | 2 +- src/app/hooks/useDeviceVerificationStatus.ts | 2 +- src/app/hooks/useDirectUsers.ts | 2 +- src/app/hooks/useFileDrop.ts | 9 +- src/app/hooks/useFilePasteHandler.ts | 2 +- src/app/hooks/useGetRoom.ts | 2 +- src/app/hooks/useGroupDMMembers.ts | 2 +- src/app/hooks/useImagePackRooms.ts | 2 +- src/app/hooks/useImagePacks.ts | 6 +- src/app/hooks/useIntegrationManager.ts | 6 +- src/app/hooks/useKeyBackup.ts | 8 +- src/app/hooks/useLivekitSupport.ts | 2 +- src/app/hooks/useLocalRoomSummary.ts | 2 +- src/app/hooks/useMatrixClient.ts | 2 +- src/app/hooks/useMatrixEventRenderer.ts | 2 +- src/app/hooks/useMediaConfig.ts | 4 +- src/app/hooks/useMemberEventParser.tsx | 8 +- src/app/hooks/useMemberFilter.ts | 2 +- src/app/hooks/useMemberPowerCompare.ts | 2 +- src/app/hooks/useMemberPowerTag.ts | 10 +- src/app/hooks/useMemberSort.ts | 2 +- src/app/hooks/useMembership.ts | 2 +- src/app/hooks/useMentionClickHandler.ts | 4 +- src/app/hooks/useMessageSpacing.ts | 2 +- src/app/hooks/useMutualRooms.ts | 2 +- src/app/hooks/useNickname.ts | 2 +- src/app/hooks/useNotificationMode.ts | 2 +- src/app/hooks/useParsedLoginFlows.ts | 7 +- src/app/hooks/usePasswordEmail.ts | 6 +- src/app/hooks/usePowerLevelTags.ts | 6 +- src/app/hooks/usePowerLevels.ts | 2 +- src/app/hooks/usePushRule.ts | 10 +- src/app/hooks/useRecentEmoji.ts | 4 +- src/app/hooks/useRegisterEmail.ts | 6 +- src/app/hooks/useRoom.ts | 2 +- src/app/hooks/useRoomAccountData.ts | 2 +- src/app/hooks/useRoomAliases.ts | 8 +- src/app/hooks/useRoomCreators.ts | 4 +- src/app/hooks/useRoomCreatorsTag.ts | 2 +- src/app/hooks/useRoomEvent.ts | 6 +- src/app/hooks/useRoomEventReaders.ts | 2 +- src/app/hooks/useRoomLatestRenderedEvent.ts | 7 +- src/app/hooks/useRoomMembers.ts | 7 +- src/app/hooks/useRoomMeta.ts | 7 +- src/app/hooks/useRoomNavigate.ts | 2 +- src/app/hooks/useRoomPermissions.ts | 6 +- src/app/hooks/useRoomPinnedEvents.ts | 2 +- src/app/hooks/useRoomState.ts | 6 +- src/app/hooks/useRoomTypingMembers.ts | 4 +- src/app/hooks/useRoomWidgets.ts | 8 +- .../hooks/useRoomsNotificationPreferences.ts | 4 +- src/app/hooks/useSableCosmetics.ts | 2 +- src/app/hooks/useSecretStorage.ts | 4 +- src/app/hooks/useSessionProfiles.ts | 2 +- src/app/hooks/useSidebarItems.ts | 4 +- src/app/hooks/useSpace.ts | 2 +- src/app/hooks/useSpaceHierarchy.ts | 8 +- src/app/hooks/useSpecVersions.ts | 2 +- src/app/hooks/useSpoilerClickHandler.ts | 2 +- src/app/hooks/useStateEvent.ts | 4 +- src/app/hooks/useStateEventCallback.ts | 7 +- src/app/hooks/useSyncState.ts | 2 +- src/app/hooks/useTextAreaCodeEditor.ts | 4 +- src/app/hooks/useTextAreaIntent.ts | 4 +- src/app/hooks/useThrottle.ts | 4 +- src/app/hooks/useTypingStatusUpdater.ts | 2 +- src/app/hooks/useUIAFlows.ts | 2 +- src/app/hooks/useUserPresence.ts | 2 +- src/app/hooks/useUserProfile.ts | 2 +- src/app/hooks/useVerificationRequest.ts | 12 +- src/app/hooks/useVirtualPaginator.ts | 2 +- src/app/i18n.ts | 2 +- src/app/pages/FeatureCheck.tsx | 2 +- src/app/pages/MobileFriendly.tsx | 2 +- src/app/pages/Router.tsx | 4 +- src/app/pages/ThemeManager.tsx | 2 +- src/app/pages/auth/SSOLogin.tsx | 2 +- src/app/pages/auth/ServerPicker.tsx | 10 +- src/app/pages/auth/login/Login.tsx | 2 +- .../pages/auth/login/PasswordLoginForm.tsx | 8 +- src/app/pages/auth/login/TokenLogin.tsx | 4 +- src/app/pages/auth/login/loginUtil.ts | 9 +- .../auth/register/PasswordRegisterForm.tsx | 18 +- src/app/pages/auth/register/Register.tsx | 2 +- src/app/pages/auth/register/registerUtil.ts | 10 +- .../auth/reset-password/PasswordResetForm.tsx | 8 +- .../auth/reset-password/ResetPassword.tsx | 2 +- .../auth/reset-password/resetPasswordUtil.ts | 7 +- src/app/pages/client/AutoDiscovery.tsx | 4 +- .../pages/client/BackgroundNotifications.tsx | 12 +- src/app/pages/client/ClientBindAtoms.ts | 2 +- .../pages/client/ClientInitStorageAtom.tsx | 2 +- src/app/pages/client/ClientLayout.tsx | 2 +- src/app/pages/client/ClientNonUIFeatures.tsx | 4 +- .../ClientRoomsNotificationPreferences.tsx | 2 +- src/app/pages/client/ClientRoot.tsx | 13 +- src/app/pages/client/SpecVersions.tsx | 2 +- src/app/pages/client/SyncStatus.tsx | 2 +- src/app/pages/client/direct/Direct.tsx | 4 +- src/app/pages/client/direct/RoomProvider.tsx | 2 +- src/app/pages/client/explore/Explore.tsx | 2 +- src/app/pages/client/explore/Server.tsx | 12 +- src/app/pages/client/home/Home.tsx | 6 +- src/app/pages/client/home/RoomProvider.tsx | 2 +- src/app/pages/client/inbox/Invites.tsx | 7 +- src/app/pages/client/inbox/Notifications.tsx | 18 +- .../client/sidebar/AccountSwitcherTab.tsx | 6 +- src/app/pages/client/sidebar/CreateTab.tsx | 6 +- .../pages/client/sidebar/DirectDMsList.tsx | 2 +- src/app/pages/client/sidebar/DirectTab.tsx | 15 +- src/app/pages/client/sidebar/HomeTab.tsx | 15 +- src/app/pages/client/sidebar/SpaceTabs.tsx | 18 +- src/app/pages/client/space/RoomProvider.tsx | 2 +- src/app/pages/client/space/Space.tsx | 6 +- src/app/pages/client/space/SpaceProvider.tsx | 2 +- src/app/pages/pathSearchParam.ts | 2 +- src/app/pages/pathUtils.ts | 4 +- src/app/plugins/call/CallControl.ts | 8 +- src/app/plugins/call/CallEmbed.ts | 16 +- src/app/plugins/call/CallWidgetDriver.ts | 6 +- src/app/plugins/call/hooks.ts | 10 +- src/app/plugins/custom-emoji/ImagePack.ts | 6 +- .../plugins/custom-emoji/PackImageReader.ts | 4 +- .../plugins/custom-emoji/PackImagesReader.ts | 2 +- .../plugins/custom-emoji/PackMetaReader.ts | 2 +- .../plugins/custom-emoji/imagePackCache.ts | 2 +- src/app/plugins/custom-emoji/types.ts | 2 +- src/app/plugins/custom-emoji/utils.ts | 8 +- src/app/plugins/emoji.ts | 2 +- src/app/plugins/markdown/block/parser.ts | 2 +- src/app/plugins/markdown/block/rules.ts | 2 +- src/app/plugins/markdown/block/runner.ts | 2 +- src/app/plugins/markdown/block/type.ts | 2 +- src/app/plugins/markdown/inline/parser.ts | 2 +- src/app/plugins/markdown/inline/rules.ts | 2 +- src/app/plugins/markdown/inline/runner.ts | 4 +- src/app/plugins/markdown/inline/type.ts | 2 +- src/app/plugins/millify.ts | 2 +- src/app/plugins/react-custom-html-parser.tsx | 16 +- src/app/plugins/react-prism/ReactPrism.tsx | 2 +- src/app/plugins/recent-emoji.ts | 4 +- src/app/plugins/text-area/Operations.ts | 6 +- src/app/plugins/text-area/TextArea.ts | 2 +- .../plugins/text-area/TextAreaOperations.ts | 4 +- src/app/plugins/text-area/mods/Intent.ts | 4 +- src/app/plugins/utils.ts | 4 +- src/app/plugins/via-servers.ts | 6 +- src/app/state/backupRestore.ts | 2 +- src/app/state/callEmbed.ts | 2 +- src/app/state/callPreferences.ts | 2 +- src/app/state/closedLobbyCategories.ts | 2 +- src/app/state/closedNavCategories.ts | 2 +- src/app/state/createRoomModal.ts | 2 +- src/app/state/hooks/callPreferences.ts | 2 +- src/app/state/hooks/closedLobbyCategories.ts | 2 +- src/app/state/hooks/closedNavCategories.ts | 2 +- src/app/state/hooks/createRoomModal.ts | 4 +- src/app/state/hooks/createSpaceModal.ts | 2 +- src/app/state/hooks/navToActivePath.ts | 2 +- src/app/state/hooks/openedSidebarFolder.ts | 2 +- src/app/state/hooks/roomList.ts | 6 +- src/app/state/hooks/roomSettings.ts | 6 +- src/app/state/hooks/settings.ts | 2 +- src/app/state/hooks/spaceSettings.ts | 6 +- src/app/state/hooks/unread.ts | 4 +- src/app/state/hooks/useBindAtoms.ts | 2 +- src/app/state/hooks/userRoomProfile.ts | 6 +- src/app/state/mDirectList.ts | 2 +- src/app/state/mediaVolume.ts | 21 ++ src/app/state/modal.ts | 2 +- src/app/state/navToActivePath.ts | 4 +- src/app/state/nicknames.ts | 2 +- src/app/state/openedSidebarFolder.ts | 2 +- src/app/state/room-list/inviteList.ts | 6 +- src/app/state/room-list/roomList.ts | 4 +- src/app/state/room-list/utils.ts | 6 +- src/app/state/room/roomInputDrafts.ts | 8 +- src/app/state/room/roomToParents.ts | 8 +- src/app/state/room/roomToUnread.ts | 18 +- src/app/state/sentryStorage.ts | 34 +++ src/app/state/sessions.ts | 2 +- src/app/state/settings.ts | 4 +- src/app/state/typingMembers.ts | 6 +- src/app/state/upload.ts | 9 +- src/app/state/userRoomProfile.ts | 2 +- src/app/styles/ContainerColor.css.ts | 6 +- .../utils/addStickerToDefaultStickerPack.ts | 6 +- src/app/utils/colorMXID.ts | 2 +- src/app/utils/common.ts | 2 +- src/app/utils/debugLogger.ts | 4 +- src/app/utils/delayedEvents.ts | 13 +- src/app/utils/keyboard.ts | 6 +- src/app/utils/matrix-crypto.ts | 2 +- src/app/utils/matrix-uia.ts | 2 +- src/app/utils/matrix.ts | 18 +- src/app/utils/notifications.ts | 2 +- src/app/utils/room.ts | 30 +-- src/app/utils/sanitize.ts | 2 +- src/app/utils/sendFeedbackToUser.ts | 2 +- src/app/utils/sort.ts | 2 +- src/client/initMatrix.ts | 16 +- src/client/slidingSync.ts | 10 +- src/ext.d.ts | 8 +- src/index.tsx | 2 +- src/instrument.ts | 5 +- src/types/matrix-sdk-events.d.ts | 8 +- src/types/matrix/common.ts | 4 +- src/types/matrix/room.ts | 2 +- 499 files changed, 1812 insertions(+), 1272 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 src/app/state/mediaVolume.ts create mode 100644 src/app/state/sentryStorage.ts diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..5ee7abd87 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/eslint.config.js b/eslint.config.js index 9fa0c87bb..09a1e7417 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -111,8 +111,11 @@ const projectOverrides = defineConfig([ name: 'project/typescript-rule-overrides', files: tsFiles, rules: { - // disabled for now to get eslint to pass - '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + '@typescript-eslint/consistent-type-imports': [ + 'error', + { prefer: 'type-imports', fixStyle: 'inline-type-imports' }, + ], '@typescript-eslint/no-unsafe-enum-comparison': 'off', '@typescript-eslint/only-throw-error': 'off', '@typescript-eslint/array-type': 'off', @@ -131,6 +134,27 @@ const projectOverrides = defineConfig([ 'no-undef': 'off', }, }, + { + name: 'project/no-direct-localstorage-in-ui', + files: ['src/app/components/**/*.{ts,tsx}', 'src/app/features/**/*.{ts,tsx}'], + ignores: ['src/app/components/**/*.test.{ts,tsx}', 'src/app/features/**/*.test.{ts,tsx}'], + rules: { + 'no-restricted-properties': [ + 'error', + { + object: 'localStorage', + message: + 'Direct localStorage access is not allowed in components or features. Use an atom (atomWithLocalStorage) or a storage utility from src/app/state/ instead.', + }, + { + object: 'window', + property: 'localStorage', + message: + 'Direct localStorage access is not allowed in components or features. Use an atom (atomWithLocalStorage) or a storage utility from src/app/state/ instead.', + }, + ], + }, + }, ]); export default defineConfig([ diff --git a/package.json b/package.json index af125cf18..7f19cfa6b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,12 @@ "knip": "knip", "knope": "knope", "document-change": "knope document-change", - "postinstall": "node scripts/install-knope.js" + "postinstall": "node scripts/install-knope.js", + "prepare": "husky" + }, + "lint-staged": { + "*.{ts,tsx,js,jsx}": ["eslint --fix", "prettier --write"], + "*.{css,json,md,yaml,yml}": ["prettier --write"] }, "keywords": [], "author": "7w1", @@ -34,8 +39,8 @@ "@atlaskit/pragmatic-drag-and-drop-auto-scroll": "^1.4.0", "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0", "@fontsource-variable/nunito": "5.2.7", - "@sentry/react": "^10.43.0", "@fontsource/space-mono": "5.2.9", + "@sentry/react": "^10.43.0", "@tanstack/react-query": "^5.90.21", "@tanstack/react-query-devtools": "^5.91.3", "@tanstack/react-virtual": "^3.13.19", @@ -94,12 +99,12 @@ }, "devDependencies": { "@cloudflare/vite-plugin": "^1.26.0", - "@sableclient/sable-call-embedded": "v1.1.3", "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@eslint/compat": "2.0.2", "@eslint/js": "9.39.3", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-wasm": "^6.2.2", + "@sableclient/sable-call-embedded": "v1.1.3", "@sentry/vite-plugin": "^5.1.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -123,8 +128,10 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-prettier": "5.5.5", "globals": "17.3.0", + "husky": "^9.1.7", "jsdom": "^29.0.0", "knip": "5.85.0", + "lint-staged": "^16.4.0", "prettier": "3.8.1", "typescript": "^5.9.3", "vite": "^7.3.1", @@ -136,4 +143,4 @@ "vitest": "^4.1.0", "wrangler": "^4.70.0" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24937c80e..f1bd06e3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,12 +290,18 @@ importers: globals: specifier: 17.3.0 version: 17.3.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 jsdom: specifier: ^29.0.0 version: 29.0.0 knip: specifier: 5.85.0 version: 5.85.0(@types/node@24.10.13)(typescript@5.9.3) + lint-staged: + specifier: ^16.4.0 + version: 16.4.0 prettier: specifier: 3.8.1 version: 3.8.1 @@ -3093,10 +3099,18 @@ packages: another-json@0.2.0: resolution: {integrity: sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3105,6 +3119,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3307,6 +3325,14 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3322,6 +3348,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3517,6 +3550,9 @@ packages: electron-to-chromium@1.5.307: resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3547,6 +3583,10 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -3951,6 +3991,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -4083,6 +4127,11 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + i18next-browser-languagedetector@8.2.1: resolution: {integrity: sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==} @@ -4190,6 +4239,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -4443,6 +4496,15 @@ packages: linkifyjs@4.3.2: resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + lint-staged@16.4.0: + resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} + engines: {node: '>=20.17'} + hasBin: true + + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} + engines: {node: '>=20.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -4459,6 +4521,10 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + loglevel@1.9.2: resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} engines: {node: '>= 0.6.0'} @@ -4533,6 +4599,10 @@ packages: resolution: {integrity: sha512-H/E3J6t+DQs/F2YgfDhxUVZz/dF8JXPPKTLHL/yHCcLZLtCXJDUaqvhJXQwqOVBvbyNn4T0WjLpIHd7PAw7fBA==} hasBin: true + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -4650,6 +4720,10 @@ packages: resolution: {integrity: sha512-jNdst/U28Iasukx/L5MP6b274Vr7ftQs6qAhPBCvz6Wt5rPCA+Q/tUmCzfCHHWweWw5szeMy2Gfrm1rITwUKrw==} engines: {node: '>=18'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4946,10 +5020,17 @@ packages: engines: {node: '>= 0.4'} hasBin: true + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rollup@4.59.0: resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5072,6 +5153,14 @@ packages: slate@0.123.0: resolution: {integrity: sha512-Oon3HR/QzJQBjuOUJT1jGGlp8Ff7t3Bkr/rJ2lDqxNT4H+cBnXpEVQ/si6hn1ZCHhD2xY/2N91PQoH/rD7kxTg==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + smob@1.6.1: resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} engines: {node: '>=20.0.0'} @@ -5117,10 +5206,22 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.0: + resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} + engines: {node: '>=20'} + string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -5152,6 +5253,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -5649,6 +5754,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -8857,14 +8966,22 @@ snapshots: another-json@0.2.0: {} + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -9094,6 +9211,15 @@ snapshots: classnames@2.5.1: {} + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -9108,6 +9234,10 @@ snapshots: color-name@1.1.4: {} + colorette@2.0.20: {} + + commander@14.0.3: {} + commander@2.20.3: {} comment-parser@1.4.5: {} @@ -9276,6 +9406,8 @@ snapshots: electron-to-chromium@1.5.307: {} + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -9297,6 +9429,8 @@ snapshots: entities@7.0.1: {} + environment@1.1.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -9873,6 +10007,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.5.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -10033,6 +10169,8 @@ snapshots: transitivePeerDependencies: - supports-color + husky@9.1.7: {} + i18next-browser-languagedetector@8.2.1: dependencies: '@babel/runtime': 7.28.6 @@ -10141,6 +10279,10 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.5.0 + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -10382,6 +10524,24 @@ snapshots: linkifyjs@4.3.2: {} + lint-staged@16.4.0: + dependencies: + commander: 14.0.3 + listr2: 9.0.5 + picomatch: 4.0.3 + string-argv: 0.3.2 + tinyexec: 1.0.4 + yaml: 2.8.2 + + listr2@9.0.5: + dependencies: + cli-truncate: 5.2.0 + colorette: 2.0.20 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -10394,6 +10554,14 @@ snapshots: lodash@4.17.23: {} + log-update@6.1.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + loglevel@1.9.2: {} loose-envify@1.4.0: @@ -10477,6 +10645,8 @@ snapshots: dependencies: yargs: 17.7.2 + mimic-function@5.0.1: {} + min-indent@1.0.1: {} miniflare@4.20260310.0: @@ -10595,6 +10765,10 @@ snapshots: dependencies: jwt-decode: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -10939,8 +11113,15 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.1.0: {} + rfdc@1.4.1: {} + rollup@4.59.0: dependencies: '@types/estree': 1.0.8 @@ -11152,6 +11333,16 @@ snapshots: slate@0.123.0: {} + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + smob@1.6.1: {} smol-toml@1.6.0: {} @@ -11187,12 +11378,25 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + string-argv@0.3.2: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + string-width@8.2.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 @@ -11253,6 +11457,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + strip-bom@3.0.0: {} strip-comments@2.0.1: {} @@ -11847,6 +12055,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + ws@8.18.0: {} xml-name-validator@5.0.0: {} @@ -11857,8 +12071,7 @@ snapshots: yallist@3.1.1: {} - yaml@2.8.2: - optional: true + yaml@2.8.2: {} yargs-parser@21.1.1: {} diff --git a/src/app/components/AccountDataEditor.tsx b/src/app/components/AccountDataEditor.tsx index f8fd8445f..4639bcb73 100644 --- a/src/app/components/AccountDataEditor.tsx +++ b/src/app/components/AccountDataEditor.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { type FormEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Box, Text, @@ -14,7 +14,7 @@ import { Scroll, config, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { Cursor } from '$plugins/text-area'; import { syntaxErrorPosition } from '$utils/dom'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; diff --git a/src/app/components/ActionUIA.tsx b/src/app/components/ActionUIA.tsx index caffb0329..16d30d73b 100644 --- a/src/app/components/ActionUIA.tsx +++ b/src/app/components/ActionUIA.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { AuthDict, AuthType, IAuthData, UIAFlow } from '$types/matrix-sdk'; +import { type ReactNode } from 'react'; +import { type AuthDict, AuthType, type IAuthData, type UIAFlow } from '$types/matrix-sdk'; import { getUIAFlowForStages } from '$utils/matrix-uia'; import { useSupportedUIAFlows, useUIACompleted, useUIAFlow } from '$hooks/useUIAFlows'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/AuthFlowsLoader.tsx b/src/app/components/AuthFlowsLoader.tsx index 4ea21b92c..a4af0dd9b 100644 --- a/src/app/components/AuthFlowsLoader.tsx +++ b/src/app/components/AuthFlowsLoader.tsx @@ -1,12 +1,12 @@ -import { ReactNode, useCallback, useEffect, useMemo } from 'react'; -import { MatrixError, createClient } from '$types/matrix-sdk'; +import { type ReactNode, useCallback, useEffect, useMemo } from 'react'; +import { type MatrixError, createClient } from '$types/matrix-sdk'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; import { promiseFulfilledResult, promiseRejectedResult } from '$utils/common'; import { - AuthFlows, + type AuthFlows, RegisterFlowStatus, - RegisterFlowsResponse, + type RegisterFlowsResponse, parseRegisterErrResp, } from '$hooks/useAuthFlows'; diff --git a/src/app/components/BackRouteHandler.tsx b/src/app/components/BackRouteHandler.tsx index a6e91bcd1..6ce06352f 100644 --- a/src/app/components/BackRouteHandler.tsx +++ b/src/app/components/BackRouteHandler.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useCallback } from 'react'; +import { type ReactNode, useCallback } from 'react'; import { useSetAtom } from 'jotai'; import { matchPath, useLocation, useNavigate } from 'react-router-dom'; import { diff --git a/src/app/components/BackupRestore.tsx b/src/app/components/BackupRestore.tsx index 78d65dff4..f19a8f298 100644 --- a/src/app/components/BackupRestore.tsx +++ b/src/app/components/BackupRestore.tsx @@ -1,6 +1,6 @@ -import { MouseEventHandler, useCallback, useState } from 'react'; +import { type MouseEventHandler, useCallback, useState } from 'react'; import { useAtom } from 'jotai'; -import { CryptoApi, KeyBackupInfo } from '$types/matrix-sdk'; +import { type CryptoApi, type KeyBackupInfo } from '$types/matrix-sdk'; import { Badge, Box, @@ -14,7 +14,7 @@ import { percent, PopOut, ProgressBar, - RectCords, + type RectCords, Spinner, Text, } from 'folds'; diff --git a/src/app/components/CallEmbedProvider.tsx b/src/app/components/CallEmbedProvider.tsx index fe2f84468..4e88b0217 100644 --- a/src/app/components/CallEmbedProvider.tsx +++ b/src/app/components/CallEmbedProvider.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useCallback, useRef } from 'react'; +import { type ReactNode, useCallback, useRef } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; import { useAutoJoinCall } from '$hooks/useAutoJoinCall'; import { @@ -9,7 +9,7 @@ import { useCallThemeSync, useCallMemberSoundSync, } from '$hooks/useCallEmbed'; -import { CallEmbed, useClientWidgetApiEvent, ElementWidgetActions } from '$plugins/call'; +import { type CallEmbed, useClientWidgetApiEvent, ElementWidgetActions } from '$plugins/call'; import { callChatAtom, callEmbedAtom } from '$state/callEmbed'; import { useSelectedRoom } from '$hooks/router/useSelectedRoom'; import { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize'; diff --git a/src/app/components/ClientConfigLoader.tsx b/src/app/components/ClientConfigLoader.tsx index 92af0c149..4c04f1560 100644 --- a/src/app/components/ClientConfigLoader.tsx +++ b/src/app/components/ClientConfigLoader.tsx @@ -1,6 +1,6 @@ -import { ReactNode, useCallback, useEffect, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useState } from 'react'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { ClientConfig } from '$hooks/useClientConfig'; +import { type ClientConfig } from '$hooks/useClientConfig'; import { trimTrailingSlash } from '$utils/common'; const getClientConfig = async (): Promise => { diff --git a/src/app/components/ConfirmPasswordMatch.tsx b/src/app/components/ConfirmPasswordMatch.tsx index dea228924..a1ea3a5a6 100644 --- a/src/app/components/ConfirmPasswordMatch.tsx +++ b/src/app/components/ConfirmPasswordMatch.tsx @@ -1,4 +1,4 @@ -import { ReactNode, RefObject, useCallback, useRef, useState } from 'react'; +import { type ReactNode, type RefObject, useCallback, useRef, useState } from 'react'; import { useDebounce } from '$hooks/useDebounce'; type ConfirmPasswordMatchProps = { diff --git a/src/app/components/DeviceVerification.tsx b/src/app/components/DeviceVerification.tsx index fa29ae11e..4c718d66e 100644 --- a/src/app/components/DeviceVerification.tsx +++ b/src/app/components/DeviceVerification.tsx @@ -1,11 +1,11 @@ import { - ShowSasCallbacks, + type ShowSasCallbacks, VerificationPhase, - VerificationRequest, - Verifier, + type VerificationRequest, + type Verifier, VerificationMethod, } from '$types/matrix-sdk'; -import { CSSProperties, useCallback, useEffect, useState } from 'react'; +import { type CSSProperties, useCallback, useEffect, useState } from 'react'; import { Box, Button, diff --git a/src/app/components/DeviceVerificationSetup.tsx b/src/app/components/DeviceVerificationSetup.tsx index 78fe8ded2..c020eea50 100644 --- a/src/app/components/DeviceVerificationSetup.tsx +++ b/src/app/components/DeviceVerificationSetup.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, forwardRef, useCallback, useState } from 'react'; +import { type FormEventHandler, forwardRef, useCallback, useState } from 'react'; import { Dialog, Header, @@ -15,7 +15,7 @@ import { } from 'folds'; import FileSaver from 'file-saver'; import to from 'await-to-js'; -import { AuthDict, IAuthData, MatrixError, UIAuthCallback } from '$types/matrix-sdk'; +import { type AuthDict, type IAuthData, MatrixError, type UIAuthCallback } from '$types/matrix-sdk'; import { clearSecretStorageKeys } from '$client/secretStorageKeys'; import { ContainerColor } from '$styles/ContainerColor.css'; import { copyToClipboard } from '$utils/dom'; diff --git a/src/app/components/DeviceVerificationStatus.ts b/src/app/components/DeviceVerificationStatus.ts index f69c64ac9..6a5868125 100644 --- a/src/app/components/DeviceVerificationStatus.ts +++ b/src/app/components/DeviceVerificationStatus.ts @@ -1,8 +1,8 @@ -import { ReactNode } from 'react'; -import { CryptoApi } from '$types/matrix-sdk'; +import { type ReactNode } from 'react'; +import { type CryptoApi } from '$types/matrix-sdk'; import { useDeviceVerificationStatus, - VerificationStatus, + type VerificationStatus, } from '$hooks/useDeviceVerificationStatus'; type DeviceVerificationStatusProps = { diff --git a/src/app/components/HexColorPickerPopOut.tsx b/src/app/components/HexColorPickerPopOut.tsx index 25c5d661b..c111d90dd 100644 --- a/src/app/components/HexColorPickerPopOut.tsx +++ b/src/app/components/HexColorPickerPopOut.tsx @@ -1,6 +1,6 @@ import FocusTrap from 'focus-trap-react'; -import { Box, Button, config, Menu, PopOut, RectCords, Text } from 'folds'; -import { MouseEventHandler, ReactNode, useState } from 'react'; +import { Box, Button, config, Menu, PopOut, type RectCords, Text } from 'folds'; +import { type MouseEventHandler, type ReactNode, useState } from 'react'; import { stopPropagation } from '$utils/keyboard'; type HexColorPickerPopOutProps = { diff --git a/src/app/components/JoinRulesSwitcher.tsx b/src/app/components/JoinRulesSwitcher.tsx index 5b33b397d..e1c1eb05f 100644 --- a/src/app/components/JoinRulesSwitcher.tsx +++ b/src/app/components/JoinRulesSwitcher.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useMemo, useState } from 'react'; +import { type MouseEventHandler, useCallback, useMemo, useState } from 'react'; import { config, Box, @@ -6,8 +6,8 @@ import { Text, Icon, Icons, - IconSrc, - RectCords, + type IconSrc, + type RectCords, PopOut, Menu, Button, diff --git a/src/app/components/ManualVerification.tsx b/src/app/components/ManualVerification.tsx index 31903f957..cd087a3f6 100644 --- a/src/app/components/ManualVerification.tsx +++ b/src/app/components/ManualVerification.tsx @@ -1,11 +1,11 @@ -import { MouseEventHandler, ReactNode, useCallback, useState } from 'react'; +import { type MouseEventHandler, type ReactNode, useCallback, useState } from 'react'; import { Box, Text, Chip, Icon, Icons, - RectCords, + type RectCords, PopOut, Menu, config, @@ -13,7 +13,7 @@ import { color, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import { SecretStorageKeyContent } from '$types/matrix/accountData'; +import { type SecretStorageKeyContent } from '$types/matrix/accountData'; import { storePrivateKey } from '$client/secretStorageKeys'; import { stopPropagation } from '$utils/keyboard'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/Modal500.tsx b/src/app/components/Modal500.tsx index 260baa6d8..32dcc2c3a 100644 --- a/src/app/components/Modal500.tsx +++ b/src/app/components/Modal500.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import FocusTrap from 'focus-trap-react'; import { Modal, Overlay, OverlayBackdrop, OverlayCenter } from 'folds'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/components/Pdf-viewer/PdfViewer.tsx b/src/app/components/Pdf-viewer/PdfViewer.tsx index 71ab77efb..1667319a9 100644 --- a/src/app/components/Pdf-viewer/PdfViewer.tsx +++ b/src/app/components/Pdf-viewer/PdfViewer.tsx @@ -1,6 +1,6 @@ /* eslint-disable no-param-reassign */ -import { FormEventHandler, MouseEventHandler, useEffect, useRef, useState } from 'react'; +import { type FormEventHandler, type MouseEventHandler, useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import { Box, @@ -13,7 +13,7 @@ import { Input, Menu, PopOut, - RectCords, + type RectCords, Scroll, Spinner, Text, diff --git a/src/app/components/RenderMessageContent.tsx b/src/app/components/RenderMessageContent.tsx index b892f7691..8dba19fa9 100644 --- a/src/app/components/RenderMessageContent.tsx +++ b/src/app/components/RenderMessageContent.tsx @@ -3,8 +3,8 @@ import { MsgType } from '$types/matrix-sdk'; import { testMatrixTo } from '$plugins/matrix-to'; import { useSetting } from '$state/hooks/settings'; import { settingsAtom, CaptionPosition } from '$state/settings'; -import { HTMLReactParserOptions } from 'html-react-parser'; -import { Opts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts } from 'linkifyjs'; import { Box, config } from 'folds'; import { AudioContent, diff --git a/src/app/components/RoomNotificationSwitcher.tsx b/src/app/components/RoomNotificationSwitcher.tsx index 268758500..cdc29efac 100644 --- a/src/app/components/RoomNotificationSwitcher.tsx +++ b/src/app/components/RoomNotificationSwitcher.tsx @@ -1,5 +1,5 @@ -import { Box, config, Icon, Menu, MenuItem, PopOut, RectCords, Text } from 'folds'; -import { MouseEventHandler, ReactNode, useMemo, useState } from 'react'; +import { Box, config, Icon, Menu, MenuItem, PopOut, type RectCords, Text } from 'folds'; +import { type MouseEventHandler, type ReactNode, useMemo, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { stopPropagation } from '$utils/keyboard'; import { diff --git a/src/app/components/RoomSummaryLoader.tsx b/src/app/components/RoomSummaryLoader.tsx index 93baa5721..0a8fb135e 100644 --- a/src/app/components/RoomSummaryLoader.tsx +++ b/src/app/components/RoomSummaryLoader.tsx @@ -1,9 +1,9 @@ -import { ReactNode, useCallback, useState } from 'react'; -import { MatrixClient, Room, IHierarchyRoom } from '$types/matrix-sdk'; +import { type ReactNode, useCallback, useState } from 'react'; +import { type MatrixClient, type Room, type IHierarchyRoom } from '$types/matrix-sdk'; import { useQuery } from '@tanstack/react-query'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { LocalRoomSummary, useLocalRoomSummary } from '$hooks/useLocalRoomSummary'; -import { AsyncState, AsyncStatus } from '$hooks/useAsyncCallback'; +import { type LocalRoomSummary, useLocalRoomSummary } from '$hooks/useLocalRoomSummary'; +import { type AsyncState, AsyncStatus } from '$hooks/useAsyncCallback'; export type IRoomSummary = Awaited>; diff --git a/src/app/components/RoomUnreadProvider.tsx b/src/app/components/RoomUnreadProvider.tsx index 5a1fc13a6..cfa4d8f66 100644 --- a/src/app/components/RoomUnreadProvider.tsx +++ b/src/app/components/RoomUnreadProvider.tsx @@ -1,5 +1,5 @@ -import { ReactElement } from 'react'; -import { Unread } from '$types/matrix/room'; +import { type ReactElement } from 'react'; +import { type Unread } from '$types/matrix/room'; import { useRoomUnread, useRoomsUnread } from '$state/hooks/unread'; import { roomToUnreadAtom } from '$state/room/roomToUnread'; diff --git a/src/app/components/SecretStorage.tsx b/src/app/components/SecretStorage.tsx index 07b2e15d5..3f8849247 100644 --- a/src/app/components/SecretStorage.tsx +++ b/src/app/components/SecretStorage.tsx @@ -1,7 +1,10 @@ -import { FormEventHandler, useCallback } from 'react'; +import { type FormEventHandler, useCallback } from 'react'; import { Box, Text, Button, Spinner, color } from 'folds'; import { decodeRecoveryKey, deriveRecoveryKeyFromPassphrase } from '$types/matrix-sdk'; -import { SecretStorageKeyContent, SecretStoragePassphraseContent } from '$types/matrix/accountData'; +import { + type SecretStorageKeyContent, + type SecretStoragePassphraseContent, +} from '$types/matrix/accountData'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useAlive } from '$hooks/useAlive'; diff --git a/src/app/components/ServerConfigsLoader.tsx b/src/app/components/ServerConfigsLoader.tsx index 3f7b395e5..7c212d1fd 100644 --- a/src/app/components/ServerConfigsLoader.tsx +++ b/src/app/components/ServerConfigsLoader.tsx @@ -1,8 +1,12 @@ -import { ReactNode, useCallback, useMemo } from 'react'; -import { Capabilities, validateAuthMetadata, ValidatedAuthMetadata } from '$types/matrix-sdk'; +import { type ReactNode, useCallback, useMemo } from 'react'; +import { + type Capabilities, + validateAuthMetadata, + type ValidatedAuthMetadata, +} from '$types/matrix-sdk'; import { AsyncStatus, useAsyncCallbackValue } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { MediaConfig } from '$hooks/useMediaConfig'; +import { type MediaConfig } from '$hooks/useMediaConfig'; import { promiseFulfilledResult } from '$utils/common'; import { createLogger } from '$utils/debug'; diff --git a/src/app/components/SpecVersionsLoader.tsx b/src/app/components/SpecVersionsLoader.tsx index 2bbbff272..2ac87f5d3 100644 --- a/src/app/components/SpecVersionsLoader.tsx +++ b/src/app/components/SpecVersionsLoader.tsx @@ -1,6 +1,6 @@ -import { ReactNode, useCallback, useEffect, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useState } from 'react'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { SpecVersions, specVersions } from '../cs-api'; +import { type SpecVersions, specVersions } from '../cs-api'; type SpecVersionsLoaderProps = { baseUrl: string; diff --git a/src/app/components/SupportedUIAFlowsLoader.tsx b/src/app/components/SupportedUIAFlowsLoader.tsx index cd3f81499..4c839600f 100644 --- a/src/app/components/SupportedUIAFlowsLoader.tsx +++ b/src/app/components/SupportedUIAFlowsLoader.tsx @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { UIAFlow } from '$types/matrix-sdk'; +import { type ReactNode } from 'react'; +import { type UIAFlow } from '$types/matrix-sdk'; import { useSupportedUIAFlows } from '$hooks/useUIAFlows'; export function SupportedUIAFlowsLoader({ diff --git a/src/app/components/SwipeableChatWrapper.tsx b/src/app/components/SwipeableChatWrapper.tsx index 2eba0d011..0811c54be 100644 --- a/src/app/components/SwipeableChatWrapper.tsx +++ b/src/app/components/SwipeableChatWrapper.tsx @@ -1,16 +1,16 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { motion, useMotionValue, useSpring } from 'framer-motion'; import { useDrag } from '@use-gesture/react'; import { useAtomValue } from 'jotai'; import { settingsAtom, RightSwipeAction } from '$state/settings'; import { mobileOrTablet } from '$utils/user-agent'; -interface SwipeableChatWrapperProps { +type SwipeableChatWrapperProps = { children: ReactNode; onOpenSidebar?: () => void; onOpenMembers?: () => void; onReply?: () => void; -} +}; export function SwipeableChatWrapper({ children, diff --git a/src/app/components/SwipeableMessageWrapper.tsx b/src/app/components/SwipeableMessageWrapper.tsx index 4b219355c..e697fc24b 100644 --- a/src/app/components/SwipeableMessageWrapper.tsx +++ b/src/app/components/SwipeableMessageWrapper.tsx @@ -1,6 +1,6 @@ import { useMotionValue, useSpring, useTransform, motion } from 'framer-motion'; import { useDrag } from '@use-gesture/react'; -import { ReactNode, useMemo, useState } from 'react'; +import { type ReactNode, useMemo, useState } from 'react'; import { useAtomValue } from 'jotai'; import { config, Icon, Icons } from 'folds'; import { mobileOrTablet } from '$utils/user-agent'; diff --git a/src/app/components/SwipeableOverlayWrapper.tsx b/src/app/components/SwipeableOverlayWrapper.tsx index 15521bb12..6cc488204 100644 --- a/src/app/components/SwipeableOverlayWrapper.tsx +++ b/src/app/components/SwipeableOverlayWrapper.tsx @@ -1,15 +1,15 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { motion, useMotionValue, useSpring } from 'framer-motion'; import { useDrag } from '@use-gesture/react'; import { useAtomValue } from 'jotai'; import { settingsAtom } from '$state/settings'; import { mobileOrTablet } from '$utils/user-agent'; -interface SwipeableOverlayWrapperProps { +type SwipeableOverlayWrapperProps = { children: ReactNode; onClose: () => void; direction: 'left' | 'right'; -} +}; export function SwipeableOverlayWrapper({ children, diff --git a/src/app/components/UIAFlowOverlay.tsx b/src/app/components/UIAFlowOverlay.tsx index 85211a0f0..57ea24be9 100644 --- a/src/app/components/UIAFlowOverlay.tsx +++ b/src/app/components/UIAFlowOverlay.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Overlay, OverlayBackdrop, diff --git a/src/app/components/UseStateProvider.tsx b/src/app/components/UseStateProvider.tsx index 21e5b3cad..cb62b7903 100644 --- a/src/app/components/UseStateProvider.tsx +++ b/src/app/components/UseStateProvider.tsx @@ -1,4 +1,4 @@ -import { Dispatch, ReactElement, SetStateAction, useState } from 'react'; +import { type Dispatch, type ReactElement, type SetStateAction, useState } from 'react'; type UseStateProviderProps = { initial: T | (() => T); diff --git a/src/app/components/UserRoomProfileRenderer.tsx b/src/app/components/UserRoomProfileRenderer.tsx index 97489d277..f2e0780ae 100644 --- a/src/app/components/UserRoomProfileRenderer.tsx +++ b/src/app/components/UserRoomProfileRenderer.tsx @@ -1,7 +1,7 @@ import { Menu, PopOut, toRem } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useCloseUserRoomProfile, useUserRoomProfileState } from '$state/hooks/userRoomProfile'; -import { UserRoomProfileState } from '$state/userRoomProfile'; +import { type UserRoomProfileState } from '$state/userRoomProfile'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; import { stopPropagation } from '$utils/keyboard'; import { SpaceProvider } from '$hooks/useSpace'; diff --git a/src/app/components/create-room/AdditionalCreatorInput.tsx b/src/app/components/create-room/AdditionalCreatorInput.tsx index f362122a0..4ef005125 100644 --- a/src/app/components/create-room/AdditionalCreatorInput.tsx +++ b/src/app/components/create-room/AdditionalCreatorInput.tsx @@ -10,7 +10,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Text, toRem, @@ -18,9 +18,9 @@ import { import { isKeyHotkey } from 'is-hotkey'; import FocusTrap from 'focus-trap-react'; import { - ChangeEventHandler, - KeyboardEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useMemo, useState, } from 'react'; @@ -28,7 +28,7 @@ import { getMxIdLocalPart, getMxIdServer, isUserId } from '$utils/matrix'; import { useDirectUsers } from '$hooks/useDirectUsers'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { stopPropagation } from '$utils/keyboard'; -import { useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { useAsyncSearch, type UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; import { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser'; import { SettingTile } from '$components/setting-tile'; diff --git a/src/app/components/create-room/CreateRoomAccessSelector.tsx b/src/app/components/create-room/CreateRoomAccessSelector.tsx index 6dd049835..f20c03955 100644 --- a/src/app/components/create-room/CreateRoomAccessSelector.tsx +++ b/src/app/components/create-room/CreateRoomAccessSelector.tsx @@ -1,4 +1,4 @@ -import { Box, Text, Icon, Icons, config, IconSrc } from 'folds'; +import { Box, Text, Icon, Icons, config, type IconSrc } from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; import { CreateRoomAccess } from './types'; diff --git a/src/app/components/create-room/CreateRoomAliasInput.tsx b/src/app/components/create-room/CreateRoomAliasInput.tsx index 0460717a5..570edb0bb 100644 --- a/src/app/components/create-room/CreateRoomAliasInput.tsx +++ b/src/app/components/create-room/CreateRoomAliasInput.tsx @@ -1,6 +1,6 @@ import { - FormEventHandler, - KeyboardEventHandler, + type FormEventHandler, + type KeyboardEventHandler, useCallback, useEffect, useRef, @@ -12,7 +12,7 @@ import { isKeyHotkey } from 'is-hotkey'; import { getMxIdServer } from '$utils/matrix'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { replaceSpaceWithDash } from '$utils/common'; -import { AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; +import { type AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; import { useDebounce } from '$hooks/useDebounce'; export function CreateRoomAliasInput({ disabled }: { disabled?: boolean }) { diff --git a/src/app/components/create-room/CreateRoomTypeSelector.tsx b/src/app/components/create-room/CreateRoomTypeSelector.tsx index 42468a03d..c47bb4f0c 100644 --- a/src/app/components/create-room/CreateRoomTypeSelector.tsx +++ b/src/app/components/create-room/CreateRoomTypeSelector.tsx @@ -1,4 +1,4 @@ -import { Box, Text, Icon, Icons, config, IconSrc } from 'folds'; +import { Box, Text, Icon, Icons, config, type IconSrc } from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; import { BetaNoticeBadge } from '$components/BetaNoticeBadge'; diff --git a/src/app/components/create-room/RoomVersionSelector.tsx b/src/app/components/create-room/RoomVersionSelector.tsx index a86b1d2df..c3d7fe3af 100644 --- a/src/app/components/create-room/RoomVersionSelector.tsx +++ b/src/app/components/create-room/RoomVersionSelector.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useState } from 'react'; +import { type MouseEventHandler, useState } from 'react'; import { Box, Button, @@ -8,7 +8,7 @@ import { Icons, Menu, PopOut, - RectCords, + type RectCords, Text, toRem, } from 'folds'; diff --git a/src/app/components/create-room/utils.ts b/src/app/components/create-room/utils.ts index d03226823..2a47a1b13 100644 --- a/src/app/components/create-room/utils.ts +++ b/src/app/components/create-room/utils.ts @@ -1,11 +1,11 @@ import { - ICreateRoomOpts, - ICreateRoomStateEvent, + type ICreateRoomOpts, + type ICreateRoomStateEvent, JoinRule, - MatrixClient, + type MatrixClient, RestrictedAllowType, - Room, - RoomJoinRulesEventContent, + type Room, + type RoomJoinRulesEventContent, } from '$types/matrix-sdk'; import { RoomType, StateEvent } from '$types/matrix/room'; import { getViaServers } from '$plugins/via-servers'; diff --git a/src/app/components/cutout-card/CutoutCard.tsx b/src/app/components/cutout-card/CutoutCard.tsx index 5a6c2ae3d..24860264f 100644 --- a/src/app/components/cutout-card/CutoutCard.tsx +++ b/src/app/components/cutout-card/CutoutCard.tsx @@ -1,4 +1,4 @@ -import { as, ContainerColor as TContainerColor } from 'folds'; +import { as, type ContainerColor as TContainerColor } from 'folds'; import classNames from 'classnames'; import { ContainerColor } from '$styles/ContainerColor.css'; import * as css from './CutoutCard.css'; diff --git a/src/app/components/editor/Editor.tsx b/src/app/components/editor/Editor.tsx index 27df4cf6c..16f96b40b 100644 --- a/src/app/components/editor/Editor.tsx +++ b/src/app/components/editor/Editor.tsx @@ -1,28 +1,28 @@ /* eslint-disable no-param-reassign */ import { - ClipboardEventHandler, - KeyboardEventHandler, - ReactNode, + type ClipboardEventHandler, + type KeyboardEventHandler, + type ReactNode, forwardRef, useCallback, useState, } from 'react'; import { Box, Scroll, Text } from 'folds'; -import { Descendant, Editor, createEditor } from 'slate'; +import { type Descendant, type Editor, createEditor } from 'slate'; import { Slate, Editable, withReact, - RenderLeafProps, - RenderElementProps, - RenderPlaceholderProps, + type RenderLeafProps, + type RenderElementProps, + type RenderPlaceholderProps, ReactEditor, } from 'slate-react'; import { withHistory } from 'slate-history'; import { mobileOrTablet } from '$utils/user-agent'; import { BlockType } from './types'; import { RenderElement, RenderLeaf } from './Elements'; -import { CustomElement } from './slate'; +import { type CustomElement } from './slate'; import * as css from './Editor.css'; import { toggleKeyboardShortcut } from './keyboard'; diff --git a/src/app/components/editor/Elements.tsx b/src/app/components/editor/Elements.tsx index 7e3500810..bdf361788 100644 --- a/src/app/components/editor/Elements.tsx +++ b/src/app/components/editor/Elements.tsx @@ -1,7 +1,7 @@ import { Scroll, Text } from 'folds'; import { - RenderElementProps, - RenderLeafProps, + type RenderElementProps, + type RenderLeafProps, useFocused, useSelected, useSlate, @@ -15,7 +15,12 @@ import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { nicknamesAtom } from '$state/nicknames'; import { BlockType } from './types'; import { getBeginCommand } from './utils'; -import { CommandElement, EmoticonElement, LinkElement, MentionElement } from './slate'; +import { + type CommandElement, + type EmoticonElement, + type LinkElement, + type MentionElement, +} from './slate'; // Put this at the start and end of an inline component to work around this Chromium bug: // https://bugs.chromium.org/p/chromium/issues/detail?id=1249405 diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index 62cd9356a..10c7c21d9 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -6,18 +6,18 @@ import { Icon, IconButton, Icons, - IconSrc, + type IconSrc, Line, Menu, PopOut, - RectCords, + type RectCords, Scroll, Text, Tooltip, TooltipProvider, toRem, } from 'folds'; -import { MouseEventHandler, ReactNode, useState } from 'react'; +import { type MouseEventHandler, type ReactNode, useState } from 'react'; import { ReactEditor, useSlate } from 'slate-react'; import { isMacOS } from '$utils/user-agent'; import { KeySymbol } from '$utils/key-symbol'; @@ -25,7 +25,7 @@ import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { stopPropagation } from '$utils/keyboard'; import { floatingToolbar } from '$styles/overrides/Composer.css'; -import { HeadingLevel } from './slate'; +import { type HeadingLevel } from './slate'; import { BlockType, MarkType } from './types'; import * as css from './Editor.css'; import { diff --git a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx index 0b82001b5..9a73d486e 100644 --- a/src/app/components/editor/autocomplete/AutocompleteMenu.tsx +++ b/src/app/components/editor/autocomplete/AutocompleteMenu.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect, useLayoutEffect, useRef, useState } from 'react'; +import { type ReactNode, useEffect, useLayoutEffect, useRef, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Header, Menu, Scroll, config } from 'folds'; diff --git a/src/app/components/editor/autocomplete/AutocompleteNotice.tsx b/src/app/components/editor/autocomplete/AutocompleteNotice.tsx index a9b21e8cf..859d8048f 100644 --- a/src/app/components/editor/autocomplete/AutocompleteNotice.tsx +++ b/src/app/components/editor/autocomplete/AutocompleteNotice.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Header, Menu } from 'folds'; import { BaseAutocompleteMenu } from './BaseAutocompleteMenu'; import * as css from './AutocompleteMenu.css'; diff --git a/src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx b/src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx index 9f1bf316f..9d6de8d03 100644 --- a/src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx +++ b/src/app/components/editor/autocomplete/BaseAutocompleteMenu.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import * as css from './AutocompleteMenu.css'; type BaseAutocompleteMenuProps = { diff --git a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx index 85e0c0e3e..64361b95a 100644 --- a/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/EmoticonAutocomplete.tsx @@ -1,25 +1,25 @@ -import { KeyboardEvent as ReactKeyboardEvent, useEffect, useMemo } from 'react'; -import { Editor } from 'slate'; +import { type KeyboardEvent as ReactKeyboardEvent, useEffect, useMemo } from 'react'; +import { type Editor } from 'slate'; import { ReactEditor } from 'slate-react'; import { Box, MenuItem, Text, toRem } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; +import { type UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; import { onTabPress } from '$utils/keyboard'; import { useRecentEmoji } from '$hooks/useRecentEmoji'; import { useRelevantImagePacks } from '$hooks/useImagePacks'; -import { IEmoji, emojis } from '$plugins/emoji'; +import { type IEmoji, emojis } from '$plugins/emoji'; import { useKeyDown } from '$hooks/useKeyDown'; import { mxcUrlToHttp } from '$utils/matrix'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { ImageUsage, PackImageReader } from '$plugins/custom-emoji'; +import { ImageUsage, type PackImageReader } from '$plugins/custom-emoji'; import { getEmoticonSearchStr } from '$plugins/utils'; import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { createEmoticonElement, moveCursor, replaceWithElement } from '$components/editor/utils'; import { AutocompleteMenu } from './AutocompleteMenu'; -import { AutocompleteQuery } from './autocompleteQuery'; +import { type AutocompleteQuery } from './autocompleteQuery'; type EmoticonCompleteHandler = (key: string, shortcode: string) => void; diff --git a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx index ff690edce..3cf9817ff 100644 --- a/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/RoomMentionAutocomplete.tsx @@ -1,14 +1,14 @@ -import { KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect } from 'react'; -import { Editor } from 'slate'; +import { type KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect } from 'react'; +import { type Editor } from 'slate'; import { ReactEditor } from 'slate-react'; import { Avatar, Icon, Icons, MenuItem, Text } from 'folds'; -import { JoinRule, MatrixClient } from '$types/matrix-sdk'; +import { JoinRule, type MatrixClient } from '$types/matrix-sdk'; import { useAtomValue } from 'jotai'; import { getDirectRoomAvatarUrl } from '$utils/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { getMxIdServer, isRoomAlias } from '$utils/matrix'; -import { UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; +import { type UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; import { onTabPress } from '$utils/keyboard'; import { useKeyDown } from '$hooks/useKeyDown'; import { mDirectAtom } from '$state/mDirectList'; @@ -18,7 +18,7 @@ import { RoomAvatar, RoomIcon } from '$components/room-avatar'; import { getViaServers } from '$plugins/via-servers'; import { createMentionElement, moveCursor, replaceWithElement } from '$components/editor/utils'; import { AutocompleteMenu } from './AutocompleteMenu'; -import { AutocompleteQuery } from './autocompleteQuery'; +import { type AutocompleteQuery } from './autocompleteQuery'; type MentionAutoCompleteHandler = (roomAliasOrId: string, name: string) => void; diff --git a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx index e47fe9d07..3017a5bf5 100644 --- a/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx +++ b/src/app/components/editor/autocomplete/UserMentionAutocomplete.tsx @@ -1,12 +1,16 @@ -import { useEffect, KeyboardEvent as ReactKeyboardEvent } from 'react'; -import { Editor } from 'slate'; +import { useEffect, type KeyboardEvent as ReactKeyboardEvent } from 'react'; +import { type Editor } from 'slate'; import { ReactEditor } from 'slate-react'; import { Avatar, Icon, Icons, MenuItem, Text } from 'folds'; -import { MatrixClient, Room, RoomMember } from '$types/matrix-sdk'; +import { type MatrixClient, type Room, type RoomMember } from '$types/matrix-sdk'; import { useRoomMembers } from '$hooks/useRoomMembers'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { SearchItemStrGetter, UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; +import { + type SearchItemStrGetter, + type UseAsyncSearchOptions, + useAsyncSearch, +} from '$hooks/useAsyncSearch'; import { onTabPress } from '$utils/keyboard'; import { useKeyDown } from '$hooks/useKeyDown'; import { getMxIdLocalPart, getMxIdServer, isUserId } from '$utils/matrix'; @@ -18,7 +22,7 @@ import { useAtomValue } from 'jotai'; import { nicknamesAtom } from '$state/nicknames'; import { createMentionElement, moveCursor, replaceWithElement } from '$components/editor/utils'; import { AutocompleteMenu } from './AutocompleteMenu'; -import { AutocompleteQuery } from './autocompleteQuery'; +import { type AutocompleteQuery } from './autocompleteQuery'; type MentionAutoCompleteHandler = (userId: string, name: string) => void; diff --git a/src/app/components/editor/autocomplete/autocompleteQuery.ts b/src/app/components/editor/autocomplete/autocompleteQuery.ts index 5b8294afb..b1c86df9c 100644 --- a/src/app/components/editor/autocomplete/autocompleteQuery.ts +++ b/src/app/components/editor/autocomplete/autocompleteQuery.ts @@ -1,4 +1,4 @@ -import { BaseRange, Editor } from 'slate'; +import { type BaseRange, Editor } from 'slate'; export enum AutocompletePrefix { RoomMention = '#', diff --git a/src/app/components/editor/input.ts b/src/app/components/editor/input.ts index 27a6b68fc..8a919ab84 100644 --- a/src/app/components/editor/input.ts +++ b/src/app/components/editor/input.ts @@ -1,6 +1,6 @@ -import { Descendant, Text } from 'slate'; +import { type Descendant, Text } from 'slate'; import parse from 'html-dom-parser'; -import { ChildNode, Element, isText, isTag } from 'domhandler'; +import { type ChildNode, type Element, isText, isTag } from 'domhandler'; import { sanitizeCustomHtml } from '$utils/sanitize'; import { @@ -12,19 +12,19 @@ import { import { escapeMarkdownInlineSequences, escapeMarkdownBlockSequences } from '$plugins/markdown'; import { BlockType, MarkType } from './types'; import { - BlockQuoteElement, - CodeBlockElement, - CodeLineElement, - EmoticonElement, - HeadingElement, - HeadingLevel, - HorizontalRuleElement, - InlineElement, - MentionElement, - OrderedListElement, - ParagraphElement, - SmallElement, - UnorderedListElement, + type BlockQuoteElement, + type CodeBlockElement, + type CodeLineElement, + type EmoticonElement, + type HeadingElement, + type HeadingLevel, + type HorizontalRuleElement, + type InlineElement, + type MentionElement, + type OrderedListElement, + type ParagraphElement, + type SmallElement, + type UnorderedListElement, } from './slate'; import { createEmoticonElement, createMentionElement } from './utils'; diff --git a/src/app/components/editor/keyboard.ts b/src/app/components/editor/keyboard.ts index a920a9050..ff9c796ed 100644 --- a/src/app/components/editor/keyboard.ts +++ b/src/app/components/editor/keyboard.ts @@ -1,5 +1,5 @@ import { isKeyHotkey } from 'is-hotkey'; -import { KeyboardEvent } from 'react'; +import { type KeyboardEvent } from 'react'; import { Editor, Element as SlateElement, Range, Transforms } from 'slate'; import { isAnyMarkActive, isBlockActive, removeAllMark, toggleBlock, toggleMark } from './utils'; import { BlockType, MarkType } from './types'; diff --git a/src/app/components/editor/output.ts b/src/app/components/editor/output.ts index 9e3901925..b5bf6d7aa 100644 --- a/src/app/components/editor/output.ts +++ b/src/app/components/editor/output.ts @@ -1,5 +1,5 @@ -import { Descendant, Editor, Text } from 'slate'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type Descendant, type Editor, Text } from 'slate'; +import { type MatrixClient } from '$types/matrix-sdk'; import { sanitizeText } from '$utils/sanitize'; import { parseBlockMD, @@ -10,7 +10,7 @@ import { import { findAndReplace } from '$utils/findAndReplace'; import { sanitizeForRegex } from '$utils/regex'; import { isUserId } from '$utils/matrix'; -import { CustomElement } from './slate'; +import { type CustomElement } from './slate'; import { BlockType } from './types'; export type OutputOptions = { diff --git a/src/app/components/editor/slate.d.ts b/src/app/components/editor/slate.d.ts index 81d690fbc..09ef3a8a0 100644 --- a/src/app/components/editor/slate.d.ts +++ b/src/app/components/editor/slate.d.ts @@ -1,7 +1,7 @@ -import { BaseEditor } from 'slate'; -import { ReactEditor } from 'slate-react'; -import { HistoryEditor } from 'slate-history'; -import { BlockType } from './types'; +import { type BaseEditor } from 'slate'; +import { type ReactEditor } from 'slate-react'; +import { type HistoryEditor } from 'slate-history'; +import { type BlockType } from './types'; export type HeadingLevel = 1 | 2 | 3; @@ -115,9 +115,9 @@ export type CustomElement = | HorizontalRuleElement; declare module 'slate' { - interface CustomTypes { + type CustomTypes = { Editor: Editor; Element: CustomElement; Text: FormattedText & Text; - } + }; } diff --git a/src/app/components/editor/utils.ts b/src/app/components/editor/utils.ts index 85ff437a1..31f69f075 100644 --- a/src/app/components/editor/utils.ts +++ b/src/app/components/editor/utils.ts @@ -1,12 +1,21 @@ -import { BasePoint, BaseRange, Editor, Element, Point, Range, Text, Transforms } from 'slate'; +import { + type BasePoint, + type BaseRange, + Editor, + Element, + Point, + Range, + Text, + Transforms, +} from 'slate'; import { BlockType, MarkType } from './types'; import { - CommandElement, - EmoticonElement, - FormattedText, - HeadingLevel, - LinkElement, - MentionElement, + type CommandElement, + type EmoticonElement, + type FormattedText, + type HeadingLevel, + type LinkElement, + type MentionElement, } from './slate'; const ALL_MARK_TYPE: MarkType[] = [ @@ -220,10 +229,10 @@ export const moveCursor = (editor: Editor, withSpace?: boolean) => { Transforms.collapse(editor, { edge: 'end' }); }; -interface PointUntilCharOptions { +type PointUntilCharOptions = { match: (char: string) => boolean; reverse?: boolean; -} +}; export const getPointUntilChar = ( editor: Editor, cursorPoint: BasePoint, diff --git a/src/app/components/emoji-board/EmojiBoard.tsx b/src/app/components/emoji-board/EmojiBoard.tsx index 193caf71d..ce43c387c 100644 --- a/src/app/components/emoji-board/EmojiBoard.tsx +++ b/src/app/components/emoji-board/EmojiBoard.tsx @@ -1,9 +1,9 @@ import { - ChangeEventHandler, - FocusEventHandler, - MouseEventHandler, - ReactNode, - RefObject, + type ChangeEventHandler, + type FocusEventHandler, + type MouseEventHandler, + type ReactNode, + type RefObject, useCallback, useEffect, useMemo, @@ -12,22 +12,22 @@ import { import { Box, config, Icons, Scroll } from 'folds'; import FocusTrap from 'focus-trap-react'; import { isKeyHotkey } from 'is-hotkey'; -import { Room } from '$types/matrix-sdk'; -import { atom, PrimitiveAtom, useAtom, useSetAtom } from 'jotai'; +import { type Room } from '$types/matrix-sdk'; +import { atom, type PrimitiveAtom, useAtom, useSetAtom } from 'jotai'; import { useVirtualizer } from '@tanstack/react-virtual'; -import { IEmoji, emojiGroups, emojis } from '$plugins/emoji'; +import { type IEmoji, emojiGroups, emojis } from '$plugins/emoji'; import { preventScrollWithArrowKey, stopPropagation } from '$utils/keyboard'; import { useRelevantImagePacks } from '$hooks/useImagePacks'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useRecentEmoji } from '$hooks/useRecentEmoji'; import { isUserId, mxcUrlToHttp } from '$utils/matrix'; import { editableActiveElement, targetFromEvent } from '$utils/dom'; -import { useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { useAsyncSearch, type UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; import { useDebounce } from '$hooks/useDebounce'; import { useThrottle } from '$hooks/useThrottle'; import { addRecentEmoji } from '$plugins/recent-emoji'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { ImagePack, ImageUsage, PackImageReader } from '$plugins/custom-emoji'; +import { type ImagePack, ImageUsage, type PackImageReader } from '$plugins/custom-emoji'; import { getEmoticonSearchStr } from '$plugins/utils'; import { VirtualTile } from '$components/virtualizer'; import { useSetting } from '$state/hooks/settings'; @@ -43,7 +43,7 @@ import { NoStickerPacks, createPreviewDataAtom, Preview, - PreviewData, + type PreviewData, EmojiItem, StickerItem, CustomEmojiItem, diff --git a/src/app/components/emoji-board/components/Group.tsx b/src/app/components/emoji-board/components/Group.tsx index 293ac6145..97836e9d7 100644 --- a/src/app/components/emoji-board/components/Group.tsx +++ b/src/app/components/emoji-board/components/Group.tsx @@ -1,5 +1,5 @@ import { as, Box, Text } from 'folds'; -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; import * as css from './styles.css'; diff --git a/src/app/components/emoji-board/components/Item.tsx b/src/app/components/emoji-board/components/Item.tsx index c593b5db0..895316d18 100644 --- a/src/app/components/emoji-board/components/Item.tsx +++ b/src/app/components/emoji-board/components/Item.tsx @@ -1,9 +1,9 @@ import { Box } from 'folds'; -import { MatrixClient } from '$types/matrix-sdk'; -import { PackImageReader } from '$plugins/custom-emoji'; -import { IEmoji } from '$plugins/emoji'; +import { type MatrixClient } from '$types/matrix-sdk'; +import { type PackImageReader } from '$plugins/custom-emoji'; +import { type IEmoji } from '$plugins/emoji'; import { mxcUrlToHttp } from '$utils/matrix'; -import { EmojiItemInfo, EmojiType } from '$components/emoji-board/types'; +import { type EmojiItemInfo, EmojiType } from '$components/emoji-board/types'; import * as css from './styles.css'; const ANIMATED_MIME_TYPES = new Set(['image/gif', 'image/apng']); diff --git a/src/app/components/emoji-board/components/Layout.tsx b/src/app/components/emoji-board/components/Layout.tsx index 286006896..8453f494b 100644 --- a/src/app/components/emoji-board/components/Layout.tsx +++ b/src/app/components/emoji-board/components/Layout.tsx @@ -1,5 +1,5 @@ import { as, Box, Line } from 'folds'; -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; import * as css from './styles.css'; diff --git a/src/app/components/emoji-board/components/Preview.tsx b/src/app/components/emoji-board/components/Preview.tsx index 1f7cef289..65444a1cf 100644 --- a/src/app/components/emoji-board/components/Preview.tsx +++ b/src/app/components/emoji-board/components/Preview.tsx @@ -1,5 +1,5 @@ import { Box, Text } from 'folds'; -import { Atom, atom, useAtomValue } from 'jotai'; +import { type Atom, atom, useAtomValue } from 'jotai'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { mxcUrlToHttp } from '$utils/matrix'; diff --git a/src/app/components/emoji-board/components/SearchInput.tsx b/src/app/components/emoji-board/components/SearchInput.tsx index c3c80e939..8896d8ad9 100644 --- a/src/app/components/emoji-board/components/SearchInput.tsx +++ b/src/app/components/emoji-board/components/SearchInput.tsx @@ -1,4 +1,4 @@ -import { ChangeEventHandler, useRef } from 'react'; +import { type ChangeEventHandler, useRef } from 'react'; import { Input, Chip, Icon, Icons, Text } from 'folds'; import { mobileOrTablet } from '$utils/user-agent'; diff --git a/src/app/components/emoji-board/components/Sidebar.tsx b/src/app/components/emoji-board/components/Sidebar.tsx index 70bf87902..d03c9a4a4 100644 --- a/src/app/components/emoji-board/components/Sidebar.tsx +++ b/src/app/components/emoji-board/components/Sidebar.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, Scroll, @@ -9,7 +9,7 @@ import { Text, IconButton, Icon, - IconSrc, + type IconSrc, Icons, } from 'folds'; import classNames from 'classnames'; diff --git a/src/app/components/emoji-board/components/Tabs.tsx b/src/app/components/emoji-board/components/Tabs.tsx index bef95c145..63546d651 100644 --- a/src/app/components/emoji-board/components/Tabs.tsx +++ b/src/app/components/emoji-board/components/Tabs.tsx @@ -1,4 +1,4 @@ -import { CSSProperties } from 'react'; +import { type CSSProperties } from 'react'; import { Badge, Box, Text } from 'folds'; import { EmojiBoardTab } from '$components/emoji-board/types'; diff --git a/src/app/components/emoji-board/useEmojiGroupIcons.ts b/src/app/components/emoji-board/useEmojiGroupIcons.ts index 0b59fbcd9..623885149 100644 --- a/src/app/components/emoji-board/useEmojiGroupIcons.ts +++ b/src/app/components/emoji-board/useEmojiGroupIcons.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { IconSrc, Icons } from 'folds'; +import { type IconSrc, Icons } from 'folds'; import { EmojiGroupId } from '$plugins/emoji'; diff --git a/src/app/components/event-history/EventHistory.tsx b/src/app/components/event-history/EventHistory.tsx index 955a2846f..a36d5c036 100644 --- a/src/app/components/event-history/EventHistory.tsx +++ b/src/app/components/event-history/EventHistory.tsx @@ -14,7 +14,7 @@ import { color, config, } from 'folds'; -import { IContent, MatrixEvent, Room } from '$types/matrix-sdk'; +import { type IContent, type MatrixEvent, type Room } from '$types/matrix-sdk'; import { getMemberDisplayName } from '$utils/room'; import { getMxIdLocalPart } from '$utils/matrix'; import { useMatrixClient } from '$hooks/useMatrixClient'; @@ -30,8 +30,8 @@ import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { useCallback, useMemo, useState } from 'react'; import { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser'; -import { Opts as LinkifyOpts } from 'linkifyjs'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; import { modalAtom, ModalType } from '$state/modal'; import { roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts'; diff --git a/src/app/components/event-readers/EventReaders.tsx b/src/app/components/event-readers/EventReaders.tsx index 6bb1737b4..b94efbb3e 100644 --- a/src/app/components/event-readers/EventReaders.tsx +++ b/src/app/components/event-readers/EventReaders.tsx @@ -12,7 +12,7 @@ import { as, config, } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useRoomEventReaders } from '$hooks/useRoomEventReaders'; import { getMemberDisplayName } from '$utils/room'; import { getMxIdLocalPart } from '$utils/matrix'; diff --git a/src/app/components/image-pack-view/ImagePackContent.tsx b/src/app/components/image-pack-view/ImagePackContent.tsx index 6f56d70f3..e89108254 100644 --- a/src/app/components/image-pack-view/ImagePackContent.tsx +++ b/src/app/components/image-pack-view/ImagePackContent.tsx @@ -1,18 +1,18 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { as, Box, Text, config, Button, Menu, Spinner } from 'folds'; import { - ImagePack, - ImageUsage, - PackContent, - PackImage, + type ImagePack, + type ImageUsage, + type PackContent, + type PackImage, PackImageReader, packMetaEqual, PackMetaReader, } from '$plugins/custom-emoji'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useFilePicker } from '$hooks/useFilePicker'; -import { UploadSuccess } from '$state/upload'; -import { getImageInfo, TUploadContent } from '$utils/matrix'; +import { type UploadSuccess } from '$state/upload'; +import { getImageInfo, type TUploadContent } from '$utils/matrix'; import { getImageFileUrl, loadImageElement, renameFile } from '$utils/dom'; import { replaceSpaceWithDash, suffixRename } from '$utils/common'; import { getFileNameWithoutExt } from '$utils/mimeTypes'; diff --git a/src/app/components/image-pack-view/ImagePackView.tsx b/src/app/components/image-pack-view/ImagePackView.tsx index 304275e54..b79fd7b3b 100644 --- a/src/app/components/image-pack-view/ImagePackView.tsx +++ b/src/app/components/image-pack-view/ImagePackView.tsx @@ -1,5 +1,5 @@ import { Box, IconButton, Text, Icon, Icons, Scroll, Chip } from 'folds'; -import { PackAddress } from '$plugins/custom-emoji'; +import { type PackAddress } from '$plugins/custom-emoji'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { Page, PageHeader, PageContent } from '$components/page'; import { RoomImagePack } from './RoomImagePack'; diff --git a/src/app/components/image-pack-view/ImageTile.tsx b/src/app/components/image-pack-view/ImageTile.tsx index 2070f00e4..ee7e74fbe 100644 --- a/src/app/components/image-pack-view/ImageTile.tsx +++ b/src/app/components/image-pack-view/ImageTile.tsx @@ -1,10 +1,10 @@ -import { FormEventHandler, ReactNode, useMemo, useState } from 'react'; +import { type FormEventHandler, type ReactNode, useMemo, useState } from 'react'; import { Badge, Box, Button, Chip, Icon, Icons, Input, Text } from 'folds'; import { mxcUrlToHttp } from '$utils/matrix'; -import { ImageUsage, imageUsageEqual, PackImageReader } from '$plugins/custom-emoji'; +import { type ImageUsage, imageUsageEqual, PackImageReader } from '$plugins/custom-emoji'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useObjectURL } from '$hooks/useObjectURL'; -import { createUploadAtom, TUploadAtom } from '$state/upload'; +import { createUploadAtom, type TUploadAtom } from '$state/upload'; import { replaceSpaceWithDash } from '$utils/common'; import { SettingTile } from '$components/setting-tile'; import * as css from './style.css'; diff --git a/src/app/components/image-pack-view/PackMeta.tsx b/src/app/components/image-pack-view/PackMeta.tsx index 77e8a42f5..a45f75b49 100644 --- a/src/app/components/image-pack-view/PackMeta.tsx +++ b/src/app/components/image-pack-view/PackMeta.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useMemo, useState } from 'react'; +import { type FormEventHandler, useCallback, useMemo, useState } from 'react'; import { Box, Text, @@ -21,7 +21,7 @@ import { LINKIFY_OPTS } from '$plugins/react-custom-html-parser'; import { ContainerColor } from '$styles/ContainerColor.css'; import { useFilePicker } from '$hooks/useFilePicker'; import { useObjectURL } from '$hooks/useObjectURL'; -import { createUploadAtom, UploadSuccess } from '$state/upload'; +import { createUploadAtom, type UploadSuccess } from '$state/upload'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { PackMetaReader } from '$plugins/custom-emoji'; import { CompactUploadCardRenderer } from '$components/upload-card'; diff --git a/src/app/components/image-pack-view/RoomImagePack.tsx b/src/app/components/image-pack-view/RoomImagePack.tsx index 01f0f7dd7..1feb08e62 100644 --- a/src/app/components/image-pack-view/RoomImagePack.tsx +++ b/src/app/components/image-pack-view/RoomImagePack.tsx @@ -1,8 +1,8 @@ import { useCallback, useMemo } from 'react'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { usePowerLevels } from '$hooks/usePowerLevels'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { ImagePack, PackContent } from '$plugins/custom-emoji'; +import { ImagePack, type PackContent } from '$plugins/custom-emoji'; import { StateEvent } from '$types/matrix/room'; import { useRoomImagePack } from '$hooks/useImagePacks'; import { randomStr } from '$utils/common'; diff --git a/src/app/components/image-pack-view/UsageSwitcher.tsx b/src/app/components/image-pack-view/UsageSwitcher.tsx index 201a40aaa..4b022dc69 100644 --- a/src/app/components/image-pack-view/UsageSwitcher.tsx +++ b/src/app/components/image-pack-view/UsageSwitcher.tsx @@ -1,5 +1,16 @@ -import { MouseEventHandler, useMemo, useState } from 'react'; -import { Box, Button, config, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text } from 'folds'; +import { type MouseEventHandler, useMemo, useState } from 'react'; +import { + Box, + Button, + config, + Icon, + Icons, + Menu, + MenuItem, + PopOut, + type RectCords, + Text, +} from 'folds'; import FocusTrap from 'focus-trap-react'; import { ImageUsage } from '$plugins/custom-emoji'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/components/image-pack-view/UserImagePack.tsx b/src/app/components/image-pack-view/UserImagePack.tsx index a723b83ab..f16b34d1d 100644 --- a/src/app/components/image-pack-view/UserImagePack.tsx +++ b/src/app/components/image-pack-view/UserImagePack.tsx @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react'; -import { ImagePack, PackContent } from '$plugins/custom-emoji'; +import { ImagePack, type PackContent } from '$plugins/custom-emoji'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AccountDataEvent } from '$types/matrix/accountData'; import { useUserImagePack } from '$hooks/useImagePacks'; diff --git a/src/app/components/image-viewer/ImageViewer.tsx b/src/app/components/image-viewer/ImageViewer.tsx index e08430f1c..e750c6749 100644 --- a/src/app/components/image-viewer/ImageViewer.tsx +++ b/src/app/components/image-viewer/ImageViewer.tsx @@ -1,4 +1,4 @@ -import { WheelEvent } from 'react'; +import { type WheelEvent } from 'react'; import FileSaver from 'file-saver'; import classNames from 'classnames'; import { Box, Chip, Header, Icon, IconButton, Icons, Text, as } from 'folds'; diff --git a/src/app/components/info-card/InfoCard.tsx b/src/app/components/info-card/InfoCard.tsx index 6070479ca..44761abba 100644 --- a/src/app/components/info-card/InfoCard.tsx +++ b/src/app/components/info-card/InfoCard.tsx @@ -1,5 +1,5 @@ -import { Box, ContainerColor, Text } from 'folds'; -import { ReactNode } from 'react'; +import { Box, type ContainerColor, Text } from 'folds'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; import { BreakWord } from '$styles/Text.css'; import { ContainerColor as ContainerClr } from '$styles/ContainerColor.css'; diff --git a/src/app/components/invite-user-prompt/InviteUserPrompt.tsx b/src/app/components/invite-user-prompt/InviteUserPrompt.tsx index c8fbabef5..ef7bf65e5 100644 --- a/src/app/components/invite-user-prompt/InviteUserPrompt.tsx +++ b/src/app/components/invite-user-prompt/InviteUserPrompt.tsx @@ -1,7 +1,7 @@ import { - ChangeEventHandler, - FormEventHandler, - KeyboardEventHandler, + type ChangeEventHandler, + type FormEventHandler, + type KeyboardEventHandler, useCallback, useMemo, useRef, @@ -29,14 +29,14 @@ import { Scroll, MenuItem, } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { isKeyHotkey } from 'is-hotkey'; import FocusTrap from 'focus-trap-react'; import { stopPropagation } from '$utils/keyboard'; import { useDirectUsers } from '$hooks/useDirectUsers'; import { getMxIdLocalPart, getMxIdServer, isUserId } from '$utils/matrix'; import { Membership } from '$types/matrix/room'; -import { useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { useAsyncSearch, type UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; import { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/join-address-prompt/JoinAddressPrompt.tsx b/src/app/components/join-address-prompt/JoinAddressPrompt.tsx index d6a6478d2..956bf669b 100644 --- a/src/app/components/join-address-prompt/JoinAddressPrompt.tsx +++ b/src/app/components/join-address-prompt/JoinAddressPrompt.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useState } from 'react'; +import { type FormEventHandler, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Dialog, diff --git a/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx b/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx index 36cdd89de..de80ab323 100644 --- a/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx +++ b/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx @@ -16,7 +16,7 @@ import { Button, Spinner, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx index 5bee7af26..96345bc0c 100644 --- a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx +++ b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx @@ -16,7 +16,7 @@ import { Button, Spinner, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/components/media/Image.tsx b/src/app/components/media/Image.tsx index 29990e99e..0fc4e5f33 100644 --- a/src/app/components/media/Image.tsx +++ b/src/app/components/media/Image.tsx @@ -1,4 +1,4 @@ -import { ImgHTMLAttributes, forwardRef } from 'react'; +import { type ImgHTMLAttributes, forwardRef } from 'react'; import classNames from 'classnames'; import * as css from './media.css'; diff --git a/src/app/components/media/MediaControls.tsx b/src/app/components/media/MediaControls.tsx index 2360b9f96..ceb7d6c04 100644 --- a/src/app/components/media/MediaControls.tsx +++ b/src/app/components/media/MediaControls.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, as } from 'folds'; export type MediaControlProps = { diff --git a/src/app/components/media/Video.tsx b/src/app/components/media/Video.tsx index c28efcaa3..2d65fb2f3 100644 --- a/src/app/components/media/Video.tsx +++ b/src/app/components/media/Video.tsx @@ -1,5 +1,6 @@ -import { VideoHTMLAttributes, forwardRef, useEffect, useRef } from 'react'; +import { type VideoHTMLAttributes, forwardRef, useEffect, useRef } from 'react'; import classNames from 'classnames'; +import { getMediaVolume, setMediaVolume } from '$state/mediaVolume'; import * as css from './media.css'; export const Video = forwardRef>( @@ -9,8 +10,6 @@ export const Video = forwardRef(null); useEffect(() => { - const stored = localStorage.getItem(MEDIA_VOLUME_KEY); - if (innerRef.current && stored !== null) { - const parsed = parseFloat(stored); - if (!Number.isNaN(parsed)) innerRef.current.volume = parsed; - } + const volume = getMediaVolume(); + if (innerRef.current && volume !== undefined) innerRef.current.volume = volume; }, []); return ( @@ -30,7 +26,7 @@ export function PersistedVolumeVideo({ {...props} ref={innerRef} onVolumeChange={(e) => { - localStorage.setItem(MEDIA_VOLUME_KEY, String((e.target as HTMLVideoElement).volume)); + setMediaVolume((e.target as HTMLVideoElement).volume); onVolumeChange?.(e); }} /> diff --git a/src/app/components/member-tile/MemberTile.tsx b/src/app/components/member-tile/MemberTile.tsx index 9af782eef..a983ab9f7 100644 --- a/src/app/components/member-tile/MemberTile.tsx +++ b/src/app/components/member-tile/MemberTile.tsx @@ -1,6 +1,6 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { as, Avatar, Box, Icon, Icons, Text } from 'folds'; -import { MatrixClient, Room, RoomMember } from '$types/matrix-sdk'; +import { type MatrixClient, type Room, type RoomMember } from '$types/matrix-sdk'; import { getMemberDisplayName } from '$utils/room'; import { getMxIdLocalPart } from '$utils/matrix'; import { useSableCosmetics } from '$hooks/useSableCosmetics'; diff --git a/src/app/components/message/FileHeader.tsx b/src/app/components/message/FileHeader.tsx index 36d8adeb1..c800c4a08 100644 --- a/src/app/components/message/FileHeader.tsx +++ b/src/app/components/message/FileHeader.tsx @@ -1,6 +1,6 @@ import { Badge, Box, Icon, IconButton, Icons, Spinner, Text, as, toRem } from 'folds'; -import { ReactNode, useCallback } from 'react'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type ReactNode, useCallback } from 'react'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; import FileSaver from 'file-saver'; import { mimeTypeToExt } from '$utils/mimeTypes'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/message/MsgTypeRenderers.tsx b/src/app/components/message/MsgTypeRenderers.tsx index edd1af26c..b6b4ec16b 100644 --- a/src/app/components/message/MsgTypeRenderers.tsx +++ b/src/app/components/message/MsgTypeRenderers.tsx @@ -1,19 +1,19 @@ -import { CSSProperties, ReactNode, useMemo } from 'react'; +import { type CSSProperties, type ReactNode, useMemo } from 'react'; import { Box, Chip, Icon, Icons, Text, toRem } from 'folds'; -import { IContent } from '$types/matrix-sdk'; +import { type IContent } from '$types/matrix-sdk'; import { JUMBO_EMOJI_REG, URL_REG } from '$utils/regex'; import { trimReplyFromBody } from '$utils/room'; import { - IAudioContent, - IAudioInfo, - IEncryptedFile, - IFileContent, - IFileInfo, - IImageContent, - IImageInfo, - IThumbnailContent, - IVideoContent, - IVideoInfo, + type IAudioContent, + type IAudioInfo, + type IEncryptedFile, + type IFileContent, + type IFileInfo, + type IImageContent, + type IImageInfo, + type IThumbnailContent, + type IVideoContent, + type IVideoInfo, MATRIX_SPOILER_PROPERTY_NAME, MATRIX_SPOILER_REASON_PROPERTY_NAME, } from '$types/matrix/common'; diff --git a/src/app/components/message/Reaction.tsx b/src/app/components/message/Reaction.tsx index 155de11f4..f411adb24 100644 --- a/src/app/components/message/Reaction.tsx +++ b/src/app/components/message/Reaction.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { Box, Icon, Icons, Text, as } from 'folds'; import classNames from 'classnames'; -import { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk'; +import { type MatrixClient, type MatrixEvent, type Room } from '$types/matrix-sdk'; import { getHexcodeForEmoji, getShortcodeFor } from '$plugins/emoji'; import { getMemberDisplayName } from '$utils/room'; import { eventWithShortcode, getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix'; diff --git a/src/app/components/message/RenderBody.tsx b/src/app/components/message/RenderBody.tsx index bfd3bdc5f..9dbf6b770 100644 --- a/src/app/components/message/RenderBody.tsx +++ b/src/app/components/message/RenderBody.tsx @@ -1,6 +1,6 @@ -import parse, { HTMLReactParserOptions } from 'html-react-parser'; +import parse, { type HTMLReactParserOptions } from 'html-react-parser'; import Linkify from 'linkify-react'; -import { Opts } from 'linkifyjs'; +import { type Opts } from 'linkifyjs'; import { sanitizeCustomHtml } from '$utils/sanitize'; import { highlightText, scaleSystemEmoji } from '$plugins/react-custom-html-parser'; import { MessageEmptyContent } from './content'; diff --git a/src/app/components/message/Reply.tsx b/src/app/components/message/Reply.tsx index 1e047e9e9..1e70e858d 100644 --- a/src/app/components/message/Reply.tsx +++ b/src/app/components/message/Reply.tsx @@ -1,6 +1,6 @@ import { Box, Chip, Icon, Icons, Text, as, color, toRem } from 'folds'; -import { EventTimelineSet, Room } from '$types/matrix-sdk'; -import { MouseEventHandler, ReactNode, useCallback, useMemo } from 'react'; +import { type EventTimelineSet, type Room } from '$types/matrix-sdk'; +import { type MouseEventHandler, type ReactNode, useCallback, useMemo } from 'react'; import { useQueryClient } from '@tanstack/react-query'; import classNames from 'classnames'; import parse from 'html-react-parser'; diff --git a/src/app/components/message/Time.tsx b/src/app/components/message/Time.tsx index dc190d93d..844a2f1b7 100644 --- a/src/app/components/message/Time.tsx +++ b/src/app/components/message/Time.tsx @@ -1,4 +1,4 @@ -import { ComponentProps } from 'react'; +import { type ComponentProps } from 'react'; import { Text, as, Tooltip, TooltipProvider } from 'folds'; import { timeDayMonYear, diff --git a/src/app/components/message/attachment/Attachment.css.ts b/src/app/components/message/attachment/Attachment.css.ts index dad95f616..213ac1066 100644 --- a/src/app/components/message/attachment/Attachment.css.ts +++ b/src/app/components/message/attachment/Attachment.css.ts @@ -1,5 +1,5 @@ import { style } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; import { DefaultReset, color, config, toRem } from 'folds'; export const Attachment = recipe({ diff --git a/src/app/components/message/content/AudioContent.tsx b/src/app/components/message/content/AudioContent.tsx index 26d74db88..31a69381c 100644 --- a/src/app/components/message/content/AudioContent.tsx +++ b/src/app/components/message/content/AudioContent.tsx @@ -1,13 +1,13 @@ /* eslint-disable jsx-a11y/media-has-caption */ -import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import { Badge, Chip, Icon, IconButton, Icons, ProgressBar, Spinner, Text, toRem } from 'folds'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; import { Range } from 'react-range'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { IAudioInfo } from '$types/matrix/common'; +import { type IAudioInfo } from '$types/matrix/common'; import { - PlayTimeCallback, + type PlayTimeCallback, useMediaLoading, useMediaPlay, useMediaPlayTimeCallback, @@ -18,7 +18,7 @@ import { useThrottle } from '$hooks/useThrottle'; import { secondsToMinutesAndSeconds } from '$utils/common'; import { decryptFile, downloadEncryptedMedia, downloadMedia, mxcUrlToHttp } from '$utils/matrix'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { MEDIA_VOLUME_KEY } from '$components/media'; +import { getMediaVolume, setMediaVolume } from '$state/mediaVolume'; const PLAY_TIME_THROTTLE_OPS = { wait: 500, @@ -62,11 +62,8 @@ export function AudioContent({ const audioRef = useRef(null); useEffect(() => { - const stored = localStorage.getItem(MEDIA_VOLUME_KEY); - if (audioRef.current && stored !== null) { - const parsed = parseFloat(stored); - if (!Number.isNaN(parsed)) audioRef.current.volume = parsed; - } + const volume = getMediaVolume(); + if (audioRef.current && volume !== undefined) audioRef.current.volume = volume; }, []); const [currentTime, setCurrentTime] = useState(0); @@ -211,7 +208,7 @@ export function AudioContent({ autoPlay ref={audioRef} onVolumeChange={(e) => { - localStorage.setItem(MEDIA_VOLUME_KEY, String((e.target as HTMLAudioElement).volume)); + setMediaVolume((e.target as HTMLAudioElement).volume); }} > {srcState.status === AsyncStatus.Success && } diff --git a/src/app/components/message/content/EventContent.tsx b/src/app/components/message/content/EventContent.tsx index 35449e1ba..bcdd8cb63 100644 --- a/src/app/components/message/content/EventContent.tsx +++ b/src/app/components/message/content/EventContent.tsx @@ -1,5 +1,5 @@ -import { Box, Icon, IconSrc } from 'folds'; -import { ReactNode } from 'react'; +import { Box, Icon, type IconSrc } from 'folds'; +import { type ReactNode } from 'react'; import { MessageLayout } from '$state/settings'; import { BubbleLayout, CompactLayout, ModernLayout } from '$components/message/layout'; diff --git a/src/app/components/message/content/FileContent.tsx b/src/app/components/message/content/FileContent.tsx index af802d46b..89c50ec52 100644 --- a/src/app/components/message/content/FileContent.tsx +++ b/src/app/components/message/content/FileContent.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useCallback, useState } from 'react'; +import { type ReactNode, useCallback, useState } from 'react'; import { Box, Button, @@ -15,9 +15,9 @@ import { as, } from 'folds'; import FileSaver from 'file-saver'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; import FocusTrap from 'focus-trap-react'; -import { IFileInfo } from '$types/matrix/common'; +import { type IFileInfo } from '$types/matrix/common'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { bytesToSize } from '$utils/common'; diff --git a/src/app/components/message/content/ImageContent.tsx b/src/app/components/message/content/ImageContent.tsx index 92be5f9d6..6a5fa76c5 100644 --- a/src/app/components/message/content/ImageContent.tsx +++ b/src/app/components/message/content/ImageContent.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useCallback, useEffect, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useState } from 'react'; import { Badge, Box, @@ -22,8 +22,8 @@ import { import classNames from 'classnames'; import { BlurhashCanvas } from 'react-blurhash'; import FocusTrap from 'focus-trap-react'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; -import { IImageInfo, MATRIX_BLUR_HASH_PROPERTY_NAME } from '$types/matrix/common'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type IImageInfo, MATRIX_BLUR_HASH_PROPERTY_NAME } from '$types/matrix/common'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { bytesToSize } from '$utils/common'; diff --git a/src/app/components/message/content/ThumbnailContent.tsx b/src/app/components/message/content/ThumbnailContent.tsx index 2d0510bed..15ec34020 100644 --- a/src/app/components/message/content/ThumbnailContent.tsx +++ b/src/app/components/message/content/ThumbnailContent.tsx @@ -1,5 +1,5 @@ -import { ReactNode, useCallback, useEffect } from 'react'; -import { IThumbnailContent } from '$types/matrix/common'; +import { type ReactNode, useCallback, useEffect } from 'react'; +import { type IThumbnailContent } from '$types/matrix/common'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { decryptFile, downloadEncryptedMedia, mxcUrlToHttp } from '$utils/matrix'; diff --git a/src/app/components/message/content/VideoContent.tsx b/src/app/components/message/content/VideoContent.tsx index 71613c598..6fbb42a04 100644 --- a/src/app/components/message/content/VideoContent.tsx +++ b/src/app/components/message/content/VideoContent.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useCallback, useEffect, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useState } from 'react'; import { Badge, Box, @@ -17,10 +17,10 @@ import { } from 'folds'; import classNames from 'classnames'; import { BlurhashCanvas } from 'react-blurhash'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; import { - IThumbnailContent, - IVideoInfo, + type IThumbnailContent, + type IVideoInfo, MATRIX_BLUR_HASH_PROPERTY_NAME, } from '$types/matrix/common'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/message/layout/Bubble.tsx b/src/app/components/message/layout/Bubble.tsx index 21120da47..9ffeabe2d 100644 --- a/src/app/components/message/layout/Bubble.tsx +++ b/src/app/components/message/layout/Bubble.tsx @@ -1,6 +1,6 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; -import { Box, ContainerColor, as, color } from 'folds'; +import { Box, type ContainerColor, as, color } from 'folds'; import * as css from './layout.css'; type BubbleArrowProps = { diff --git a/src/app/components/message/layout/Compact.tsx b/src/app/components/message/layout/Compact.tsx index e9015ab96..5e4b7fece 100644 --- a/src/app/components/message/layout/Compact.tsx +++ b/src/app/components/message/layout/Compact.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, as } from 'folds'; import * as css from './layout.css'; diff --git a/src/app/components/message/layout/Modern.tsx b/src/app/components/message/layout/Modern.tsx index e73e93013..a2c6273a6 100644 --- a/src/app/components/message/layout/Modern.tsx +++ b/src/app/components/message/layout/Modern.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, as } from 'folds'; import * as css from './layout.css'; diff --git a/src/app/components/message/layout/layout.css.ts b/src/app/components/message/layout/layout.css.ts index a027af3df..fde995c7a 100644 --- a/src/app/components/message/layout/layout.css.ts +++ b/src/app/components/message/layout/layout.css.ts @@ -1,5 +1,5 @@ import { createVar, keyframes, style, styleVariants } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; import { DefaultReset, color, config, toRem } from 'folds'; export const StickySection = style({ diff --git a/src/app/components/message/modals/MessageDelete.tsx b/src/app/components/message/modals/MessageDelete.tsx index 666895102..12c3b3546 100644 --- a/src/app/components/message/modals/MessageDelete.tsx +++ b/src/app/components/message/modals/MessageDelete.tsx @@ -1,5 +1,5 @@ -import { FormEventHandler, MouseEvent, useCallback, useEffect } from 'react'; -import { Room, MatrixEvent } from '$types/matrix-sdk'; +import { type FormEventHandler, type MouseEvent, useCallback, useEffect } from 'react'; +import { type Room, type MatrixEvent } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { Box, diff --git a/src/app/components/message/modals/MessageEditHistory.tsx b/src/app/components/message/modals/MessageEditHistory.tsx index 9581aa419..5057c82a2 100644 --- a/src/app/components/message/modals/MessageEditHistory.tsx +++ b/src/app/components/message/modals/MessageEditHistory.tsx @@ -1,5 +1,5 @@ -import { MouseEvent } from 'react'; -import { Room, MatrixEvent } from '$types/matrix-sdk'; +import { type MouseEvent } from 'react'; +import { type Room, type MatrixEvent } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { MenuItem, Icon, Icons, Text } from 'folds'; import { getEventEdits } from '$utils/room'; diff --git a/src/app/components/message/modals/MessageForward.tsx b/src/app/components/message/modals/MessageForward.tsx index 219e41197..e6d231126 100644 --- a/src/app/components/message/modals/MessageForward.tsx +++ b/src/app/components/message/modals/MessageForward.tsx @@ -17,7 +17,7 @@ import { as, } from 'folds'; import { useAtomValue, useSetAtom } from 'jotai'; -import { JoinRule, MatrixEvent, Room } from '$types/matrix-sdk'; +import { JoinRule, type MatrixEvent, type Room } from '$types/matrix-sdk'; import { useEffect, useMemo, useState } from 'react'; import { allRoomsAtom } from '$state/room-list/roomList'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; diff --git a/src/app/components/message/modals/MessageReactions.tsx b/src/app/components/message/modals/MessageReactions.tsx index f2fa7a5bd..04a32b511 100644 --- a/src/app/components/message/modals/MessageReactions.tsx +++ b/src/app/components/message/modals/MessageReactions.tsx @@ -1,5 +1,5 @@ -import { MouseEvent } from 'react'; -import { Room, Relations } from '$types/matrix-sdk'; +import { type MouseEvent } from 'react'; +import { type Room, type Relations } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { Icon, Icons, Text, MenuItem } from 'folds'; import { modalAtom, ModalType } from '$state/modal'; diff --git a/src/app/components/message/modals/MessageReadRecipts.tsx b/src/app/components/message/modals/MessageReadRecipts.tsx index 6642627c0..7252e696d 100644 --- a/src/app/components/message/modals/MessageReadRecipts.tsx +++ b/src/app/components/message/modals/MessageReadRecipts.tsx @@ -1,5 +1,5 @@ -import { MouseEvent } from 'react'; -import { Room } from '$types/matrix-sdk'; +import { type MouseEvent } from 'react'; +import { type Room } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { MenuItem, Icon, Icons, Text } from 'folds'; import { modalAtom, ModalType } from '$state/modal'; diff --git a/src/app/components/message/modals/MessageReport.tsx b/src/app/components/message/modals/MessageReport.tsx index 71cf03cc5..beae33e1e 100644 --- a/src/app/components/message/modals/MessageReport.tsx +++ b/src/app/components/message/modals/MessageReport.tsx @@ -1,5 +1,5 @@ -import { FormEventHandler, MouseEvent, useCallback, useEffect } from 'react'; -import { Room, MatrixEvent } from '$types/matrix-sdk'; +import { type FormEventHandler, type MouseEvent, useCallback, useEffect } from 'react'; +import { type Room, type MatrixEvent } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { Box, diff --git a/src/app/components/message/modals/MessageSource.tsx b/src/app/components/message/modals/MessageSource.tsx index eff8e1e58..1deb28ebf 100644 --- a/src/app/components/message/modals/MessageSource.tsx +++ b/src/app/components/message/modals/MessageSource.tsx @@ -1,5 +1,5 @@ -import { MouseEvent } from 'react'; -import { Room, MatrixEvent } from '$types/matrix-sdk'; +import { type MouseEvent } from 'react'; +import { type Room, type MatrixEvent } from '$types/matrix-sdk'; import { useSetAtom } from 'jotai'; import { MenuItem, Icon, Icons, Text } from 'folds'; import { TextViewer } from '$components/text-viewer'; diff --git a/src/app/components/message/placeholder/CompactPlaceholder.tsx b/src/app/components/message/placeholder/CompactPlaceholder.tsx index c6e6dda00..961cf165e 100644 --- a/src/app/components/message/placeholder/CompactPlaceholder.tsx +++ b/src/app/components/message/placeholder/CompactPlaceholder.tsx @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { as, ContainerColor, toRem } from 'folds'; +import { as, type ContainerColor, toRem } from 'folds'; import { randomNumberBetween } from '$utils/common'; import { CompactLayout } from '$components/message/layout'; import { LinePlaceholder } from './LinePlaceholder'; diff --git a/src/app/components/message/placeholder/DefaultPlaceholder.tsx b/src/app/components/message/placeholder/DefaultPlaceholder.tsx index 444990ac6..d0a73733f 100644 --- a/src/app/components/message/placeholder/DefaultPlaceholder.tsx +++ b/src/app/components/message/placeholder/DefaultPlaceholder.tsx @@ -1,5 +1,5 @@ -import { CSSProperties, useMemo } from 'react'; -import { Avatar, Box, ContainerColor, as, color, toRem } from 'folds'; +import { type CSSProperties, useMemo } from 'react'; +import { Avatar, Box, type ContainerColor, as, color, toRem } from 'folds'; import { randomNumberBetween } from '$utils/common'; import { ModernLayout } from '$components/message/layout'; import { LinePlaceholder } from './LinePlaceholder'; diff --git a/src/app/components/message/placeholder/LinePlaceholder.css.ts b/src/app/components/message/placeholder/LinePlaceholder.css.ts index 34ad76a3e..bcf69b7e5 100644 --- a/src/app/components/message/placeholder/LinePlaceholder.css.ts +++ b/src/app/components/message/placeholder/LinePlaceholder.css.ts @@ -1,6 +1,6 @@ -import { ComplexStyleRule } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; -import { ContainerColor, DefaultReset, color, config, toRem } from 'folds'; +import { type ComplexStyleRule } from '@vanilla-extract/css'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; +import { type ContainerColor, DefaultReset, color, config, toRem } from 'folds'; const getVariant = (variant: ContainerColor): ComplexStyleRule => ({ backgroundColor: color[variant].Container, diff --git a/src/app/components/nav/NavCategory.tsx b/src/app/components/nav/NavCategory.tsx index 7285330f0..b03c0916a 100644 --- a/src/app/components/nav/NavCategory.tsx +++ b/src/app/components/nav/NavCategory.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { as } from 'folds'; import classNames from 'classnames'; import * as css from './styles.css'; diff --git a/src/app/components/nav/NavCategoryHeader.tsx b/src/app/components/nav/NavCategoryHeader.tsx index 1d4152fc9..1cbea5b10 100644 --- a/src/app/components/nav/NavCategoryHeader.tsx +++ b/src/app/components/nav/NavCategoryHeader.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; import { Header, as } from 'folds'; import * as css from './styles.css'; diff --git a/src/app/components/nav/NavEmptyLayout.tsx b/src/app/components/nav/NavEmptyLayout.tsx index 25b69380b..cf21d6699 100644 --- a/src/app/components/nav/NavEmptyLayout.tsx +++ b/src/app/components/nav/NavEmptyLayout.tsx @@ -1,5 +1,5 @@ import { Box, config } from 'folds'; -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; export function NavEmptyCenter({ children }: { children: ReactNode }) { return ( diff --git a/src/app/components/nav/NavItem.tsx b/src/app/components/nav/NavItem.tsx index 68a967f6f..f3eefa4f5 100644 --- a/src/app/components/nav/NavItem.tsx +++ b/src/app/components/nav/NavItem.tsx @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import { ComponentProps, forwardRef } from 'react'; +import { type ComponentProps, forwardRef } from 'react'; import { Link } from 'react-router-dom'; import { as } from 'folds'; import * as css from './styles.css'; diff --git a/src/app/components/nav/NavItemContent.tsx b/src/app/components/nav/NavItemContent.tsx index eaf8f113e..4ca35cc0c 100644 --- a/src/app/components/nav/NavItemContent.tsx +++ b/src/app/components/nav/NavItemContent.tsx @@ -1,4 +1,4 @@ -import { ComponentProps } from 'react'; +import { type ComponentProps } from 'react'; import { Text, as } from 'folds'; import classNames from 'classnames'; import * as css from './styles.css'; diff --git a/src/app/components/nav/NavItemOptions.tsx b/src/app/components/nav/NavItemOptions.tsx index a735781e5..d43fc7ab0 100644 --- a/src/app/components/nav/NavItemOptions.tsx +++ b/src/app/components/nav/NavItemOptions.tsx @@ -1,4 +1,4 @@ -import { ComponentProps } from 'react'; +import { type ComponentProps } from 'react'; import { Box, as } from 'folds'; import classNames from 'classnames'; import * as css from './styles.css'; diff --git a/src/app/components/nav/styles.css.ts b/src/app/components/nav/styles.css.ts index 48b2a4d34..cd02a25f4 100644 --- a/src/app/components/nav/styles.css.ts +++ b/src/app/components/nav/styles.css.ts @@ -1,6 +1,14 @@ -import { ComplexStyleRule, createVar, style } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; -import { ContainerColor, DefaultReset, Disabled, RadiiVariant, color, config, toRem } from 'folds'; +import { type ComplexStyleRule, createVar, style } from '@vanilla-extract/css'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { + type ContainerColor, + DefaultReset, + Disabled, + RadiiVariant, + color, + config, + toRem, +} from 'folds'; export const NavCategory = style([ DefaultReset, diff --git a/src/app/components/notification-banner/NotificationBanner.tsx b/src/app/components/notification-banner/NotificationBanner.tsx index b574e3585..38b163863 100644 --- a/src/app/components/notification-banner/NotificationBanner.tsx +++ b/src/app/components/notification-banner/NotificationBanner.tsx @@ -1,8 +1,8 @@ import { useAtom } from 'jotai'; -import { ReactNode, useCallback, useEffect, useRef, useState } from 'react'; +import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import { Box, Icon, IconButton, Icons, Text } from 'folds'; import { createLogger } from '$utils/debug'; -import { inAppBannerAtom, InAppBannerNotification } from '$state/sessions'; +import { inAppBannerAtom, type InAppBannerNotification } from '$state/sessions'; import * as css from './NotificationBanner.css'; const log = createLogger('NotificationBanner'); diff --git a/src/app/components/page/Page.tsx b/src/app/components/page/Page.tsx index b481df637..87534b479 100644 --- a/src/app/components/page/Page.tsx +++ b/src/app/components/page/Page.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, MutableRefObject, ReactNode } from 'react'; +import { type ComponentProps, type MutableRefObject, type ReactNode } from 'react'; import { Box, Header, Line, Scroll, Text, as } from 'folds'; import classNames from 'classnames'; import { ContainerColor } from '$styles/ContainerColor.css'; diff --git a/src/app/components/page/style.css.ts b/src/app/components/page/style.css.ts index bd14cd583..5241c11eb 100644 --- a/src/app/components/page/style.css.ts +++ b/src/app/components/page/style.css.ts @@ -1,5 +1,5 @@ import { style } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; import { DefaultReset, color, config, toRem } from 'folds'; export const PageNav = recipe({ diff --git a/src/app/components/password-input/PasswordInput.tsx b/src/app/components/password-input/PasswordInput.tsx index d1fdea246..0fce3feda 100644 --- a/src/app/components/password-input/PasswordInput.tsx +++ b/src/app/components/password-input/PasswordInput.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, forwardRef } from 'react'; +import { type ComponentProps, forwardRef } from 'react'; import { Icon, IconButton, Input, config, Icons } from 'folds'; import { UseStateProvider } from '$components/UseStateProvider'; diff --git a/src/app/components/power/PowerSelector.tsx b/src/app/components/power/PowerSelector.tsx index 23188aeae..5d6aa9d51 100644 --- a/src/app/components/power/PowerSelector.tsx +++ b/src/app/components/power/PowerSelector.tsx @@ -1,7 +1,7 @@ -import { forwardRef, MouseEventHandler, ReactNode, useState } from 'react'; +import { forwardRef, type MouseEventHandler, type ReactNode, useState } from 'react'; import FocusTrap from 'focus-trap-react'; -import { Box, config, Menu, MenuItem, PopOut, Scroll, Text, toRem, RectCords } from 'folds'; -import { getPowers, PowerLevelTags } from '$hooks/usePowerLevelTags'; +import { Box, config, Menu, MenuItem, PopOut, Scroll, Text, toRem, type RectCords } from 'folds'; +import { getPowers, type PowerLevelTags } from '$hooks/usePowerLevelTags'; import { stopPropagation } from '$utils/keyboard'; import { PowerColorBadge } from './PowerColorBadge'; diff --git a/src/app/components/power/style.css.ts b/src/app/components/power/style.css.ts index 60737f8cb..7a076df3a 100644 --- a/src/app/components/power/style.css.ts +++ b/src/app/components/power/style.css.ts @@ -1,5 +1,5 @@ import { createVar, style } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; import { color, config, DefaultReset, toRem } from 'folds'; export const PowerColorBadge = style({ diff --git a/src/app/components/presence/Presence.tsx b/src/app/components/presence/Presence.tsx index e6ac463bb..8e3d3c7d1 100644 --- a/src/app/components/presence/Presence.tsx +++ b/src/app/components/presence/Presence.tsx @@ -3,14 +3,14 @@ import { Badge, Box, color, - ContainerColor, - MainColor, + type ContainerColor, + type MainColor, Text, Tooltip, TooltipProvider, toRem, } from 'folds'; -import { ReactNode, useId } from 'react'; +import { type ReactNode, useId } from 'react'; import { Presence, usePresenceLabel } from '$hooks/useUserPresence'; import * as css from './styles.css'; diff --git a/src/app/components/room-avatar/AvatarImage.tsx b/src/app/components/room-avatar/AvatarImage.tsx index 1e4cb0d0a..97c06bb48 100644 --- a/src/app/components/room-avatar/AvatarImage.tsx +++ b/src/app/components/room-avatar/AvatarImage.tsx @@ -1,5 +1,5 @@ import { AvatarImage as FoldsAvatarImage } from 'folds'; -import { ReactEventHandler, useState, useEffect } from 'react'; +import { type ReactEventHandler, useState, useEffect } from 'react'; import bgColorImg from '$utils/bgColorImg'; import { settingsAtom } from '$state/settings'; import { useSetting } from '$state/hooks/settings'; diff --git a/src/app/components/room-avatar/RoomAvatar.tsx b/src/app/components/room-avatar/RoomAvatar.tsx index 356d9dbc2..991000df4 100644 --- a/src/app/components/room-avatar/RoomAvatar.tsx +++ b/src/app/components/room-avatar/RoomAvatar.tsx @@ -1,6 +1,6 @@ -import { JoinRule } from '$types/matrix-sdk'; +import { type JoinRule } from '$types/matrix-sdk'; import { AvatarFallback, Icon, Icons, color } from 'folds'; -import { ComponentProps, ReactNode, forwardRef, useState } from 'react'; +import { type ComponentProps, type ReactNode, forwardRef, useState } from 'react'; import { getRoomIconSrc } from '$utils/room'; import colorMXID from '$utils/colorMXID'; import * as css from './RoomAvatar.css'; diff --git a/src/app/components/room-card/RoomCard.tsx b/src/app/components/room-card/RoomCard.tsx index afd66d3c8..574b4eb2d 100644 --- a/src/app/components/room-card/RoomCard.tsx +++ b/src/app/components/room-card/RoomCard.tsx @@ -1,5 +1,5 @@ -import { ReactNode, useCallback, useRef, useState } from 'react'; -import { MatrixError, Room } from '$types/matrix-sdk'; +import { type ReactNode, useCallback, useRef, useState } from 'react'; +import { type MatrixError, type Room } from '$types/matrix-sdk'; import { Avatar, Badge, diff --git a/src/app/components/room-intro/RoomIntro.tsx b/src/app/components/room-intro/RoomIntro.tsx index 3ad39546f..aaf0698f6 100644 --- a/src/app/components/room-intro/RoomIntro.tsx +++ b/src/app/components/room-intro/RoomIntro.tsx @@ -1,8 +1,8 @@ import { useCallback, useEffect, useState } from 'react'; import { Avatar, Box, Button, Icon, Icons, Spinner, Text, as } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useAtomValue } from 'jotai'; -import { IRoomCreateContent, Membership, StateEvent } from '$types/matrix/room'; +import { type IRoomCreateContent, Membership, StateEvent } from '$types/matrix/room'; import { getMemberDisplayName, getStateEvent } from '$utils/room'; import { nicknamesAtom } from '$state/nicknames'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/scroll-top-container/ScrollTopContainer.tsx b/src/app/components/scroll-top-container/ScrollTopContainer.tsx index 4681e7baf..ecb204017 100644 --- a/src/app/components/scroll-top-container/ScrollTopContainer.tsx +++ b/src/app/components/scroll-top-container/ScrollTopContainer.tsx @@ -1,4 +1,4 @@ -import { RefObject, useCallback, useState } from 'react'; +import { type RefObject, useCallback, useState } from 'react'; import { Box, as } from 'folds'; import classNames from 'classnames'; import { diff --git a/src/app/components/sequence-card/SequenceCard.tsx b/src/app/components/sequence-card/SequenceCard.tsx index 7738d93fb..8d3ebbcc9 100644 --- a/src/app/components/sequence-card/SequenceCard.tsx +++ b/src/app/components/sequence-card/SequenceCard.tsx @@ -1,7 +1,7 @@ -import { ComponentProps } from 'react'; +import { type ComponentProps } from 'react'; import { Box, as } from 'folds'; import classNames from 'classnames'; -import { ContainerColor, ContainerColorVariants } from '$styles/ContainerColor.css'; +import { ContainerColor, type ContainerColorVariants } from '$styles/ContainerColor.css'; import * as css from './style.css'; export const SequenceCard = as< diff --git a/src/app/components/sequence-card/style.css.ts b/src/app/components/sequence-card/style.css.ts index 2665b46e7..17f02dcc3 100644 --- a/src/app/components/sequence-card/style.css.ts +++ b/src/app/components/sequence-card/style.css.ts @@ -1,5 +1,5 @@ import { createVar } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; import { config } from 'folds'; const outlinedWidth = createVar('0'); diff --git a/src/app/components/setting-tile/SettingTile.tsx b/src/app/components/setting-tile/SettingTile.tsx index e57dccd55..d0280b9fa 100644 --- a/src/app/components/setting-tile/SettingTile.tsx +++ b/src/app/components/setting-tile/SettingTile.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, Text } from 'folds'; import { BreakWord } from '$styles/Text.css'; diff --git a/src/app/components/sidebar/Sidebar.css.ts b/src/app/components/sidebar/Sidebar.css.ts index 457ceecbe..f1ae88db2 100644 --- a/src/app/components/sidebar/Sidebar.css.ts +++ b/src/app/components/sidebar/Sidebar.css.ts @@ -1,5 +1,5 @@ import { createVar, style } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; import { color, config, DefaultReset, Disabled, FocusOutline, toRem } from 'folds'; import { ContainerColor } from '$styles/ContainerColor.css'; diff --git a/src/app/components/sidebar/SidebarContent.tsx b/src/app/components/sidebar/SidebarContent.tsx index a4546b196..6e7f62fc2 100644 --- a/src/app/components/sidebar/SidebarContent.tsx +++ b/src/app/components/sidebar/SidebarContent.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box } from 'folds'; type SidebarContentProps = { diff --git a/src/app/components/sidebar/SidebarItem.tsx b/src/app/components/sidebar/SidebarItem.tsx index 6e6e0146b..2b1ab94b1 100644 --- a/src/app/components/sidebar/SidebarItem.tsx +++ b/src/app/components/sidebar/SidebarItem.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames'; import { as, Avatar, Text, Tooltip, TooltipProvider, toRem } from 'folds'; -import { ComponentProps, ReactNode, RefCallback } from 'react'; +import { type ComponentProps, type ReactNode, type RefCallback } from 'react'; import * as css from './Sidebar.css'; export const SidebarItem = as<'div', css.SidebarItemVariants>( diff --git a/src/app/components/splash-screen/SplashScreen.tsx b/src/app/components/splash-screen/SplashScreen.tsx index 463fd66d6..71cada585 100644 --- a/src/app/components/splash-screen/SplashScreen.tsx +++ b/src/app/components/splash-screen/SplashScreen.tsx @@ -1,5 +1,5 @@ import { Box, Text } from 'folds'; -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import classNames from 'classnames'; import * as patternsCSS from '$styles/Patterns.css'; import * as css from './SplashScreen.css'; diff --git a/src/app/components/stacked-avatar/styles.css.ts b/src/app/components/stacked-avatar/styles.css.ts index 3bbf7271a..b7f279e2e 100644 --- a/src/app/components/stacked-avatar/styles.css.ts +++ b/src/app/components/stacked-avatar/styles.css.ts @@ -1,6 +1,6 @@ -import { ComplexStyleRule } from '@vanilla-extract/css'; -import { recipe, RecipeVariants } from '@vanilla-extract/recipes'; -import { color, config, ContainerColor, toRem } from 'folds'; +import { type ComplexStyleRule } from '@vanilla-extract/css'; +import { recipe, type RecipeVariants } from '@vanilla-extract/recipes'; +import { color, config, type ContainerColor, toRem } from 'folds'; const getVariant = (variant: ContainerColor): ComplexStyleRule => ({ outlineColor: color[variant].Container, diff --git a/src/app/components/telemetry-consent/TelemetryConsentBanner.tsx b/src/app/components/telemetry-consent/TelemetryConsentBanner.tsx index 5c1e90a08..24f726b2b 100644 --- a/src/app/components/telemetry-consent/TelemetryConsentBanner.tsx +++ b/src/app/components/telemetry-consent/TelemetryConsentBanner.tsx @@ -1,14 +1,11 @@ import { useEffect, useRef, useState } from 'react'; import { Box, Button, Icon, Icons, Text } from 'folds'; +import { isSentryDecided, setSentryEnabled } from '$state/sentryStorage'; import * as css from './TelemetryConsentBanner.css'; -const SENTRY_KEY = 'sable_sentry_enabled'; - export function TelemetryConsentBanner() { const isSentryConfigured = Boolean(import.meta.env.VITE_SENTRY_DSN); - const [visible, setVisible] = useState( - isSentryConfigured && localStorage.getItem(SENTRY_KEY) === null - ); + const [visible, setVisible] = useState(isSentryConfigured && !isSentryDecided()); const [dismissing, setDismissing] = useState(false); const dismissTimerRef = useRef | null>(null); @@ -22,12 +19,12 @@ export function TelemetryConsentBanner() { if (!visible) return null; const handleEnable = () => { - localStorage.setItem(SENTRY_KEY, 'true'); + setSentryEnabled(true); window.location.reload(); }; const handleDecline = () => { - localStorage.setItem(SENTRY_KEY, 'false'); + setSentryEnabled(false); setDismissing(true); dismissTimerRef.current = setTimeout(() => setVisible(false), 220); }; diff --git a/src/app/components/text-viewer/TextViewer.tsx b/src/app/components/text-viewer/TextViewer.tsx index 8c6957ec8..a21672434 100644 --- a/src/app/components/text-viewer/TextViewer.tsx +++ b/src/app/components/text-viewer/TextViewer.tsx @@ -1,4 +1,4 @@ -import { ComponentProps, HTMLAttributes, Suspense, forwardRef, lazy } from 'react'; +import { type ComponentProps, type HTMLAttributes, Suspense, forwardRef, lazy } from 'react'; import classNames from 'classnames'; import { Box, Chip, Header, Icon, IconButton, Icons, Scroll, Text, as } from 'folds'; import { ErrorBoundary } from 'react-error-boundary'; diff --git a/src/app/components/time-date/PickerColumn.tsx b/src/app/components/time-date/PickerColumn.tsx index a1fbcb34f..4a74f713d 100644 --- a/src/app/components/time-date/PickerColumn.tsx +++ b/src/app/components/time-date/PickerColumn.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, Text, Scroll } from 'folds'; import { CutoutCard } from '$components/cutout-card'; import * as css from './styles.css'; diff --git a/src/app/components/uia-stages/DummyStage.tsx b/src/app/components/uia-stages/DummyStage.tsx index 9a78af0e8..62f716458 100644 --- a/src/app/components/uia-stages/DummyStage.tsx +++ b/src/app/components/uia-stages/DummyStage.tsx @@ -1,7 +1,7 @@ import { useEffect, useCallback } from 'react'; import { Dialog, Text, Box, Button, config } from 'folds'; import { AuthType } from '$types/matrix-sdk'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; function DummyErrorDialog({ title, diff --git a/src/app/components/uia-stages/EmailStage.tsx b/src/app/components/uia-stages/EmailStage.tsx index 3d3134495..322f49d97 100644 --- a/src/app/components/uia-stages/EmailStage.tsx +++ b/src/app/components/uia-stages/EmailStage.tsx @@ -1,9 +1,9 @@ -import { useEffect, useCallback, FormEventHandler } from 'react'; +import { useEffect, useCallback, type FormEventHandler } from 'react'; import { Dialog, Text, Box, Button, config, Input, color, Spinner } from 'folds'; -import { AuthType, MatrixError } from '$types/matrix-sdk'; -import { AsyncState, AsyncStatus } from '$hooks/useAsyncCallback'; -import { RequestEmailTokenCallback, RequestEmailTokenResponse } from '$hooks/types'; -import { StageComponentProps } from './types'; +import { AuthType, type MatrixError } from '$types/matrix-sdk'; +import { type AsyncState, AsyncStatus } from '$hooks/useAsyncCallback'; +import { type RequestEmailTokenCallback, type RequestEmailTokenResponse } from '$hooks/types'; +import { type StageComponentProps } from './types'; function EmailErrorDialog({ title, diff --git a/src/app/components/uia-stages/PasswordStage.tsx b/src/app/components/uia-stages/PasswordStage.tsx index 8ebc923ab..e3b0884bf 100644 --- a/src/app/components/uia-stages/PasswordStage.tsx +++ b/src/app/components/uia-stages/PasswordStage.tsx @@ -1,8 +1,8 @@ import { Box, Button, color, config, Dialog, Header, Icon, IconButton, Icons, Text } from 'folds'; -import { FormEventHandler } from 'react'; +import { type FormEventHandler } from 'react'; import { AuthType } from '$types/matrix-sdk'; import { PasswordInput } from '$components/password-input'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; import { ErrorCode } from '../../cs-errorcode'; export function PasswordStage({ diff --git a/src/app/components/uia-stages/ReCaptchaStage.tsx b/src/app/components/uia-stages/ReCaptchaStage.tsx index 65357b0e4..ea190904e 100644 --- a/src/app/components/uia-stages/ReCaptchaStage.tsx +++ b/src/app/components/uia-stages/ReCaptchaStage.tsx @@ -1,7 +1,7 @@ import { Dialog, Text, Box, Button, config } from 'folds'; import { AuthType } from '$types/matrix-sdk'; import ReCAPTCHA from 'react-google-recaptcha'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; function ReCaptchaErrorDialog({ title, diff --git a/src/app/components/uia-stages/RegistrationTokenStage.tsx b/src/app/components/uia-stages/RegistrationTokenStage.tsx index cfe79786c..d471b3813 100644 --- a/src/app/components/uia-stages/RegistrationTokenStage.tsx +++ b/src/app/components/uia-stages/RegistrationTokenStage.tsx @@ -1,7 +1,7 @@ -import { useEffect, useCallback, FormEventHandler } from 'react'; +import { useEffect, useCallback, type FormEventHandler } from 'react'; import { Dialog, Text, Box, Button, config, Input } from 'folds'; import { AuthType } from '$types/matrix-sdk'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; function RegistrationTokenErrorDialog({ title, diff --git a/src/app/components/uia-stages/SSOStage.tsx b/src/app/components/uia-stages/SSOStage.tsx index fb20e03b1..5da517fda 100644 --- a/src/app/components/uia-stages/SSOStage.tsx +++ b/src/app/components/uia-stages/SSOStage.tsx @@ -1,6 +1,6 @@ import { Box, Button, color, config, Dialog, Header, Icon, IconButton, Icons, Text } from 'folds'; import { useCallback, useEffect, useState } from 'react'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; export function SSOStage({ ssoRedirectURL, diff --git a/src/app/components/uia-stages/TermsStage.tsx b/src/app/components/uia-stages/TermsStage.tsx index bfe8e4032..01fe7b441 100644 --- a/src/app/components/uia-stages/TermsStage.tsx +++ b/src/app/components/uia-stages/TermsStage.tsx @@ -1,7 +1,7 @@ import { useEffect, useCallback } from 'react'; import { Dialog, Text, Box, Button, config } from 'folds'; import { AuthType } from '$types/matrix-sdk'; -import { StageComponentProps } from './types'; +import { type StageComponentProps } from './types'; function TermsErrorDialog({ title, diff --git a/src/app/components/uia-stages/types.ts b/src/app/components/uia-stages/types.ts index 3408cd013..ca81984ff 100644 --- a/src/app/components/uia-stages/types.ts +++ b/src/app/components/uia-stages/types.ts @@ -1,5 +1,5 @@ -import { AuthDict } from '$types/matrix-sdk'; -import { AuthStageData } from '$hooks/useUIAFlows'; +import { type AuthDict } from '$types/matrix-sdk'; +import { type AuthStageData } from '$hooks/useUIAFlows'; export type StageComponentProps = { stageData: AuthStageData; diff --git a/src/app/components/unread-badge/UnreadBadge.tsx b/src/app/components/unread-badge/UnreadBadge.tsx index 1ad2605ab..a5a8c4390 100644 --- a/src/app/components/unread-badge/UnreadBadge.tsx +++ b/src/app/components/unread-badge/UnreadBadge.tsx @@ -1,4 +1,4 @@ -import { CSSProperties, ReactNode } from 'react'; +import { type CSSProperties, type ReactNode } from 'react'; import { Box, Badge, toRem, Text } from 'folds'; import { millify } from '$plugins/millify'; import { useSetting } from '$state/hooks/settings'; diff --git a/src/app/components/upload-board/UploadBoard.tsx b/src/app/components/upload-board/UploadBoard.tsx index 8f71c22e9..f03eb0d4b 100644 --- a/src/app/components/upload-board/UploadBoard.tsx +++ b/src/app/components/upload-board/UploadBoard.tsx @@ -1,9 +1,14 @@ -import { MutableRefObject, ReactNode, useImperativeHandle, useRef } from 'react'; +import { type MutableRefObject, type ReactNode, useImperativeHandle, useRef } from 'react'; import { Badge, Box, Chip, Header, Icon, Icons, Spinner, Text, as, percent } from 'folds'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; -import { TUploadFamilyObserverAtom, Upload, UploadStatus, UploadSuccess } from '$state/upload'; +import { + type TUploadFamilyObserverAtom, + type Upload, + UploadStatus, + type UploadSuccess, +} from '$state/upload'; import * as css from './UploadBoard.css'; type UploadBoardProps = { diff --git a/src/app/components/upload-card/CompactUploadCardRenderer.tsx b/src/app/components/upload-card/CompactUploadCardRenderer.tsx index c4f5cdfa2..46708c690 100644 --- a/src/app/components/upload-card/CompactUploadCardRenderer.tsx +++ b/src/app/components/upload-card/CompactUploadCardRenderer.tsx @@ -1,8 +1,13 @@ import { useEffect } from 'react'; import { Chip, Icon, IconButton, Icons, Text, color } from 'folds'; -import { TUploadAtom, UploadStatus, UploadSuccess, useBindUploadAtom } from '$state/upload'; +import { + type TUploadAtom, + UploadStatus, + type UploadSuccess, + useBindUploadAtom, +} from '$state/upload'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { TUploadContent } from '$utils/matrix'; +import { type TUploadContent } from '$utils/matrix'; import { bytesToSize, getFileTypeIcon } from '$utils/common'; import { useMediaConfig } from '$hooks/useMediaConfig'; import { UploadCard, UploadCardError, CompactUploadCardProgress } from './UploadCard'; diff --git a/src/app/components/upload-card/UploadCard.css.ts b/src/app/components/upload-card/UploadCard.css.ts index ad3caf10e..1a295b870 100644 --- a/src/app/components/upload-card/UploadCard.css.ts +++ b/src/app/components/upload-card/UploadCard.css.ts @@ -1,5 +1,5 @@ import { style } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; import { RadiiVariant, color, config } from 'folds'; export const UploadCard = recipe({ diff --git a/src/app/components/upload-card/UploadCard.tsx b/src/app/components/upload-card/UploadCard.tsx index bfe11d475..6111515fb 100644 --- a/src/app/components/upload-card/UploadCard.tsx +++ b/src/app/components/upload-card/UploadCard.tsx @@ -1,5 +1,5 @@ import { Badge, Box, Icon, Icons, ProgressBar, Text, percent } from 'folds'; -import { ReactNode, forwardRef } from 'react'; +import { type ReactNode, forwardRef } from 'react'; import { bytesToSize } from '$utils/common'; import * as css from './UploadCard.css'; diff --git a/src/app/components/upload-card/UploadCardRenderer.tsx b/src/app/components/upload-card/UploadCardRenderer.tsx index e5e894398..e30d19b32 100644 --- a/src/app/components/upload-card/UploadCardRenderer.tsx +++ b/src/app/components/upload-card/UploadCardRenderer.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect, useMemo, useState } from 'react'; +import { type ReactNode, useEffect, useMemo, useState } from 'react'; import { Box, Chip, @@ -13,17 +13,21 @@ import { config, toRem, } from 'folds'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; import { RenderBody } from '$components/message'; -import { UploadStatus, UploadSuccess, useBindUploadAtom } from '$state/upload'; +import { UploadStatus, type UploadSuccess, useBindUploadAtom } from '$state/upload'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { TUploadContent } from '$utils/matrix'; +import { type TUploadContent } from '$utils/matrix'; import { bytesToSize, getFileTypeIcon } from '$utils/common'; -import { roomUploadAtomFamily, TUploadItem, TUploadMetadata } from '$state/room/roomInputDrafts'; +import { + roomUploadAtomFamily, + type TUploadItem, + type TUploadMetadata, +} from '$state/room/roomInputDrafts'; import { useObjectURL } from '$hooks/useObjectURL'; import { useMediaConfig } from '$hooks/useMediaConfig'; import { UploadCard, UploadCardError, UploadCardProgress } from './UploadCard'; diff --git a/src/app/components/upload-card/UploadDescriptionEditor.tsx b/src/app/components/upload-card/UploadDescriptionEditor.tsx index 563f06eda..6d527c783 100644 --- a/src/app/components/upload-card/UploadDescriptionEditor.tsx +++ b/src/app/components/upload-card/UploadDescriptionEditor.tsx @@ -1,4 +1,4 @@ -import { KeyboardEventHandler, useCallback, useEffect, useState, useRef } from 'react'; +import { type KeyboardEventHandler, useCallback, useEffect, useState, useRef } from 'react'; import { Box, Chip, @@ -7,7 +7,7 @@ import { Icons, Line, PopOut, - RectCords, + type RectCords, Spinner, Text, config, @@ -17,7 +17,7 @@ import { ReactEditor } from 'slate-react'; import { isKeyHotkey } from 'is-hotkey'; import { AutocompletePrefix, - AutocompleteQuery, + type AutocompleteQuery, CustomEditor, EmoticonAutocomplete, Toolbar, diff --git a/src/app/components/url-preview/UrlPreviewCard.tsx b/src/app/components/url-preview/UrlPreviewCard.tsx index 947cd67bf..a655da816 100644 --- a/src/app/components/url-preview/UrlPreviewCard.tsx +++ b/src/app/components/url-preview/UrlPreviewCard.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import { IPreviewUrlResponse } from '$types/matrix-sdk'; +import { type IPreviewUrlResponse } from '$types/matrix-sdk'; import { Box, Icon, IconButton, Icons, Scroll, Spinner, Text, as, color, config } from 'folds'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/user-avatar/UserAvatar.tsx b/src/app/components/user-avatar/UserAvatar.tsx index 3659cb305..a036221d4 100644 --- a/src/app/components/user-avatar/UserAvatar.tsx +++ b/src/app/components/user-avatar/UserAvatar.tsx @@ -1,5 +1,5 @@ import { AvatarFallback, AvatarImage, color } from 'folds'; -import { ReactEventHandler, ReactNode, useState } from 'react'; +import { type ReactEventHandler, type ReactNode, useState } from 'react'; import classNames from 'classnames'; import colorMXID from '$utils/colorMXID'; import * as css from './UserAvatar.css'; diff --git a/src/app/components/user-profile/CreatorChip.tsx b/src/app/components/user-profile/CreatorChip.tsx index f517581cc..6499a36a7 100644 --- a/src/app/components/user-profile/CreatorChip.tsx +++ b/src/app/components/user-profile/CreatorChip.tsx @@ -1,5 +1,5 @@ -import { Chip, config, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text } from 'folds'; -import { MouseEventHandler, useState } from 'react'; +import { Chip, config, Icon, Icons, Menu, MenuItem, PopOut, type RectCords, Text } from 'folds'; +import { type MouseEventHandler, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { isKeyHotkey } from 'is-hotkey'; import { useRoomCreatorsTag } from '$hooks/useRoomCreatorsTag'; diff --git a/src/app/components/user-profile/PowerChip.tsx b/src/app/components/user-profile/PowerChip.tsx index d1e4dbfa2..22f5a9f8a 100644 --- a/src/app/components/user-profile/PowerChip.tsx +++ b/src/app/components/user-profile/PowerChip.tsx @@ -15,12 +15,12 @@ import { OverlayBackdrop, OverlayCenter, PopOut, - RectCords, + type RectCords, Spinner, Text, toRem, } from 'folds'; -import { MouseEventHandler, useCallback, useState } from 'react'; +import { type MouseEventHandler, useCallback, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { isKeyHotkey } from 'is-hotkey'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/components/user-profile/UserChips.tsx b/src/app/components/user-profile/UserChips.tsx index 1ce3b26c1..fbcf870f1 100644 --- a/src/app/components/user-profile/UserChips.tsx +++ b/src/app/components/user-profile/UserChips.tsx @@ -1,6 +1,6 @@ import { - KeyboardEventHandler, - MouseEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useCallback, useEffect, useMemo, @@ -10,7 +10,7 @@ import { import { useNavigate } from 'react-router-dom'; import FocusTrap from 'focus-trap-react'; import { isKeyHotkey } from 'is-hotkey'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { PopOut, Menu, @@ -21,7 +21,7 @@ import { Chip, Icon, Icons, - RectCords, + type RectCords, Spinner, toRem, Box, diff --git a/src/app/components/user-profile/UserHero.tsx b/src/app/components/user-profile/UserHero.tsx index 0acdc3618..dccfab777 100644 --- a/src/app/components/user-profile/UserHero.tsx +++ b/src/app/components/user-profile/UserHero.tsx @@ -18,7 +18,7 @@ import FocusTrap from 'focus-trap-react'; import colorMXID from '$utils/colorMXID'; import { getMxIdLocalPart } from '$utils/matrix'; import { BreakWord, LineClamp3 } from '$styles/Text.css'; -import { UserPresence } from '$hooks/useUserPresence'; +import { type UserPresence } from '$hooks/useUserPresence'; import { stopPropagation } from '$utils/keyboard'; import { useRoom } from '$hooks/useRoom'; import { useSableCosmetics } from '$hooks/useSableCosmetics'; diff --git a/src/app/components/user-profile/UserRoomProfile.tsx b/src/app/components/user-profile/UserRoomProfile.tsx index 5d0f9e7e3..12f5bcdd3 100644 --- a/src/app/components/user-profile/UserRoomProfile.tsx +++ b/src/app/components/user-profile/UserRoomProfile.tsx @@ -1,9 +1,9 @@ import { Box, Button, config, Icon, Icons, Scroll, Text } from 'folds'; -import { SyntheticEvent, useCallback, useMemo, useState } from 'react'; +import { type SyntheticEvent, useCallback, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAtomValue } from 'jotai'; -import { Opts as LinkifyOpts } from 'linkifyjs'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { getMxIdServer, mxcUrlToHttp } from '$utils/matrix'; import { getMemberAvatarMxc, getMemberDisplayName } from '$utils/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; @@ -19,9 +19,9 @@ import { useRoomCreators } from '$hooks/useRoomCreators'; import { useRoomPermissions } from '$hooks/useRoomPermissions'; import { useMemberPowerCompare } from '$hooks/useMemberPowerCompare'; import { getDirectCreatePath, withSearchParam } from '$pages/pathUtils'; -import { DirectCreateSearchParams } from '$pages/paths'; +import { type DirectCreateSearchParams } from '$pages/paths'; import { nicknamesAtom } from '$state/nicknames'; -import { UserProfile, useUserProfile } from '$hooks/useUserProfile'; +import { type UserProfile, useUserProfile } from '$hooks/useUserProfile'; import { factoryRenderLinkifyWithMention, getReactCustomHtmlParser, diff --git a/src/app/components/virtualizer/VirtualTile.tsx b/src/app/components/virtualizer/VirtualTile.tsx index b92add55a..22c4faadd 100644 --- a/src/app/components/virtualizer/VirtualTile.tsx +++ b/src/app/components/virtualizer/VirtualTile.tsx @@ -1,4 +1,4 @@ -import { VirtualItem } from '@tanstack/react-virtual'; +import { type VirtualItem } from '@tanstack/react-virtual'; import { as } from 'folds'; import classNames from 'classnames'; import * as css from './style.css'; diff --git a/src/app/features/add-existing/AddExisting.tsx b/src/app/features/add-existing/AddExisting.tsx index 80ace407b..46f3c5221 100644 --- a/src/app/features/add-existing/AddExisting.tsx +++ b/src/app/features/add-existing/AddExisting.tsx @@ -20,8 +20,8 @@ import { Text, } from 'folds'; import { - ChangeEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type MouseEventHandler, useCallback, useMemo, useRef, @@ -29,7 +29,7 @@ import { } from 'react'; import { useAtomValue } from 'jotai'; import { useVirtualizer } from '@tanstack/react-virtual'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { stopPropagation } from '$utils/keyboard'; import { useDirects, useRooms, useSpaces } from '$state/hooks/roomList'; import { useMatrixClient } from '$hooks/useMatrixClient'; @@ -43,7 +43,11 @@ import { RoomAvatar, RoomIcon } from '$components/room-avatar'; import { nameInitials } from '$utils/common'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { factoryRoomIdByAtoZ } from '$utils/sort'; -import { SearchItemStrGetter, useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { + type SearchItemStrGetter, + useAsyncSearch, + type UseAsyncSearchOptions, +} from '$hooks/useAsyncSearch'; import { highlightText, makeHighlightRegex } from '$plugins/react-custom-html-parser'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { StateEvent } from '$types/matrix/room'; diff --git a/src/app/features/call-status/CallControl.tsx b/src/app/features/call-status/CallControl.tsx index 128df221f..d10a28a51 100644 --- a/src/app/features/call-status/CallControl.tsx +++ b/src/app/features/call-status/CallControl.tsx @@ -2,7 +2,7 @@ import { Box, Chip, Icon, IconButton, Icons, Spinner, Text, Tooltip, TooltipProv import { useCallback } from 'react'; import { useSetAtom } from 'jotai'; import { StatusDivider } from './components'; -import { CallEmbed, useCallControlState } from '../../plugins/call'; +import { type CallEmbed, useCallControlState } from '../../plugins/call'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; import { callEmbedAtom } from '../../state/callEmbed'; diff --git a/src/app/features/call-status/CallRoomName.tsx b/src/app/features/call-status/CallRoomName.tsx index e2cca3b1b..189d5e0ff 100644 --- a/src/app/features/call-status/CallRoomName.tsx +++ b/src/app/features/call-status/CallRoomName.tsx @@ -1,4 +1,4 @@ -import { Room } from 'matrix-js-sdk'; +import { type Room } from 'matrix-js-sdk'; import { Chip, Text } from 'folds'; import { useAtomValue } from 'jotai'; import { useRoomName } from '../../hooks/useRoomMeta'; diff --git a/src/app/features/call-status/CallStatus.tsx b/src/app/features/call-status/CallStatus.tsx index 899bff7d6..4379ac227 100644 --- a/src/app/features/call-status/CallStatus.tsx +++ b/src/app/features/call-status/CallStatus.tsx @@ -9,7 +9,7 @@ import { useCallMembers, useCallSession } from '../../hooks/useCall'; import { ScreenSize, useScreenSize } from '../../hooks/useScreenSize'; import { MemberGlance } from './MemberGlance'; import { StatusDivider } from './components'; -import { CallEmbed } from '../../plugins/call/CallEmbed'; +import { type CallEmbed } from '../../plugins/call/CallEmbed'; import { useCallJoined } from '../../hooks/useCallEmbed'; import { useCallSpeakers } from '../../hooks/useCallSpeakers'; import { MemberSpeaking } from './MemberSpeaking'; diff --git a/src/app/features/call-status/LiveChip.tsx b/src/app/features/call-status/LiveChip.tsx index e62af0e24..6476ab2d4 100644 --- a/src/app/features/call-status/LiveChip.tsx +++ b/src/app/features/call-status/LiveChip.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useState } from 'react'; +import { type MouseEventHandler, useState } from 'react'; import { Avatar, Badge, @@ -10,14 +10,14 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Text, toRem, } from 'folds'; -import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; +import { type CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; import FocusTrap from 'focus-trap-react'; -import { Room } from 'matrix-js-sdk'; +import { type Room } from 'matrix-js-sdk'; import * as css from './styles.css'; import { stopPropagation } from '../../utils/keyboard'; import { getMemberAvatarMxc, getMemberDisplayName } from '../../utils/room'; diff --git a/src/app/features/call-status/MemberGlance.tsx b/src/app/features/call-status/MemberGlance.tsx index 88c114d51..681e13161 100644 --- a/src/app/features/call-status/MemberGlance.tsx +++ b/src/app/features/call-status/MemberGlance.tsx @@ -1,6 +1,6 @@ import { Box, config, Icon, Icons, Text } from 'folds'; -import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; -import { Room } from 'matrix-js-sdk'; +import { type CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; +import { type Room } from 'matrix-js-sdk'; import { UserAvatar } from '../../components/user-avatar'; import { getMemberAvatarMxc, getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart, mxcUrlToHttp } from '../../utils/matrix'; diff --git a/src/app/features/call-status/MemberSpeaking.tsx b/src/app/features/call-status/MemberSpeaking.tsx index b80190cd3..3c7206e5b 100644 --- a/src/app/features/call-status/MemberSpeaking.tsx +++ b/src/app/features/call-status/MemberSpeaking.tsx @@ -1,4 +1,4 @@ -import { Room } from 'matrix-js-sdk'; +import { type Room } from 'matrix-js-sdk'; import { Box, Icon, Icons, Text } from 'folds'; import { getMemberDisplayName } from '../../utils/room'; import { getMxIdLocalPart } from '../../utils/matrix'; diff --git a/src/app/features/call/CallControls.tsx b/src/app/features/call/CallControls.tsx index 6643069c5..f015e684e 100644 --- a/src/app/features/call/CallControls.tsx +++ b/src/app/features/call/CallControls.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useEffect, useRef, useState } from 'react'; +import { type MouseEventHandler, useCallback, useEffect, useRef, useState } from 'react'; import { Box, Button, @@ -9,14 +9,14 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Spinner, Text, toRem, } from 'folds'; import FocusTrap from 'focus-trap-react'; import { SequenceCard } from '$components/sequence-card'; -import { CallEmbed, useCallControlState } from '$plugins/call'; +import { type CallEmbed, useCallControlState } from '$plugins/call'; import { stopPropagation } from '$utils/keyboard'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useRoom } from '$hooks/useRoom'; diff --git a/src/app/features/call/CallMemberCard.tsx b/src/app/features/call/CallMemberCard.tsx index 7d03ac77b..698cc998a 100644 --- a/src/app/features/call/CallMemberCard.tsx +++ b/src/app/features/call/CallMemberCard.tsx @@ -1,4 +1,7 @@ -import { CallMembership, SessionMembershipData } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; +import { + type CallMembership, + type SessionMembershipData, +} from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; import { useState } from 'react'; import { Avatar, Box, Icon, Icons, Text } from 'folds'; import { useMatrixClient } from '../../hooks/useMatrixClient'; @@ -12,11 +15,11 @@ import { UserAvatar } from '../../components/user-avatar'; import { getMouseEventCords } from '../../utils/dom'; import * as css from './styles.css'; -interface MemberWithMembershipData { +type MemberWithMembershipData = { membershipData?: SessionMembershipData & { 'm.call.intent': 'video' | 'audio'; }; -} +}; type CallMemberCardProps = { member: CallMembership; diff --git a/src/app/features/call/CallView.tsx b/src/app/features/call/CallView.tsx index e79a7f6ac..9e802b961 100644 --- a/src/app/features/call/CallView.tsx +++ b/src/app/features/call/CallView.tsx @@ -147,9 +147,9 @@ function CallJoined({ joined, containerRef }: CallJoinedProps) { ); } -interface CallViewProps { +type CallViewProps = { resizable?: boolean; -} +}; export function CallView({ resizable }: CallViewProps) { const room = useRoom(); diff --git a/src/app/features/common-settings/cosmetics/Cosmetics.tsx b/src/app/features/common-settings/cosmetics/Cosmetics.tsx index dbfbd1390..0d92883c8 100644 --- a/src/app/features/common-settings/cosmetics/Cosmetics.tsx +++ b/src/app/features/common-settings/cosmetics/Cosmetics.tsx @@ -1,7 +1,7 @@ import { - ChangeEvent, - ChangeEventHandler, - FormEventHandler, + type ChangeEvent, + type ChangeEventHandler, + type FormEventHandler, useCallback, useEffect, useMemo, @@ -41,14 +41,14 @@ import { SequenceCardStyle } from '$features/common-settings/styles.css'; import { UserAvatar } from '$components/user-avatar'; import { nameInitials } from '$utils/common'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { UserProfile, useUserProfile } from '$hooks/useUserProfile'; +import { type UserProfile, useUserProfile } from '$hooks/useUserProfile'; import { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { Room, RoomMember } from '$types/matrix-sdk'; +import { type Room, type RoomMember } from '$types/matrix-sdk'; import { Command, useCommands } from '$hooks/useCommands'; import { useCapabilities } from '$hooks/useCapabilities'; import { useObjectURL } from '$hooks/useObjectURL'; -import { createUploadAtom, UploadSuccess } from '$state/upload'; +import { createUploadAtom, type UploadSuccess } from '$state/upload'; import { useFilePicker } from '$hooks/useFilePicker'; import { CompactUploadCardRenderer } from '$components/upload-card'; import FocusTrap from 'focus-trap-react'; @@ -56,7 +56,7 @@ import { ImageEditor } from '$components/image-editor'; import { stopPropagation } from '$utils/keyboard'; import { ModalWide } from '$styles/Modal.css'; import { NameColorEditor } from '$features/settings/account/NameColorEditor'; -import { PronounEditor, PronounSet } from '$features/settings/account/PronounEditor'; +import { PronounEditor, type PronounSet } from '$features/settings/account/PronounEditor'; const log = createLogger('Cosmetics'); diff --git a/src/app/features/common-settings/developer-tools/DevelopTools.tsx b/src/app/features/common-settings/developer-tools/DevelopTools.tsx index f8552e19a..177013578 100644 --- a/src/app/features/common-settings/developer-tools/DevelopTools.tsx +++ b/src/app/features/common-settings/developer-tools/DevelopTools.tsx @@ -29,11 +29,11 @@ import { allRoomsAtom } from '$state/room-list/roomList'; import { allInvitesAtom } from '$state/room-list/inviteList'; import { isNotificationEvent } from '$utils/room'; import { CutoutCard } from '$components/cutout-card'; -import { AccountDataEditor, AccountDataSubmitCallback } from '$components/AccountDataEditor'; +import { AccountDataEditor, type AccountDataSubmitCallback } from '$components/AccountDataEditor'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { SequenceCardStyle } from '$features/common-settings/styles.css'; import { SendRoomEvent } from './SendRoomEvent'; -import { StateEventEditor, StateEventInfo } from './StateEventEditor'; +import { StateEventEditor, type StateEventInfo } from './StateEventEditor'; const formatSyncReason = (reason: string): string => { if (reason === 'sliding_active') return 'Sliding Sync active'; diff --git a/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx b/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx index b246b14b6..fd1a1cff0 100644 --- a/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx +++ b/src/app/features/common-settings/developer-tools/SendRoomEvent.tsx @@ -1,5 +1,5 @@ -import { useCallback, useRef, useState, FormEventHandler, useEffect } from 'react'; -import { MatrixError } from '$types/matrix-sdk'; +import { useCallback, useRef, useState, type FormEventHandler, useEffect } from 'react'; +import { type MatrixError } from '$types/matrix-sdk'; import { Box, Chip, diff --git a/src/app/features/common-settings/developer-tools/StateEventEditor.tsx b/src/app/features/common-settings/developer-tools/StateEventEditor.tsx index 00bbd1125..fe69b5f62 100644 --- a/src/app/features/common-settings/developer-tools/StateEventEditor.tsx +++ b/src/app/features/common-settings/developer-tools/StateEventEditor.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { type FormEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Box, Text, @@ -13,13 +13,13 @@ import { Spinner, Button, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { Page, PageHeader } from '$components/page'; import { SequenceCard } from '$components/sequence-card'; import { TextViewerContent } from '$components/text-viewer'; import { useStateEvent } from '$hooks/useStateEvent'; import { useRoom } from '$hooks/useRoom'; -import { StateEvent } from '$types/matrix/room'; +import { type StateEvent } from '$types/matrix/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useAlive } from '$hooks/useAlive'; import { Cursor } from '$plugins/text-area'; diff --git a/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx b/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx index 0ee350a69..6de76d7ac 100644 --- a/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx +++ b/src/app/features/common-settings/emojis-stickers/EmojisStickers.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { Box, Icon, IconButton, Icons, Scroll, Text } from 'folds'; import { Page, PageContent, PageHeader } from '$components/page'; -import { ImagePack } from '$plugins/custom-emoji'; +import { type ImagePack } from '$plugins/custom-emoji'; import { ImagePackView } from '$components/image-pack-view'; import { RoomPacks } from './RoomPacks'; diff --git a/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx b/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx index 6162e4c0b..6a9e05b35 100644 --- a/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx +++ b/src/app/features/common-settings/emojis-stickers/RoomPacks.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useMemo, useState } from 'react'; +import { type FormEventHandler, useCallback, useMemo, useState } from 'react'; import { Box, Text, @@ -16,14 +16,14 @@ import { IconButton, Menu, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { SequenceCard } from '$components/sequence-card'; import { - ImagePack, + type ImagePack, ImageUsage, - PackAddress, + type PackAddress, packAddressEqual, - PackContent, + type PackContent, } from '$plugins/custom-emoji'; import { useRoom } from '$hooks/useRoom'; import { useRoomImagePacks } from '$hooks/useImagePacks'; diff --git a/src/app/features/common-settings/general/RoomAddress.tsx b/src/app/features/common-settings/general/RoomAddress.tsx index f1ae66968..80e3247ab 100644 --- a/src/app/features/common-settings/general/RoomAddress.tsx +++ b/src/app/features/common-settings/general/RoomAddress.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useState } from 'react'; +import { type FormEventHandler, useCallback, useState } from 'react'; import { Badge, Box, @@ -14,7 +14,7 @@ import { Text, toRem, } from 'folds'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { SettingTile } from '$components/setting-tile'; import { SequenceCard } from '$components/sequence-card'; import { SequenceCardStyle } from '$features/room-settings/styles.css'; @@ -31,7 +31,7 @@ import { CutoutCard } from '$components/cutout-card'; import { replaceSpaceWithDash } from '$utils/common'; import { useAlive } from '$hooks/useAlive'; import { StateEvent } from '$types/matrix/room'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; import { getMxIdServer } from '$utils/matrix'; type RoomPublishedAddressesProps = { diff --git a/src/app/features/common-settings/general/RoomEncryption.tsx b/src/app/features/common-settings/general/RoomEncryption.tsx index 3dc87f840..dac24596f 100644 --- a/src/app/features/common-settings/general/RoomEncryption.tsx +++ b/src/app/features/common-settings/general/RoomEncryption.tsx @@ -16,7 +16,7 @@ import { Text, } from 'folds'; import { useCallback, useState } from 'react'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; import { SequenceCard } from '$components/sequence-card'; import { SequenceCardStyle } from '$features/room-settings/styles.css'; @@ -27,7 +27,7 @@ import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useRoom } from '$hooks/useRoom'; import { useStateEvent } from '$hooks/useStateEvent'; import { stopPropagation } from '$utils/keyboard'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; const ROOM_ENC_ALGO = 'm.megolm.v1.aes-sha2'; diff --git a/src/app/features/common-settings/general/RoomHistoryVisibility.tsx b/src/app/features/common-settings/general/RoomHistoryVisibility.tsx index 2f93472e6..9671110e1 100644 --- a/src/app/features/common-settings/general/RoomHistoryVisibility.tsx +++ b/src/app/features/common-settings/general/RoomHistoryVisibility.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useMemo, useState } from 'react'; +import { type MouseEventHandler, useCallback, useMemo, useState } from 'react'; import { Button, color, @@ -8,14 +8,14 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Spinner, Text, } from 'folds'; import { HistoryVisibility, - MatrixError, - RoomHistoryVisibilityEventContent, + type MatrixError, + type RoomHistoryVisibilityEventContent, } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; import { SequenceCard } from '$components/sequence-card'; @@ -27,7 +27,7 @@ import { StateEvent } from '$types/matrix/room'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useStateEvent } from '$hooks/useStateEvent'; import { stopPropagation } from '$utils/keyboard'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; const useVisibilityStr = () => useMemo( diff --git a/src/app/features/common-settings/general/RoomJoinRules.tsx b/src/app/features/common-settings/general/RoomJoinRules.tsx index 5a6c3697f..f69e194db 100644 --- a/src/app/features/common-settings/general/RoomJoinRules.tsx +++ b/src/app/features/common-settings/general/RoomJoinRules.tsx @@ -2,13 +2,13 @@ import { useCallback, useMemo } from 'react'; import { color, Text } from 'folds'; import { JoinRule, - MatrixError, + type MatrixError, RestrictedAllowType, - RoomJoinRulesEventContent, + type RoomJoinRulesEventContent, } from '$types/matrix-sdk'; import { useAtomValue } from 'jotai'; import { - ExtendedJoinRules, + type ExtendedJoinRules, JoinRulesSwitcher, useJoinRuleIcons, useRoomJoinRuleLabel, @@ -27,7 +27,7 @@ import { useRecursiveChildSpaceScopeFactory, useSpaceChildren } from '$state/hoo import { allRoomsAtom } from '$state/room-list/roomList'; import { roomToParentsAtom } from '$state/room/roomToParents'; import { knockRestrictedSupported, knockSupported, restrictedSupported } from '$utils/matrix'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; type RestrictedRoomAllowContent = { room_id: string; diff --git a/src/app/features/common-settings/general/RoomProfile.tsx b/src/app/features/common-settings/general/RoomProfile.tsx index cd523f32b..b6df8ec3d 100644 --- a/src/app/features/common-settings/general/RoomProfile.tsx +++ b/src/app/features/common-settings/general/RoomProfile.tsx @@ -11,11 +11,11 @@ import { Text, TextArea, } from 'folds'; -import { FormEventHandler, useCallback, useMemo, useState } from 'react'; +import { type FormEventHandler, useCallback, useMemo, useState } from 'react'; import { useAtomValue } from 'jotai'; import Linkify from 'linkify-react'; import classNames from 'classnames'; -import { JoinRule, MatrixError } from '$types/matrix-sdk'; +import { JoinRule, type MatrixError } from '$types/matrix-sdk'; import { SequenceCard } from '$components/sequence-card'; import { SequenceCardStyle } from '$features/room-settings/styles.css'; import { useRoom } from '$hooks/useRoom'; @@ -30,11 +30,11 @@ import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { StateEvent } from '$types/matrix/room'; import { CompactUploadCardRenderer } from '$components/upload-card'; import { useObjectURL } from '$hooks/useObjectURL'; -import { createUploadAtom, UploadSuccess } from '$state/upload'; +import { createUploadAtom, type UploadSuccess } from '$state/upload'; import { useFilePicker } from '$hooks/useFilePicker'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useAlive } from '$hooks/useAlive'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; type RoomProfileEditProps = { canEditAvatar: boolean; diff --git a/src/app/features/common-settings/general/RoomPublish.tsx b/src/app/features/common-settings/general/RoomPublish.tsx index a4aa47d2a..5739cc5ee 100644 --- a/src/app/features/common-settings/general/RoomPublish.tsx +++ b/src/app/features/common-settings/general/RoomPublish.tsx @@ -1,5 +1,5 @@ import { Box, color, Spinner, Switch, Text } from 'folds'; -import { JoinRule, MatrixError, RoomJoinRulesEventContent } from '$types/matrix-sdk'; +import { JoinRule, type MatrixError, type RoomJoinRulesEventContent } from '$types/matrix-sdk'; import { SequenceCard } from '$components/sequence-card'; import { SequenceCardStyle } from '$features/room-settings/styles.css'; import { SettingTile } from '$components/setting-tile'; @@ -9,8 +9,8 @@ import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { StateEvent } from '$types/matrix/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useStateEvent } from '$hooks/useStateEvent'; -import { ExtendedJoinRules } from '$components/JoinRulesSwitcher'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type ExtendedJoinRules } from '$components/JoinRulesSwitcher'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; type RoomPublishProps = { permissions: RoomPermissionsAPI; diff --git a/src/app/features/common-settings/general/RoomUpgrade.tsx b/src/app/features/common-settings/general/RoomUpgrade.tsx index 073465688..ac738ff77 100644 --- a/src/app/features/common-settings/general/RoomUpgrade.tsx +++ b/src/app/features/common-settings/general/RoomUpgrade.tsx @@ -16,19 +16,19 @@ import { Icons, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import { MatrixError, Method, RoomTombstoneEventContent } from '$types/matrix-sdk'; +import { type MatrixError, Method, type RoomTombstoneEventContent } from '$types/matrix-sdk'; import { SequenceCard } from '$components/sequence-card'; import { SequenceCardStyle } from '$features/room-settings/styles.css'; import { SettingTile } from '$components/setting-tile'; import { useRoom } from '$hooks/useRoom'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { IRoomCreateContent, StateEvent } from '$types/matrix/room'; +import { type IRoomCreateContent, StateEvent } from '$types/matrix/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useStateEvent } from '$hooks/useStateEvent'; import { useRoomNavigate } from '$hooks/useRoomNavigate'; import { useCapabilities } from '$hooks/useCapabilities'; import { stopPropagation } from '$utils/keyboard'; -import { RoomPermissionsAPI } from '$hooks/useRoomPermissions'; +import { type RoomPermissionsAPI } from '$hooks/useRoomPermissions'; import { AdditionalCreatorInput, RoomVersionSelector, diff --git a/src/app/features/common-settings/members/Members.tsx b/src/app/features/common-settings/members/Members.tsx index 19b8ffc46..6a7abc10f 100644 --- a/src/app/features/common-settings/members/Members.tsx +++ b/src/app/features/common-settings/members/Members.tsx @@ -1,6 +1,6 @@ import { - ChangeEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type MouseEventHandler, useCallback, useMemo, useRef, @@ -15,14 +15,14 @@ import { Icons, Input, PopOut, - RectCords, + type RectCords, Scroll, Spinner, Text, toRem, } from 'folds'; import { useVirtualizer } from '@tanstack/react-virtual'; -import { RoomMember } from '$types/matrix-sdk'; +import { type RoomMember } from '$types/matrix-sdk'; import { Page, PageContent, PageHeader } from '$components/page'; import { useRoom } from '$hooks/useRoom'; import { useRoomMembers } from '$hooks/useRoomMembers'; @@ -34,7 +34,11 @@ import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { getMxIdLocalPart, getMxIdServer } from '$utils/matrix'; import { ServerBadge } from '$components/server-badge'; import { useDebounce } from '$hooks/useDebounce'; -import { SearchItemStrGetter, useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { + type SearchItemStrGetter, + useAsyncSearch, + type UseAsyncSearchOptions, +} from '$hooks/useAsyncSearch'; import { getMemberSearchStr } from '$utils/room'; import { useMembershipFilter, useMembershipFilterMenu } from '$hooks/useMemberFilter'; import { useMemberPowerSort, useMemberSort, useMemberSortMenu } from '$hooks/useMemberSort'; diff --git a/src/app/features/common-settings/permissions/PermissionGroups.tsx b/src/app/features/common-settings/permissions/PermissionGroups.tsx index 324005819..b29c788e1 100644 --- a/src/app/features/common-settings/permissions/PermissionGroups.tsx +++ b/src/app/features/common-settings/permissions/PermissionGroups.tsx @@ -7,8 +7,8 @@ import { SettingTile } from '$components/setting-tile'; import { applyPermissionPower, getPermissionPower, - IPowerLevels, - PermissionLocation, + type IPowerLevels, + type PermissionLocation, } from '$hooks/usePowerLevels'; import { getPowerLevelTag, getPowers, usePowerLevelTags } from '$hooks/usePowerLevelTags'; import { useRoom } from '$hooks/useRoom'; @@ -18,7 +18,7 @@ import { PowerSwitcher } from '$components/power'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useAlive } from '$hooks/useAlive'; import { SequenceCardStyle } from '$features/common-settings/styles.css'; -import { PermissionGroup } from './types'; +import { type PermissionGroup } from './types'; const USER_DEFAULT_LOCATION: PermissionLocation = { user: true, diff --git a/src/app/features/common-settings/permissions/Powers.tsx b/src/app/features/common-settings/permissions/Powers.tsx index a029ac785..ce1d03674 100644 --- a/src/app/features/common-settings/permissions/Powers.tsx +++ b/src/app/features/common-settings/permissions/Powers.tsx @@ -1,12 +1,12 @@ /* eslint-disable react/no-array-index-key */ -import { useState, MouseEventHandler, ReactNode } from 'react'; +import { useState, type MouseEventHandler, type ReactNode } from 'react'; import FocusTrap from 'focus-trap-react'; import { Box, Button, Chip, Text, - RectCords, + type RectCords, PopOut, Menu, Scroll, @@ -17,7 +17,7 @@ import { import { SequenceCard } from '$components/sequence-card'; import { getPowers, usePowerLevelTags } from '$hooks/usePowerLevelTags'; import { SettingTile } from '$components/setting-tile'; -import { getPermissionPower, IPowerLevels } from '$hooks/usePowerLevels'; +import { getPermissionPower, type IPowerLevels } from '$hooks/usePowerLevels'; import { useRoom } from '$hooks/useRoom'; import { PowerColorBadge, PowerIcon } from '$components/power'; import { useMatrixClient } from '$hooks/useMatrixClient'; @@ -27,7 +27,7 @@ import { getPowerTagIconSrc } from '$hooks/useMemberPowerTag'; import { useRoomCreatorsTag } from '$hooks/useRoomCreatorsTag'; import { useRoomCreators } from '$hooks/useRoomCreators'; import { SequenceCardStyle } from '$features/common-settings/styles.css'; -import { PermissionGroup } from './types'; +import { type PermissionGroup } from './types'; type PeekPermissionsProps = { powerLevels: IPowerLevels; diff --git a/src/app/features/common-settings/permissions/PowersEditor.tsx b/src/app/features/common-settings/permissions/PowersEditor.tsx index f53f3a237..06cfd8337 100644 --- a/src/app/features/common-settings/permissions/PowersEditor.tsx +++ b/src/app/features/common-settings/permissions/PowersEditor.tsx @@ -1,4 +1,10 @@ -import { FormEventHandler, MouseEventHandler, useCallback, useMemo, useState } from 'react'; +import { + type FormEventHandler, + type MouseEventHandler, + useCallback, + useMemo, + useState, +} from 'react'; import { Box, Text, @@ -9,7 +15,7 @@ import { Scroll, Button, Input, - RectCords, + type RectCords, PopOut, Menu, config, @@ -21,13 +27,13 @@ import { import { HexColorPicker } from 'react-colorful'; import { useAtomValue } from 'jotai'; import { Page, PageContent, PageHeader } from '$components/page'; -import { IPowerLevels } from '$hooks/usePowerLevels'; +import { type IPowerLevels } from '$hooks/usePowerLevels'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; import { getPowers, getUsedPowers, - PowerLevelTags, + type PowerLevelTags, usePowerLevelTags, } from '$hooks/usePowerLevelTags'; import { useRoom } from '$hooks/useRoom'; @@ -41,9 +47,9 @@ import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useFilePicker } from '$hooks/useFilePicker'; import { CompactUploadCardRenderer } from '$components/upload-card'; -import { createUploadAtom, UploadSuccess } from '$state/upload'; +import { createUploadAtom, type UploadSuccess } from '$state/upload'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; -import { MemberPowerTag, MemberPowerTagIcon, StateEvent } from '$types/matrix/room'; +import { type MemberPowerTag, type MemberPowerTagIcon, StateEvent } from '$types/matrix/room'; import { useAlive } from '$hooks/useAlive'; import { BetaNoticeBadge } from '$components/BetaNoticeBadge'; import { getPowerTagIconSrc } from '$hooks/useMemberPowerTag'; diff --git a/src/app/features/common-settings/permissions/types.ts b/src/app/features/common-settings/permissions/types.ts index 5d5eaa35d..1f47aa452 100644 --- a/src/app/features/common-settings/permissions/types.ts +++ b/src/app/features/common-settings/permissions/types.ts @@ -1,4 +1,4 @@ -import { PermissionLocation } from '$hooks/usePowerLevels'; +import { type PermissionLocation } from '$hooks/usePowerLevels'; export type PermissionItem = { location: PermissionLocation; diff --git a/src/app/features/create-chat/CreateChat.tsx b/src/app/features/create-chat/CreateChat.tsx index 225ef9b64..c862718b6 100644 --- a/src/app/features/create-chat/CreateChat.tsx +++ b/src/app/features/create-chat/CreateChat.tsx @@ -1,6 +1,6 @@ import { Box, Button, color, config, Icon, Icons, Input, Spinner, Switch, Text } from 'folds'; -import { FormEventHandler, useCallback, useState } from 'react'; -import { ICreateRoomStateEvent, MatrixError, Preset, Visibility } from '$types/matrix-sdk'; +import { type FormEventHandler, useCallback, useState } from 'react'; +import { type ICreateRoomStateEvent, MatrixError, Preset, Visibility } from '$types/matrix-sdk'; import { useNavigate } from 'react-router-dom'; import { SettingTile } from '$components/setting-tile'; import { SequenceCard } from '$components/sequence-card'; diff --git a/src/app/features/create-room/CreateRoom.tsx b/src/app/features/create-room/CreateRoom.tsx index 7347ba586..1f5692018 100644 --- a/src/app/features/create-room/CreateRoom.tsx +++ b/src/app/features/create-room/CreateRoom.tsx @@ -1,5 +1,5 @@ -import { FormEventHandler, useCallback, useEffect, useState } from 'react'; -import { MatrixError, Room, JoinRule } from '$types/matrix-sdk'; +import { type FormEventHandler, useCallback, useEffect, useState } from 'react'; +import { MatrixError, type Room, JoinRule } from '$types/matrix-sdk'; import { Box, Button, @@ -31,7 +31,7 @@ import { AdditionalCreatorInput, createRoom, CreateRoomAliasInput, - CreateRoomData, + type CreateRoomData, CreateRoomAccess, CreateRoomAccessSelector, RoomVersionSelector, diff --git a/src/app/features/create-room/CreateRoomModal.tsx b/src/app/features/create-room/CreateRoomModal.tsx index ad613a520..7297ab150 100644 --- a/src/app/features/create-room/CreateRoomModal.tsx +++ b/src/app/features/create-room/CreateRoomModal.tsx @@ -16,7 +16,7 @@ import FocusTrap from 'focus-trap-react'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; import { SpaceProvider } from '$hooks/useSpace'; import { useCloseCreateRoomModal, useCreateRoomModalState } from '$state/hooks/createRoomModal'; -import { CreateRoomModalState } from '$state/createRoomModal'; +import { type CreateRoomModalState } from '$state/createRoomModal'; import { stopPropagation } from '$utils/keyboard'; import { CreateRoomType } from '$components/create-room/types'; import { CreateRoomForm } from './CreateRoom'; diff --git a/src/app/features/create-space/CreateSpace.tsx b/src/app/features/create-space/CreateSpace.tsx index 2fbeb198b..e1de7d25c 100644 --- a/src/app/features/create-space/CreateSpace.tsx +++ b/src/app/features/create-space/CreateSpace.tsx @@ -1,5 +1,5 @@ -import { FormEventHandler, useCallback, useEffect, useState } from 'react'; -import { MatrixError, Room } from '$types/matrix-sdk'; +import { type FormEventHandler, useCallback, useEffect, useState } from 'react'; +import { MatrixError, type Room } from '$types/matrix-sdk'; import { Box, Button, @@ -31,7 +31,7 @@ import { AdditionalCreatorInput, createRoom, CreateRoomAliasInput, - CreateRoomData, + type CreateRoomData, CreateRoomAccess, CreateRoomAccessSelector, RoomVersionSelector, diff --git a/src/app/features/create-space/CreateSpaceModal.tsx b/src/app/features/create-space/CreateSpaceModal.tsx index 3ef0da51f..effa38bdd 100644 --- a/src/app/features/create-space/CreateSpaceModal.tsx +++ b/src/app/features/create-space/CreateSpaceModal.tsx @@ -16,7 +16,7 @@ import FocusTrap from 'focus-trap-react'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; import { SpaceProvider } from '$hooks/useSpace'; import { useCloseCreateSpaceModal, useCreateSpaceModalState } from '$state/hooks/createSpaceModal'; -import { CreateSpaceModalState } from '$state/createSpaceModal'; +import { type CreateSpaceModalState } from '$state/createSpaceModal'; import { stopPropagation } from '$utils/keyboard'; import { CreateSpaceForm } from './CreateSpace'; diff --git a/src/app/features/lobby/DnD.tsx b/src/app/features/lobby/DnD.tsx index fa4584a40..3c6f46d7e 100644 --- a/src/app/features/lobby/DnD.tsx +++ b/src/app/features/lobby/DnD.tsx @@ -1,4 +1,4 @@ -import { RefObject, useEffect, useRef, useState } from 'react'; +import { type RefObject, useEffect, useRef, useState } from 'react'; import { dropTargetForElements, draggable, @@ -8,7 +8,7 @@ import { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-sc import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'; import classNames from 'classnames'; import { Box, Icon, Icons, as } from 'folds'; -import { HierarchyItem } from '$hooks/useSpaceHierarchy'; +import { type HierarchyItem } from '$hooks/useSpaceHierarchy'; import * as css from './DnD.css'; export type DropContainerData = { diff --git a/src/app/features/lobby/HierarchyItemMenu.tsx b/src/app/features/lobby/HierarchyItemMenu.tsx index bbaf3885f..8ba4d1235 100644 --- a/src/app/features/lobby/HierarchyItemMenu.tsx +++ b/src/app/features/lobby/HierarchyItemMenu.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useEffect, useState } from 'react'; +import { type MouseEventHandler, useCallback, useEffect, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Box, @@ -9,15 +9,15 @@ import { Menu, MenuItem, Text, - RectCords, + type RectCords, config, Line, Spinner, toRem, } from 'folds'; -import { HierarchyItem } from '$hooks/useSpaceHierarchy'; +import { type HierarchyItem } from '$hooks/useSpaceHierarchy'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { MSpaceChildContent, StateEvent } from '$types/matrix/room'; +import { type MSpaceChildContent, StateEvent } from '$types/matrix/room'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { UseStateProvider } from '$components/UseStateProvider'; import { LeaveSpacePrompt } from '$components/leave-space-prompt'; @@ -26,7 +26,7 @@ import { stopPropagation } from '$utils/keyboard'; import { useOpenRoomSettings } from '$state/hooks/roomSettings'; import { useSpaceOptionally } from '$hooks/useSpace'; import { useOpenSpaceSettings } from '$state/hooks/spaceSettings'; -import { IPowerLevels } from '$hooks/usePowerLevels'; +import { type IPowerLevels } from '$hooks/usePowerLevels'; import { getRoomCreatorsForRoomId } from '$hooks/useRoomCreators'; import { getRoomPermissionsAPI } from '$hooks/useRoomPermissions'; import { InviteUserPrompt } from '$components/invite-user-prompt'; diff --git a/src/app/features/lobby/Lobby.tsx b/src/app/features/lobby/Lobby.tsx index 180e0d81f..ca6527fee 100644 --- a/src/app/features/lobby/Lobby.tsx +++ b/src/app/features/lobby/Lobby.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, useCallback, useMemo, useRef, useState } from 'react'; import { Box, Chip, Icon, IconButton, Icons, Line, Scroll, Spinner, Text, config } from 'folds'; import { useVirtualizer } from '@tanstack/react-virtual'; import { useAtom, useAtomValue } from 'jotai'; @@ -6,14 +6,18 @@ import { useNavigate } from 'react-router-dom'; import { JoinRule, RestrictedAllowType, - Room, - RoomJoinRulesEventContent, - IHierarchyRoom, + type Room, + type RoomJoinRulesEventContent, + type IHierarchyRoom, } from '$types/matrix-sdk'; import { produce } from 'immer'; import { useSpace } from '$hooks/useSpace'; import { Page, PageContent, PageContentCenter, PageHeroSection } from '$components/page'; -import { HierarchyItem, HierarchyItemSpace, useSpaceHierarchy } from '$hooks/useSpaceHierarchy'; +import { + type HierarchyItem, + type HierarchyItemSpace, + useSpaceHierarchy, +} from '$hooks/useSpaceHierarchy'; import { VirtualTile } from '$components/virtualizer'; import { spaceRoomsAtom } from '$state/spaceRooms'; import { useSetting } from '$state/hooks/settings'; @@ -22,7 +26,7 @@ import { settingsAtom } from '$state/settings'; import { ScrollTopContainer } from '$components/scroll-top-container'; import { useElementSizeObserver } from '$hooks/useElementSizeObserver'; import { - IPowerLevels, + type IPowerLevels, PowerLevelsContextProvider, usePowerLevels, useRoomsPowerLevels, @@ -53,7 +57,7 @@ import { getRoomPermissionsAPI } from '$hooks/useRoomPermissions'; import { getRoomCreatorsForRoomId } from '$hooks/useRoomCreators'; import { MembersDrawer } from '$features/room/MembersDrawer'; import { SpaceHierarchy } from './SpaceHierarchy'; -import { CanDropCallback, useDnDMonitor } from './DnD'; +import { type CanDropCallback, useDnDMonitor } from './DnD'; import { LobbyHero } from './LobbyHero'; import { LobbyHeader } from './LobbyHeader'; diff --git a/src/app/features/lobby/LobbyHeader.tsx b/src/app/features/lobby/LobbyHeader.tsx index 4c3ba7447..d64673b79 100644 --- a/src/app/features/lobby/LobbyHeader.tsx +++ b/src/app/features/lobby/LobbyHeader.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, forwardRef, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useState } from 'react'; import { Avatar, Box, @@ -9,7 +9,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, Tooltip, TooltipProvider, @@ -25,7 +25,7 @@ import { useSpace } from '$hooks/useSpace'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { RoomAvatar } from '$components/room-avatar'; import { nameInitials } from '$utils/common'; -import { IPowerLevels } from '$hooks/usePowerLevels'; +import { type IPowerLevels } from '$hooks/usePowerLevels'; import { UseStateProvider } from '$components/UseStateProvider'; import { LeaveSpacePrompt } from '$components/leave-space-prompt'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/features/lobby/RoomItem.tsx b/src/app/features/lobby/RoomItem.tsx index 0d512285d..ce4dec24e 100644 --- a/src/app/features/lobby/RoomItem.tsx +++ b/src/app/features/lobby/RoomItem.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, ReactNode, useCallback, useRef } from 'react'; +import { type MouseEventHandler, type ReactNode, useCallback, useRef } from 'react'; import { Avatar, Badge, @@ -19,11 +19,11 @@ import { toRem, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import { JoinRule, MatrixError, Room, IHierarchyRoom } from '$types/matrix-sdk'; +import { JoinRule, type MatrixError, type Room, type IHierarchyRoom } from '$types/matrix-sdk'; import { RoomAvatar, RoomIcon } from '$components/room-avatar'; import { SequenceCard } from '$components/sequence-card'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { HierarchyItem } from '$hooks/useSpaceHierarchy'; +import { type HierarchyItem } from '$hooks/useSpaceHierarchy'; import { millify } from '$plugins/millify'; import { LocalRoomSummaryLoader } from '$components/RoomSummaryLoader'; import { UseStateProvider } from '$components/UseStateProvider'; diff --git a/src/app/features/lobby/SpaceHierarchy.tsx b/src/app/features/lobby/SpaceHierarchy.tsx index c617fe7d0..db1460702 100644 --- a/src/app/features/lobby/SpaceHierarchy.tsx +++ b/src/app/features/lobby/SpaceHierarchy.tsx @@ -1,20 +1,20 @@ -import { forwardRef, MouseEventHandler, useEffect, useMemo } from 'react'; -import { MatrixError, Room, IHierarchyRoom } from '$types/matrix-sdk'; +import { forwardRef, type MouseEventHandler, useEffect, useMemo } from 'react'; +import { MatrixError, type Room, type IHierarchyRoom } from '$types/matrix-sdk'; import { Box, config, Text } from 'folds'; import { - HierarchyItem, - HierarchyItemRoom, - HierarchyItemSpace, + type HierarchyItem, + type HierarchyItemRoom, + type HierarchyItemSpace, useFetchSpaceHierarchyLevel, } from '$hooks/useSpaceHierarchy'; -import { IPowerLevels } from '$hooks/usePowerLevels'; +import { type IPowerLevels } from '$hooks/usePowerLevels'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { RoomType, StateEvent } from '$types/matrix/room'; import { SequenceCard } from '$components/sequence-card'; import { getRoomCreatorsForRoomId } from '$hooks/useRoomCreators'; import { getRoomPermissionsAPI } from '$hooks/useRoomPermissions'; import { SpaceItemCard } from './SpaceItem'; -import { AfterItemDropTarget, CanDropCallback } from './DnD'; +import { AfterItemDropTarget, type CanDropCallback } from './DnD'; import { HierarchyItemMenu } from './HierarchyItemMenu'; import { RoomItemCard } from './RoomItem'; diff --git a/src/app/features/lobby/SpaceItem.tsx b/src/app/features/lobby/SpaceItem.tsx index c8ec05f22..b5a0de7a7 100644 --- a/src/app/features/lobby/SpaceItem.tsx +++ b/src/app/features/lobby/SpaceItem.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, ReactNode, useCallback, useRef, useState } from 'react'; +import { type MouseEventHandler, type ReactNode, useCallback, useRef, useState } from 'react'; import { Box, Avatar, @@ -13,13 +13,13 @@ import { PopOut, Menu, MenuItem, - RectCords, + type RectCords, config, } from 'folds'; import FocusTrap from 'focus-trap-react'; import classNames from 'classnames'; -import { MatrixError, Room, IHierarchyRoom } from '$types/matrix-sdk'; -import { HierarchyItem } from '$hooks/useSpaceHierarchy'; +import { type MatrixError, type Room, type IHierarchyRoom } from '$types/matrix-sdk'; +import { type HierarchyItem } from '$hooks/useSpaceHierarchy'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { RoomAvatar } from '$components/room-avatar'; import { nameInitials } from '$utils/common'; diff --git a/src/app/features/message-search/MessageSearch.tsx b/src/app/features/message-search/MessageSearch.tsx index db9191725..443d6a20c 100644 --- a/src/app/features/message-search/MessageSearch.tsx +++ b/src/app/features/message-search/MessageSearch.tsx @@ -1,4 +1,4 @@ -import { RefObject, useEffect, useMemo, useRef } from 'react'; +import { type RefObject, useEffect, useMemo, useRef } from 'react'; import { Text, Box, Icon, Icons, config, Spinner, IconButton, Line, toRem } from 'folds'; import { useAtomValue } from 'jotai'; import { useVirtualizer } from '@tanstack/react-virtual'; @@ -7,7 +7,7 @@ import { useSearchParams } from 'react-router-dom'; import { SearchOrderBy } from '$types/matrix-sdk'; import { PageHero, PageHeroEmpty, PageHeroSection } from '$components/page'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { SearchPathSearchParams } from '$pages/paths'; +import { type SearchPathSearchParams } from '$pages/paths'; import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { SequenceCard } from '$components/sequence-card'; @@ -19,7 +19,7 @@ import { useRooms } from '$state/hooks/roomList'; import { allRoomsAtom } from '$state/room-list/roomList'; import { mDirectAtom } from '$state/mDirectList'; import { VirtualTile } from '$components/virtualizer'; -import { MessageSearchParams, useMessageSearch } from './useMessageSearch'; +import { type MessageSearchParams, useMessageSearch } from './useMessageSearch'; import { SearchResultGroup } from './SearchResultGroup'; import { SearchInput } from './SearchInput'; import { SearchFilters } from './SearchFilters'; diff --git a/src/app/features/message-search/SearchFilters.tsx b/src/app/features/message-search/SearchFilters.tsx index 4c1abd75d..57a8e31af 100644 --- a/src/app/features/message-search/SearchFilters.tsx +++ b/src/app/features/message-search/SearchFilters.tsx @@ -1,6 +1,6 @@ import { - ChangeEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type MouseEventHandler, useCallback, useEffect, useRef, @@ -23,7 +23,7 @@ import { Button, Input, Badge, - RectCords, + type RectCords, } from 'folds'; import { SearchOrderBy } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; @@ -31,8 +31,12 @@ import { useVirtualizer } from '@tanstack/react-virtual'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { getRoomIconSrc } from '$utils/room'; import { factoryRoomIdByAtoZ } from '$utils/sort'; -import { SearchItemStrGetter, UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; -import { DebounceOptions, useDebounce } from '$hooks/useDebounce'; +import { + type SearchItemStrGetter, + type UseAsyncSearchOptions, + useAsyncSearch, +} from '$hooks/useAsyncSearch'; +import { type DebounceOptions, useDebounce } from '$hooks/useDebounce'; import { VirtualTile } from '$components/virtualizer'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/features/message-search/SearchInput.tsx b/src/app/features/message-search/SearchInput.tsx index ad1ca593d..de927c277 100644 --- a/src/app/features/message-search/SearchInput.tsx +++ b/src/app/features/message-search/SearchInput.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, RefObject } from 'react'; +import { type FormEventHandler, type RefObject } from 'react'; import { Box, Text, Input, Icon, Icons, Spinner, Chip, config } from 'folds'; type SearchProps = { diff --git a/src/app/features/message-search/SearchResultGroup.tsx b/src/app/features/message-search/SearchResultGroup.tsx index 86a67553c..fd84d5d7e 100644 --- a/src/app/features/message-search/SearchResultGroup.tsx +++ b/src/app/features/message-search/SearchResultGroup.tsx @@ -1,9 +1,9 @@ /* eslint-disable react/destructuring-assignment */ -import { MouseEventHandler, useMemo } from 'react'; -import { IEventWithRoomId, JoinRule, RelationType, Room } from '$types/matrix-sdk'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type MouseEventHandler, useMemo } from 'react'; +import { type IEventWithRoomId, JoinRule, RelationType, type Room } from '$types/matrix-sdk'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { Avatar, Box, Chip, Header, Icon, Icons, Text, config } from 'folds'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { factoryRenderLinkifyWithMention, @@ -15,7 +15,7 @@ import { } from '$plugins/react-custom-html-parser'; import { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix'; import { useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer'; -import { GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; +import { type GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; import { AvatarBase, ImageContent, @@ -52,7 +52,7 @@ import { } from '$hooks/useMemberPowerTag'; import { useRoomCreators } from '$hooks/useRoomCreators'; import { useRoomCreatorsTag } from '$hooks/useRoomCreatorsTag'; -import { ResultItem } from './useMessageSearch'; +import { type ResultItem } from './useMessageSearch'; type SearchResultGroupProps = { room: Room; diff --git a/src/app/features/message-search/useMessageSearch.ts b/src/app/features/message-search/useMessageSearch.ts index de1b15585..a0349531e 100644 --- a/src/app/features/message-search/useMessageSearch.ts +++ b/src/app/features/message-search/useMessageSearch.ts @@ -1,10 +1,10 @@ import { - IEventWithRoomId, - IResultContext, - ISearchRequestBody, - ISearchResponse, - ISearchResult, - SearchOrderBy, + type IEventWithRoomId, + type IResultContext, + type ISearchRequestBody, + type ISearchResponse, + type ISearchResult, + type SearchOrderBy, } from '$types/matrix-sdk'; import { useCallback } from 'react'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/features/room-nav/RoomNavItem.tsx b/src/app/features/room-nav/RoomNavItem.tsx index 30d93d436..45391678f 100644 --- a/src/app/features/room-nav/RoomNavItem.tsx +++ b/src/app/features/room-nav/RoomNavItem.tsx @@ -1,5 +1,5 @@ -import { MouseEventHandler, forwardRef, useState, MouseEvent, useEffect } from 'react'; -import { Room, RoomEvent as RoomEventEnum } from '$types/matrix-sdk'; +import { type MouseEventHandler, forwardRef, useState, type MouseEvent, useEffect } from 'react'; +import { type Room, RoomEvent as RoomEventEnum } from '$types/matrix-sdk'; import { Avatar, Box, @@ -13,7 +13,7 @@ import { PopOut, toRem, Line, - RectCords, + type RectCords, Badge, Spinner, Tooltip, diff --git a/src/app/features/room-nav/RoomNavUser.tsx b/src/app/features/room-nav/RoomNavUser.tsx index 7d25d7bf9..ed62ced95 100644 --- a/src/app/features/room-nav/RoomNavUser.tsx +++ b/src/app/features/room-nav/RoomNavUser.tsx @@ -1,7 +1,7 @@ import { Avatar, Box, Icon, Icons, Text } from 'folds'; -import { MouseEventHandler } from 'react'; +import { type MouseEventHandler } from 'react'; import { useAtomValue } from 'jotai'; -import { Room, CallMembership } from '$types/matrix-sdk'; +import { type Room, type CallMembership } from '$types/matrix-sdk'; import { NavButton, NavItem, NavItemContent } from '$components/nav'; import { UserAvatar } from '$components/user-avatar'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/features/room-settings/RoomSettings.tsx b/src/app/features/room-settings/RoomSettings.tsx index 7c973d995..1e9f7e0a9 100644 --- a/src/app/features/room-settings/RoomSettings.tsx +++ b/src/app/features/room-settings/RoomSettings.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react'; import { useAtomValue } from 'jotai'; -import { Avatar, Box, config, Icon, IconButton, Icons, IconSrc, MenuItem, Text } from 'folds'; +import { Avatar, Box, config, Icon, IconButton, Icons, type IconSrc, MenuItem, Text } from 'folds'; import { JoinRule } from '$types/matrix-sdk'; import { PageNav, PageNavContent, PageNavHeader, PageRoot } from '$components/page'; import { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize'; diff --git a/src/app/features/room-settings/RoomSettingsRenderer.tsx b/src/app/features/room-settings/RoomSettingsRenderer.tsx index 7f2e53e79..d9dcbecf6 100644 --- a/src/app/features/room-settings/RoomSettingsRenderer.tsx +++ b/src/app/features/room-settings/RoomSettingsRenderer.tsx @@ -1,7 +1,7 @@ import { Modal500 } from '$components/Modal500'; import { useCloseRoomSettings, useRoomSettingsState } from '$state/hooks/roomSettings'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; -import { RoomSettingsState } from '$state/roomSettings'; +import { type RoomSettingsState } from '$state/roomSettings'; import { RoomProvider } from '$hooks/useRoom'; import { SpaceProvider } from '$hooks/useSpace'; import { RoomSettings } from './RoomSettings'; diff --git a/src/app/features/room-settings/permissions/usePermissionItems.ts b/src/app/features/room-settings/permissions/usePermissionItems.ts index 20222d45f..7d967c754 100644 --- a/src/app/features/room-settings/permissions/usePermissionItems.ts +++ b/src/app/features/room-settings/permissions/usePermissionItems.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { MessageEvent, StateEvent } from '$types/matrix/room'; -import { PermissionGroup } from '$features/common-settings/permissions'; +import { type PermissionGroup } from '$features/common-settings/permissions'; export const usePermissionGroups = (isCallRoom: boolean): PermissionGroup[] => { const groups: PermissionGroup[] = useMemo(() => { diff --git a/src/app/features/room/CommandAutocomplete.tsx b/src/app/features/room/CommandAutocomplete.tsx index 39f5e67b7..66d97571f 100644 --- a/src/app/features/room/CommandAutocomplete.tsx +++ b/src/app/features/room/CommandAutocomplete.tsx @@ -1,16 +1,16 @@ -import { KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect, useMemo } from 'react'; -import { Editor } from 'slate'; +import { type KeyboardEvent as ReactKeyboardEvent, useCallback, useEffect, useMemo } from 'react'; +import { type Editor } from 'slate'; import { Box, config, MenuItem, Text } from 'folds'; -import { Room } from '$types/matrix-sdk'; -import { Command, useCommands } from '$hooks/useCommands'; +import { type Room } from '$types/matrix-sdk'; +import { type Command, useCommands } from '$hooks/useCommands'; import { AutocompleteMenu, - AutocompleteQuery, + type AutocompleteQuery, createCommandElement, moveCursor, replaceWithElement, } from '$components/editor'; -import { UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; +import { type UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useKeyDown } from '$hooks/useKeyDown'; import { onTabPress } from '$utils/keyboard'; diff --git a/src/app/features/room/MembersDrawer.tsx b/src/app/features/room/MembersDrawer.tsx index c54d96507..aa0ab43c9 100644 --- a/src/app/features/room/MembersDrawer.tsx +++ b/src/app/features/room/MembersDrawer.tsx @@ -1,6 +1,6 @@ import { - ChangeEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type MouseEventHandler, useCallback, useMemo, useRef, @@ -18,7 +18,7 @@ import { Input, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Spinner, Text, @@ -27,7 +27,7 @@ import { config, toRem, } from 'folds'; -import { MatrixClient, Room, RoomMember } from '$types/matrix-sdk'; +import { type MatrixClient, type Room, type RoomMember } from '$types/matrix-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; import classNames from 'classnames'; @@ -35,7 +35,11 @@ import { AvatarPresence, PresenceBadge } from '$components/presence'; import { useUserPresence } from '$hooks/useUserPresence'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { UseStateProvider } from '$components/UseStateProvider'; -import { SearchItemStrGetter, UseAsyncSearchOptions, useAsyncSearch } from '$hooks/useAsyncSearch'; +import { + type SearchItemStrGetter, + type UseAsyncSearchOptions, + useAsyncSearch, +} from '$hooks/useAsyncSearch'; import { useDebounce } from '$hooks/useDebounce'; import { TypingIndicator } from '$components/typing-indicator'; import { getMemberDisplayName, getMemberSearchStr } from '$utils/room'; diff --git a/src/app/features/room/RoomCallButton.tsx b/src/app/features/room/RoomCallButton.tsx index ad3c7916d..c12c9a0a5 100644 --- a/src/app/features/room/RoomCallButton.tsx +++ b/src/app/features/room/RoomCallButton.tsx @@ -1,14 +1,14 @@ import { IconButton, Icon, Icons, TooltipProvider, Tooltip, Text } from 'folds'; import { useAtomValue } from 'jotai'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useCallStart, useCallJoined } from '$hooks/useCallEmbed'; import { callEmbedAtom } from '$state/callEmbed'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useCallPreferences } from '$state/hooks/callPreferences'; -interface RoomCallButtonProps { +type RoomCallButtonProps = { room: Room; -} +}; export function RoomCallButton({ room }: RoomCallButtonProps) { const startCall = useCallStart(); diff --git a/src/app/features/room/RoomInput.tsx b/src/app/features/room/RoomInput.tsx index 60ee8d20b..5d027a405 100644 --- a/src/app/features/room/RoomInput.tsx +++ b/src/app/features/room/RoomInput.tsx @@ -1,9 +1,9 @@ import { forwardRef, - KeyboardEventHandler, - MouseEvent, - RefObject, - ReactNode, + type KeyboardEventHandler, + type MouseEvent, + type RefObject, + type ReactNode, useCallback, useEffect, useRef, @@ -13,13 +13,13 @@ import { useAtom, useAtomValue } from 'jotai'; import { isKeyHotkey } from 'is-hotkey'; import { EventType, - IContent, - MatrixEvent, + type IContent, + type MatrixEvent, MsgType, RelationType, - Room, - IEventRelation, - StickerEventContent, + type Room, + type IEventRelation, + type StickerEventContent, } from '$types/matrix-sdk'; import { ReactEditor } from 'slate-react'; import { Editor, Point, Range, Transforms } from 'slate'; @@ -37,7 +37,7 @@ import { OverlayBackdrop, OverlayCenter, PopOut, - RectCords, + type RectCords, Scroll, Text, toRem, @@ -53,7 +53,7 @@ import { import { useMatrixClient } from '$hooks/useMatrixClient'; import { AutocompletePrefix, - AutocompleteQuery, + type AutocompleteQuery, createEmoticonElement, CustomEditor, customHtmlEqualsPlainText, @@ -79,7 +79,7 @@ import { import { EmojiBoard, EmojiBoardTab } from '$components/emoji-board'; import { UseStateProvider } from '$components/UseStateProvider'; import { - TUploadContent, + type TUploadContent, encryptFile, getImageInfo, getMxIdLocalPart, @@ -95,18 +95,23 @@ import { roomIdToReplyDraftAtomFamily, roomIdToUploadItemsAtomFamily, roomUploadAtomFamily, - TUploadItem, - TUploadMetadata, - IReplyDraft, + type TUploadItem, + type TUploadMetadata, + type IReplyDraft, } from '$state/room/roomInputDrafts'; import { UploadCardRenderer } from '$components/upload-card'; import { UploadBoard, UploadBoardContent, UploadBoardHeader, - UploadBoardImperativeHandlers, + type UploadBoardImperativeHandlers, } from '$components/upload-board'; -import { Upload, UploadStatus, UploadSuccess, createUploadFamilyObserverAtom } from '$state/upload'; +import { + type Upload, + UploadStatus, + type UploadSuccess, + createUploadFamilyObserverAtom, +} from '$state/upload'; import { getImageUrlBlob, loadImageElement } from '$utils/dom'; import { safeFile } from '$utils/mimeTypes'; import { fulfilledPromiseSettledResult } from '$utils/common'; @@ -230,17 +235,17 @@ const getReplyContent = (replyDraft: IReplyDraft | undefined, room?: Room): IEve const log = createLogger('RoomInput'); const debugLog = createDebugLogger('RoomInput'); -interface ReplyEventContent { +type ReplyEventContent = { 'm.relates_to'?: IEventRelation; -} +}; -interface RoomInputProps { +type RoomInputProps = { editor: Editor; fileDropContainerRef: RefObject; roomId: string; room: Room; threadRootId?: string; -} +}; export const RoomInput = forwardRef( ({ editor, fileDropContainerRef, roomId, room, threadRootId }, ref) => { // When in thread mode, isolate drafts by thread root ID so thread replies diff --git a/src/app/features/room/RoomInputPlaceholder.tsx b/src/app/features/room/RoomInputPlaceholder.tsx index fc923d196..319660755 100644 --- a/src/app/features/room/RoomInputPlaceholder.tsx +++ b/src/app/features/room/RoomInputPlaceholder.tsx @@ -1,4 +1,4 @@ -import { ComponentProps } from 'react'; +import { type ComponentProps } from 'react'; import { Box, as } from 'folds'; import classNames from 'classnames'; diff --git a/src/app/features/room/RoomTimeline.css.ts b/src/app/features/room/RoomTimeline.css.ts index 29f18f3a5..f8f1da172 100644 --- a/src/app/features/room/RoomTimeline.css.ts +++ b/src/app/features/room/RoomTimeline.css.ts @@ -1,5 +1,5 @@ import { globalStyle, style } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; import { DefaultReset, config } from 'folds'; export const TimelineFloat = recipe({ diff --git a/src/app/features/room/RoomTimeline.tsx b/src/app/features/room/RoomTimeline.tsx index 292023fa3..26c4a7bcb 100644 --- a/src/app/features/room/RoomTimeline.tsx +++ b/src/app/features/room/RoomTimeline.tsx @@ -1,11 +1,11 @@ /* eslint-disable react/destructuring-assignment */ import { Fragment, - Dispatch, - MouseEventHandler, - ReactNode, - RefObject, - SetStateAction, + type Dispatch, + type MouseEventHandler, + type ReactNode, + type RefObject, + type SetStateAction, useCallback, useEffect, useLayoutEffect, @@ -15,26 +15,26 @@ import { } from 'react'; import { Direction, - EventTimeline, - EventTimelineSet, - EventTimelineSetHandlerMap, + type EventTimeline, + type EventTimelineSet, + type EventTimelineSetHandlerMap, EventStatus, - IContent, - IRoomTimelineData, - MatrixClient, - MatrixEvent, + type IContent, + type IRoomTimelineData, + type MatrixClient, + type MatrixEvent, PushProcessor, RelationType, - Room, + type Room, RoomEvent, - RoomEventHandlerMap, + type RoomEventHandlerMap, ThreadEvent, } from '$types/matrix-sdk'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import classNames from 'classnames'; import { ReactEditor } from 'slate-react'; -import { Editor } from 'slate'; -import { SessionMembershipData } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; +import { type Editor } from 'slate'; +import { type SessionMembershipData } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; import to from 'await-to-js'; import * as Sentry from '@sentry/react'; import { useAtomValue, useSetAtom } from 'jotai'; @@ -46,7 +46,7 @@ import { Chip, color, config, - ContainerColor, + type ContainerColor, Icon, Icons, Line, @@ -56,11 +56,11 @@ import { toRem, } from 'folds'; import { isKeyHotkey } from 'is-hotkey'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { useTranslation } from 'react-i18next'; import { getMxIdLocalPart, mxcUrlToHttp, toggleReaction } from '$utils/matrix'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { ItemRange, useVirtualPaginator } from '$hooks/useVirtualPaginator'; +import { type ItemRange, useVirtualPaginator } from '$hooks/useVirtualPaginator'; import { useAlive } from '$hooks/useAlive'; import { editableActiveElement, scrollToBottom } from '$utils/dom'; import { @@ -114,7 +114,7 @@ import { createMentionElement, isEmptyEditor, moveCursor } from '$components/edi import { roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts'; import { roomIdToOpenThreadAtomFamily } from '$state/room/roomToOpenThread'; import { usePowerLevelsContext } from '$hooks/usePowerLevels'; -import { GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; +import { type GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; import { useKeyDown } from '$hooks/useKeyDown'; import { useDocumentFocusChange } from '$hooks/useDocumentFocusChange'; import { RenderMessageContent } from '$components/RenderMessageContent'; @@ -139,7 +139,7 @@ import { profilesCacheAtom } from '$state/userRoomProfile'; import { ClientSideHoverFreeze } from '$components/ClientSideHoverFreeze'; import { createDebugLogger } from '$utils/debugLogger'; import * as css from './RoomTimeline.css'; -import { EncryptedContent, Event, ForwardedMessageProps, Message, Reactions } from './message'; +import { EncryptedContent, Event, type ForwardedMessageProps, Message, Reactions } from './message'; const debugLog = createDebugLogger('RoomTimeline'); diff --git a/src/app/features/room/RoomViewFollowing.tsx b/src/app/features/room/RoomViewFollowing.tsx index 6d9a60c68..946c5923b 100644 --- a/src/app/features/room/RoomViewFollowing.tsx +++ b/src/app/features/room/RoomViewFollowing.tsx @@ -11,7 +11,7 @@ import { as, config, } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import classNames from 'classnames'; import FocusTrap from 'focus-trap-react'; import { useAtomValue } from 'jotai'; diff --git a/src/app/features/room/RoomViewHeader.tsx b/src/app/features/room/RoomViewHeader.tsx index 8552332cf..1ea0f6133 100644 --- a/src/app/features/room/RoomViewHeader.tsx +++ b/src/app/features/room/RoomViewHeader.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, forwardRef, useCallback, useEffect, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useCallback, useEffect, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { useAtom, useAtomValue } from 'jotai'; import { @@ -19,17 +19,17 @@ import { config, Line, PopOut, - RectCords, + type RectCords, Badge, Spinner, } from 'folds'; import { useNavigate } from 'react-router-dom'; import { EventTimeline, - Room, + type Room, ThreadEvent, RoomEvent, - MatrixEvent, + type MatrixEvent, NotificationCountType, } from '$types/matrix-sdk'; @@ -105,11 +105,11 @@ async function getPinsHash(pinnedIds: string[]): Promise { return hashHex.slice(0, 10); } -export interface PinReadMarker { +export type PinReadMarker = { hash: string; count: number; last_seen_id: string; -} +}; type RoomMenuProps = { room: Room; diff --git a/src/app/features/room/RoomViewTyping.tsx b/src/app/features/room/RoomViewTyping.tsx index 8a3c7a716..074e211be 100644 --- a/src/app/features/room/RoomViewTyping.tsx +++ b/src/app/features/room/RoomViewTyping.tsx @@ -1,5 +1,5 @@ import { Box, Icon, IconButton, Icons, Text, as } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import classNames from 'classnames'; import { useSetAtom, useAtomValue } from 'jotai'; import { roomIdToTypingMembersAtom } from '$state/typingMembers'; diff --git a/src/app/features/room/ThreadBrowser.tsx b/src/app/features/room/ThreadBrowser.tsx index 2762cb688..eb304a520 100644 --- a/src/app/features/room/ThreadBrowser.tsx +++ b/src/app/features/room/ThreadBrowser.tsx @@ -1,6 +1,6 @@ import { - ChangeEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type MouseEventHandler, useCallback, useEffect, useMemo, @@ -20,10 +20,10 @@ import { config, Chip, } from 'folds'; -import { MatrixEvent, Room, Thread, ThreadEvent } from '$types/matrix-sdk'; +import { type MatrixEvent, type Room, type Thread, ThreadEvent } from '$types/matrix-sdk'; import { useAtomValue } from 'jotai'; -import { HTMLReactParserOptions } from 'html-react-parser'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useRoomNavigate } from '$hooks/useRoomNavigate'; @@ -43,7 +43,7 @@ import { import { RenderMessageContent } from '$components/RenderMessageContent'; import { settingsAtom } from '$state/settings'; import { useSetting } from '$state/hooks/settings'; -import { GetContentCallback } from '$types/matrix/room'; +import { type GetContentCallback } from '$types/matrix/room'; import { useMentionClickHandler } from '$hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; import { diff --git a/src/app/features/room/ThreadDrawer.tsx b/src/app/features/room/ThreadDrawer.tsx index 00957bc34..585ca95ac 100644 --- a/src/app/features/room/ThreadDrawer.tsx +++ b/src/app/features/room/ThreadDrawer.tsx @@ -1,18 +1,18 @@ -import { MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Box, Header, Icon, IconButton, Icons, Scroll, Text, config } from 'folds'; import { - MatrixEvent, + type MatrixEvent, PushProcessor, ReceiptType, RelationType, - Room, + type Room, RoomEvent, ThreadEvent, } from '$types/matrix-sdk'; import { useAtomValue, useSetAtom } from 'jotai'; import { ReactEditor } from 'slate-react'; -import { HTMLReactParserOptions } from 'html-react-parser'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { ImageContent, MSticker, RedactedContent, Reply } from '$components/message'; import { RenderMessageContent } from '$components/RenderMessageContent'; import { Image } from '$components/media'; @@ -36,18 +36,18 @@ import { minuteDifference } from '$utils/time'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { nicknamesAtom } from '$state/nicknames'; -import { MessageLayout, MessageSpacing, settingsAtom } from '$state/settings'; +import { MessageLayout, type MessageSpacing, settingsAtom } from '$state/settings'; import { useSetting } from '$state/hooks/settings'; import { createMentionElement, moveCursor, useEditor } from '$components/editor'; import { useMentionClickHandler } from '$hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; -import { GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; +import { type GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; import { usePowerLevelsContext } from '$hooks/usePowerLevels'; import { useRoomPermissions } from '$hooks/useRoomPermissions'; import { useRoomCreators } from '$hooks/useRoomCreators'; import { useImagePackRooms } from '$hooks/useImagePackRooms'; import { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile'; -import { IReplyDraft, roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts'; +import { type IReplyDraft, roomIdToReplyDraftAtomFamily } from '$state/room/roomInputDrafts'; import { roomToParentsAtom } from '$state/room/roomToParents'; import { EncryptedContent, Message, Reactions } from './message'; import { RoomInput } from './RoomInput'; diff --git a/src/app/features/room/jump-to-time/JumpToTime.tsx b/src/app/features/room/jump-to-time/JumpToTime.tsx index 9ebd5a7ac..81ffd29ee 100644 --- a/src/app/features/room/jump-to-time/JumpToTime.tsx +++ b/src/app/features/room/jump-to-time/JumpToTime.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useMemo, useState } from 'react'; +import { type MouseEventHandler, useCallback, useMemo, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Dialog, @@ -17,9 +17,9 @@ import { Spinner, Chip, PopOut, - RectCords, + type RectCords, } from 'folds'; -import { Direction, MatrixError } from '$types/matrix-sdk'; +import { Direction, type MatrixError } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/features/room/message/EncryptedContent.tsx b/src/app/features/room/message/EncryptedContent.tsx index 33955b6e9..89c1ba56d 100644 --- a/src/app/features/room/message/EncryptedContent.tsx +++ b/src/app/features/room/message/EncryptedContent.tsx @@ -1,5 +1,5 @@ -import { MatrixEvent, MatrixEventEvent, MatrixEventHandlerMap } from '$types/matrix-sdk'; -import { ReactNode, useEffect, useState } from 'react'; +import { type MatrixEvent, MatrixEventEvent, type MatrixEventHandlerMap } from '$types/matrix-sdk'; +import { type ReactNode, useEffect, useState } from 'react'; import { MessageEvent } from '$types/matrix/room'; import { useMatrixClient } from '$hooks/useMatrixClient'; import * as Sentry from '@sentry/react'; diff --git a/src/app/features/room/message/Message.tsx b/src/app/features/room/message/Message.tsx index 9dd200ed5..9bdc2ee9b 100644 --- a/src/app/features/room/message/Message.tsx +++ b/src/app/features/room/message/Message.tsx @@ -9,17 +9,17 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, as, config, } from 'folds'; import { - MouseEventHandler, - MouseEvent, - PointerEvent, - ReactNode, + type MouseEventHandler, + type MouseEvent, + type PointerEvent, + type ReactNode, memo, useCallback, useRef, @@ -31,10 +31,10 @@ import FocusTrap from 'focus-trap-react'; import { useHover, useFocusWithin } from 'react-aria'; import { EventStatus, - MatrixEvent, - Room, - Relations, - RoomPinnedEventsEventContent, + type MatrixEvent, + type Room, + type Relations, + type RoomPinnedEventsEventContent, } from '$types/matrix-sdk'; import classNames from 'classnames'; import { useAtomValue, useSetAtom } from 'jotai'; @@ -51,7 +51,7 @@ import { } from '$components/message'; import { canEditEvent, getEventEdits, getMemberAvatarMxc } from '$utils/room'; import { mxcUrlToHttp } from '$utils/matrix'; -import { getSettings, MessageLayout, MessageSpacing, settingsAtom } from '$state/settings'; +import { getSettings, MessageLayout, type MessageSpacing, settingsAtom } from '$state/settings'; import { nicknamesAtom, setNicknameAtom } from '$state/nicknames'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useRecentEmoji } from '$hooks/useRecentEmoji'; @@ -63,7 +63,7 @@ import { getMatrixToRoomEvent } from '$plugins/matrix-to'; import { getViaServers } from '$plugins/via-servers'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useRoomPinnedEvents } from '$hooks/useRoomPinnedEvents'; -import { MemberPowerTag, StateEvent } from '$types/matrix/room'; +import { type MemberPowerTag, StateEvent } from '$types/matrix/room'; import { PowerIcon } from '$components/power'; import { getPowerTagIconSrc } from '$hooks/useMemberPowerTag'; import { useSableCosmetics } from '$hooks/useSableCosmetics'; diff --git a/src/app/features/room/message/MessageEditor.tsx b/src/app/features/room/message/MessageEditor.tsx index cb516c1db..e327ece91 100644 --- a/src/app/features/room/message/MessageEditor.tsx +++ b/src/app/features/room/message/MessageEditor.tsx @@ -1,6 +1,6 @@ import { - KeyboardEventHandler, - MouseEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useCallback, useEffect, useMemo, @@ -14,7 +14,7 @@ import { Icons, Line, PopOut, - RectCords, + type RectCords, Spinner, Text, as, @@ -23,19 +23,19 @@ import { import { Editor, Transforms } from 'slate'; import { ReactEditor } from 'slate-react'; import { - IContent, - IMentions, - MatrixEvent, - ReplacementEvent, + type IContent, + type IMentions, + type MatrixEvent, + type ReplacementEvent, RelationType, - Room, - RoomMessageTextEventContent, + type Room, + type RoomMessageTextEventContent, MsgType, } from '$types/matrix-sdk'; import { isKeyHotkey } from 'is-hotkey'; import { AutocompletePrefix, - AutocompleteQuery, + type AutocompleteQuery, CustomEditor, EmoticonAutocomplete, RoomMentionAutocomplete, @@ -68,10 +68,10 @@ import { floatingEditor } from '$styles/overrides/Composer.css'; import { RenderMessageContent } from '$components/RenderMessageContent'; import { getReactCustomHtmlParser, LINKIFY_OPTS } from '$plugins/react-custom-html-parser'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; -import { Opts as LinkifyOpts } from 'linkifyjs'; -import { GetContentCallback } from '$types/matrix/room'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; +import { type GetContentCallback } from '$types/matrix/room'; type MessageEditorProps = { roomId: string; diff --git a/src/app/features/room/message/Reactions.tsx b/src/app/features/room/message/Reactions.tsx index efcd74dc9..a5cacf2dc 100644 --- a/src/app/features/room/message/Reactions.tsx +++ b/src/app/features/room/message/Reactions.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useState } from 'react'; +import { type MouseEventHandler, useCallback, useState } from 'react'; import { Box, Modal, @@ -12,8 +12,7 @@ import { toRem, } from 'folds'; import classNames from 'classnames'; -import { Room } from '$types/matrix-sdk'; -import { type Relations } from '$types/matrix-sdk'; +import { type Room, type Relations } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { factoryEventSentBy } from '$utils/matrix'; diff --git a/src/app/features/room/msgContent.ts b/src/app/features/room/msgContent.ts index e5de20f2e..1048dc23d 100644 --- a/src/app/features/room/msgContent.ts +++ b/src/app/features/room/msgContent.ts @@ -1,7 +1,7 @@ -import { IContent, MatrixClient, MsgType } from '$types/matrix-sdk'; +import { type IContent, type MatrixClient, MsgType } from '$types/matrix-sdk'; import to from 'await-to-js'; import { - IThumbnailContent, + type IThumbnailContent, MATRIX_BLUR_HASH_PROPERTY_NAME, MATRIX_SPOILER_PROPERTY_NAME, } from '$types/matrix/common'; @@ -14,7 +14,7 @@ import { loadVideoElement, } from '$utils/dom'; import { encryptFile, getImageInfo, getThumbnailContent, getVideoInfo } from '$utils/matrix'; -import { TUploadItem } from '$state/room/roomInputDrafts'; +import { type TUploadItem } from '$state/room/roomInputDrafts'; import { encodeBlurHash } from '$utils/blurHash'; import { scaleYDimension } from '$utils/common'; import { createLogger } from '$utils/debug'; diff --git a/src/app/features/room/reaction-viewer/ReactionViewer.tsx b/src/app/features/room/reaction-viewer/ReactionViewer.tsx index 9065cfb64..fc0573499 100644 --- a/src/app/features/room/reaction-viewer/ReactionViewer.tsx +++ b/src/app/features/room/reaction-viewer/ReactionViewer.tsx @@ -14,7 +14,7 @@ import { as, config, } from 'folds'; -import { MatrixEvent, Room, RoomMember, Relations } from '$types/matrix-sdk'; +import { type MatrixEvent, type Room, type RoomMember, type Relations } from '$types/matrix-sdk'; import { getMemberDisplayName } from '$utils/room'; import { eventWithShortcode, getMxIdLocalPart } from '$utils/matrix'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/features/room/room-pin-menu/RoomPinMenu.tsx b/src/app/features/room/room-pin-menu/RoomPinMenu.tsx index d05284da0..050b4f820 100644 --- a/src/app/features/room/room-pin-menu/RoomPinMenu.tsx +++ b/src/app/features/room/room-pin-menu/RoomPinMenu.tsx @@ -1,6 +1,13 @@ /* eslint-disable react/no-unused-prop-types, react/destructuring-assignment */ -import { forwardRef, MouseEventHandler, ReactNode, useCallback, useMemo, useRef } from 'react'; -import { MatrixEvent, Room, RoomPinnedEventsEventContent } from '$types/matrix-sdk'; +import { + forwardRef, + type MouseEventHandler, + type ReactNode, + useCallback, + useMemo, + useRef, +} from 'react'; +import { type MatrixEvent, type Room, type RoomPinnedEventsEventContent } from '$types/matrix-sdk'; import { Avatar, Box, @@ -17,8 +24,8 @@ import { Text, toRem, } from 'folds'; -import { Opts as LinkifyOpts } from 'linkifyjs'; -import { HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; import { useAtomValue } from 'jotai'; import { useVirtualizer } from '@tanstack/react-virtual'; import { createLogger } from '$utils/debug'; @@ -49,7 +56,7 @@ import { getMemberDisplayName, getStateEvent, } from '$utils/room'; -import { GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; +import { type GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; import { useMentionClickHandler } from '$hooks/useMentionClickHandler'; import { useSpoilerClickHandler } from '$hooks/useSpoilerClickHandler'; import { @@ -59,7 +66,7 @@ import { makeMentionCustomProps, renderMatrixMention, } from '$plugins/react-custom-html-parser'; -import { RenderMatrixEvent, useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer'; +import { type RenderMatrixEvent, useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer'; import { RenderMessageContent } from '$components/RenderMessageContent'; import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; @@ -77,7 +84,7 @@ import { PowerIcon } from '$components/power'; import { useRoomCreators } from '$hooks/useRoomCreators'; import { useRoomPermissions } from '$hooks/useRoomPermissions'; import { - GetMemberPowerTag, + type GetMemberPowerTag, getPowerTagIconSrc, useAccessiblePowerTagColors, useGetMemberPowerTag, diff --git a/src/app/features/room/schedule-send/SchedulePickerDialog.tsx b/src/app/features/room/schedule-send/SchedulePickerDialog.tsx index 50f119ef9..a2ab1141a 100644 --- a/src/app/features/room/schedule-send/SchedulePickerDialog.tsx +++ b/src/app/features/room/schedule-send/SchedulePickerDialog.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useState } from 'react'; +import { type MouseEventHandler, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { Dialog, @@ -16,7 +16,7 @@ import { Button, Chip, PopOut, - RectCords, + type RectCords, } from 'folds'; import { stopPropagation } from '$utils/keyboard'; import { timeDayMonthYear, timeHourMinute, hoursToMs, daysToMs } from '$utils/time'; diff --git a/src/app/features/room/schedule-send/ScheduledMessagesList.tsx b/src/app/features/room/schedule-send/ScheduledMessagesList.tsx index 39f751c9c..94ce0e338 100644 --- a/src/app/features/room/schedule-send/ScheduledMessagesList.tsx +++ b/src/app/features/room/schedule-send/ScheduledMessagesList.tsx @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Box, Text, Chip, Icon, Icons, IconButton } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { getDelayedEvents, cancelDelayedEvent } from '$utils/delayedEvents'; diff --git a/src/app/features/search/Search.tsx b/src/app/features/search/Search.tsx index 9ec8f150a..c87fe7ce1 100644 --- a/src/app/features/search/Search.tsx +++ b/src/app/features/search/Search.tsx @@ -16,9 +16,9 @@ import { toRem, } from 'folds'; import { - ChangeEventHandler, - KeyboardEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useCallback, useEffect, useMemo, @@ -27,12 +27,16 @@ import { } from 'react'; import { isKeyHotkey } from 'is-hotkey'; import { useAtom, useAtomValue } from 'jotai'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useDirects, useOrphanSpaces, useRooms, useSpaces } from '$state/hooks/roomList'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { mDirectAtom } from '$state/mDirectList'; import { allRoomsAtom } from '$state/room-list/roomList'; -import { SearchItemStrGetter, useAsyncSearch, UseAsyncSearchOptions } from '$hooks/useAsyncSearch'; +import { + type SearchItemStrGetter, + useAsyncSearch, + type UseAsyncSearchOptions, +} from '$hooks/useAsyncSearch'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; import { RoomAvatar, RoomIcon } from '$components/room-avatar'; import { diff --git a/src/app/features/settings/Settings.tsx b/src/app/features/settings/Settings.tsx index 34f350b3d..48f4afc01 100644 --- a/src/app/features/settings/Settings.tsx +++ b/src/app/features/settings/Settings.tsx @@ -7,7 +7,7 @@ import { Icon, IconButton, Icons, - IconSrc, + type IconSrc, MenuItem, Overlay, OverlayBackdrop, diff --git a/src/app/features/settings/account/BioEditor.tsx b/src/app/features/settings/account/BioEditor.tsx index 49b47d7b9..55af3ccc7 100644 --- a/src/app/features/settings/account/BioEditor.tsx +++ b/src/app/features/settings/account/BioEditor.tsx @@ -1,4 +1,4 @@ -import { KeyboardEventHandler, useCallback, useEffect, useState, useRef } from 'react'; +import { type KeyboardEventHandler, useCallback, useEffect, useState, useRef } from 'react'; import { Box, Chip, @@ -7,7 +7,7 @@ import { Icons, Line, PopOut, - RectCords, + type RectCords, Spinner, Text, config, @@ -17,7 +17,7 @@ import { ReactEditor } from 'slate-react'; import { isKeyHotkey } from 'is-hotkey'; import { AutocompletePrefix, - AutocompleteQuery, + type AutocompleteQuery, CustomEditor, EmoticonAutocomplete, Toolbar, diff --git a/src/app/features/settings/account/IgnoredUserList.tsx b/src/app/features/settings/account/IgnoredUserList.tsx index 0b3b3470f..ef8a024ce 100644 --- a/src/app/features/settings/account/IgnoredUserList.tsx +++ b/src/app/features/settings/account/IgnoredUserList.tsx @@ -1,4 +1,4 @@ -import { ChangeEventHandler, FormEventHandler, useCallback, useState } from 'react'; +import { type ChangeEventHandler, type FormEventHandler, useCallback, useState } from 'react'; import { Box, Button, Chip, Icon, IconButton, Icons, Input, Spinner, Text, config } from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; diff --git a/src/app/features/settings/account/Profile.tsx b/src/app/features/settings/account/Profile.tsx index 68daf9bf8..7129cbd3b 100644 --- a/src/app/features/settings/account/Profile.tsx +++ b/src/app/features/settings/account/Profile.tsx @@ -1,6 +1,6 @@ import { - ChangeEventHandler, - FormEventHandler, + type ChangeEventHandler, + type FormEventHandler, useCallback, useEffect, useMemo, @@ -30,7 +30,7 @@ import { useSetAtom } from 'jotai'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { UserProfile, useUserProfile } from '$hooks/useUserProfile'; +import { type UserProfile, useUserProfile } from '$hooks/useUserProfile'; import { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix'; import { UserAvatar } from '$components/user-avatar'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; @@ -41,7 +41,7 @@ import { useObjectURL } from '$hooks/useObjectURL'; import { stopPropagation } from '$utils/keyboard'; import { ImageEditor } from '$components/image-editor'; import { ModalWide } from '$styles/Modal.css'; -import { createUploadAtom, UploadSuccess } from '$state/upload'; +import { createUploadAtom, type UploadSuccess } from '$state/upload'; import { CompactUploadCardRenderer } from '$components/upload-card'; import { useCapabilities } from '$hooks/useCapabilities'; import { profilesCacheAtom } from '$state/userRoomProfile'; diff --git a/src/app/features/settings/account/PronounEditor.tsx b/src/app/features/settings/account/PronounEditor.tsx index e6aeaf781..a803ffe98 100644 --- a/src/app/features/settings/account/PronounEditor.tsx +++ b/src/app/features/settings/account/PronounEditor.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, ChangeEvent } from 'react'; +import { useState, useEffect, type ChangeEvent } from 'react'; import { Input } from 'folds'; import { SettingTile } from '$components/setting-tile'; import { parsePronounsInput } from '$utils/pronouns'; diff --git a/src/app/features/settings/account/StatusEditor.tsx b/src/app/features/settings/account/StatusEditor.tsx index 001c99c34..1ca6f68ce 100644 --- a/src/app/features/settings/account/StatusEditor.tsx +++ b/src/app/features/settings/account/StatusEditor.tsx @@ -1,4 +1,4 @@ -import { ChangeEventHandler, FormEventHandler, useEffect, useState } from 'react'; +import { type ChangeEventHandler, type FormEventHandler, useEffect, useState } from 'react'; import { Box, Text, Button, Input, IconButton, Icon, Icons, Spinner, config } from 'folds'; import { SettingTile } from '$components/setting-tile'; diff --git a/src/app/features/settings/account/TimezoneEditor.tsx b/src/app/features/settings/account/TimezoneEditor.tsx index 7d28399a5..4832268ca 100644 --- a/src/app/features/settings/account/TimezoneEditor.tsx +++ b/src/app/features/settings/account/TimezoneEditor.tsx @@ -1,10 +1,10 @@ -import { useMemo, useState, useEffect, ChangeEvent } from 'react'; +import { useMemo, useState, useEffect, type ChangeEvent } from 'react'; import { Box, IconButton, Button, Icon, Icons, Input, Text } from 'folds'; import { SettingTile } from '$components/setting-tile'; -interface IntlWithSupportedValues { +type IntlWithSupportedValues = { supportedValuesOf(key: 'timeZone' | string): string[]; -} +}; type TimezoneEditorProps = { current?: string; diff --git a/src/app/features/settings/cosmetics/Cosmetics.tsx b/src/app/features/settings/cosmetics/Cosmetics.tsx index d1a65b6ba..8b98d0a6a 100644 --- a/src/app/features/settings/cosmetics/Cosmetics.tsx +++ b/src/app/features/settings/cosmetics/Cosmetics.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useState } from 'react'; +import { type MouseEventHandler, useState } from 'react'; import { Box, Button, @@ -9,7 +9,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Switch, Text, @@ -18,7 +18,7 @@ import FocusTrap from 'focus-trap-react'; import { Page, PageContent, PageHeader } from '$components/page'; import { SequenceCard } from '$components/sequence-card'; import { useSetting } from '$state/hooks/settings'; -import { JumboEmojiSize, settingsAtom } from '$state/settings'; +import { type JumboEmojiSize, settingsAtom } from '$state/settings'; import { SettingTile } from '$components/setting-tile'; import { stopPropagation } from '$utils/keyboard'; import { SequenceCardStyle } from '$features/settings/styles.css'; diff --git a/src/app/features/settings/cosmetics/Themes.tsx b/src/app/features/settings/cosmetics/Themes.tsx index 8d0f75e7e..5a745b9ee 100644 --- a/src/app/features/settings/cosmetics/Themes.tsx +++ b/src/app/features/settings/cosmetics/Themes.tsx @@ -1,4 +1,9 @@ -import { ChangeEventHandler, KeyboardEventHandler, MouseEventHandler, useState } from 'react'; +import { + type ChangeEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, + useState, +} from 'react'; import { as, Box, @@ -11,7 +16,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Switch, Text, toRem, @@ -25,7 +30,7 @@ import { SettingTile } from '$components/setting-tile'; import { DarkTheme, LightTheme, - Theme, + type Theme, ThemeKind, useSystemThemeKind, useThemeNames, diff --git a/src/app/features/settings/developer-tools/DebugLogViewer.tsx b/src/app/features/settings/developer-tools/DebugLogViewer.tsx index 8e5ae01e1..d983cf436 100644 --- a/src/app/features/settings/developer-tools/DebugLogViewer.tsx +++ b/src/app/features/settings/developer-tools/DebugLogViewer.tsx @@ -1,10 +1,21 @@ -import { useEffect, useState, useCallback, useMemo, MouseEventHandler } from 'react'; +import { useEffect, useState, useCallback, useMemo, type MouseEventHandler } from 'react'; import { useAtom, useAtomValue, useSetAtom } from 'jotai'; -import { Box, Text, Button, color, config, Badge, Menu, MenuItem, PopOut, RectCords } from 'folds'; +import { + Box, + Text, + Button, + color, + config, + Badge, + Menu, + MenuItem, + PopOut, + type RectCords, +} from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { debugLoggerEnabledAtom, debugLogsAtom, clearDebugLogsAtom } from '$state/debugLogger'; -import { LogEntry, getDebugLogger, LogLevel, LogCategory } from '$utils/debugLogger'; +import { type LogEntry, getDebugLogger, type LogLevel, type LogCategory } from '$utils/debugLogger'; import { SequenceCardStyle } from '$features/settings/styles.css'; const formatTimestamp = (timestamp: number): string => { diff --git a/src/app/features/settings/developer-tools/DevelopTools.tsx b/src/app/features/settings/developer-tools/DevelopTools.tsx index b717f2261..f13f8457f 100644 --- a/src/app/features/settings/developer-tools/DevelopTools.tsx +++ b/src/app/features/settings/developer-tools/DevelopTools.tsx @@ -6,7 +6,7 @@ import { SettingTile } from '$components/setting-tile'; import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { AccountDataEditor, AccountDataSubmitCallback } from '$components/AccountDataEditor'; +import { AccountDataEditor, type AccountDataSubmitCallback } from '$components/AccountDataEditor'; import { copyToClipboard } from '$utils/dom'; import { SequenceCardStyle } from '$features/settings/styles.css'; import { AccountData } from './AccountData'; diff --git a/src/app/features/settings/developer-tools/SentrySettings.tsx b/src/app/features/settings/developer-tools/SentrySettings.tsx index b0425e76f..4515ba45d 100644 --- a/src/app/features/settings/developer-tools/SentrySettings.tsx +++ b/src/app/features/settings/developer-tools/SentrySettings.tsx @@ -3,7 +3,8 @@ import { Box, Text, Switch, Button } from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; import { SequenceCardStyle } from '$features/settings/styles.css'; -import { getDebugLogger, LogCategory } from '$utils/debugLogger'; +import { getDebugLogger, type LogCategory } from '$utils/debugLogger'; +import { getSentryEnabled } from '$state/sentryStorage'; const ALL_CATEGORIES: LogCategory[] = [ 'sync', @@ -50,7 +51,7 @@ export function SentrySettings() { }; const isSentryConfigured = Boolean(import.meta.env.VITE_SENTRY_DSN); - const sentryEnabled = localStorage.getItem('sable_sentry_enabled') === 'true'; + const sentryEnabled = getSentryEnabled(); const environment = import.meta.env.VITE_SENTRY_ENVIRONMENT || import.meta.env.MODE; const isProd = environment === 'production'; const traceSampleRate = isProd ? '10%' : '100%'; diff --git a/src/app/features/settings/developer-tools/SyncDiagnostics.tsx b/src/app/features/settings/developer-tools/SyncDiagnostics.tsx index 07824c859..448ba93f0 100644 --- a/src/app/features/settings/developer-tools/SyncDiagnostics.tsx +++ b/src/app/features/settings/developer-tools/SyncDiagnostics.tsx @@ -3,7 +3,7 @@ import { Box, Button, Icon, Icons, Text } from 'folds'; import { SequenceCard } from '$components/sequence-card'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { getClientSyncDiagnostics } from '$client/initMatrix'; -import { Direction, EventType, NotificationCountType, Room } from '$types/matrix-sdk'; +import { Direction, EventType, NotificationCountType, type Room } from '$types/matrix-sdk'; import { Membership } from '$types/matrix/room'; import { SequenceCardStyle } from '$features/settings/styles.css'; import { getUnreadInfo, isNotificationEvent } from '$utils/room'; diff --git a/src/app/features/settings/devices/DeviceTile.tsx b/src/app/features/settings/devices/DeviceTile.tsx index b77be8ac5..c9473b484 100644 --- a/src/app/features/settings/devices/DeviceTile.tsx +++ b/src/app/features/settings/devices/DeviceTile.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, ReactNode, useCallback, useEffect, useState } from 'react'; +import { type FormEventHandler, type ReactNode, useCallback, useEffect, useState } from 'react'; import { Box, Text, @@ -15,7 +15,7 @@ import { OverlayBackdrop, OverlayCenter, } from 'folds'; -import { CryptoApi, IMyDevice, MatrixError } from '$types/matrix-sdk'; +import { type CryptoApi, type IMyDevice, type MatrixError } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; import { SettingTile } from '$components/setting-tile'; import { useMatrixClient } from '$hooks/useMatrixClient'; diff --git a/src/app/features/settings/devices/LocalBackup.tsx b/src/app/features/settings/devices/LocalBackup.tsx index eaefc7ff5..b8700405f 100644 --- a/src/app/features/settings/devices/LocalBackup.tsx +++ b/src/app/features/settings/devices/LocalBackup.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useEffect, useState } from 'react'; +import { type FormEventHandler, useCallback, useEffect, useState } from 'react'; import { Box, Button, color, Icon, Icons, Spinner, Text, toRem } from 'folds'; import FileSaver from 'file-saver'; import { SequenceCard } from '$components/sequence-card'; diff --git a/src/app/features/settings/devices/OtherDevices.tsx b/src/app/features/settings/devices/OtherDevices.tsx index e044201d1..8687f1165 100644 --- a/src/app/features/settings/devices/OtherDevices.tsx +++ b/src/app/features/settings/devices/OtherDevices.tsx @@ -1,9 +1,9 @@ import { useCallback, useState } from 'react'; import { Box, Button, config, Menu, Spinner, Text } from 'folds'; -import { AuthDict, IMyDevice, MatrixError } from '$types/matrix-sdk'; +import { type AuthDict, type IMyDevice, type MatrixError } from '$types/matrix-sdk'; import { SequenceCard } from '$components/sequence-card'; import { ActionUIA, ActionUIAFlowsLoader } from '$components/ActionUIA'; -import { AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; +import { type AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useUIAMatrixError } from '$hooks/useUIAFlows'; import { DeviceVerificationStatus } from '$components/DeviceVerificationStatus'; diff --git a/src/app/features/settings/devices/Verification.tsx b/src/app/features/settings/devices/Verification.tsx index 34dccf481..7376c4116 100644 --- a/src/app/features/settings/devices/Verification.tsx +++ b/src/app/features/settings/devices/Verification.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useState } from 'react'; +import { type MouseEventHandler, useCallback, useState } from 'react'; import { Badge, Box, @@ -13,18 +13,18 @@ import { OverlayBackdrop, OverlayCenter, IconButton, - RectCords, + type RectCords, PopOut, Menu, MenuItem, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import { CryptoApi, VerificationRequest } from '$types/matrix-sdk'; +import { type CryptoApi, type VerificationRequest } from '$types/matrix-sdk'; import { VerificationStatus } from '$hooks/useDeviceVerificationStatus'; import { InfoCard } from '$components/info-card'; import { ManualVerificationTile } from '$components/ManualVerification'; -import { SecretStorageKeyContent } from '$types/matrix/accountData'; -import { AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; +import { type SecretStorageKeyContent } from '$types/matrix/accountData'; +import { type AsyncState, AsyncStatus, useAsync } from '$hooks/useAsyncCallback'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { DeviceVerification } from '$components/DeviceVerification'; import { diff --git a/src/app/features/settings/emojis-stickers/EmojisStickers.tsx b/src/app/features/settings/emojis-stickers/EmojisStickers.tsx index d8708907c..6ceb142a6 100644 --- a/src/app/features/settings/emojis-stickers/EmojisStickers.tsx +++ b/src/app/features/settings/emojis-stickers/EmojisStickers.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { Box, Text, IconButton, Icon, Icons, Scroll } from 'folds'; import { Page, PageContent, PageHeader } from '$components/page'; -import { ImagePack } from '$plugins/custom-emoji'; +import { type ImagePack } from '$plugins/custom-emoji'; import { ImagePackView } from '$components/image-pack-view'; import { GlobalPacks } from './GlobalPacks'; import { UserPack } from './UserPack'; diff --git a/src/app/features/settings/emojis-stickers/GlobalPacks.tsx b/src/app/features/settings/emojis-stickers/GlobalPacks.tsx index 1c66d4c6f..799e709f6 100644 --- a/src/app/features/settings/emojis-stickers/GlobalPacks.tsx +++ b/src/app/features/settings/emojis-stickers/GlobalPacks.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; +import { type MouseEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; import { Box, Text, @@ -12,7 +12,7 @@ import { config, Spinner, Menu, - RectCords, + type RectCords, PopOut, Checkbox, toRem, @@ -23,7 +23,7 @@ import { } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useAtomValue } from 'jotai'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useGlobalImagePacks, useRoomsImagePacks } from '$hooks/useImagePacks'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; @@ -31,10 +31,10 @@ import { mxcUrlToHttp } from '$utils/matrix'; import { useMediaAuthentication } from '$hooks/useMediaAuthentication'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { - EmoteRoomsContent, - ImagePack, + type EmoteRoomsContent, + type ImagePack, ImageUsage, - PackAddress, + type PackAddress, packAddressEqual, } from '$plugins/custom-emoji'; import { LineClamp2 } from '$styles/Text.css'; diff --git a/src/app/features/settings/general/General.tsx b/src/app/features/settings/general/General.tsx index 0392e47da..ecd0178e8 100644 --- a/src/app/features/settings/general/General.tsx +++ b/src/app/features/settings/general/General.tsx @@ -1,8 +1,8 @@ import { - ChangeEventHandler, - FormEventHandler, - KeyboardEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type FormEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useEffect, useState, } from 'react'; @@ -19,7 +19,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Switch, Text, @@ -31,11 +31,11 @@ import { Page, PageContent, PageHeader } from '$components/page'; import { SequenceCard } from '$components/sequence-card'; import { useSetting } from '$state/hooks/settings'; import { - DateFormat, + type DateFormat, MessageLayout, - MessageSpacing, + type MessageSpacing, RightSwipeAction, - CaptionPosition, + type CaptionPosition, settingsAtom, } from '$state/settings'; import { SettingTile } from '$components/setting-tile'; @@ -51,6 +51,12 @@ import { sessionsAtom, activeSessionIdAtom } from '$state/sessions'; import { useClientConfig } from '$hooks/useClientConfig'; import { resolveSlidingEnabled } from '$client/initMatrix'; import { isKeyHotkey } from 'is-hotkey'; +import { + getSentryEnabled, + getSentryReplayEnabled, + setSentryEnabled as persistSentryEnabled, + setSentryReplayEnabled as persistSentryReplayEnabled, +} from '$state/sentryStorage'; type DateHintProps = { hasChanges: boolean; @@ -1080,33 +1086,21 @@ type GeneralProps = { }; function DiagnosticsAndPrivacy() { - const [sentryEnabled, setSentryEnabled] = useState( - localStorage.getItem('sable_sentry_enabled') === 'true' - ); - const [sessionReplayEnabled, setSessionReplayEnabled] = useState( - localStorage.getItem('sable_sentry_replay_enabled') === 'true' - ); + const [sentryEnabled, setSentryEnabledState] = useState(getSentryEnabled); + const [sessionReplayEnabled, setSessionReplayEnabledState] = useState(getSentryReplayEnabled); const [needsRefresh, setNeedsRefresh] = useState(false); const isSentryConfigured = Boolean(import.meta.env.VITE_SENTRY_DSN); const handleSentryToggle = (enabled: boolean) => { - setSentryEnabled(enabled); - if (enabled) { - localStorage.setItem('sable_sentry_enabled', 'true'); - } else { - localStorage.setItem('sable_sentry_enabled', 'false'); - } + setSentryEnabledState(enabled); + persistSentryEnabled(enabled); setNeedsRefresh(true); }; const handleReplayToggle = (enabled: boolean) => { - setSessionReplayEnabled(enabled); - if (enabled) { - localStorage.setItem('sable_sentry_replay_enabled', 'true'); - } else { - localStorage.removeItem('sable_sentry_replay_enabled'); - } + setSessionReplayEnabledState(enabled); + persistSentryReplayEnabled(enabled); setNeedsRefresh(true); }; diff --git a/src/app/features/settings/notifications/AllMessages.tsx b/src/app/features/settings/notifications/AllMessages.tsx index 5ee60a178..6fa701409 100644 --- a/src/app/features/settings/notifications/AllMessages.tsx +++ b/src/app/features/settings/notifications/AllMessages.tsx @@ -2,8 +2,8 @@ import { useCallback, useMemo } from 'react'; import { Badge, Box, Text } from 'folds'; import { ConditionKind, - IPushRules, - PushRuleCondition, + type IPushRules, + type PushRuleCondition, PushRuleKind, RuleId, } from '$types/matrix-sdk'; @@ -11,7 +11,7 @@ import { useAccountData } from '$hooks/useAccountData'; import { AccountDataEvent } from '$types/matrix/accountData'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; -import { PushRuleData, usePushRule } from '$hooks/usePushRule'; +import { type PushRuleData, usePushRule } from '$hooks/usePushRule'; import { getNotificationModeActions, NotificationMode, diff --git a/src/app/features/settings/notifications/KeywordMessages.tsx b/src/app/features/settings/notifications/KeywordMessages.tsx index ff235271f..4395d8a78 100644 --- a/src/app/features/settings/notifications/KeywordMessages.tsx +++ b/src/app/features/settings/notifications/KeywordMessages.tsx @@ -1,5 +1,11 @@ -import { ChangeEventHandler, FormEventHandler, useCallback, useMemo, useState } from 'react'; -import { IPushRule, IPushRules, PushRuleKind } from '$types/matrix-sdk'; +import { + type ChangeEventHandler, + type FormEventHandler, + useCallback, + useMemo, + useState, +} from 'react'; +import { type IPushRule, type IPushRules, PushRuleKind } from '$types/matrix-sdk'; import { Box, Text, Badge, Button, Input, config, IconButton, Icons, Icon, Spinner } from 'folds'; import { useAccountData } from '$hooks/useAccountData'; import { AccountDataEvent } from '$types/matrix/accountData'; @@ -9,7 +15,7 @@ import { useMatrixClient } from '$hooks/useMatrixClient'; import { getNotificationModeActions, NotificationMode, - NotificationModeOptions, + type NotificationModeOptions, useNotificationModeActions, } from '$hooks/useNotificationMode'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; diff --git a/src/app/features/settings/notifications/NotificationLevelsHint.tsx b/src/app/features/settings/notifications/NotificationLevelsHint.tsx index 700ca2bdb..9585a57ed 100644 --- a/src/app/features/settings/notifications/NotificationLevelsHint.tsx +++ b/src/app/features/settings/notifications/NotificationLevelsHint.tsx @@ -1,5 +1,16 @@ -import { MouseEventHandler, useState } from 'react'; -import { Box, config, Header, Icon, IconButton, Icons, Menu, PopOut, RectCords, Text } from 'folds'; +import { type MouseEventHandler, useState } from 'react'; +import { + Box, + config, + Header, + Icon, + IconButton, + Icons, + Menu, + PopOut, + type RectCords, + Text, +} from 'folds'; import FocusTrap from 'focus-trap-react'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/features/settings/notifications/NotificationModeSwitcher.tsx b/src/app/features/settings/notifications/NotificationModeSwitcher.tsx index 608bd5078..b76be0a83 100644 --- a/src/app/features/settings/notifications/NotificationModeSwitcher.tsx +++ b/src/app/features/settings/notifications/NotificationModeSwitcher.tsx @@ -7,12 +7,12 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Spinner, Text, } from 'folds'; -import { IPushRule } from '$types/matrix-sdk'; -import { MouseEventHandler, useMemo, useState } from 'react'; +import { type IPushRule } from '$types/matrix-sdk'; +import { type MouseEventHandler, useMemo, useState } from 'react'; import FocusTrap from 'focus-trap-react'; import { NotificationMode, useNotificationActionsMode } from '$hooks/useNotificationMode'; import { stopPropagation } from '$utils/keyboard'; diff --git a/src/app/features/settings/notifications/PushNotifications.tsx b/src/app/features/settings/notifications/PushNotifications.tsx index 46c0ebb0d..45c6526d7 100644 --- a/src/app/features/settings/notifications/PushNotifications.tsx +++ b/src/app/features/settings/notifications/PushNotifications.tsx @@ -1,6 +1,6 @@ -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { createDebugLogger } from '$utils/debugLogger'; -import { ClientConfig } from '../../../hooks/useClientConfig'; +import { type ClientConfig } from '../../../hooks/useClientConfig'; const debugLog = createDebugLogger('PushNotifications'); diff --git a/src/app/features/settings/notifications/SpecialMessages.tsx b/src/app/features/settings/notifications/SpecialMessages.tsx index ac8d736f3..f347cee17 100644 --- a/src/app/features/settings/notifications/SpecialMessages.tsx +++ b/src/app/features/settings/notifications/SpecialMessages.tsx @@ -1,5 +1,5 @@ import { useCallback, useMemo } from 'react'; -import { ConditionKind, IPushRules, PushRuleKind, RuleId } from '$types/matrix-sdk'; +import { ConditionKind, type IPushRules, PushRuleKind, RuleId } from '$types/matrix-sdk'; import { Box, Text, Badge } from 'folds'; import { useAccountData } from '$hooks/useAccountData'; import { AccountDataEvent } from '$types/matrix/accountData'; @@ -8,11 +8,11 @@ import { SettingTile } from '$components/setting-tile'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useUserProfile } from '$hooks/useUserProfile'; import { getMxIdLocalPart } from '$utils/matrix'; -import { makePushRuleData, PushRuleData, usePushRule } from '$hooks/usePushRule'; +import { makePushRuleData, type PushRuleData, usePushRule } from '$hooks/usePushRule'; import { getNotificationModeActions, NotificationMode, - NotificationModeOptions, + type NotificationModeOptions, useNotificationModeActions, } from '$hooks/useNotificationMode'; import { SequenceCardStyle } from '$features/settings/styles.css'; diff --git a/src/app/features/settings/notifications/SystemNotification.tsx b/src/app/features/settings/notifications/SystemNotification.tsx index 47266460e..aa4511adf 100644 --- a/src/app/features/settings/notifications/SystemNotification.tsx +++ b/src/app/features/settings/notifications/SystemNotification.tsx @@ -1,7 +1,7 @@ /* eslint-disable no-nested-ternary */ import { useCallback, useEffect, useState } from 'react'; import { Box, Text, Switch, Button, color, Spinner, config } from 'folds'; -import { IPusherRequest } from '$types/matrix-sdk'; +import { type IPusherRequest } from '$types/matrix-sdk'; import { useAtom } from 'jotai'; import { SequenceCard } from '$components/sequence-card'; import { SettingTile } from '$components/setting-tile'; diff --git a/src/app/features/space-settings/SpaceSettings.tsx b/src/app/features/space-settings/SpaceSettings.tsx index ddd1d5c74..fc978a8c7 100644 --- a/src/app/features/space-settings/SpaceSettings.tsx +++ b/src/app/features/space-settings/SpaceSettings.tsx @@ -1,6 +1,6 @@ import { useMemo, useState } from 'react'; import { useAtomValue } from 'jotai'; -import { Avatar, Box, config, Icon, IconButton, Icons, IconSrc, MenuItem, Text } from 'folds'; +import { Avatar, Box, config, Icon, IconButton, Icons, type IconSrc, MenuItem, Text } from 'folds'; import { JoinRule } from '$types/matrix-sdk'; import { PageNav, PageNavContent, PageNavHeader, PageRoot } from '$components/page'; import { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize'; diff --git a/src/app/features/space-settings/SpaceSettingsRenderer.tsx b/src/app/features/space-settings/SpaceSettingsRenderer.tsx index 425428685..fe1f95624 100644 --- a/src/app/features/space-settings/SpaceSettingsRenderer.tsx +++ b/src/app/features/space-settings/SpaceSettingsRenderer.tsx @@ -1,7 +1,7 @@ import { Modal500 } from '$components/Modal500'; import { useCloseSpaceSettings, useSpaceSettingsState } from '$state/hooks/spaceSettings'; import { useAllJoinedRoomsSet, useGetRoom } from '$hooks/useGetRoom'; -import { SpaceSettingsState } from '$state/spaceSettings'; +import { type SpaceSettingsState } from '$state/spaceSettings'; import { RoomProvider } from '$hooks/useRoom'; import { SpaceProvider } from '$hooks/useSpace'; import { SpaceSettings } from './SpaceSettings'; diff --git a/src/app/features/space-settings/permissions/usePermissionItems.ts b/src/app/features/space-settings/permissions/usePermissionItems.ts index cdc4f73df..573970a16 100644 --- a/src/app/features/space-settings/permissions/usePermissionItems.ts +++ b/src/app/features/space-settings/permissions/usePermissionItems.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { StateEvent } from '$types/matrix/room'; -import { PermissionGroup } from '$features/common-settings/permissions'; +import { type PermissionGroup } from '$features/common-settings/permissions'; export const usePermissionGroups = (): PermissionGroup[] => { const groups: PermissionGroup[] = useMemo(() => { diff --git a/src/app/features/widgets/GenericWidgetDriver.ts b/src/app/features/widgets/GenericWidgetDriver.ts index ee143b4f3..c58752406 100644 --- a/src/app/features/widgets/GenericWidgetDriver.ts +++ b/src/app/features/widgets/GenericWidgetDriver.ts @@ -6,14 +6,14 @@ import { type IRoomEvent, type Widget, WidgetDriver, - WidgetKind, + type WidgetKind, type IWidgetApiErrorResponseDataDetails, type ISearchUserDirectoryResult, type IGetMediaConfigResult, UpdateDelayedEventAction, OpenIDRequestState, - SimpleObservable, - IOpenIDUpdate, + type SimpleObservable, + type IOpenIDUpdate, } from 'matrix-widget-api'; import { EventType, @@ -24,8 +24,8 @@ import { type SendDelayedEventResponse, type StateEvents, type TimelineEvents, - MatrixClient, - Room, + type MatrixClient, + type Room, } from '$types/matrix-sdk'; export type CapabilityApprovalCallback = (requested: Set) => Promise>; diff --git a/src/app/features/widgets/IntegrationManager.tsx b/src/app/features/widgets/IntegrationManager.tsx index 4bf242a4f..133b87c66 100644 --- a/src/app/features/widgets/IntegrationManager.tsx +++ b/src/app/features/widgets/IntegrationManager.tsx @@ -12,16 +12,16 @@ import { Text, } from 'folds'; import FocusTrap from 'focus-trap-react'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useIntegrationManager, buildIntegrationManagerUrl } from '$hooks/useIntegrationManager'; import * as css from './IntegrationManager.css'; -interface IntegrationManagerProps { +type IntegrationManagerProps = { room: Room; open: boolean; onClose: () => void; -} +}; export function IntegrationManager({ room, open, onClose }: IntegrationManagerProps) { const { managers, scalarToken, loading, error } = useIntegrationManager(); diff --git a/src/app/features/widgets/WidgetIframe.tsx b/src/app/features/widgets/WidgetIframe.tsx index 844debfd2..589566494 100644 --- a/src/app/features/widgets/WidgetIframe.tsx +++ b/src/app/features/widgets/WidgetIframe.tsx @@ -1,25 +1,31 @@ import { useEffect, useRef, useState } from 'react'; -import { ClientWidgetApi, IWidget, IRoomEvent, Widget, WidgetKind } from 'matrix-widget-api'; +import { + ClientWidgetApi, + type IWidget, + type IRoomEvent, + Widget, + WidgetKind, +} from 'matrix-widget-api'; import { ClientEvent, Direction, - IEvent, - MatrixClient, - MatrixEvent, + type IEvent, + type MatrixClient, + type MatrixEvent, MatrixEventEvent, } from '$types/matrix-sdk'; import { createLogger } from '$utils/debug'; import { resolveWidgetUrl } from '$hooks/useRoomWidgets'; -import { GenericWidgetDriver, CapabilityApprovalCallback } from './GenericWidgetDriver'; +import { GenericWidgetDriver, type CapabilityApprovalCallback } from './GenericWidgetDriver'; const log = createLogger('WidgetIframe'); -interface WidgetIframeProps { +type WidgetIframeProps = { widget: IWidget; roomId: string; mx: MatrixClient; onCapabilityRequest?: CapabilityApprovalCallback; -} +}; export function WidgetIframe({ widget, roomId, mx, onCapabilityRequest }: WidgetIframeProps) { const iframeRef = useRef(null); diff --git a/src/app/features/widgets/WidgetsDrawer.tsx b/src/app/features/widgets/WidgetsDrawer.tsx index ade7699e8..9c66f2832 100644 --- a/src/app/features/widgets/WidgetsDrawer.tsx +++ b/src/app/features/widgets/WidgetsDrawer.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, MouseEventHandler, useState } from 'react'; +import { type FormEventHandler, type MouseEventHandler, useState } from 'react'; import { Box, Header, @@ -15,10 +15,10 @@ import { Button, Line, } from 'folds'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; -import { useRoomWidgets, RoomWidget, enrichWidgetUrl } from '$hooks/useRoomWidgets'; +import { useRoomWidgets, type RoomWidget, enrichWidgetUrl } from '$hooks/useRoomWidgets'; import { useSetSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { usePowerLevelsContext } from '$hooks/usePowerLevels'; diff --git a/src/app/hooks/types.ts b/src/app/hooks/types.ts index 781eb90ca..37c5e42ca 100644 --- a/src/app/hooks/types.ts +++ b/src/app/hooks/types.ts @@ -1,4 +1,4 @@ -import { IRequestTokenResponse } from '$types/matrix-sdk'; +import { type IRequestTokenResponse } from '$types/matrix-sdk'; export type RequestEmailTokenResponse = { email: string; diff --git a/src/app/hooks/useAccountData.ts b/src/app/hooks/useAccountData.ts index 11d3d5b42..ca90d866c 100644 --- a/src/app/hooks/useAccountData.ts +++ b/src/app/hooks/useAccountData.ts @@ -1,5 +1,5 @@ import { useState, useCallback } from 'react'; -import { AccountDataEvents } from '$types/matrix-sdk'; +import { type AccountDataEvents } from '$types/matrix-sdk'; import { useMatrixClient } from './useMatrixClient'; import { useAccountDataCallback } from './useAccountDataCallback'; diff --git a/src/app/hooks/useAccountDataCallback.ts b/src/app/hooks/useAccountDataCallback.ts index 97c350446..7c4995707 100644 --- a/src/app/hooks/useAccountDataCallback.ts +++ b/src/app/hooks/useAccountDataCallback.ts @@ -1,4 +1,4 @@ -import { ClientEvent, ClientEventHandlerMap, MatrixClient } from '$types/matrix-sdk'; +import { ClientEvent, type ClientEventHandlerMap, type MatrixClient } from '$types/matrix-sdk'; import { useEffect } from 'react'; export const useAccountDataCallback = ( diff --git a/src/app/hooks/useAppVisibility.ts b/src/app/hooks/useAppVisibility.ts index 7fd5f2325..4dc9a5be7 100644 --- a/src/app/hooks/useAppVisibility.ts +++ b/src/app/hooks/useAppVisibility.ts @@ -1,5 +1,5 @@ import { useEffect } from 'react'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useAtom } from 'jotai'; import { togglePusher } from '../features/settings/notifications/PushNotifications'; import { appEvents } from '../utils/appEvents'; diff --git a/src/app/hooks/useAsyncCallback.ts b/src/app/hooks/useAsyncCallback.ts index 70831bea1..f06c0060b 100644 --- a/src/app/hooks/useAsyncCallback.ts +++ b/src/app/hooks/useAsyncCallback.ts @@ -1,4 +1,11 @@ -import { Dispatch, SetStateAction, useCallback, useEffect, useRef, useState } from 'react'; +import { + type Dispatch, + type SetStateAction, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; import { flushSync } from 'react-dom'; import { useAlive } from './useAlive'; diff --git a/src/app/hooks/useAsyncSearch.ts b/src/app/hooks/useAsyncSearch.ts index ebf78b8be..5ab436d09 100644 --- a/src/app/hooks/useAsyncSearch.ts +++ b/src/app/hooks/useAsyncSearch.ts @@ -1,14 +1,14 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { - MatchHandler, + type MatchHandler, AsyncSearch, - AsyncSearchHandler, - AsyncSearchOption, - MatchQueryOption, - NormalizeOption, + type AsyncSearchHandler, + type AsyncSearchOption, + type MatchQueryOption, + type NormalizeOption, normalize, matchQuery, - ResultHandler, + type ResultHandler, } from '$utils/AsyncSearch'; import { sanitizeForRegex } from '$utils/regex'; diff --git a/src/app/hooks/useAuthFlows.ts b/src/app/hooks/useAuthFlows.ts index 8d82435e2..a1791b86e 100644 --- a/src/app/hooks/useAuthFlows.ts +++ b/src/app/hooks/useAuthFlows.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { IAuthData, MatrixError, ILoginFlowsResponse } from '$types/matrix-sdk'; +import { type IAuthData, type MatrixError, type ILoginFlowsResponse } from '$types/matrix-sdk'; export enum RegisterFlowStatus { FlowRequired = 401, diff --git a/src/app/hooks/useAuthMetadata.ts b/src/app/hooks/useAuthMetadata.ts index a24859093..42830c443 100644 --- a/src/app/hooks/useAuthMetadata.ts +++ b/src/app/hooks/useAuthMetadata.ts @@ -1,4 +1,4 @@ -import { ValidatedAuthMetadata } from '$types/matrix-sdk'; +import { type ValidatedAuthMetadata } from '$types/matrix-sdk'; import { createContext, useContext } from 'react'; const AuthMetadataContext = createContext(undefined); diff --git a/src/app/hooks/useAutoDiscoveryInfo.ts b/src/app/hooks/useAutoDiscoveryInfo.ts index b2f8bcb56..9d570d467 100644 --- a/src/app/hooks/useAutoDiscoveryInfo.ts +++ b/src/app/hooks/useAutoDiscoveryInfo.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { AutoDiscoveryInfo } from '../cs-api'; +import { type AutoDiscoveryInfo } from '../cs-api'; const AutoDiscoverInfoContext = createContext(null); diff --git a/src/app/hooks/useCall.ts b/src/app/hooks/useCall.ts index 1364e4598..9ec13122d 100644 --- a/src/app/hooks/useCall.ts +++ b/src/app/hooks/useCall.ts @@ -1,9 +1,9 @@ -import { Room } from 'matrix-js-sdk'; +import { type Room } from 'matrix-js-sdk'; import { MatrixRTCSession, MatrixRTCSessionEvent, } from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSession'; -import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; +import { type CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership'; import { useEffect, useState } from 'react'; import { MatrixRTCSessionManagerEvents } from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSessionManager'; import { useMatrixClient } from './useMatrixClient'; diff --git a/src/app/hooks/useCallEmbed.ts b/src/app/hooks/useCallEmbed.ts index a5bd94b9d..13f284308 100644 --- a/src/app/hooks/useCallEmbed.ts +++ b/src/app/hooks/useCallEmbed.ts @@ -1,11 +1,11 @@ -import { createContext, RefObject, useCallback, useContext, useEffect, useState } from 'react'; +import { createContext, type RefObject, useCallback, useContext, useEffect, useState } from 'react'; import { MatrixRTCSession } from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSession'; -import { MatrixClient, Room } from 'matrix-js-sdk'; +import { type MatrixClient, type Room } from 'matrix-js-sdk'; import { useSetAtom } from 'jotai'; import * as Sentry from '@sentry/react'; import { CallEmbed, - ElementCallThemeKind, + type ElementCallThemeKind, ElementWidgetActions, useClientWidgetApiEvent, } from '../plugins/call'; @@ -15,7 +15,7 @@ import { callEmbedAtom } from '../state/callEmbed'; import { useResizeObserver } from './useResizeObserver'; import { CallControlState } from '../plugins/call/CallControlState'; import { useCallMembersChange, useCallSession } from './useCall'; -import { CallPreferences } from '../state/callPreferences'; +import { type CallPreferences } from '../state/callPreferences'; import { createDebugLogger } from '../utils/debugLogger'; const debugLog = createDebugLogger('useCallEmbed'); diff --git a/src/app/hooks/useCallSignaling.ts b/src/app/hooks/useCallSignaling.ts index 16620acb9..ea433df99 100644 --- a/src/app/hooks/useCallSignaling.ts +++ b/src/app/hooks/useCallSignaling.ts @@ -14,10 +14,10 @@ const debugLog = createDebugLogger('CallSignaling'); type CallPhase = 'IDLE' | 'RINGING_OUT' | 'RINGING_IN' | 'ACTIVE' | 'ENDED'; -interface SignalState { +type SignalState = { incoming: string | null; outgoing: string | null; -} +}; export function useCallSignaling() { const mx = useMatrixClient(); diff --git a/src/app/hooks/useCallSpeakers.ts b/src/app/hooks/useCallSpeakers.ts index 240036785..4e18fce14 100644 --- a/src/app/hooks/useCallSpeakers.ts +++ b/src/app/hooks/useCallSpeakers.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; -import { CallEmbed } from '../plugins/call'; +import { type CallEmbed } from '../plugins/call'; import { useMutationObserver } from './useMutationObserver'; import { isUserId } from '../utils/matrix'; import { useCallMembers, useCallSession } from './useCall'; diff --git a/src/app/hooks/useCapabilities.ts b/src/app/hooks/useCapabilities.ts index 6e84090e7..3022347b6 100644 --- a/src/app/hooks/useCapabilities.ts +++ b/src/app/hooks/useCapabilities.ts @@ -1,4 +1,4 @@ -import { Capabilities } from '$types/matrix-sdk'; +import { type Capabilities } from '$types/matrix-sdk'; import { createContext, useContext } from 'react'; const CapabilitiesContext = createContext(null); diff --git a/src/app/hooks/useCategoryHandler.ts b/src/app/hooks/useCategoryHandler.ts index 086902d63..434a5120f 100644 --- a/src/app/hooks/useCategoryHandler.ts +++ b/src/app/hooks/useCategoryHandler.ts @@ -1,4 +1,4 @@ -import { MouseEventHandler } from 'react'; +import { type MouseEventHandler } from 'react'; type CategoryAction = | { diff --git a/src/app/hooks/useCommands.ts b/src/app/hooks/useCommands.ts index 199927883..9b7d92354 100644 --- a/src/app/hooks/useCommands.ts +++ b/src/app/hooks/useCommands.ts @@ -1,14 +1,14 @@ import { Direction, EventTimeline, - IContextResponse, - MatrixClient, + type IContextResponse, + type MatrixClient, Method, Preset, - Room, - RoomMember, + type Room, + type RoomMember, Visibility, - RoomServerAclEventContent, + type RoomServerAclEventContent, MsgType, } from '$types/matrix-sdk'; import { useMemo } from 'react'; diff --git a/src/app/hooks/useComposingCheck.ts b/src/app/hooks/useComposingCheck.ts index 9208fcf33..a9f508c9d 100644 --- a/src/app/hooks/useComposingCheck.ts +++ b/src/app/hooks/useComposingCheck.ts @@ -2,9 +2,9 @@ import { useCallback, useEffect } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; import { lastCompositionEndAtom } from '$state/lastCompositionEnd'; -interface TimeStamped { +type TimeStamped = { readonly timeStamp: number; -} +}; export function useCompositionEndTracking(): void { const setLastCompositionEnd = useSetAtom(lastCompositionEndAtom); @@ -24,13 +24,13 @@ export function useCompositionEndTracking(): void { }); } -interface IsComposingLike { +type IsComposingLike = { readonly timeStamp: number; readonly keyCode: number; readonly nativeEvent: { readonly isComposing?: boolean; }; -} +}; export function useComposingCheck({ compositionEndThreshold = 500, diff --git a/src/app/hooks/useCrossSigning.ts b/src/app/hooks/useCrossSigning.ts index b280ecfdc..776ce9ddb 100644 --- a/src/app/hooks/useCrossSigning.ts +++ b/src/app/hooks/useCrossSigning.ts @@ -1,4 +1,4 @@ -import { AccountDataEvent, SecretAccountData } from '$types/matrix/accountData'; +import { AccountDataEvent, type SecretAccountData } from '$types/matrix/accountData'; import { useAccountData } from './useAccountData'; export const useCrossSigningActive = (): boolean => { diff --git a/src/app/hooks/useDateFormat.ts b/src/app/hooks/useDateFormat.ts index 497173101..05de45b29 100644 --- a/src/app/hooks/useDateFormat.ts +++ b/src/app/hooks/useDateFormat.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { DateFormat } from '$state/settings'; +import { type DateFormat } from '$state/settings'; export type DateFormatItem = { name: string; diff --git a/src/app/hooks/useDebounce.ts b/src/app/hooks/useDebounce.ts index 5f33976a3..d3ebc7b3d 100644 --- a/src/app/hooks/useDebounce.ts +++ b/src/app/hooks/useDebounce.ts @@ -1,9 +1,9 @@ import { useCallback, useRef } from 'react'; -export interface DebounceOptions { +export type DebounceOptions = { wait?: number; immediate?: boolean; -} +}; export type DebounceCallback = (...args: T) => void; export function useDebounce( diff --git a/src/app/hooks/useDeviceList.ts b/src/app/hooks/useDeviceList.ts index 965784125..06b3bb73f 100644 --- a/src/app/hooks/useDeviceList.ts +++ b/src/app/hooks/useDeviceList.ts @@ -1,5 +1,5 @@ import { useEffect, useCallback, useMemo } from 'react'; -import { IMyDevice, CryptoEvent, CryptoEventHandlerMap } from '$types/matrix-sdk'; +import { type IMyDevice, CryptoEvent, type CryptoEventHandlerMap } from '$types/matrix-sdk'; import { useQuery } from '@tanstack/react-query'; import { useMatrixClient } from './useMatrixClient'; diff --git a/src/app/hooks/useDeviceVerificationStatus.ts b/src/app/hooks/useDeviceVerificationStatus.ts index 4d2ea071f..95e24b27c 100644 --- a/src/app/hooks/useDeviceVerificationStatus.ts +++ b/src/app/hooks/useDeviceVerificationStatus.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { CryptoApi } from '$types/matrix-sdk'; +import { type CryptoApi } from '$types/matrix-sdk'; import { verifiedDevice } from '$utils/matrix-crypto'; import { fulfilledPromiseSettledResult } from '$utils/common'; import { useAlive } from './useAlive'; diff --git a/src/app/hooks/useDirectUsers.ts b/src/app/hooks/useDirectUsers.ts index ea412fb65..9f65bfc74 100644 --- a/src/app/hooks/useDirectUsers.ts +++ b/src/app/hooks/useDirectUsers.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { AccountDataEvent, MDirectContent } from '$types/matrix/accountData'; +import { AccountDataEvent, type MDirectContent } from '$types/matrix/accountData'; import { useAccountData } from './useAccountData'; import { useAllJoinedRoomsSet, useGetRoom } from './useGetRoom'; diff --git a/src/app/hooks/useFileDrop.ts b/src/app/hooks/useFileDrop.ts index 7922c336d..ff95f8b62 100644 --- a/src/app/hooks/useFileDrop.ts +++ b/src/app/hooks/useFileDrop.ts @@ -1,4 +1,11 @@ -import { useCallback, DragEventHandler, RefObject, useState, useEffect, useRef } from 'react'; +import { + useCallback, + type DragEventHandler, + type RefObject, + useState, + useEffect, + useRef, +} from 'react'; import { getDataTransferFiles } from '$utils/dom'; export const useFileDropHandler = (onDrop: (file: File[]) => void): DragEventHandler => diff --git a/src/app/hooks/useFilePasteHandler.ts b/src/app/hooks/useFilePasteHandler.ts index 253ad9b3b..197a8f85c 100644 --- a/src/app/hooks/useFilePasteHandler.ts +++ b/src/app/hooks/useFilePasteHandler.ts @@ -1,4 +1,4 @@ -import { useCallback, ClipboardEventHandler } from 'react'; +import { useCallback, type ClipboardEventHandler } from 'react'; import { getDataTransferFiles } from '$utils/dom'; export const useFilePasteHandler = (onPaste: (file: File[]) => void): ClipboardEventHandler => diff --git a/src/app/hooks/useGetRoom.ts b/src/app/hooks/useGetRoom.ts index 6ab37b795..671b72fa4 100644 --- a/src/app/hooks/useGetRoom.ts +++ b/src/app/hooks/useGetRoom.ts @@ -1,4 +1,4 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useAtomValue } from 'jotai'; import { useCallback, useMemo } from 'react'; import { allRoomsAtom } from '$state/room-list/roomList'; diff --git a/src/app/hooks/useGroupDMMembers.ts b/src/app/hooks/useGroupDMMembers.ts index a3ab796a1..2908e3a0b 100644 --- a/src/app/hooks/useGroupDMMembers.ts +++ b/src/app/hooks/useGroupDMMembers.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { MatrixClient, Room } from '$types/matrix-sdk'; +import { type MatrixClient, type Room } from '$types/matrix-sdk'; export type GroupMemberInfo = { userId: string; diff --git a/src/app/hooks/useImagePackRooms.ts b/src/app/hooks/useImagePackRooms.ts index b2163a726..6e22886e3 100644 --- a/src/app/hooks/useImagePackRooms.ts +++ b/src/app/hooks/useImagePackRooms.ts @@ -1,4 +1,4 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useMemo } from 'react'; import { getAllParents } from '$utils/room'; import { useMatrixClient } from './useMatrixClient'; diff --git a/src/app/hooks/useImagePacks.ts b/src/app/hooks/useImagePacks.ts index 7146966b2..47c6cbedd 100644 --- a/src/app/hooks/useImagePacks.ts +++ b/src/app/hooks/useImagePacks.ts @@ -1,4 +1,4 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { AccountDataEvent } from '$types/matrix/accountData'; import { StateEvent } from '$types/matrix/room'; @@ -8,8 +8,8 @@ import { getRoomImagePacks, getUserImagePack, globalPacksScope, - ImagePack, - ImageUsage, + type ImagePack, + type ImageUsage, readCachedPack, readCachedPacks, roomPacksScope, diff --git a/src/app/hooks/useIntegrationManager.ts b/src/app/hooks/useIntegrationManager.ts index 00feba387..76a978288 100644 --- a/src/app/hooks/useIntegrationManager.ts +++ b/src/app/hooks/useIntegrationManager.ts @@ -1,11 +1,11 @@ import { useCallback, useEffect, useState } from 'react'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useMatrixClient } from './useMatrixClient'; -export interface IntegrationManager { +export type IntegrationManager = { apiUrl: string; uiUrl: string; -} +}; const DEFAULT_MANAGERS: IntegrationManager[] = [ { diff --git a/src/app/hooks/useKeyBackup.ts b/src/app/hooks/useKeyBackup.ts index 3714ec6be..48b0751c8 100644 --- a/src/app/hooks/useKeyBackup.ts +++ b/src/app/hooks/useKeyBackup.ts @@ -1,9 +1,9 @@ import { - BackupTrustInfo, - CryptoApi, + type BackupTrustInfo, + type CryptoApi, CryptoEvent, - CryptoEventHandlerMap, - KeyBackupInfo, + type CryptoEventHandlerMap, + type KeyBackupInfo, } from '$types/matrix-sdk'; import { useCallback, useEffect, useState } from 'react'; import * as Sentry from '@sentry/react'; diff --git a/src/app/hooks/useLivekitSupport.ts b/src/app/hooks/useLivekitSupport.ts index 3cb2c1d88..b38bc12ca 100644 --- a/src/app/hooks/useLivekitSupport.ts +++ b/src/app/hooks/useLivekitSupport.ts @@ -1,4 +1,4 @@ -import { AutoDiscoveryInfo } from '../cs-api'; +import { type AutoDiscoveryInfo } from '../cs-api'; import { useAutoDiscoveryInfo } from './useAutoDiscoveryInfo'; export const livekitSupport = (autoDiscoveryInfo: AutoDiscoveryInfo): boolean => { diff --git a/src/app/hooks/useLocalRoomSummary.ts b/src/app/hooks/useLocalRoomSummary.ts index 043d09f7b..3cd38330a 100644 --- a/src/app/hooks/useLocalRoomSummary.ts +++ b/src/app/hooks/useLocalRoomSummary.ts @@ -1,4 +1,4 @@ -import { GuestAccess, HistoryVisibility, JoinRule, Room } from '$types/matrix-sdk'; +import { GuestAccess, HistoryVisibility, type JoinRule, type Room } from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import { getStateEvent } from '$utils/room'; diff --git a/src/app/hooks/useMatrixClient.ts b/src/app/hooks/useMatrixClient.ts index f12365351..6b1310d7f 100644 --- a/src/app/hooks/useMatrixClient.ts +++ b/src/app/hooks/useMatrixClient.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; const MatrixClientContext = createContext(null); diff --git a/src/app/hooks/useMatrixEventRenderer.ts b/src/app/hooks/useMatrixEventRenderer.ts index 57d56cc1c..f08258009 100644 --- a/src/app/hooks/useMatrixEventRenderer.ts +++ b/src/app/hooks/useMatrixEventRenderer.ts @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; export type EventRenderer = (...args: T) => ReactNode; diff --git a/src/app/hooks/useMediaConfig.ts b/src/app/hooks/useMediaConfig.ts index 929ebd004..d633cd6b7 100644 --- a/src/app/hooks/useMediaConfig.ts +++ b/src/app/hooks/useMediaConfig.ts @@ -1,9 +1,9 @@ import { createContext, useContext } from 'react'; -export interface MediaConfig { +export type MediaConfig = { [key: string]: unknown; 'm.upload.size'?: number; -} +}; const MediaConfigContext = createContext(null); diff --git a/src/app/hooks/useMemberEventParser.tsx b/src/app/hooks/useMemberEventParser.tsx index 05d5cc40f..b1abc5cbb 100644 --- a/src/app/hooks/useMemberEventParser.tsx +++ b/src/app/hooks/useMemberEventParser.tsx @@ -1,7 +1,7 @@ -import { ReactNode } from 'react'; -import { IconSrc, Icons } from 'folds'; -import { MatrixEvent } from '$types/matrix-sdk'; -import { IMemberContent, Membership } from '$types/matrix/room'; +import { type ReactNode } from 'react'; +import { type IconSrc, Icons } from 'folds'; +import { type MatrixEvent } from '$types/matrix-sdk'; +import { type IMemberContent, Membership } from '$types/matrix/room'; import { getMxIdLocalPart } from '$utils/matrix'; import { isMembershipChanged } from '$utils/room'; diff --git a/src/app/hooks/useMemberFilter.ts b/src/app/hooks/useMemberFilter.ts index 3ce50a5bd..fb40fc2c4 100644 --- a/src/app/hooks/useMemberFilter.ts +++ b/src/app/hooks/useMemberFilter.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { RoomMember } from '$types/matrix-sdk'; +import { type RoomMember } from '$types/matrix-sdk'; import { Membership } from '$types/matrix/room'; export const MembershipFilter = { diff --git a/src/app/hooks/useMemberPowerCompare.ts b/src/app/hooks/useMemberPowerCompare.ts index 72163edfc..3380377b0 100644 --- a/src/app/hooks/useMemberPowerCompare.ts +++ b/src/app/hooks/useMemberPowerCompare.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { IPowerLevels, readPowerLevel } from './usePowerLevels'; +import { type IPowerLevels, readPowerLevel } from './usePowerLevels'; export const useMemberPowerCompare = (creators: Set, powerLevels: IPowerLevels) => { /** diff --git a/src/app/hooks/useMemberPowerTag.ts b/src/app/hooks/useMemberPowerTag.ts index ac2df17c4..727daad09 100644 --- a/src/app/hooks/useMemberPowerTag.ts +++ b/src/app/hooks/useMemberPowerTag.ts @@ -1,11 +1,11 @@ import { useCallback, useMemo } from 'react'; -import { MatrixClient, Room, RoomMember } from '$types/matrix-sdk'; -import { MemberPowerTag, MemberPowerTagIcon } from '$types/matrix/room'; +import { type MatrixClient, type Room, type RoomMember } from '$types/matrix-sdk'; +import { type MemberPowerTag, type MemberPowerTagIcon } from '$types/matrix/room'; import { accessibleColor } from '$plugins/color'; -import { getPowerLevelTag, PowerLevelTags, usePowerLevelTags } from './usePowerLevelTags'; -import { IPowerLevels, readPowerLevel } from './usePowerLevels'; +import { getPowerLevelTag, type PowerLevelTags, usePowerLevelTags } from './usePowerLevelTags'; +import { type IPowerLevels, readPowerLevel } from './usePowerLevels'; import { useRoomCreatorsTag } from './useRoomCreatorsTag'; -import { ThemeKind } from './useTheme'; +import { type ThemeKind } from './useTheme'; export type GetMemberPowerTag = (userId: string) => MemberPowerTag; diff --git a/src/app/hooks/useMemberSort.ts b/src/app/hooks/useMemberSort.ts index 72e0581da..af82c3a4d 100644 --- a/src/app/hooks/useMemberSort.ts +++ b/src/app/hooks/useMemberSort.ts @@ -1,4 +1,4 @@ -import { RoomMember } from '$types/matrix-sdk'; +import { type RoomMember } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; export const MemberSort = { diff --git a/src/app/hooks/useMembership.ts b/src/app/hooks/useMembership.ts index 47044c381..6957e7fc6 100644 --- a/src/app/hooks/useMembership.ts +++ b/src/app/hooks/useMembership.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Room, RoomMemberEvent, RoomMemberEventHandlerMap } from '$types/matrix-sdk'; +import { type Room, RoomMemberEvent, type RoomMemberEventHandlerMap } from '$types/matrix-sdk'; import { Membership } from '$types/matrix/room'; export const useMembership = (room: Room, userId: string): Membership => { diff --git a/src/app/hooks/useMentionClickHandler.ts b/src/app/hooks/useMentionClickHandler.ts index aadfb9826..1e736257f 100644 --- a/src/app/hooks/useMentionClickHandler.ts +++ b/src/app/hooks/useMentionClickHandler.ts @@ -1,8 +1,8 @@ -import { ReactEventHandler, useCallback } from 'react'; +import { type ReactEventHandler, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { isRoomId, isUserId } from '$utils/matrix'; import { getHomeRoomPath, withSearchParam } from '$pages/pathUtils'; -import { RoomSearchParams } from '$pages/paths'; +import { type RoomSearchParams } from '$pages/paths'; import { useOpenUserRoomProfile } from '$state/hooks/userRoomProfile'; import { useMatrixClient } from './useMatrixClient'; import { useRoomNavigate } from './useRoomNavigate'; diff --git a/src/app/hooks/useMessageSpacing.ts b/src/app/hooks/useMessageSpacing.ts index aab6cb531..33647903f 100644 --- a/src/app/hooks/useMessageSpacing.ts +++ b/src/app/hooks/useMessageSpacing.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { MessageSpacing } from '$state/settings'; +import { type MessageSpacing } from '$state/settings'; export type MessageSpacingItem = { name: string; diff --git a/src/app/hooks/useMutualRooms.ts b/src/app/hooks/useMutualRooms.ts index d0cbefe7e..2c10dfd6a 100644 --- a/src/app/hooks/useMutualRooms.ts +++ b/src/app/hooks/useMutualRooms.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; import { useMatrixClient } from './useMatrixClient'; -import { AsyncState, useAsyncCallbackValue } from './useAsyncCallback'; +import { type AsyncState, useAsyncCallbackValue } from './useAsyncCallback'; import { useSpecVersions } from './useSpecVersions'; export const useMutualRoomsSupport = (): boolean => { diff --git a/src/app/hooks/useNickname.ts b/src/app/hooks/useNickname.ts index 999a668dd..56c65496f 100644 --- a/src/app/hooks/useNickname.ts +++ b/src/app/hooks/useNickname.ts @@ -1,6 +1,6 @@ import { useAtomValue, useSetAtom } from 'jotai'; import { useCallback, useEffect } from 'react'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { AccountDataEvent } from '$types/matrix/accountData'; import { nicknamesAtom, setNicknameAtom } from '$state/nicknames'; import { useAccountDataCallback } from './useAccountDataCallback'; diff --git a/src/app/hooks/useNotificationMode.ts b/src/app/hooks/useNotificationMode.ts index 7901c80a2..d537398fc 100644 --- a/src/app/hooks/useNotificationMode.ts +++ b/src/app/hooks/useNotificationMode.ts @@ -1,4 +1,4 @@ -import { PushRuleAction, PushRuleActionName, TweakName } from '$types/matrix-sdk'; +import { type PushRuleAction, PushRuleActionName, TweakName } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; export enum NotificationMode { diff --git a/src/app/hooks/useParsedLoginFlows.ts b/src/app/hooks/useParsedLoginFlows.ts index 8095ef37a..85605ef7e 100644 --- a/src/app/hooks/useParsedLoginFlows.ts +++ b/src/app/hooks/useParsedLoginFlows.ts @@ -1,5 +1,10 @@ import { useMemo } from 'react'; -import { ILoginFlow, IPasswordFlow, ISSOFlow, LoginFlow } from '$types/matrix-sdk'; +import { + type ILoginFlow, + type IPasswordFlow, + type ISSOFlow, + type LoginFlow, +} from '$types/matrix-sdk'; export const getSSOFlow = (loginFlows: LoginFlow[]): ISSOFlow | undefined => loginFlows.find((flow) => flow.type === 'm.login.sso' || flow.type === 'm.login.cas') as diff --git a/src/app/hooks/usePasswordEmail.ts b/src/app/hooks/usePasswordEmail.ts index dbe39010d..bc2169cf5 100644 --- a/src/app/hooks/usePasswordEmail.ts +++ b/src/app/hooks/usePasswordEmail.ts @@ -1,7 +1,7 @@ -import { MatrixClient, MatrixError } from '$types/matrix-sdk'; +import { type MatrixClient, type MatrixError } from '$types/matrix-sdk'; import { useCallback, useRef } from 'react'; -import { AsyncState, useAsyncCallback } from './useAsyncCallback'; -import { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types'; +import { type AsyncState, useAsyncCallback } from './useAsyncCallback'; +import { type RequestEmailTokenCallback, type RequestEmailTokenResponse } from './types'; export const usePasswordEmail = ( mx: MatrixClient diff --git a/src/app/hooks/usePowerLevelTags.ts b/src/app/hooks/usePowerLevelTags.ts index eab9cc1f7..6b5407cdd 100644 --- a/src/app/hooks/usePowerLevelTags.ts +++ b/src/app/hooks/usePowerLevelTags.ts @@ -1,7 +1,7 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useMemo } from 'react'; -import { MemberPowerTag, StateEvent } from '$types/matrix/room'; -import { IPowerLevels } from './usePowerLevels'; +import { type MemberPowerTag, StateEvent } from '$types/matrix/room'; +import { type IPowerLevels } from './usePowerLevels'; import { useStateEvent } from './useStateEvent'; export type PowerLevelTags = Record; diff --git a/src/app/hooks/usePowerLevels.ts b/src/app/hooks/usePowerLevels.ts index 4b1b874b4..2332f3354 100644 --- a/src/app/hooks/usePowerLevels.ts +++ b/src/app/hooks/usePowerLevels.ts @@ -1,4 +1,4 @@ -import { MatrixEvent, Room } from '$types/matrix-sdk'; +import { type MatrixEvent, type Room } from '$types/matrix-sdk'; import { createContext, useCallback, useContext, useMemo, useState } from 'react'; import { produce } from 'immer'; import { StateEvent } from '$types/matrix/room'; diff --git a/src/app/hooks/usePushRule.ts b/src/app/hooks/usePushRule.ts index 32c9c3133..6a845115d 100644 --- a/src/app/hooks/usePushRule.ts +++ b/src/app/hooks/usePushRule.ts @@ -1,10 +1,10 @@ import { - IPushRule, - IPushRules, - PushRuleAction, - PushRuleCondition, + type IPushRule, + type IPushRules, + type PushRuleAction, + type PushRuleCondition, PushRuleKind, - RuleId, + type RuleId, } from '$types/matrix-sdk'; import { useMemo } from 'react'; diff --git a/src/app/hooks/useRecentEmoji.ts b/src/app/hooks/useRecentEmoji.ts index 09c356795..44609c506 100644 --- a/src/app/hooks/useRecentEmoji.ts +++ b/src/app/hooks/useRecentEmoji.ts @@ -1,8 +1,8 @@ import { useEffect, useState } from 'react'; -import { ClientEvent, MatrixClient, MatrixEvent } from '$types/matrix-sdk'; +import { ClientEvent, type MatrixClient, type MatrixEvent } from '$types/matrix-sdk'; import { AccountDataEvent } from '$types/matrix/accountData'; import { getRecentEmojis } from '$plugins/recent-emoji'; -import { IEmoji } from '$plugins/emoji'; +import { type IEmoji } from '$plugins/emoji'; export const useRecentEmoji = (mx: MatrixClient, limit?: number): IEmoji[] => { const [recentEmoji, setRecentEmoji] = useState(() => getRecentEmojis(mx, limit)); diff --git a/src/app/hooks/useRegisterEmail.ts b/src/app/hooks/useRegisterEmail.ts index 9124f116f..d311d9b0e 100644 --- a/src/app/hooks/useRegisterEmail.ts +++ b/src/app/hooks/useRegisterEmail.ts @@ -1,7 +1,7 @@ -import { MatrixClient, MatrixError } from '$types/matrix-sdk'; +import { type MatrixClient, type MatrixError } from '$types/matrix-sdk'; import { useCallback, useRef } from 'react'; -import { AsyncState, useAsyncCallback } from './useAsyncCallback'; -import { RequestEmailTokenCallback, RequestEmailTokenResponse } from './types'; +import { type AsyncState, useAsyncCallback } from './useAsyncCallback'; +import { type RequestEmailTokenCallback, type RequestEmailTokenResponse } from './types'; export const useRegisterEmail = ( mx: MatrixClient diff --git a/src/app/hooks/useRoom.ts b/src/app/hooks/useRoom.ts index 80b148115..5de2f999c 100644 --- a/src/app/hooks/useRoom.ts +++ b/src/app/hooks/useRoom.ts @@ -1,4 +1,4 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { createContext, useContext } from 'react'; const RoomContext = createContext(null); diff --git a/src/app/hooks/useRoomAccountData.ts b/src/app/hooks/useRoomAccountData.ts index 4d246fe49..5fd4ff520 100644 --- a/src/app/hooks/useRoomAccountData.ts +++ b/src/app/hooks/useRoomAccountData.ts @@ -1,4 +1,4 @@ -import { Room, RoomEvent, RoomEventHandlerMap } from '$types/matrix-sdk'; +import { type Room, RoomEvent, type RoomEventHandlerMap } from '$types/matrix-sdk'; import { useCallback, useEffect, useState } from 'react'; export const useRoomAccountData = (room: Room): Map => { diff --git a/src/app/hooks/useRoomAliases.ts b/src/app/hooks/useRoomAliases.ts index 36fff1ad9..ab6fcabae 100644 --- a/src/app/hooks/useRoomAliases.ts +++ b/src/app/hooks/useRoomAliases.ts @@ -1,8 +1,12 @@ import { useCallback, useEffect, useMemo } from 'react'; -import { MatrixError, Room, RoomCanonicalAliasEventContent } from '$types/matrix-sdk'; +import { + type MatrixError, + type Room, + type RoomCanonicalAliasEventContent, +} from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import { getStateEvent } from '$utils/room'; -import { AsyncState, useAsyncCallback } from './useAsyncCallback'; +import { type AsyncState, useAsyncCallback } from './useAsyncCallback'; import { useMatrixClient } from './useMatrixClient'; import { useAlive } from './useAlive'; import { useStateEvent } from './useStateEvent'; diff --git a/src/app/hooks/useRoomCreators.ts b/src/app/hooks/useRoomCreators.ts index 6c4f740c1..f041d0682 100644 --- a/src/app/hooks/useRoomCreators.ts +++ b/src/app/hooks/useRoomCreators.ts @@ -1,6 +1,6 @@ -import { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk'; +import { type MatrixClient, type MatrixEvent, type Room } from '$types/matrix-sdk'; import { useMemo } from 'react'; -import { IRoomCreateContent, StateEvent } from '$types/matrix/room'; +import { type IRoomCreateContent, StateEvent } from '$types/matrix/room'; import { creatorsSupported } from '$utils/matrix'; import { getStateEvent } from '$utils/room'; import { useStateEvent } from './useStateEvent'; diff --git a/src/app/hooks/useRoomCreatorsTag.ts b/src/app/hooks/useRoomCreatorsTag.ts index f1a31de15..081d61d43 100644 --- a/src/app/hooks/useRoomCreatorsTag.ts +++ b/src/app/hooks/useRoomCreatorsTag.ts @@ -1,4 +1,4 @@ -import { MemberPowerTag } from '$types/matrix/room'; +import { type MemberPowerTag } from '$types/matrix/room'; const DEFAULT_TAG: MemberPowerTag = { name: 'Founder', diff --git a/src/app/hooks/useRoomEvent.ts b/src/app/hooks/useRoomEvent.ts index 703353669..f5bf22dcb 100644 --- a/src/app/hooks/useRoomEvent.ts +++ b/src/app/hooks/useRoomEvent.ts @@ -1,10 +1,10 @@ import { - IEvent, + type IEvent, MatrixEvent, MatrixEventEvent, - Room, + type Room, RoomEvent, - CryptoBackend, + type CryptoBackend, } from '$types/matrix-sdk'; import { useCallback, useEffect, useMemo, useState } from 'react'; import to from 'await-to-js'; diff --git a/src/app/hooks/useRoomEventReaders.ts b/src/app/hooks/useRoomEventReaders.ts index 8a0236685..52147c60d 100644 --- a/src/app/hooks/useRoomEventReaders.ts +++ b/src/app/hooks/useRoomEventReaders.ts @@ -1,4 +1,4 @@ -import { Room, RoomEvent, RoomEventHandlerMap } from '$types/matrix-sdk'; +import { type Room, RoomEvent, type RoomEventHandlerMap } from '$types/matrix-sdk'; import { useEffect, useState } from 'react'; const getEventReaders = (room: Room, evtId?: string) => { diff --git a/src/app/hooks/useRoomLatestRenderedEvent.ts b/src/app/hooks/useRoomLatestRenderedEvent.ts index 07b2a28d9..9c5aa4526 100644 --- a/src/app/hooks/useRoomLatestRenderedEvent.ts +++ b/src/app/hooks/useRoomLatestRenderedEvent.ts @@ -1,5 +1,10 @@ /* eslint-disable no-continue */ -import { MatrixEvent, Room, RoomEvent, RoomEventHandlerMap } from '$types/matrix-sdk'; +import { + type MatrixEvent, + type Room, + RoomEvent, + type RoomEventHandlerMap, +} from '$types/matrix-sdk'; import { useEffect, useState } from 'react'; import { MessageEvent, StateEvent } from '$types/matrix/room'; import { settingsAtom } from '$state/settings'; diff --git a/src/app/hooks/useRoomMembers.ts b/src/app/hooks/useRoomMembers.ts index fbfdbdd3c..e7271b039 100644 --- a/src/app/hooks/useRoomMembers.ts +++ b/src/app/hooks/useRoomMembers.ts @@ -1,4 +1,9 @@ -import { MatrixClient, MatrixEvent, RoomMember, RoomMemberEvent } from '$types/matrix-sdk'; +import { + type MatrixClient, + type MatrixEvent, + type RoomMember, + RoomMemberEvent, +} from '$types/matrix-sdk'; import { useEffect, useState } from 'react'; export const useRoomMembers = (mx: MatrixClient, roomId: string): RoomMember[] => { diff --git a/src/app/hooks/useRoomMeta.ts b/src/app/hooks/useRoomMeta.ts index eee1385fd..6cc70b2e6 100644 --- a/src/app/hooks/useRoomMeta.ts +++ b/src/app/hooks/useRoomMeta.ts @@ -1,5 +1,10 @@ import { useEffect, useState } from 'react'; -import { RoomJoinRulesEventContent, Room, RoomEvent, RoomStateEvent } from '$types/matrix-sdk'; +import { + type RoomJoinRulesEventContent, + type Room, + RoomEvent, + RoomStateEvent, +} from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import { useStateEvent } from './useStateEvent'; import { useNickname } from './useNickname'; diff --git a/src/app/hooks/useRoomNavigate.ts b/src/app/hooks/useRoomNavigate.ts index 51555125c..387657b3f 100644 --- a/src/app/hooks/useRoomNavigate.ts +++ b/src/app/hooks/useRoomNavigate.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { NavigateOptions, useNavigate } from 'react-router-dom'; +import { type NavigateOptions, useNavigate } from 'react-router-dom'; import { useAtomValue } from 'jotai'; import { getCanonicalAliasOrRoomId } from '$utils/matrix'; import { diff --git a/src/app/hooks/useRoomPermissions.ts b/src/app/hooks/useRoomPermissions.ts index cb6f69a25..5046d6a10 100644 --- a/src/app/hooks/useRoomPermissions.ts +++ b/src/app/hooks/useRoomPermissions.ts @@ -1,8 +1,8 @@ import { useMemo } from 'react'; import { - IPowerLevels, - PowerLevelActions, - PowerLevelNotificationsAction, + type IPowerLevels, + type PowerLevelActions, + type PowerLevelNotificationsAction, readPowerLevel, } from './usePowerLevels'; diff --git a/src/app/hooks/useRoomPinnedEvents.ts b/src/app/hooks/useRoomPinnedEvents.ts index cb6106461..ae6dfeb4c 100644 --- a/src/app/hooks/useRoomPinnedEvents.ts +++ b/src/app/hooks/useRoomPinnedEvents.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { RoomPinnedEventsEventContent, Room } from '$types/matrix-sdk'; +import { type RoomPinnedEventsEventContent, type Room } from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import { useStateEvent } from './useStateEvent'; diff --git a/src/app/hooks/useRoomState.ts b/src/app/hooks/useRoomState.ts index 532bfb7d8..3142e63bf 100644 --- a/src/app/hooks/useRoomState.ts +++ b/src/app/hooks/useRoomState.ts @@ -1,9 +1,9 @@ import { Direction, - MatrixEvent, - Room, + type MatrixEvent, + type Room, RoomStateEvent, - RoomStateEventHandlerMap, + type RoomStateEventHandlerMap, } from '$types/matrix-sdk'; import { useCallback, useEffect, useState } from 'react'; import { StateEvent } from '$types/matrix/room'; diff --git a/src/app/hooks/useRoomTypingMembers.ts b/src/app/hooks/useRoomTypingMembers.ts index 5d06baded..424bb7e20 100644 --- a/src/app/hooks/useRoomTypingMembers.ts +++ b/src/app/hooks/useRoomTypingMembers.ts @@ -2,8 +2,8 @@ import { useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { useCallback } from 'react'; import { - IRoomIdToTypingMembers, - TypingReceipt, + type IRoomIdToTypingMembers, + type TypingReceipt, roomIdToTypingMembersAtom, } from '$state/typingMembers'; diff --git a/src/app/hooks/useRoomWidgets.ts b/src/app/hooks/useRoomWidgets.ts index 65381ddd3..e2cbde94f 100644 --- a/src/app/hooks/useRoomWidgets.ts +++ b/src/app/hooks/useRoomWidgets.ts @@ -1,15 +1,15 @@ -import { Room, MatrixEvent, MatrixClient } from '$types/matrix-sdk'; +import { type Room, type MatrixEvent, type MatrixClient } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; -import { IWidget } from 'matrix-widget-api'; +import { type IWidget } from 'matrix-widget-api'; import { StateEvent } from '$types/matrix/room'; import { getStateEvents } from '$utils/room'; import { useStateEventCallback } from './useStateEventCallback'; import { useForceUpdate } from './useForceUpdate'; -export interface RoomWidget extends IWidget { +export type RoomWidget = { eventId?: string; sender?: string; -} +} & IWidget; export const resolveWidgetUrl = ( url: string, diff --git a/src/app/hooks/useRoomsNotificationPreferences.ts b/src/app/hooks/useRoomsNotificationPreferences.ts index 65626bc12..e56ae0bbd 100644 --- a/src/app/hooks/useRoomsNotificationPreferences.ts +++ b/src/app/hooks/useRoomsNotificationPreferences.ts @@ -1,6 +1,6 @@ import { createContext, useCallback, useContext, useMemo } from 'react'; -import { ConditionKind, IPushRules, MatrixClient, PushRuleKind } from '$types/matrix-sdk'; -import { Icons, IconSrc } from 'folds'; +import { ConditionKind, type IPushRules, type MatrixClient, PushRuleKind } from '$types/matrix-sdk'; +import { Icons, type IconSrc } from 'folds'; import { AccountDataEvent } from '$types/matrix/accountData'; import { isRoomId } from '$utils/matrix'; import { useAccountData } from './useAccountData'; diff --git a/src/app/hooks/useSableCosmetics.ts b/src/app/hooks/useSableCosmetics.ts index b9b54c7e3..52a7d44fa 100644 --- a/src/app/hooks/useSableCosmetics.ts +++ b/src/app/hooks/useSableCosmetics.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { usePowerLevels } from './usePowerLevels'; import { useRoomCreators } from './useRoomCreators'; import { useAccessiblePowerTagColors, useGetMemberPowerTag } from './useMemberPowerTag'; diff --git a/src/app/hooks/useSecretStorage.ts b/src/app/hooks/useSecretStorage.ts index 53829cf8d..970b430be 100644 --- a/src/app/hooks/useSecretStorage.ts +++ b/src/app/hooks/useSecretStorage.ts @@ -1,7 +1,7 @@ import { AccountDataEvent, - SecretStorageDefaultKeyContent, - SecretStorageKeyContent, + type SecretStorageDefaultKeyContent, + type SecretStorageKeyContent, } from '$types/matrix/accountData'; import { useAccountData } from './useAccountData'; diff --git a/src/app/hooks/useSessionProfiles.ts b/src/app/hooks/useSessionProfiles.ts index 2cb03c358..5effad9ea 100644 --- a/src/app/hooks/useSessionProfiles.ts +++ b/src/app/hooks/useSessionProfiles.ts @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from 'react'; -import { Session } from '$state/sessions'; +import { type Session } from '$state/sessions'; export type SessionProfile = { displayName?: string; diff --git a/src/app/hooks/useSidebarItems.ts b/src/app/hooks/useSidebarItems.ts index dba7b2f28..b3fa793a4 100644 --- a/src/app/hooks/useSidebarItems.ts +++ b/src/app/hooks/useSidebarItems.ts @@ -1,5 +1,5 @@ -import { Dispatch, SetStateAction, useCallback, useEffect, useState } from 'react'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type Dispatch, type SetStateAction, useCallback, useEffect, useState } from 'react'; +import { type MatrixClient } from '$types/matrix-sdk'; import { AccountDataEvent } from '$types/matrix/accountData'; import { Membership } from '$types/matrix/room'; import { getAccountData, isSpace } from '$utils/room'; diff --git a/src/app/hooks/useSpace.ts b/src/app/hooks/useSpace.ts index ea53a0d0a..d9976a5ba 100644 --- a/src/app/hooks/useSpace.ts +++ b/src/app/hooks/useSpace.ts @@ -1,4 +1,4 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { createContext, useContext } from 'react'; const SpaceContext = createContext(null); diff --git a/src/app/hooks/useSpaceHierarchy.ts b/src/app/hooks/useSpaceHierarchy.ts index af8c80196..bbcf4c2de 100644 --- a/src/app/hooks/useSpaceHierarchy.ts +++ b/src/app/hooks/useSpaceHierarchy.ts @@ -1,12 +1,12 @@ import { atom, useAtom, useAtomValue } from 'jotai'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { MatrixError, Room, IHierarchyRoom } from '$types/matrix-sdk'; -import { QueryFunction, useInfiniteQuery } from '@tanstack/react-query'; -import { MSpaceChildContent, StateEvent } from '$types/matrix/room'; +import { MatrixError, type Room, type IHierarchyRoom } from '$types/matrix-sdk'; +import { type QueryFunction, useInfiniteQuery } from '@tanstack/react-query'; +import { type MSpaceChildContent, StateEvent } from '$types/matrix/room'; import { roomToParentsAtom } from '$state/room/roomToParents'; import { getAllParents, getStateEvents, isValidChild } from '$utils/room'; import { isRoomId } from '$utils/matrix'; -import { SortFunc, byOrderKey, byTsOldToNew, factoryRoomIdByActivity } from '$utils/sort'; +import { type SortFunc, byOrderKey, byTsOldToNew, factoryRoomIdByActivity } from '$utils/sort'; import { useMatrixClient } from './useMatrixClient'; import { useStateEventCallback } from './useStateEventCallback'; import { ErrorCode } from '../cs-errorcode'; diff --git a/src/app/hooks/useSpecVersions.ts b/src/app/hooks/useSpecVersions.ts index 42403c61c..20d17c98a 100644 --- a/src/app/hooks/useSpecVersions.ts +++ b/src/app/hooks/useSpecVersions.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { SpecVersions } from '../cs-api'; +import { type SpecVersions } from '../cs-api'; const SpecVersionsContext = createContext(null); diff --git a/src/app/hooks/useSpoilerClickHandler.ts b/src/app/hooks/useSpoilerClickHandler.ts index b21011880..b92a788b7 100644 --- a/src/app/hooks/useSpoilerClickHandler.ts +++ b/src/app/hooks/useSpoilerClickHandler.ts @@ -1,4 +1,4 @@ -import { ReactEventHandler, useCallback } from 'react'; +import { type ReactEventHandler, useCallback } from 'react'; export const useSpoilerClickHandler = (): ReactEventHandler => { const handleClick: ReactEventHandler = useCallback((evt) => { diff --git a/src/app/hooks/useStateEvent.ts b/src/app/hooks/useStateEvent.ts index ba99eff51..f50b8f28c 100644 --- a/src/app/hooks/useStateEvent.ts +++ b/src/app/hooks/useStateEvent.ts @@ -1,6 +1,6 @@ -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; -import { StateEvent } from '$types/matrix/room'; +import { type StateEvent } from '$types/matrix/room'; import { getStateEvent } from '$utils/room'; import { useStateEventCallback } from './useStateEventCallback'; import { useForceUpdate } from './useForceUpdate'; diff --git a/src/app/hooks/useStateEventCallback.ts b/src/app/hooks/useStateEventCallback.ts index 512378c3e..031af47aa 100644 --- a/src/app/hooks/useStateEventCallback.ts +++ b/src/app/hooks/useStateEventCallback.ts @@ -1,4 +1,9 @@ -import { MatrixClient, MatrixEvent, RoomState, RoomStateEvent } from '$types/matrix-sdk'; +import { + type MatrixClient, + type MatrixEvent, + type RoomState, + RoomStateEvent, +} from '$types/matrix-sdk'; import { useEffect } from 'react'; export type StateEventCallback = ( diff --git a/src/app/hooks/useSyncState.ts b/src/app/hooks/useSyncState.ts index d7763050d..d8ee3c89b 100644 --- a/src/app/hooks/useSyncState.ts +++ b/src/app/hooks/useSyncState.ts @@ -1,4 +1,4 @@ -import { ClientEvent, ClientEventHandlerMap, MatrixClient } from '$types/matrix-sdk'; +import { ClientEvent, type ClientEventHandlerMap, type MatrixClient } from '$types/matrix-sdk'; import { useEffect } from 'react'; export const useSyncState = ( diff --git a/src/app/hooks/useTextAreaCodeEditor.ts b/src/app/hooks/useTextAreaCodeEditor.ts index ff44e934e..c8c673782 100644 --- a/src/app/hooks/useTextAreaCodeEditor.ts +++ b/src/app/hooks/useTextAreaCodeEditor.ts @@ -1,7 +1,7 @@ -import { useMemo, useCallback, KeyboardEventHandler, MutableRefObject } from 'react'; +import { useMemo, useCallback, type KeyboardEventHandler, type MutableRefObject } from 'react'; import { isKeyHotkey } from 'is-hotkey'; import { TextArea, Intent, TextAreaOperations, Cursor } from '$plugins/text-area'; -import { GetTarget } from '$plugins/text-area/type'; +import { type GetTarget } from '$plugins/text-area/type'; import { useTextAreaIntentHandler } from './useTextAreaIntent'; export const useTextAreaCodeEditor = ( diff --git a/src/app/hooks/useTextAreaIntent.ts b/src/app/hooks/useTextAreaIntent.ts index e3e355145..4acf7d68f 100644 --- a/src/app/hooks/useTextAreaIntent.ts +++ b/src/app/hooks/useTextAreaIntent.ts @@ -1,6 +1,6 @@ import { isKeyHotkey } from 'is-hotkey'; -import { KeyboardEventHandler, useCallback } from 'react'; -import { Cursor, Intent, Operations, TextArea } from '$plugins/text-area'; +import { type KeyboardEventHandler, useCallback } from 'react'; +import { Cursor, type Intent, type Operations, type TextArea } from '$plugins/text-area'; export const useTextAreaIntentHandler = ( textArea: TextArea, diff --git a/src/app/hooks/useThrottle.ts b/src/app/hooks/useThrottle.ts index 12b249f29..3d2875fd4 100644 --- a/src/app/hooks/useThrottle.ts +++ b/src/app/hooks/useThrottle.ts @@ -1,9 +1,9 @@ import { useCallback, useRef } from 'react'; -export interface ThrottleOptions { +export type ThrottleOptions = { wait?: number; immediate?: boolean; -} +}; export type ThrottleCallback = (...args: T) => void; diff --git a/src/app/hooks/useTypingStatusUpdater.ts b/src/app/hooks/useTypingStatusUpdater.ts index 9bbda0900..b1ccaee1b 100644 --- a/src/app/hooks/useTypingStatusUpdater.ts +++ b/src/app/hooks/useTypingStatusUpdater.ts @@ -1,4 +1,4 @@ -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useMemo, useRef } from 'react'; import { TYPING_TIMEOUT_MS } from '$state/typingMembers'; diff --git a/src/app/hooks/useUIAFlows.ts b/src/app/hooks/useUIAFlows.ts index f7e04f2e3..d2f94d956 100644 --- a/src/app/hooks/useUIAFlows.ts +++ b/src/app/hooks/useUIAFlows.ts @@ -1,4 +1,4 @@ -import { AuthType, IAuthData, MatrixError, UIAFlow } from '$types/matrix-sdk'; +import { AuthType, type IAuthData, type MatrixError, type UIAFlow } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; import { getSupportedUIAFlows, diff --git a/src/app/hooks/useUserPresence.ts b/src/app/hooks/useUserPresence.ts index f1b858422..3541b205f 100644 --- a/src/app/hooks/useUserPresence.ts +++ b/src/app/hooks/useUserPresence.ts @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from 'react'; -import { User, UserEvent, UserEventHandlerMap } from '$types/matrix-sdk'; +import { type User, UserEvent, type UserEventHandlerMap } from '$types/matrix-sdk'; import { useMatrixClient } from './useMatrixClient'; export enum Presence { diff --git a/src/app/hooks/useUserProfile.ts b/src/app/hooks/useUserProfile.ts index 8de5da050..d8829fb8f 100644 --- a/src/app/hooks/useUserProfile.ts +++ b/src/app/hooks/useUserProfile.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; import { selectAtom } from 'jotai/utils'; -import { EventTimeline, Room } from '$types/matrix-sdk'; +import { EventTimeline, type Room } from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import colorMXID from '$utils/colorMXID'; import { profilesCacheAtom } from '$state/userRoomProfile'; diff --git a/src/app/hooks/useVerificationRequest.ts b/src/app/hooks/useVerificationRequest.ts index 38d08d859..a571a1539 100644 --- a/src/app/hooks/useVerificationRequest.ts +++ b/src/app/hooks/useVerificationRequest.ts @@ -1,14 +1,14 @@ import { useCallback, useEffect, useState } from 'react'; import { CryptoEvent, - CryptoEventHandlerMap, - VerificationPhase, - VerificationRequest, + type CryptoEventHandlerMap, + type VerificationPhase, + type VerificationRequest, VerificationRequestEvent, - VerificationRequestEventHandlerMap, - Verifier, + type VerificationRequestEventHandlerMap, + type Verifier, VerifierEvent, - VerifierEventHandlerMap, + type VerifierEventHandlerMap, } from '$types/matrix-sdk'; import { useMatrixClient } from './useMatrixClient'; diff --git a/src/app/hooks/useVirtualPaginator.ts b/src/app/hooks/useVirtualPaginator.ts index 3b5ae8700..5520b7906 100644 --- a/src/app/hooks/useVirtualPaginator.ts +++ b/src/app/hooks/useVirtualPaginator.ts @@ -5,7 +5,7 @@ import { isInScrollView, isIntersectingScrollView, } from '$utils/dom'; -import { OnIntersectionCallback, useIntersectionObserver } from './useIntersectionObserver'; +import { type OnIntersectionCallback, useIntersectionObserver } from './useIntersectionObserver'; const PAGINATOR_ANCHOR_ATTR = 'data-paginator-anchor'; diff --git a/src/app/i18n.ts b/src/app/i18n.ts index 9e83805d3..08750eeb7 100644 --- a/src/app/i18n.ts +++ b/src/app/i18n.ts @@ -1,6 +1,6 @@ import i18n from 'i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; -import Backend, { HttpBackendOptions } from 'i18next-http-backend'; +import Backend, { type HttpBackendOptions } from 'i18next-http-backend'; import { initReactI18next } from 'react-i18next'; import { trimTrailingSlash } from './utils/common'; diff --git a/src/app/pages/FeatureCheck.tsx b/src/app/pages/FeatureCheck.tsx index dd621c90a..64eb54981 100644 --- a/src/app/pages/FeatureCheck.tsx +++ b/src/app/pages/FeatureCheck.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect } from 'react'; +import { type ReactNode, useEffect } from 'react'; import { Box, Dialog, Text, config } from 'folds'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { checkIndexedDBSupport } from '$utils/featureCheck'; diff --git a/src/app/pages/MobileFriendly.tsx b/src/app/pages/MobileFriendly.tsx index 2fe174fe5..f49327ff2 100644 --- a/src/app/pages/MobileFriendly.tsx +++ b/src/app/pages/MobileFriendly.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useMatch } from 'react-router-dom'; import { ScreenSize, useScreenSizeContext } from '$hooks/useScreenSize'; import { DIRECT_PATH, EXPLORE_PATH, HOME_PATH, INBOX_PATH, SPACE_PATH } from './paths'; diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx index d81890da1..58671dfa5 100644 --- a/src/app/pages/Router.tsx +++ b/src/app/pages/Router.tsx @@ -8,7 +8,7 @@ import { } from 'react-router-dom'; import * as Sentry from '@sentry/react'; -import { ClientConfig } from '$hooks/useClientConfig'; +import { type ClientConfig } from '$hooks/useClientConfig'; import { ErrorPage } from '$components/DefaultErrorPage'; import { Room } from '$features/room'; import { Lobby } from '$features/lobby'; @@ -22,7 +22,7 @@ import { UserRoomProfileRenderer } from '$components/UserRoomProfileRenderer'; import { CreateRoomModalRenderer } from '$features/create-room'; import { CreateSpaceModalRenderer } from '$features/create-space'; import { BugReportModalRenderer } from '$features/bug-report'; -import { getFallbackSession, MATRIX_SESSIONS_KEY, Sessions } from '$state/sessions'; +import { getFallbackSession, MATRIX_SESSIONS_KEY, type Sessions } from '$state/sessions'; import { getLocalStorageItem } from '$state/utils/atomWithLocalStorage'; import { NotificationJumper } from '$hooks/useNotificationJumper'; import { SearchModalRenderer } from '$features/search'; diff --git a/src/app/pages/ThemeManager.tsx b/src/app/pages/ThemeManager.tsx index 90a7e5783..2510c5ff1 100644 --- a/src/app/pages/ThemeManager.tsx +++ b/src/app/pages/ThemeManager.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect } from 'react'; +import { type ReactNode, useEffect } from 'react'; import { configClass, varsClass } from 'folds'; import { DarkTheme, diff --git a/src/app/pages/auth/SSOLogin.tsx b/src/app/pages/auth/SSOLogin.tsx index eabb23602..436bf2e5c 100644 --- a/src/app/pages/auth/SSOLogin.tsx +++ b/src/app/pages/auth/SSOLogin.tsx @@ -1,5 +1,5 @@ import { Avatar, AvatarImage, Box, Button, Text } from 'folds'; -import { IIdentityProvider, SSOAction, createClient } from '$types/matrix-sdk'; +import { type IIdentityProvider, type SSOAction, createClient } from '$types/matrix-sdk'; import { useMemo } from 'react'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; diff --git a/src/app/pages/auth/ServerPicker.tsx b/src/app/pages/auth/ServerPicker.tsx index e8a4984b2..3542ee2f2 100644 --- a/src/app/pages/auth/ServerPicker.tsx +++ b/src/app/pages/auth/ServerPicker.tsx @@ -1,8 +1,8 @@ import { - ChangeEventHandler, - FocusEventHandler, - KeyboardEventHandler, - MouseEventHandler, + type ChangeEventHandler, + type FocusEventHandler, + type KeyboardEventHandler, + type MouseEventHandler, useEffect, useRef, useState, @@ -16,7 +16,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, config, } from 'folds'; diff --git a/src/app/pages/auth/login/Login.tsx b/src/app/pages/auth/login/Login.tsx index fe895332b..2a2da65c9 100644 --- a/src/app/pages/auth/login/Login.tsx +++ b/src/app/pages/auth/login/Login.tsx @@ -7,7 +7,7 @@ import { useAuthServer } from '$hooks/useAuthServer'; import { useParsedLoginFlows } from '$hooks/useParsedLoginFlows'; import { getLoginPath, getRegisterPath, withSearchParam } from '$pages/pathUtils'; import { usePathWithOrigin } from '$hooks/usePathWithOrigin'; -import { LoginPathSearchParams } from '$pages/paths'; +import { type LoginPathSearchParams } from '$pages/paths'; import { useClientConfig } from '$hooks/useClientConfig'; import { SSOLogin } from '$pages/auth/SSOLogin'; import { OrDivider } from '$pages/auth/OrDivider'; diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx index 26350ac74..f6ff89d38 100644 --- a/src/app/pages/auth/login/PasswordLoginForm.tsx +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, MouseEventHandler, useCallback, useState } from 'react'; +import { type FormEventHandler, type MouseEventHandler, useCallback, useState } from 'react'; import { Box, Button, @@ -12,14 +12,14 @@ import { OverlayBackdrop, OverlayCenter, PopOut, - RectCords, + type RectCords, Spinner, Text, config, } from 'folds'; import FocusTrap from 'focus-trap-react'; import { Link } from 'react-router-dom'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { getMxIdLocalPart, getMxIdServer, isUserId } from '$utils/matrix'; import { EMAIL_REGEX } from '$utils/regex'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; @@ -32,7 +32,7 @@ import { stopPropagation } from '$utils/keyboard'; import { FieldError } from '$pages/auth/FiledError'; import { deviceDisplayName } from '$utils/user-agent'; import { - CustomLoginResponse, + type CustomLoginResponse, LoginError, factoryGetBaseUrl, login, diff --git a/src/app/pages/auth/login/TokenLogin.tsx b/src/app/pages/auth/login/TokenLogin.tsx index 77c45853b..f860f77df 100644 --- a/src/app/pages/auth/login/TokenLogin.tsx +++ b/src/app/pages/auth/login/TokenLogin.tsx @@ -11,11 +11,11 @@ import { config, } from 'folds'; import { useCallback, useEffect } from 'react'; -import { MatrixError } from '$types/matrix-sdk'; +import { type MatrixError } from '$types/matrix-sdk'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { deviceDisplayName } from '$utils/user-agent'; -import { CustomLoginResponse, LoginError, login, useLoginComplete } from './loginUtil'; +import { type CustomLoginResponse, LoginError, login, useLoginComplete } from './loginUtil'; function LoginTokenError({ message }: { message: string }) { return ( diff --git a/src/app/pages/auth/login/loginUtil.ts b/src/app/pages/auth/login/loginUtil.ts index f14641746..cdb7849e5 100644 --- a/src/app/pages/auth/login/loginUtil.ts +++ b/src/app/pages/auth/login/loginUtil.ts @@ -1,10 +1,15 @@ import to from 'await-to-js'; -import { createClient, LoginRequest, LoginResponse, MatrixError } from '$types/matrix-sdk'; +import { + createClient, + type LoginRequest, + type LoginResponse, + MatrixError, +} from '$types/matrix-sdk'; import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useSetAtom } from 'jotai'; import * as Sentry from '@sentry/react'; -import { clientAllowedServer, ClientConfig } from '$hooks/useClientConfig'; +import { clientAllowedServer, type ClientConfig } from '$hooks/useClientConfig'; import { deleteAfterLoginRedirectPath, getAfterLoginRedirectPath, diff --git a/src/app/pages/auth/register/PasswordRegisterForm.tsx b/src/app/pages/auth/register/PasswordRegisterForm.tsx index e8e991022..660a1d3f7 100644 --- a/src/app/pages/auth/register/PasswordRegisterForm.tsx +++ b/src/app/pages/auth/register/PasswordRegisterForm.tsx @@ -10,14 +10,14 @@ import { Text, color, } from 'folds'; -import { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; +import { type ChangeEventHandler, useCallback, useMemo, useState } from 'react'; import { - AuthDict, + type AuthDict, AuthType, - IAuthData, - MatrixError, - RegisterRequest, - UIAFlow, + type IAuthData, + type MatrixError, + type RegisterRequest, + type UIAFlow, createClient, } from '$types/matrix-sdk'; import { PasswordInput } from '$components/password-input'; @@ -28,7 +28,7 @@ import { requiredStageInFlows, } from '$utils/matrix-uia'; import { useUIACompleted, useUIAFlow, useUIAParams } from '$hooks/useUIAFlows'; -import { AsyncState, AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; +import { type AsyncState, AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; import { AutoDummyStageDialog, @@ -40,10 +40,10 @@ import { import { useRegisterEmail } from '$hooks/useRegisterEmail'; import { ConfirmPasswordMatch } from '$components/ConfirmPasswordMatch'; import { UIAFlowOverlay } from '$components/UIAFlowOverlay'; -import { RequestEmailTokenCallback, RequestEmailTokenResponse } from '$hooks/types'; +import { type RequestEmailTokenCallback, type RequestEmailTokenResponse } from '$hooks/types'; import { FieldError } from '$pages/auth/FiledError'; import { deviceDisplayName } from '$utils/user-agent'; -import { RegisterError, RegisterResult, register, useRegisterComplete } from './registerUtil'; +import { RegisterError, type RegisterResult, register, useRegisterComplete } from './registerUtil'; export const SUPPORTED_REGISTER_STAGES = [ AuthType.RegistrationToken, diff --git a/src/app/pages/auth/register/Register.tsx b/src/app/pages/auth/register/Register.tsx index 11bee338e..5e48cc819 100644 --- a/src/app/pages/auth/register/Register.tsx +++ b/src/app/pages/auth/register/Register.tsx @@ -8,7 +8,7 @@ import { useParsedLoginFlows } from '$hooks/useParsedLoginFlows'; import { SupportedUIAFlowsLoader } from '$components/SupportedUIAFlowsLoader'; import { getLoginPath } from '$pages/pathUtils'; import { usePathWithOrigin } from '$hooks/usePathWithOrigin'; -import { RegisterPathSearchParams } from '$pages/paths'; +import { type RegisterPathSearchParams } from '$pages/paths'; import { SSOLogin } from '$pages/auth/SSOLogin'; import { OrDivider } from '$pages/auth/OrDivider'; import { PasswordRegisterForm, SUPPORTED_REGISTER_STAGES } from './PasswordRegisterForm'; diff --git a/src/app/pages/auth/register/registerUtil.ts b/src/app/pages/auth/register/registerUtil.ts index 513aabfc0..2013312c2 100644 --- a/src/app/pages/auth/register/registerUtil.ts +++ b/src/app/pages/auth/register/registerUtil.ts @@ -1,15 +1,15 @@ import to from 'await-to-js'; import { - IAuthData, - MatrixClient, + type IAuthData, + type MatrixClient, MatrixError, - RegisterRequest, - RegisterResponse, + type RegisterRequest, + type RegisterResponse, } from '$types/matrix-sdk'; import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useSetAtom } from 'jotai'; -import { LoginPathSearchParams } from '$pages/paths'; +import { type LoginPathSearchParams } from '$pages/paths'; import { deleteAfterLoginRedirectPath, getAfterLoginRedirectPath, diff --git a/src/app/pages/auth/reset-password/PasswordResetForm.tsx b/src/app/pages/auth/reset-password/PasswordResetForm.tsx index af4c57526..8ed1d654a 100644 --- a/src/app/pages/auth/reset-password/PasswordResetForm.tsx +++ b/src/app/pages/auth/reset-password/PasswordResetForm.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; +import { type FormEventHandler, useCallback, useEffect, useMemo, useState } from 'react'; import { Box, Button, @@ -14,7 +14,7 @@ import { } from 'folds'; import { useNavigate } from 'react-router-dom'; import FocusTrap from 'focus-trap-react'; -import { AuthDict, AuthType, MatrixError, createClient } from '$types/matrix-sdk'; +import { type AuthDict, AuthType, type MatrixError, createClient } from '$types/matrix-sdk'; import { useAutoDiscoveryInfo } from '$hooks/useAutoDiscoveryInfo'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { useAuthServer } from '$hooks/useAuthServer'; @@ -24,10 +24,10 @@ import { ConfirmPasswordMatch } from '$components/ConfirmPasswordMatch'; import { UIAFlowOverlay } from '$components/UIAFlowOverlay'; import { EmailStageDialog } from '$components/uia-stages'; import { getLoginPath, withSearchParam } from '$pages/pathUtils'; -import { LoginPathSearchParams } from '$pages/paths'; +import { type LoginPathSearchParams } from '$pages/paths'; import { getUIAError, getUIAErrorCode } from '$utils/matrix-uia'; import { FieldError } from '$pages/auth/FiledError'; -import { ResetPasswordResult, resetPassword } from './resetPasswordUtil'; +import { type ResetPasswordResult, resetPassword } from './resetPasswordUtil'; type FormData = { email: string; diff --git a/src/app/pages/auth/reset-password/ResetPassword.tsx b/src/app/pages/auth/reset-password/ResetPassword.tsx index 718101fab..439e35af4 100644 --- a/src/app/pages/auth/reset-password/ResetPassword.tsx +++ b/src/app/pages/auth/reset-password/ResetPassword.tsx @@ -3,7 +3,7 @@ import { useMemo } from 'react'; import { Link, useSearchParams } from 'react-router-dom'; import { getLoginPath } from '$pages/pathUtils'; import { useAuthServer } from '$hooks/useAuthServer'; -import { ResetPasswordPathSearchParams } from '$pages/paths'; +import { type ResetPasswordPathSearchParams } from '$pages/paths'; import { PasswordResetForm } from './PasswordResetForm'; const useResetPasswordSearchParams = ( diff --git a/src/app/pages/auth/reset-password/resetPasswordUtil.ts b/src/app/pages/auth/reset-password/resetPasswordUtil.ts index 65f0c7e7c..98e0891b7 100644 --- a/src/app/pages/auth/reset-password/resetPasswordUtil.ts +++ b/src/app/pages/auth/reset-password/resetPasswordUtil.ts @@ -1,5 +1,10 @@ import to from 'await-to-js'; -import { AuthDict, IAuthData, MatrixClient, MatrixError } from '$types/matrix-sdk'; +import { + type AuthDict, + type IAuthData, + type MatrixClient, + type MatrixError, +} from '$types/matrix-sdk'; export type ResetPasswordResponse = Record; export type ResetPasswordResult = [IAuthData, undefined] | [undefined, ResetPasswordResponse]; diff --git a/src/app/pages/client/AutoDiscovery.tsx b/src/app/pages/client/AutoDiscovery.tsx index c39f16cd3..797d55248 100644 --- a/src/app/pages/client/AutoDiscovery.tsx +++ b/src/app/pages/client/AutoDiscovery.tsx @@ -1,7 +1,7 @@ -import { ReactNode, useCallback, useMemo } from 'react'; +import { type ReactNode, useCallback, useMemo } from 'react'; import { AutoDiscoveryInfoProvider } from '../../hooks/useAutoDiscoveryInfo'; import { AsyncStatus, useAsyncCallbackValue } from '../../hooks/useAsyncCallback'; -import { autoDiscovery, AutoDiscoveryInfo } from '../../cs-api'; +import { autoDiscovery, type AutoDiscoveryInfo } from '../../cs-api'; import { getMxIdServer } from '../../utils/matrix'; type AutoDiscoveryProps = { diff --git a/src/app/pages/client/BackgroundNotifications.tsx b/src/app/pages/client/BackgroundNotifications.tsx index 2d382fcc7..1220c2235 100644 --- a/src/app/pages/client/BackgroundNotifications.tsx +++ b/src/app/pages/client/BackgroundNotifications.tsx @@ -2,10 +2,10 @@ import { useEffect, useMemo, useRef } from 'react'; import { ClientEvent, createClient, - MatrixClient, - MatrixEvent, + type MatrixClient, + type MatrixEvent, MatrixEventEvent, - Room, + type Room, RoomEvent, SyncState, PushProcessor, @@ -14,7 +14,7 @@ import { useAtom, useAtomValue, useSetAtom } from 'jotai'; import { sessionsAtom, activeSessionIdAtom, - Session, + type Session, pendingNotificationAtom, backgroundUnreadCountsAtom, inAppBannerAtom, @@ -144,7 +144,7 @@ export function BackgroundNotifications() { const inactiveSessionsRef = useRef(inactiveSessions); inactiveSessionsRef.current = inactiveSessions; - interface NotifyOptions { + type NotifyOptions = { /** Title shown in the notification banner. */ title: string; /** Body text. */ @@ -162,7 +162,7 @@ export function BackgroundNotifications() { /** Optional callback invoked when the user clicks the notification (window.Notification * fallback path only; the SW path routes via its own notificationclick handler). */ onClick?: () => void; - } + }; useEffect(() => { if (!shouldRunBackgroundNotifications) { diff --git a/src/app/pages/client/ClientBindAtoms.ts b/src/app/pages/client/ClientBindAtoms.ts index aac351062..5ddfb67dc 100644 --- a/src/app/pages/client/ClientBindAtoms.ts +++ b/src/app/pages/client/ClientBindAtoms.ts @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useBindAtoms } from '$state/hooks/useBindAtoms'; diff --git a/src/app/pages/client/ClientInitStorageAtom.tsx b/src/app/pages/client/ClientInitStorageAtom.tsx index 90f6d914f..1eab6ceee 100644 --- a/src/app/pages/client/ClientInitStorageAtom.tsx +++ b/src/app/pages/client/ClientInitStorageAtom.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useMemo } from 'react'; +import { type ReactNode, useMemo } from 'react'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { makeClosedNavCategoriesAtom } from '$state/closedNavCategories'; import { ClosedNavCategoriesProvider } from '$state/hooks/closedNavCategories'; diff --git a/src/app/pages/client/ClientLayout.tsx b/src/app/pages/client/ClientLayout.tsx index 4bbd4068f..a9a97483a 100644 --- a/src/app/pages/client/ClientLayout.tsx +++ b/src/app/pages/client/ClientLayout.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box } from 'folds'; type ClientLayoutProps = { diff --git a/src/app/pages/client/ClientNonUIFeatures.tsx b/src/app/pages/client/ClientNonUIFeatures.tsx index d8228ccdd..0f4424fe8 100644 --- a/src/app/pages/client/ClientNonUIFeatures.tsx +++ b/src/app/pages/client/ClientNonUIFeatures.tsx @@ -1,13 +1,13 @@ import { useAtomValue, useSetAtom } from 'jotai'; import * as Sentry from '@sentry/react'; -import { ReactNode, useCallback, useEffect, useRef } from 'react'; +import { type ReactNode, useCallback, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { MatrixEvent, MatrixEventEvent, PushProcessor, RoomEvent, - RoomEventHandlerMap, + type RoomEventHandlerMap, SetPresence, } from '$types/matrix-sdk'; import parse from 'html-react-parser'; diff --git a/src/app/pages/client/ClientRoomsNotificationPreferences.tsx b/src/app/pages/client/ClientRoomsNotificationPreferences.tsx index c6ef04a4c..056072097 100644 --- a/src/app/pages/client/ClientRoomsNotificationPreferences.tsx +++ b/src/app/pages/client/ClientRoomsNotificationPreferences.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { RoomsNotificationPreferencesProvider, useRoomsNotificationPreferences, diff --git a/src/app/pages/client/ClientRoot.tsx b/src/app/pages/client/ClientRoot.tsx index 1a653e950..daade38e9 100644 --- a/src/app/pages/client/ClientRoot.tsx +++ b/src/app/pages/client/ClientRoot.tsx @@ -9,13 +9,20 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Spinner, Text, } from 'folds'; -import { HttpApiEvent, HttpApiEventHandlerMap, MatrixClient } from '$types/matrix-sdk'; +import { HttpApiEvent, type HttpApiEventHandlerMap, type MatrixClient } from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; -import { useRef, MouseEventHandler, ReactNode, useCallback, useEffect, useState } from 'react'; +import { + useRef, + type MouseEventHandler, + type ReactNode, + useCallback, + useEffect, + useState, +} from 'react'; import * as Sentry from '@sentry/react'; import { useNavigate } from 'react-router-dom'; import { useAtom, useAtomValue, useSetAtom } from 'jotai'; diff --git a/src/app/pages/client/SpecVersions.tsx b/src/app/pages/client/SpecVersions.tsx index 75cb3cafc..f5c16a855 100644 --- a/src/app/pages/client/SpecVersions.tsx +++ b/src/app/pages/client/SpecVersions.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { Box, Dialog, config, Text, Button, Spinner } from 'folds'; import { SpecVersionsLoader } from '$components/SpecVersionsLoader'; import { SpecVersionsProvider } from '$hooks/useSpecVersions'; diff --git a/src/app/pages/client/SyncStatus.tsx b/src/app/pages/client/SyncStatus.tsx index f55fe5e59..4c3398bda 100644 --- a/src/app/pages/client/SyncStatus.tsx +++ b/src/app/pages/client/SyncStatus.tsx @@ -1,4 +1,4 @@ -import { MatrixClient, SyncState } from '$types/matrix-sdk'; +import { type MatrixClient, SyncState } from '$types/matrix-sdk'; import { useCallback, useState } from 'react'; import { Box, config, Line, Text } from 'folds'; import * as Sentry from '@sentry/react'; diff --git a/src/app/pages/client/direct/Direct.tsx b/src/app/pages/client/direct/Direct.tsx index 43ccb6be1..67c1cdb71 100644 --- a/src/app/pages/client/direct/Direct.tsx +++ b/src/app/pages/client/direct/Direct.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, forwardRef, useEffect, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useEffect, useMemo, useRef, useState } from 'react'; import { useAtom, useAtomValue } from 'jotai'; import { Avatar, @@ -10,7 +10,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, config, toRem, diff --git a/src/app/pages/client/direct/RoomProvider.tsx b/src/app/pages/client/direct/RoomProvider.tsx index 1780fa728..5a00678aa 100644 --- a/src/app/pages/client/direct/RoomProvider.tsx +++ b/src/app/pages/client/direct/RoomProvider.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useParams } from 'react-router-dom'; import { useSelectedRoom } from '$hooks/router/useSelectedRoom'; import { IsDirectRoomProvider, RoomProvider } from '$hooks/useRoom'; diff --git a/src/app/pages/client/explore/Explore.tsx b/src/app/pages/client/explore/Explore.tsx index 9ac55e2d2..dcdb670bd 100644 --- a/src/app/pages/client/explore/Explore.tsx +++ b/src/app/pages/client/explore/Explore.tsx @@ -1,4 +1,4 @@ -import { FormEventHandler, useCallback, useRef, useState } from 'react'; +import { type FormEventHandler, useCallback, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import FocusTrap from 'focus-trap-react'; import { diff --git a/src/app/pages/client/explore/Server.tsx b/src/app/pages/client/explore/Server.tsx index 0ff06dd54..fba4a2263 100644 --- a/src/app/pages/client/explore/Server.tsx +++ b/src/app/pages/client/explore/Server.tsx @@ -1,7 +1,7 @@ import { - FormEventHandler, - MouseEventHandler, - RefObject, + type FormEventHandler, + type MouseEventHandler, + type RefObject, useCallback, useEffect, useMemo, @@ -20,7 +20,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Scroll, Spinner, Text, @@ -31,12 +31,12 @@ import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import FocusTrap from 'focus-trap-react'; import { useAtomValue } from 'jotai'; import { useQuery } from '@tanstack/react-query'; -import { MatrixClient, Method, RoomType } from '$types/matrix-sdk'; +import { type MatrixClient, Method, RoomType } from '$types/matrix-sdk'; import { Page, PageContent, PageContentCenter, PageHeader } from '$components/page'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { RoomTopicViewer } from '$components/room-topic-viewer'; import { RoomCard, RoomCardBase, RoomCardGrid } from '$components/room-card'; -import { ExploreServerPathSearchParams } from '$pages/paths'; +import { type ExploreServerPathSearchParams } from '$pages/paths'; import { getExploreServerPath, withSearchParam } from '$pages/pathUtils'; import { allRoomsAtom } from '$state/room-list/roomList'; import { useRoomNavigate } from '$hooks/useRoomNavigate'; diff --git a/src/app/pages/client/home/Home.tsx b/src/app/pages/client/home/Home.tsx index c25d99e30..8a114f07d 100644 --- a/src/app/pages/client/home/Home.tsx +++ b/src/app/pages/client/home/Home.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, forwardRef, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useMemo, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Avatar, @@ -10,7 +10,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, config, toRem, @@ -60,7 +60,7 @@ import { } from '$hooks/useRoomsNotificationPreferences'; import { UseStateProvider } from '$components/UseStateProvider'; import { JoinAddressPrompt } from '$components/join-address-prompt'; -import { RoomSearchParams } from '$pages/paths'; +import { type RoomSearchParams } from '$pages/paths'; import { useHomeRooms } from './useHomeRooms'; type HomeMenuProps = { diff --git a/src/app/pages/client/home/RoomProvider.tsx b/src/app/pages/client/home/RoomProvider.tsx index b6f7ba7e3..6d04c8c60 100644 --- a/src/app/pages/client/home/RoomProvider.tsx +++ b/src/app/pages/client/home/RoomProvider.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useParams } from 'react-router-dom'; import { useSelectedRoom } from '$hooks/router/useSelectedRoom'; import { IsDirectRoomProvider, RoomProvider } from '$hooks/useRoom'; diff --git a/src/app/pages/client/inbox/Invites.tsx b/src/app/pages/client/inbox/Invites.tsx index 8eeff6ad4..831a50238 100644 --- a/src/app/pages/client/inbox/Invites.tsx +++ b/src/app/pages/client/inbox/Invites.tsx @@ -19,7 +19,12 @@ import { } from 'folds'; import { useAtomValue } from 'jotai'; import { nicknamesAtom } from '$state/nicknames'; -import { RoomTopicEventContent, MatrixClient, MatrixError, Room } from '$types/matrix-sdk'; +import { + type RoomTopicEventContent, + type MatrixClient, + type MatrixError, + type Room, +} from '$types/matrix-sdk'; import FocusTrap from 'focus-trap-react'; import { Page, diff --git a/src/app/pages/client/inbox/Notifications.tsx b/src/app/pages/client/inbox/Notifications.tsx index 7543720d0..f1d133898 100644 --- a/src/app/pages/client/inbox/Notifications.tsx +++ b/src/app/pages/client/inbox/Notifications.tsx @@ -1,5 +1,5 @@ /* eslint-disable react/destructuring-assignment */ -import { MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Avatar, Box, @@ -15,23 +15,23 @@ import { } from 'folds'; import { useSearchParams } from 'react-router-dom'; import { - INotification, - INotificationsResponse, - IRoomEvent, + type INotification, + type INotificationsResponse, + type IRoomEvent, JoinRule, Method, RelationType, - Room, + type Room, } from '$types/matrix-sdk'; import { useVirtualizer } from '@tanstack/react-virtual'; -import { HTMLReactParserOptions } from 'html-react-parser'; -import { Opts as LinkifyOpts } from 'linkifyjs'; +import { type HTMLReactParserOptions } from 'html-react-parser'; +import { type Opts as LinkifyOpts } from 'linkifyjs'; import { useAtomValue } from 'jotai'; import { nicknamesAtom } from '$state/nicknames'; import { Page, PageContent, PageContentCenter, PageHeader } from '$components/page'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { getMxIdLocalPart, mxcUrlToHttp } from '$utils/matrix'; -import { InboxNotificationsPathSearchParams } from '$pages/paths'; +import { type InboxNotificationsPathSearchParams } from '$pages/paths'; import { AsyncStatus, useAsyncCallback } from '$hooks/useAsyncCallback'; import { SequenceCard } from '$components/sequence-card'; import { RoomAvatar, RoomIcon } from '$components/room-avatar'; @@ -68,7 +68,7 @@ import { useSetting } from '$state/hooks/settings'; import { settingsAtom } from '$state/settings'; import { Image } from '$components/media'; import { ImageViewer } from '$components/image-viewer'; -import { GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; +import { type GetContentCallback, MessageEvent, StateEvent } from '$types/matrix/room'; import { useMatrixEventRenderer } from '$hooks/useMatrixEventRenderer'; import * as customHtmlCss from '$styles/CustomHtml.css'; import { useRoomNavigate } from '$hooks/useRoomNavigate'; diff --git a/src/app/pages/client/sidebar/AccountSwitcherTab.tsx b/src/app/pages/client/sidebar/AccountSwitcherTab.tsx index 75a7d099b..74814e9ea 100644 --- a/src/app/pages/client/sidebar/AccountSwitcherTab.tsx +++ b/src/app/pages/client/sidebar/AccountSwitcherTab.tsx @@ -1,4 +1,4 @@ -import { MouseEvent, MouseEventHandler, useCallback, useState } from 'react'; +import { type MouseEvent, type MouseEventHandler, useCallback, useState } from 'react'; import { Box, Button, @@ -9,7 +9,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, config, toRem, @@ -23,7 +23,7 @@ import { useNavigate } from 'react-router-dom'; import { sessionsAtom, activeSessionIdAtom, - Session, + type Session, backgroundUnreadCountsAtom, } from '$state/sessions'; import { diff --git a/src/app/pages/client/sidebar/CreateTab.tsx b/src/app/pages/client/sidebar/CreateTab.tsx index 0d93621a9..bc579520d 100644 --- a/src/app/pages/client/sidebar/CreateTab.tsx +++ b/src/app/pages/client/sidebar/CreateTab.tsx @@ -1,5 +1,5 @@ -import { MouseEventHandler, useState } from 'react'; -import { Box, config, Icon, Icons, Menu, PopOut, RectCords, Text } from 'folds'; +import { type MouseEventHandler, useState } from 'react'; +import { Box, config, Icon, Icons, Menu, PopOut, type RectCords, Text } from 'folds'; import FocusTrap from 'focus-trap-react'; import { useNavigate } from 'react-router-dom'; import { SidebarAvatar, SidebarItem, SidebarItemTooltip } from '$components/sidebar'; @@ -15,7 +15,7 @@ import { } from '$pages/pathUtils'; import { useCreateSelected } from '$hooks/router/useCreateSelected'; import { JoinAddressPrompt } from '$components/join-address-prompt'; -import { RoomSearchParams } from '$pages/paths'; +import { type RoomSearchParams } from '$pages/paths'; export function CreateTab() { const createSelected = useCreateSelected(); diff --git a/src/app/pages/client/sidebar/DirectDMsList.tsx b/src/app/pages/client/sidebar/DirectDMsList.tsx index 0c01c57d7..f787f4488 100644 --- a/src/app/pages/client/sidebar/DirectDMsList.tsx +++ b/src/app/pages/client/sidebar/DirectDMsList.tsx @@ -3,7 +3,7 @@ import * as Sentry from '@sentry/react'; import { useNavigate } from 'react-router-dom'; import { Avatar, Text, Box, toRem } from 'folds'; import { useAtomValue } from 'jotai'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { roomToUnreadAtom } from '$state/room/roomToUnread'; import { getDirectRoomPath } from '$pages/pathUtils'; diff --git a/src/app/pages/client/sidebar/DirectTab.tsx b/src/app/pages/client/sidebar/DirectTab.tsx index a1ff6ff58..cff07ddf8 100644 --- a/src/app/pages/client/sidebar/DirectTab.tsx +++ b/src/app/pages/client/sidebar/DirectTab.tsx @@ -1,6 +1,17 @@ -import { MouseEventHandler, forwardRef, useMemo, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds'; +import { + Box, + Icon, + Icons, + Menu, + MenuItem, + PopOut, + type RectCords, + Text, + config, + toRem, +} from 'folds'; import FocusTrap from 'focus-trap-react'; import { useAtomValue } from 'jotai'; import { useDirects } from '$state/hooks/roomList'; diff --git a/src/app/pages/client/sidebar/HomeTab.tsx b/src/app/pages/client/sidebar/HomeTab.tsx index 7401e4233..08d99b51a 100644 --- a/src/app/pages/client/sidebar/HomeTab.tsx +++ b/src/app/pages/client/sidebar/HomeTab.tsx @@ -1,6 +1,17 @@ -import { MouseEventHandler, forwardRef, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Box, Icon, Icons, Menu, MenuItem, PopOut, RectCords, Text, config, toRem } from 'folds'; +import { + Box, + Icon, + Icons, + Menu, + MenuItem, + PopOut, + type RectCords, + Text, + config, + toRem, +} from 'folds'; import { useAtomValue } from 'jotai'; import FocusTrap from 'focus-trap-react'; import { useOrphanRooms } from '$state/hooks/roomList'; diff --git a/src/app/pages/client/sidebar/SpaceTabs.tsx b/src/app/pages/client/sidebar/SpaceTabs.tsx index c751f00cb..0570645f9 100644 --- a/src/app/pages/client/sidebar/SpaceTabs.tsx +++ b/src/app/pages/client/sidebar/SpaceTabs.tsx @@ -1,7 +1,7 @@ import { - MouseEventHandler, - ReactNode, - RefObject, + type MouseEventHandler, + type ReactNode, + type RefObject, forwardRef, useCallback, useEffect, @@ -19,13 +19,13 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Text, config, toRem, } from 'folds'; import { useAtom, useAtomValue } from 'jotai'; -import { Room } from '$types/matrix-sdk'; +import { type Room } from '$types/matrix-sdk'; import { draggable, dropTargetForElements, @@ -34,7 +34,7 @@ import { import { attachInstruction, extractInstruction, - Instruction, + type Instruction, } from '@atlaskit/pragmatic-drag-and-drop-hitbox/tree-item'; import { autoScrollForElements } from '@atlaskit/pragmatic-drag-and-drop-auto-scroll/element'; import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'; @@ -65,9 +65,9 @@ import { getCanonicalAliasOrRoomId, isRoomAlias } from '$utils/matrix'; import { RoomAvatar } from '$components/room-avatar'; import { nameInitials, randomStr } from '$utils/common'; import { - ISidebarFolder, - SidebarItems, - TSidebarItem, + type ISidebarFolder, + type SidebarItems, + type TSidebarItem, makeCinnySpacesContent, parseSidebar, sidebarItemWithout, diff --git a/src/app/pages/client/space/RoomProvider.tsx b/src/app/pages/client/space/RoomProvider.tsx index 411efc163..26df3f26e 100644 --- a/src/app/pages/client/space/RoomProvider.tsx +++ b/src/app/pages/client/space/RoomProvider.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useParams } from 'react-router-dom'; import { useAtom, useAtomValue } from 'jotai'; import { useSelectedRoom } from '$hooks/router/useSelectedRoom'; diff --git a/src/app/pages/client/space/Space.tsx b/src/app/pages/client/space/Space.tsx index aae2f2d7b..0e4cf52bf 100644 --- a/src/app/pages/client/space/Space.tsx +++ b/src/app/pages/client/space/Space.tsx @@ -1,4 +1,4 @@ -import { MouseEventHandler, forwardRef, useCallback, useMemo, useRef, useState } from 'react'; +import { type MouseEventHandler, forwardRef, useCallback, useMemo, useRef, useState } from 'react'; import { useAtom, useAtomValue } from 'jotai'; import { Avatar, @@ -11,7 +11,7 @@ import { Menu, MenuItem, PopOut, - RectCords, + type RectCords, Spinner, Text, color, @@ -21,7 +21,7 @@ import { import { useVirtualizer } from '@tanstack/react-virtual'; import FocusTrap from 'focus-trap-react'; import { useNavigate } from 'react-router-dom'; -import { JoinRule, Room, RoomJoinRulesEventContent } from '$types/matrix-sdk'; +import { JoinRule, type Room, type RoomJoinRulesEventContent } from '$types/matrix-sdk'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { mDirectAtom } from '$state/mDirectList'; import { NavCategory, NavCategoryHeader, NavItem, NavItemContent, NavLink } from '$components/nav'; diff --git a/src/app/pages/client/space/SpaceProvider.tsx b/src/app/pages/client/space/SpaceProvider.tsx index cc2eb5bde..16ec9c199 100644 --- a/src/app/pages/client/space/SpaceProvider.tsx +++ b/src/app/pages/client/space/SpaceProvider.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { useParams } from 'react-router-dom'; import { useMatrixClient } from '$hooks/useMatrixClient'; import { useSpaces } from '$state/hooks/roomList'; diff --git a/src/app/pages/pathSearchParam.ts b/src/app/pages/pathSearchParam.ts index 813abc3d9..9bfedc3ea 100644 --- a/src/app/pages/pathSearchParam.ts +++ b/src/app/pages/pathSearchParam.ts @@ -1,4 +1,4 @@ -import { RoomSearchParams, DirectCreateSearchParams } from './paths'; +import { type RoomSearchParams, type DirectCreateSearchParams } from './paths'; type SearchParamsGetter = (searchParams: URLSearchParams) => T; diff --git a/src/app/pages/pathUtils.ts b/src/app/pages/pathUtils.ts index 3872c9290..778becc83 100644 --- a/src/app/pages/pathUtils.ts +++ b/src/app/pages/pathUtils.ts @@ -1,6 +1,6 @@ -import { generatePath, Path } from 'react-router-dom'; +import { generatePath, type Path } from 'react-router-dom'; import { trimLeadingSlash, trimTrailingSlash } from '$utils/common'; -import { HashRouterConfig } from '$hooks/useClientConfig'; +import { type HashRouterConfig } from '$hooks/useClientConfig'; import { DIRECT_CREATE_PATH, DIRECT_PATH, diff --git a/src/app/plugins/call/CallControl.ts b/src/app/plugins/call/CallControl.ts index c30ffc1c7..84c571cc1 100644 --- a/src/app/plugins/call/CallControl.ts +++ b/src/app/plugins/call/CallControl.ts @@ -1,7 +1,11 @@ -import { ClientWidgetApi } from 'matrix-widget-api'; +import { type ClientWidgetApi } from 'matrix-widget-api'; import EventEmitter from 'eventemitter3'; import { CallControlState } from './CallControlState'; -import { ElementMediaStateDetail, ElementMediaStatePayload, ElementWidgetActions } from './types'; +import { + type ElementMediaStateDetail, + type ElementMediaStatePayload, + ElementWidgetActions, +} from './types'; export enum CallControlEvent { StateUpdate = 'state_update', diff --git a/src/app/plugins/call/CallEmbed.ts b/src/app/plugins/call/CallEmbed.ts index 734cf1626..7de795d5a 100644 --- a/src/app/plugins/call/CallEmbed.ts +++ b/src/app/plugins/call/CallEmbed.ts @@ -1,28 +1,28 @@ import { ClientEvent, KnownMembership, - MatrixClient, - MatrixEvent, + type MatrixClient, + type MatrixEvent, MatrixEventEvent, - Room, + type Room, RoomStateEvent, } from 'matrix-js-sdk'; import { ClientWidgetApi, type IWidgetApiRequest, - IRoomEvent, - IWidget, + type IRoomEvent, + type IWidget, Widget, WidgetApiFromWidgetAction, WidgetApiToWidgetAction, - WidgetDriver, + type WidgetDriver, } from 'matrix-widget-api'; import { CallWidgetDriver } from './CallWidgetDriver'; import { trimTrailingSlash } from '../../utils/common'; import { ElementCallIntent, - ElementCallThemeKind, - ElementMediaStateDetail, + type ElementCallThemeKind, + type ElementMediaStateDetail, ElementWidgetActions, } from './types'; import { CallControl } from './CallControl'; diff --git a/src/app/plugins/call/CallWidgetDriver.ts b/src/app/plugins/call/CallWidgetDriver.ts index 6d94891f8..a53a7dca6 100644 --- a/src/app/plugins/call/CallWidgetDriver.ts +++ b/src/app/plugins/call/CallWidgetDriver.ts @@ -10,8 +10,8 @@ import { type IGetMediaConfigResult, UpdateDelayedEventAction, OpenIDRequestState, - SimpleObservable, - IOpenIDUpdate, + type SimpleObservable, + type IOpenIDUpdate, } from 'matrix-widget-api'; import { EventType, @@ -22,7 +22,7 @@ import { type SendDelayedEventResponse, type StateEvents, type TimelineEvents, - MatrixClient, + type MatrixClient, } from 'matrix-js-sdk'; import { getCallCapabilities } from './utils'; import { downloadMedia, mxcUrlToHttp } from '../../utils/matrix'; diff --git a/src/app/plugins/call/hooks.ts b/src/app/plugins/call/hooks.ts index f5b3ff933..25cf04f39 100644 --- a/src/app/plugins/call/hooks.ts +++ b/src/app/plugins/call/hooks.ts @@ -1,11 +1,11 @@ import { - ClientWidgetApi, - IWidgetApiAcknowledgeResponseData, - IWidgetApiRequestData, + type ClientWidgetApi, + type IWidgetApiAcknowledgeResponseData, + type IWidgetApiRequestData, } from 'matrix-widget-api'; import { useCallback, useEffect, useState } from 'react'; -import { CallControl, CallControlEvent } from './CallControl'; -import { CallControlState } from './CallControlState'; +import { type CallControl, CallControlEvent } from './CallControl'; +import { type CallControlState } from './CallControlState'; export const useClientWidgetApiEvent = ( api: ClientWidgetApi | undefined, diff --git a/src/app/plugins/custom-emoji/ImagePack.ts b/src/app/plugins/custom-emoji/ImagePack.ts index d7aa9941a..127b558ba 100644 --- a/src/app/plugins/custom-emoji/ImagePack.ts +++ b/src/app/plugins/custom-emoji/ImagePack.ts @@ -1,9 +1,9 @@ -import { MatrixEvent } from '$types/matrix-sdk'; +import { type MatrixEvent } from '$types/matrix-sdk'; import { PackAddress } from './PackAddress'; -import { PackImageReader } from './PackImageReader'; +import { type PackImageReader } from './PackImageReader'; import { PackImagesReader } from './PackImagesReader'; import { PackMetaReader } from './PackMetaReader'; -import { ImageUsage, PackContent } from './types'; +import { ImageUsage, type PackContent } from './types'; export class ImagePack { public readonly id: string; diff --git a/src/app/plugins/custom-emoji/PackImageReader.ts b/src/app/plugins/custom-emoji/PackImageReader.ts index 51e5114f2..0b083fcef 100644 --- a/src/app/plugins/custom-emoji/PackImageReader.ts +++ b/src/app/plugins/custom-emoji/PackImageReader.ts @@ -1,5 +1,5 @@ -import { IImageInfo } from '$types/matrix/common'; -import { ImageUsage, PackImage } from './types'; +import { type IImageInfo } from '$types/matrix/common'; +import { ImageUsage, type PackImage } from './types'; export class PackImageReader { public readonly shortcode: string; diff --git a/src/app/plugins/custom-emoji/PackImagesReader.ts b/src/app/plugins/custom-emoji/PackImagesReader.ts index 1531218ae..a75657d10 100644 --- a/src/app/plugins/custom-emoji/PackImagesReader.ts +++ b/src/app/plugins/custom-emoji/PackImagesReader.ts @@ -1,5 +1,5 @@ import { PackImageReader } from './PackImageReader'; -import { PackImages } from './types'; +import { type PackImages } from './types'; export class PackImagesReader { private readonly rawImages: PackImages; diff --git a/src/app/plugins/custom-emoji/PackMetaReader.ts b/src/app/plugins/custom-emoji/PackMetaReader.ts index 537addf46..5153e2deb 100644 --- a/src/app/plugins/custom-emoji/PackMetaReader.ts +++ b/src/app/plugins/custom-emoji/PackMetaReader.ts @@ -1,4 +1,4 @@ -import { PackMeta, ImageUsage } from './types'; +import { type PackMeta, ImageUsage } from './types'; export class PackMetaReader { private readonly meta: PackMeta; diff --git a/src/app/plugins/custom-emoji/imagePackCache.ts b/src/app/plugins/custom-emoji/imagePackCache.ts index f15f1fba0..3773d00f0 100644 --- a/src/app/plugins/custom-emoji/imagePackCache.ts +++ b/src/app/plugins/custom-emoji/imagePackCache.ts @@ -15,7 +15,7 @@ import { PackAddress } from './PackAddress'; import { ImagePack } from './ImagePack'; -import { PackContent, PackImages } from './types'; +import { type PackContent, type PackImages } from './types'; // -------------------------------------------------------------------------- // Types stored in localStorage diff --git a/src/app/plugins/custom-emoji/types.ts b/src/app/plugins/custom-emoji/types.ts index 8794beda5..8d84f4c37 100644 --- a/src/app/plugins/custom-emoji/types.ts +++ b/src/app/plugins/custom-emoji/types.ts @@ -1,4 +1,4 @@ -import { IImageInfo } from '$types/matrix/common'; +import { type IImageInfo } from '$types/matrix/common'; // https://github.com/Sorunome/matrix-doc/blob/soru/emotes/proposals/2545-emotes.md diff --git a/src/app/plugins/custom-emoji/utils.ts b/src/app/plugins/custom-emoji/utils.ts index 4b35cad19..7e7f3d04b 100644 --- a/src/app/plugins/custom-emoji/utils.ts +++ b/src/app/plugins/custom-emoji/utils.ts @@ -1,11 +1,11 @@ -import { MatrixClient, MatrixEvent, Room } from '$types/matrix-sdk'; +import { type MatrixClient, type MatrixEvent, type Room } from '$types/matrix-sdk'; import { StateEvent } from '$types/matrix/room'; import { getAccountData, getStateEvent, getStateEvents } from '$utils/room'; import { AccountDataEvent } from '$types/matrix/accountData'; -import { ImageUsage } from './types'; +import { type ImageUsage } from './types'; import { ImagePack } from './ImagePack'; -import { PackMetaReader } from './PackMetaReader'; -import { PackAddress } from './PackAddress'; +import { type PackMetaReader } from './PackMetaReader'; +import { type PackAddress } from './PackAddress'; export function packAddressEqual(a1?: PackAddress, a2?: PackAddress): boolean { if (!a1 && !a2) return true; diff --git a/src/app/plugins/emoji.ts b/src/app/plugins/emoji.ts index 2462b7ffe..d75491b38 100644 --- a/src/app/plugins/emoji.ts +++ b/src/app/plugins/emoji.ts @@ -1,4 +1,4 @@ -import { CompactEmoji, fromUnicodeToHexcode } from 'emojibase'; +import { type CompactEmoji, fromUnicodeToHexcode } from 'emojibase'; import emojisData from 'emojibase-data/en/compact.json'; import joypixels from 'emojibase-data/en/shortcodes/joypixels.json'; import emojibase from 'emojibase-data/en/shortcodes/emojibase.json'; diff --git a/src/app/plugins/markdown/block/parser.ts b/src/app/plugins/markdown/block/parser.ts index b56d3e3b6..75b457df5 100644 --- a/src/app/plugins/markdown/block/parser.ts +++ b/src/app/plugins/markdown/block/parser.ts @@ -10,7 +10,7 @@ import { HorizontalRuleRule, } from './rules'; import { runBlockRule } from './runner'; -import { BlockMDParser } from './type'; +import { type BlockMDParser } from './type'; /** * Parses block-level markdown text into HTML using defined block rules. diff --git a/src/app/plugins/markdown/block/rules.ts b/src/app/plugins/markdown/block/rules.ts index a5bfe2635..38d3d3f82 100644 --- a/src/app/plugins/markdown/block/rules.ts +++ b/src/app/plugins/markdown/block/rules.ts @@ -1,4 +1,4 @@ -import { BlockMDRule } from './type'; +import { type BlockMDRule } from './type'; const HEADING_REG_1 = /^(#{1,6}) +(.+)\n?/m; export const HeadingRule: BlockMDRule = { diff --git a/src/app/plugins/markdown/block/runner.ts b/src/app/plugins/markdown/block/runner.ts index 8e80c95ff..a151ab5d0 100644 --- a/src/app/plugins/markdown/block/runner.ts +++ b/src/app/plugins/markdown/block/runner.ts @@ -1,5 +1,5 @@ import { replaceMatch } from '$plugins/markdown/internal'; -import { BlockMDParser, BlockMDRule } from './type'; +import { type BlockMDParser, type BlockMDRule } from './type'; /** * Parses block-level markdown text into HTML using defined block rules. diff --git a/src/app/plugins/markdown/block/type.ts b/src/app/plugins/markdown/block/type.ts index 9462e1d50..8bebe6f2c 100644 --- a/src/app/plugins/markdown/block/type.ts +++ b/src/app/plugins/markdown/block/type.ts @@ -1,4 +1,4 @@ -import { MatchResult, MatchRule } from '$plugins/markdown/internal'; +import { type MatchResult, type MatchRule } from '$plugins/markdown/internal'; /** * Type for a function that parses block-level markdown into HTML. diff --git a/src/app/plugins/markdown/inline/parser.ts b/src/app/plugins/markdown/inline/parser.ts index 37c71a661..f8ded2459 100644 --- a/src/app/plugins/markdown/inline/parser.ts +++ b/src/app/plugins/markdown/inline/parser.ts @@ -10,7 +10,7 @@ import { UnderlineRule, } from './rules'; import { runInlineRule, runInlineRules } from './runner'; -import { InlineMDParser } from './type'; +import { type InlineMDParser } from './type'; const LeveledRules = [ BoldRule, diff --git a/src/app/plugins/markdown/inline/rules.ts b/src/app/plugins/markdown/inline/rules.ts index 77bcbd57a..fae82a458 100644 --- a/src/app/plugins/markdown/inline/rules.ts +++ b/src/app/plugins/markdown/inline/rules.ts @@ -1,4 +1,4 @@ -import { InlineMDRule } from './type'; +import { type InlineMDRule } from './type'; const MIN_ANY = '(.+?)'; const URL_NEG_LB = '(?): string => millifyPlugin(count, { diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx index 12a869263..603ab7e98 100644 --- a/src/app/plugins/react-custom-html-parser.tsx +++ b/src/app/plugins/react-custom-html-parser.tsx @@ -1,9 +1,9 @@ /* eslint-disable jsx-a11y/alt-text */ import { - ComponentPropsWithoutRef, + type ComponentPropsWithoutRef, lazy, - ReactEventHandler, - ReactNode, + type ReactEventHandler, + type ReactNode, Suspense, useMemo, useState, @@ -12,16 +12,16 @@ import { attributesToProps, domToReact, Element, - HTMLReactParserOptions, + type HTMLReactParserOptions, Text as DOMText, } from 'html-react-parser'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import classNames from 'classnames'; import { Box, Chip, config, Header, Icon, IconButton, Icons, Scroll, Text, toRem } from 'folds'; -import { IntermediateRepresentation, OptFn, Opts as LinkifyOpts } from 'linkifyjs'; +import { type IntermediateRepresentation, type OptFn, type Opts as LinkifyOpts } from 'linkifyjs'; import Linkify from 'linkify-react'; import { ErrorBoundary } from 'react-error-boundary'; -import { ChildNode } from 'domhandler'; +import { type ChildNode } from 'domhandler'; import * as css from '$styles/CustomHtml.css'; import { getCanonicalAliasRoomId, @@ -30,7 +30,7 @@ import { mxcUrlToHttp, } from '$utils/matrix'; import { getMemberDisplayName } from '$utils/room'; -import { Nicknames } from '$state/nicknames'; +import { type Nicknames } from '$state/nicknames'; import { EMOJI_PATTERN, sanitizeForRegex, URL_NEG_LB } from '$utils/regex'; import { findAndReplace } from '$utils/findAndReplace'; import { onEnterOrSpace } from '$utils/keyboard'; diff --git a/src/app/plugins/react-prism/ReactPrism.tsx b/src/app/plugins/react-prism/ReactPrism.tsx index 1d3bb90fa..eda47e2ff 100644 --- a/src/app/plugins/react-prism/ReactPrism.tsx +++ b/src/app/plugins/react-prism/ReactPrism.tsx @@ -1,4 +1,4 @@ -import { MutableRefObject, ReactNode, useEffect, useRef } from 'react'; +import { type MutableRefObject, type ReactNode, useEffect, useRef } from 'react'; import Prism from 'prismjs'; diff --git a/src/app/plugins/recent-emoji.ts b/src/app/plugins/recent-emoji.ts index ca7b25cc1..0b6d9bed2 100644 --- a/src/app/plugins/recent-emoji.ts +++ b/src/app/plugins/recent-emoji.ts @@ -1,7 +1,7 @@ -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { AccountDataEvent } from '$types/matrix/accountData'; import { getAccountData } from '$utils/room'; -import { IEmoji, emojis } from './emoji'; +import { type IEmoji, emojis } from './emoji'; type EmojiUnicode = string; type EmojiUsageCount = number; diff --git a/src/app/plugins/text-area/Operations.ts b/src/app/plugins/text-area/Operations.ts index a4c813ad6..2630eefdf 100644 --- a/src/app/plugins/text-area/Operations.ts +++ b/src/app/plugins/text-area/Operations.ts @@ -1,7 +1,7 @@ -import { Cursor } from './Cursor'; +import { type Cursor } from './Cursor'; -export interface Operations { +export type Operations = { select(cursor: Cursor): void; deselect(cursor: Cursor): void; insert(cursor: Cursor, text: string): Cursor; -} +}; diff --git a/src/app/plugins/text-area/TextArea.ts b/src/app/plugins/text-area/TextArea.ts index 2e8a08553..ad4e072a0 100644 --- a/src/app/plugins/text-area/TextArea.ts +++ b/src/app/plugins/text-area/TextArea.ts @@ -1,5 +1,5 @@ import { Cursor } from './Cursor'; -import { GetTarget } from './type'; +import { type GetTarget } from './type'; export class TextArea { private readonly getTarget: GetTarget; diff --git a/src/app/plugins/text-area/TextAreaOperations.ts b/src/app/plugins/text-area/TextAreaOperations.ts index 3bc1b4f8d..511c5184b 100644 --- a/src/app/plugins/text-area/TextAreaOperations.ts +++ b/src/app/plugins/text-area/TextAreaOperations.ts @@ -1,6 +1,6 @@ import { Cursor } from './Cursor'; -import { Operations } from './Operations'; -import { GetTarget } from './type'; +import { type Operations } from './Operations'; +import { type GetTarget } from './type'; export class TextAreaOperations implements Operations { private readonly getTarget: GetTarget; diff --git a/src/app/plugins/text-area/mods/Intent.ts b/src/app/plugins/text-area/mods/Intent.ts index 9ad8533d7..c7519327c 100644 --- a/src/app/plugins/text-area/mods/Intent.ts +++ b/src/app/plugins/text-area/mods/Intent.ts @@ -1,6 +1,6 @@ import { Cursor } from '$plugins/text-area/Cursor'; -import { Operations } from '$plugins/text-area/Operations'; -import { TextArea } from '$plugins/text-area/TextArea'; +import { type Operations } from '$plugins/text-area/Operations'; +import { type TextArea } from '$plugins/text-area/TextArea'; export class Intent { public readonly textArea: TextArea; diff --git a/src/app/plugins/utils.ts b/src/app/plugins/utils.ts index fc84b3921..c227a7e02 100644 --- a/src/app/plugins/utils.ts +++ b/src/app/plugins/utils.ts @@ -1,6 +1,6 @@ -import { SearchItemStrGetter } from '$hooks/useAsyncSearch'; +import { type SearchItemStrGetter } from '$hooks/useAsyncSearch'; import { PackImageReader } from './custom-emoji'; -import { IEmoji } from './emoji'; +import { type IEmoji } from './emoji'; export const getEmoticonSearchStr: SearchItemStrGetter = (item) => { const shortcode = `:${item.shortcode}:`; diff --git a/src/app/plugins/via-servers.ts b/src/app/plugins/via-servers.ts index e789e5f8f..8e7c44c3b 100644 --- a/src/app/plugins/via-servers.ts +++ b/src/app/plugins/via-servers.ts @@ -1,6 +1,6 @@ -import { Room } from '$types/matrix-sdk'; -import { IRoomCreateContent, StateEvent } from '$types/matrix/room'; -import { IPowerLevels } from '$hooks/usePowerLevels'; +import { type Room } from '$types/matrix-sdk'; +import { type IRoomCreateContent, StateEvent } from '$types/matrix/room'; +import { type IPowerLevels } from '$hooks/usePowerLevels'; import { creatorsSupported, getMxIdServer } from '$utils/matrix'; import { getStateEvent } from '$utils/room'; diff --git a/src/app/state/backupRestore.ts b/src/app/state/backupRestore.ts index 9c1c11479..223a8e0fc 100644 --- a/src/app/state/backupRestore.ts +++ b/src/app/state/backupRestore.ts @@ -1,5 +1,5 @@ import { atom } from 'jotai'; -import { ImportRoomKeyProgressData, ImportRoomKeyStage } from '$types/matrix-sdk'; +import { type ImportRoomKeyProgressData, ImportRoomKeyStage } from '$types/matrix-sdk'; export enum BackupProgressStatus { Idle, diff --git a/src/app/state/callEmbed.ts b/src/app/state/callEmbed.ts index b05055c43..126520122 100644 --- a/src/app/state/callEmbed.ts +++ b/src/app/state/callEmbed.ts @@ -1,6 +1,6 @@ import { atom } from 'jotai'; import * as Sentry from '@sentry/react'; -import { CallEmbed } from '../plugins/call'; +import { type CallEmbed } from '../plugins/call'; const baseCallEmbedAtom = atom(undefined); diff --git a/src/app/state/callPreferences.ts b/src/app/state/callPreferences.ts index a8e82067f..541f610c3 100644 --- a/src/app/state/callPreferences.ts +++ b/src/app/state/callPreferences.ts @@ -1,4 +1,4 @@ -import { WritableAtom } from 'jotai'; +import { type WritableAtom } from 'jotai'; import { atomWithLocalStorage, getLocalStorageItem, diff --git a/src/app/state/closedLobbyCategories.ts b/src/app/state/closedLobbyCategories.ts index 9d4d5d175..3a009b40d 100644 --- a/src/app/state/closedLobbyCategories.ts +++ b/src/app/state/closedLobbyCategories.ts @@ -1,4 +1,4 @@ -import { WritableAtom, atom } from 'jotai'; +import { type WritableAtom, atom } from 'jotai'; import { produce } from 'immer'; import { atomWithLocalStorage, diff --git a/src/app/state/closedNavCategories.ts b/src/app/state/closedNavCategories.ts index d21187f9a..ae382544a 100644 --- a/src/app/state/closedNavCategories.ts +++ b/src/app/state/closedNavCategories.ts @@ -1,4 +1,4 @@ -import { WritableAtom, atom } from 'jotai'; +import { type WritableAtom, atom } from 'jotai'; import { produce } from 'immer'; import { atomWithLocalStorage, diff --git a/src/app/state/createRoomModal.ts b/src/app/state/createRoomModal.ts index 16757ec71..d341da2bc 100644 --- a/src/app/state/createRoomModal.ts +++ b/src/app/state/createRoomModal.ts @@ -1,5 +1,5 @@ import { atom } from 'jotai'; -import { CreateRoomType } from '$components/create-room/types'; +import { type CreateRoomType } from '$components/create-room/types'; export type CreateRoomModalState = { spaceId?: string; diff --git a/src/app/state/hooks/callPreferences.ts b/src/app/state/hooks/callPreferences.ts index d02700f05..ce75555a3 100644 --- a/src/app/state/hooks/callPreferences.ts +++ b/src/app/state/hooks/callPreferences.ts @@ -1,6 +1,6 @@ import { createContext, useCallback, useContext } from 'react'; import { useAtom } from 'jotai'; -import { CallPreferences, CallPreferencesAtom } from '../callPreferences'; +import { type CallPreferences, type CallPreferencesAtom } from '../callPreferences'; const CallPreferencesAtomContext = createContext(null); export const CallPreferencesProvider = CallPreferencesAtomContext.Provider; diff --git a/src/app/state/hooks/closedLobbyCategories.ts b/src/app/state/hooks/closedLobbyCategories.ts index 19843b6e6..eed808009 100644 --- a/src/app/state/hooks/closedLobbyCategories.ts +++ b/src/app/state/hooks/closedLobbyCategories.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { ClosedLobbyCategoriesAtom } from '$state/closedLobbyCategories'; +import { type ClosedLobbyCategoriesAtom } from '$state/closedLobbyCategories'; const ClosedLobbyCategoriesAtomContext = createContext(null); export const ClosedLobbyCategoriesProvider = ClosedLobbyCategoriesAtomContext.Provider; diff --git a/src/app/state/hooks/closedNavCategories.ts b/src/app/state/hooks/closedNavCategories.ts index 38a962e48..ee95e19b6 100644 --- a/src/app/state/hooks/closedNavCategories.ts +++ b/src/app/state/hooks/closedNavCategories.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { ClosedNavCategoriesAtom } from '$state/closedNavCategories'; +import { type ClosedNavCategoriesAtom } from '$state/closedNavCategories'; const ClosedNavCategoriesAtomContext = createContext(null); export const ClosedNavCategoriesProvider = ClosedNavCategoriesAtomContext.Provider; diff --git a/src/app/state/hooks/createRoomModal.ts b/src/app/state/hooks/createRoomModal.ts index 8c1ec8b70..cb7f076b9 100644 --- a/src/app/state/hooks/createRoomModal.ts +++ b/src/app/state/hooks/createRoomModal.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; -import { CreateRoomType } from '$components/create-room/types'; -import { createRoomModalAtom, CreateRoomModalState } from '$state/createRoomModal'; +import { type CreateRoomType } from '$components/create-room/types'; +import { createRoomModalAtom, type CreateRoomModalState } from '$state/createRoomModal'; export const useCreateRoomModalState = (): CreateRoomModalState | undefined => { const data = useAtomValue(createRoomModalAtom); diff --git a/src/app/state/hooks/createSpaceModal.ts b/src/app/state/hooks/createSpaceModal.ts index 4661712d0..7edf1a0e1 100644 --- a/src/app/state/hooks/createSpaceModal.ts +++ b/src/app/state/hooks/createSpaceModal.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; -import { createSpaceModalAtom, CreateSpaceModalState } from '$state/createSpaceModal'; +import { createSpaceModalAtom, type CreateSpaceModalState } from '$state/createSpaceModal'; export const useCreateSpaceModalState = (): CreateSpaceModalState | undefined => { const data = useAtomValue(createSpaceModalAtom); diff --git a/src/app/state/hooks/navToActivePath.ts b/src/app/state/hooks/navToActivePath.ts index 412247600..cdd22253c 100644 --- a/src/app/state/hooks/navToActivePath.ts +++ b/src/app/state/hooks/navToActivePath.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { NavToActivePathAtom } from '$state/navToActivePath'; +import { type NavToActivePathAtom } from '$state/navToActivePath'; const NavToActivePathAtomContext = createContext(null); export const NavToActivePathProvider = NavToActivePathAtomContext.Provider; diff --git a/src/app/state/hooks/openedSidebarFolder.ts b/src/app/state/hooks/openedSidebarFolder.ts index 6a5e61f92..1d8f32339 100644 --- a/src/app/state/hooks/openedSidebarFolder.ts +++ b/src/app/state/hooks/openedSidebarFolder.ts @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react'; -import { OpenedSidebarFolderAtom } from '$state/openedSidebarFolder'; +import { type OpenedSidebarFolderAtom } from '$state/openedSidebarFolder'; const OpenedSidebarFolderAtomContext = createContext(null); export const OpenedSidebarFolderProvider = OpenedSidebarFolderAtomContext.Provider; diff --git a/src/app/state/hooks/roomList.ts b/src/app/state/hooks/roomList.ts index 708909266..7de175f6a 100644 --- a/src/app/state/hooks/roomList.ts +++ b/src/app/state/hooks/roomList.ts @@ -1,9 +1,9 @@ -import { Atom, useAtomValue } from 'jotai'; +import { type Atom, useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useCallback, useMemo } from 'react'; import { getAllParents, isRoom, isSpace, isUnsupportedRoom } from '$utils/room'; -import { RoomToParents } from '$types/matrix/room'; +import { type RoomToParents } from '$types/matrix/room'; import { compareRoomsEqual } from '$state/room-list/utils'; export type RoomsAtom = Atom; diff --git a/src/app/state/hooks/roomSettings.ts b/src/app/state/hooks/roomSettings.ts index 8a0784870..f53b29f93 100644 --- a/src/app/state/hooks/roomSettings.ts +++ b/src/app/state/hooks/roomSettings.ts @@ -1,6 +1,10 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; -import { roomSettingsAtom, RoomSettingsPage, RoomSettingsState } from '$state/roomSettings'; +import { + roomSettingsAtom, + type RoomSettingsPage, + type RoomSettingsState, +} from '$state/roomSettings'; export const useRoomSettingsState = (): RoomSettingsState | undefined => { const data = useAtomValue(roomSettingsAtom); diff --git a/src/app/state/hooks/settings.ts b/src/app/state/hooks/settings.ts index d28c48336..2f49f98fd 100644 --- a/src/app/state/hooks/settings.ts +++ b/src/app/state/hooks/settings.ts @@ -1,7 +1,7 @@ import { atom, useAtomValue, useSetAtom } from 'jotai'; import { selectAtom } from 'jotai/utils'; import { useMemo } from 'react'; -import { Settings, settingsAtom as sAtom } from '$state/settings'; +import { type Settings, type settingsAtom as sAtom } from '$state/settings'; export type SettingSetter = | Settings[K] diff --git a/src/app/state/hooks/spaceSettings.ts b/src/app/state/hooks/spaceSettings.ts index ab3b8da20..e5672efc6 100644 --- a/src/app/state/hooks/spaceSettings.ts +++ b/src/app/state/hooks/spaceSettings.ts @@ -1,6 +1,10 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; -import { spaceSettingsAtom, SpaceSettingsPage, SpaceSettingsState } from '$state/spaceSettings'; +import { + spaceSettingsAtom, + type SpaceSettingsPage, + type SpaceSettingsState, +} from '$state/spaceSettings'; export const useSpaceSettingsState = (): SpaceSettingsState | undefined => { const data = useAtomValue(spaceSettingsAtom); diff --git a/src/app/state/hooks/unread.ts b/src/app/state/hooks/unread.ts index ac94bb6a3..87e705a37 100644 --- a/src/app/state/hooks/unread.ts +++ b/src/app/state/hooks/unread.ts @@ -1,8 +1,8 @@ import { useCallback } from 'react'; import { useAtomValue } from 'jotai'; import { selectAtom } from 'jotai/utils'; -import { RoomToUnread, Unread } from '$types/matrix/room'; -import { roomToUnreadAtom, unreadEqual } from '$state/room/roomToUnread'; +import { type RoomToUnread, type Unread } from '$types/matrix/room'; +import { type roomToUnreadAtom, unreadEqual } from '$state/room/roomToUnread'; const compareUnreadEqual = (u1?: Unread, u2?: Unread): boolean => { if (!u1 || !u2) return false; diff --git a/src/app/state/hooks/useBindAtoms.ts b/src/app/state/hooks/useBindAtoms.ts index 1d68295d0..6c1d602ed 100644 --- a/src/app/state/hooks/useBindAtoms.ts +++ b/src/app/state/hooks/useBindAtoms.ts @@ -1,4 +1,4 @@ -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { allInvitesAtom, useBindAllInvitesAtom } from '$state/room-list/inviteList'; import { allRoomsAtom, useBindAllRoomsAtom } from '$state/room-list/roomList'; import { mDirectAtom, useBindMDirectAtom } from '$state/mDirectList'; diff --git a/src/app/state/hooks/userRoomProfile.ts b/src/app/state/hooks/userRoomProfile.ts index c0e8edcb6..fe8a2df00 100644 --- a/src/app/state/hooks/userRoomProfile.ts +++ b/src/app/state/hooks/userRoomProfile.ts @@ -1,8 +1,8 @@ import { useCallback } from 'react'; import { useAtomValue, useSetAtom } from 'jotai'; -import { Position, RectCords } from 'folds'; -import { UserProfile } from '$hooks/useUserProfile'; -import { userRoomProfileAtom, UserRoomProfileState } from '$state/userRoomProfile'; +import { type Position, type RectCords } from 'folds'; +import { type UserProfile } from '$hooks/useUserProfile'; +import { userRoomProfileAtom, type UserRoomProfileState } from '$state/userRoomProfile'; export const useUserRoomProfileState = (): UserRoomProfileState | undefined => { const data = useAtomValue(userRoomProfileAtom); diff --git a/src/app/state/mDirectList.ts b/src/app/state/mDirectList.ts index 89b3721f4..a80b085b2 100644 --- a/src/app/state/mDirectList.ts +++ b/src/app/state/mDirectList.ts @@ -1,5 +1,5 @@ import { atom, useSetAtom } from 'jotai'; -import { ClientEvent, MatrixClient, MatrixEvent } from '$types/matrix-sdk'; +import { ClientEvent, type MatrixClient, type MatrixEvent } from '$types/matrix-sdk'; import { useEffect } from 'react'; import { AccountDataEvent } from '$types/matrix/accountData'; import { getAccountData, getMDirects } from '$utils/room'; diff --git a/src/app/state/mediaVolume.ts b/src/app/state/mediaVolume.ts new file mode 100644 index 000000000..83372b04a --- /dev/null +++ b/src/app/state/mediaVolume.ts @@ -0,0 +1,21 @@ +/** + * Centralized access to the persisted media volume preference. + * + * Plain functions rather than a Jotai atom because the value is applied + * directly to DOM element refs, not read reactively in JSX. + */ + +const MEDIA_VOLUME_KEY = 'mediaVolume'; + +/** Returns the persisted volume (0–1), or undefined if never set. */ +export const getMediaVolume = (): number | undefined => { + const stored = localStorage.getItem(MEDIA_VOLUME_KEY); + if (stored === null) return undefined; + const parsed = parseFloat(stored); + return Number.isNaN(parsed) ? undefined : parsed; +}; + +/** Persist the current volume (0–1). */ +export const setMediaVolume = (volume: number): void => { + localStorage.setItem(MEDIA_VOLUME_KEY, String(volume)); +}; diff --git a/src/app/state/modal.ts b/src/app/state/modal.ts index 5b54dc637..bc027ec7d 100644 --- a/src/app/state/modal.ts +++ b/src/app/state/modal.ts @@ -1,5 +1,5 @@ import { atom } from 'jotai'; -import { MatrixEvent, Room, Relations } from '$types/matrix-sdk'; +import { type MatrixEvent, type Room, type Relations } from '$types/matrix-sdk'; export enum ModalType { Delete = 'delete', diff --git a/src/app/state/navToActivePath.ts b/src/app/state/navToActivePath.ts index affc313da..47191f177 100644 --- a/src/app/state/navToActivePath.ts +++ b/src/app/state/navToActivePath.ts @@ -1,6 +1,6 @@ -import { WritableAtom, atom } from 'jotai'; +import { type WritableAtom, atom } from 'jotai'; import { produce } from 'immer'; -import { Path } from 'react-router-dom'; +import { type Path } from 'react-router-dom'; import { atomWithLocalStorage, getLocalStorageItem, diff --git a/src/app/state/nicknames.ts b/src/app/state/nicknames.ts index ca67302a1..d55f73620 100644 --- a/src/app/state/nicknames.ts +++ b/src/app/state/nicknames.ts @@ -1,5 +1,5 @@ import { atom } from 'jotai'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { AccountDataEvent } from '$types/matrix/accountData'; export const NICKNAMES_KEY = 'sableNicknames'; diff --git a/src/app/state/openedSidebarFolder.ts b/src/app/state/openedSidebarFolder.ts index 743160d4b..837335064 100644 --- a/src/app/state/openedSidebarFolder.ts +++ b/src/app/state/openedSidebarFolder.ts @@ -1,4 +1,4 @@ -import { WritableAtom, atom } from 'jotai'; +import { type WritableAtom, atom } from 'jotai'; import { produce } from 'immer'; import { atomWithLocalStorage, diff --git a/src/app/state/room-list/inviteList.ts b/src/app/state/room-list/inviteList.ts index 4d33b3323..132856039 100644 --- a/src/app/state/room-list/inviteList.ts +++ b/src/app/state/room-list/inviteList.ts @@ -1,8 +1,8 @@ -import { atom, WritableAtom } from 'jotai'; -import { MatrixClient } from '$types/matrix-sdk'; +import { atom, type WritableAtom } from 'jotai'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useMemo } from 'react'; import { Membership } from '$types/matrix/room'; -import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; +import { type RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); export const allInvitesAtom = atom( diff --git a/src/app/state/room-list/roomList.ts b/src/app/state/room-list/roomList.ts index c3437d930..5e1fce982 100644 --- a/src/app/state/room-list/roomList.ts +++ b/src/app/state/room-list/roomList.ts @@ -1,8 +1,8 @@ import { atom } from 'jotai'; -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; import { useMemo } from 'react'; import { Membership } from '$types/matrix/room'; -import { RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; +import { type RoomsAction, useBindRoomsWithMembershipsAtom } from './utils'; const baseRoomsAtom = atom([]); export const allRoomsAtom = atom( diff --git a/src/app/state/room-list/utils.ts b/src/app/state/room-list/utils.ts index 9758a1ba6..aad1ecf44 100644 --- a/src/app/state/room-list/utils.ts +++ b/src/app/state/room-list/utils.ts @@ -1,7 +1,7 @@ -import { useSetAtom, WritableAtom } from 'jotai'; -import { ClientEvent, MatrixClient, Room, RoomEvent } from '$types/matrix-sdk'; +import { useSetAtom, type WritableAtom } from 'jotai'; +import { ClientEvent, type MatrixClient, type Room, RoomEvent } from '$types/matrix-sdk'; import { useEffect } from 'react'; -import { Membership } from '$types/matrix/room'; +import { type Membership } from '$types/matrix/room'; export type RoomsAction = | { diff --git a/src/app/state/room/roomInputDrafts.ts b/src/app/state/room/roomInputDrafts.ts index 51c3cfaf5..c52979f9e 100644 --- a/src/app/state/room/roomInputDrafts.ts +++ b/src/app/state/room/roomInputDrafts.ts @@ -1,9 +1,9 @@ import { atom } from 'jotai'; import { atomFamily } from 'jotai/utils'; -import { Descendant } from 'slate'; -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; -import { IEventRelation } from '$types/matrix-sdk'; -import { TUploadContent } from '$utils/matrix'; +import { type Descendant } from 'slate'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type IEventRelation } from '$types/matrix-sdk'; +import { type TUploadContent } from '$utils/matrix'; import { createUploadAtomFamily } from '$state/upload'; import { createListAtom } from '$state/list'; diff --git a/src/app/state/room/roomToParents.ts b/src/app/state/room/roomToParents.ts index 65b0a3a36..eda09678f 100644 --- a/src/app/state/room/roomToParents.ts +++ b/src/app/state/room/roomToParents.ts @@ -2,15 +2,15 @@ import { produce } from 'immer'; import { atom, useSetAtom } from 'jotai'; import { ClientEvent, - MatrixClient, - MatrixEvent, - Room, + type MatrixClient, + type MatrixEvent, + type Room, RoomEvent, RoomStateEvent, SyncState, } from '$types/matrix-sdk'; import { useCallback, useEffect } from 'react'; -import { Membership, RoomToParents, StateEvent } from '$types/matrix/room'; +import { Membership, type RoomToParents, StateEvent } from '$types/matrix/room'; import { getRoomToParents, getSpaceChildren, diff --git a/src/app/state/room/roomToUnread.ts b/src/app/state/room/roomToUnread.ts index e70271d2c..06a4b8421 100644 --- a/src/app/state/room/roomToUnread.ts +++ b/src/app/state/room/roomToUnread.ts @@ -1,14 +1,14 @@ import { produce } from 'immer'; import { atom, useAtomValue, useSetAtom } from 'jotai'; import { - IRoomTimelineData, - MatrixClient, - MatrixEvent, - Room, + type IRoomTimelineData, + type MatrixClient, + type MatrixEvent, + type Room, RoomEvent, SyncState, - ReceiptContent, - ReceiptType, + type ReceiptContent, + type ReceiptType, EventType, ClientEvent, } from '$types/matrix-sdk'; @@ -16,9 +16,9 @@ import { useCallback, useEffect, useRef } from 'react'; import { Membership, NotificationType, - RoomToUnread, - UnreadInfo, - Unread, + type RoomToUnread, + type UnreadInfo, + type Unread, StateEvent, } from '$types/matrix/room'; import { diff --git a/src/app/state/sentryStorage.ts b/src/app/state/sentryStorage.ts new file mode 100644 index 000000000..4373a7555 --- /dev/null +++ b/src/app/state/sentryStorage.ts @@ -0,0 +1,34 @@ +/** + * Centralized access to the Sentry opt-in preference stored in localStorage. + * + * These must be plain functions (not Jotai atoms) because src/instrument.ts + * reads them synchronously at module load time, before React and Jotai mount. + * All other callers should import from here instead of using raw localStorage. + */ + +export const SENTRY_ENABLED_KEY = 'sable_sentry_enabled'; +export const SENTRY_REPLAY_ENABLED_KEY = 'sable_sentry_replay_enabled'; + +/** Returns true if the user has opted in to error reporting. */ +export const getSentryEnabled = (): boolean => localStorage.getItem(SENTRY_ENABLED_KEY) === 'true'; + +/** Returns true if the user has ever made a decision (opted in or out). */ +export const isSentryDecided = (): boolean => localStorage.getItem(SENTRY_ENABLED_KEY) !== null; + +/** Persist the user's error reporting preference. */ +export const setSentryEnabled = (enabled: boolean): void => { + localStorage.setItem(SENTRY_ENABLED_KEY, String(enabled)); +}; + +/** Returns true if the user has opted in to session replay. */ +export const getSentryReplayEnabled = (): boolean => + localStorage.getItem(SENTRY_REPLAY_ENABLED_KEY) === 'true'; + +/** Persist the user's session replay preference. */ +export const setSentryReplayEnabled = (enabled: boolean): void => { + if (enabled) { + localStorage.setItem(SENTRY_REPLAY_ENABLED_KEY, 'true'); + } else { + localStorage.removeItem(SENTRY_REPLAY_ENABLED_KEY); + } +}; diff --git a/src/app/state/sessions.ts b/src/app/state/sessions.ts index aadf20ce9..b90e2e650 100644 --- a/src/app/state/sessions.ts +++ b/src/app/state/sessions.ts @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import { type ReactNode } from 'react'; import { atom } from 'jotai'; import { createLogger } from '$utils/debug'; import { diff --git a/src/app/state/settings.ts b/src/app/state/settings.ts index e9331c62f..e5d99e834 100644 --- a/src/app/state/settings.ts +++ b/src/app/state/settings.ts @@ -23,7 +23,7 @@ export enum CaptionPosition { } export type JumboEmojiSize = 'none' | 'extraSmall' | 'small' | 'normal' | 'large' | 'extraLarge'; -export interface Settings { +export type Settings = { themeId?: string; useSystemTheme: boolean; lightThemeId?: string; @@ -100,7 +100,7 @@ export interface Settings { // furry stuff renderAnimals: boolean; -} +}; const defaultSettings: Settings = { themeId: undefined, diff --git a/src/app/state/typingMembers.ts b/src/app/state/typingMembers.ts index 9f2a357b7..1e31cab0b 100644 --- a/src/app/state/typingMembers.ts +++ b/src/app/state/typingMembers.ts @@ -1,6 +1,10 @@ import { produce } from 'immer'; import { atom, useSetAtom } from 'jotai'; -import { MatrixClient, RoomMemberEvent, RoomMemberEventHandlerMap } from '$types/matrix-sdk'; +import { + type MatrixClient, + RoomMemberEvent, + type RoomMemberEventHandlerMap, +} from '$types/matrix-sdk'; import { useEffect } from 'react'; import { useSetting } from './hooks/settings'; import { settingsAtom } from './settings'; diff --git a/src/app/state/upload.ts b/src/app/state/upload.ts index 827e4bfd4..125db34f2 100644 --- a/src/app/state/upload.ts +++ b/src/app/state/upload.ts @@ -1,9 +1,14 @@ import { atom, useAtom } from 'jotai'; import { atomFamily } from 'jotai/utils'; -import { MatrixClient, UploadResponse, UploadProgress, MatrixError } from '$types/matrix-sdk'; +import { + type MatrixClient, + type UploadResponse, + type UploadProgress, + type MatrixError, +} from '$types/matrix-sdk'; import { useCallback } from 'react'; import { useThrottle } from '$hooks/useThrottle'; -import { uploadContent, TUploadContent } from '$utils/matrix'; +import { uploadContent, type TUploadContent } from '$utils/matrix'; export enum UploadStatus { Idle = 'idle', diff --git a/src/app/state/userRoomProfile.ts b/src/app/state/userRoomProfile.ts index 04540fcd2..1ed20a3a0 100644 --- a/src/app/state/userRoomProfile.ts +++ b/src/app/state/userRoomProfile.ts @@ -1,4 +1,4 @@ -import { Position, RectCords } from 'folds'; +import { type Position, type RectCords } from 'folds'; import { atom } from 'jotai'; import type { UserProfile } from '$hooks/useUserProfile'; diff --git a/src/app/styles/ContainerColor.css.ts b/src/app/styles/ContainerColor.css.ts index cefc5256a..2f8310751 100644 --- a/src/app/styles/ContainerColor.css.ts +++ b/src/app/styles/ContainerColor.css.ts @@ -1,6 +1,6 @@ -import { ComplexStyleRule } from '@vanilla-extract/css'; -import { RecipeVariants, recipe } from '@vanilla-extract/recipes'; -import { ContainerColor as TContainerColor, DefaultReset, color, config } from 'folds'; +import { type ComplexStyleRule } from '@vanilla-extract/css'; +import { type RecipeVariants, recipe } from '@vanilla-extract/recipes'; +import { type ContainerColor as TContainerColor, DefaultReset, color, config } from 'folds'; const getVariant = (variant: TContainerColor): ComplexStyleRule => ({ vars: { diff --git a/src/app/utils/addStickerToDefaultStickerPack.ts b/src/app/utils/addStickerToDefaultStickerPack.ts index a9715a05f..d0d40d8b0 100644 --- a/src/app/utils/addStickerToDefaultStickerPack.ts +++ b/src/app/utils/addStickerToDefaultStickerPack.ts @@ -1,7 +1,7 @@ -import { PackContent, ImageUsage } from '$plugins/custom-emoji'; +import { type PackContent, ImageUsage } from '$plugins/custom-emoji'; import { AccountDataEvent } from '$types/matrix/accountData'; -import { IImageInfo } from '$types/matrix/common'; -import { MatrixClient } from 'matrix-js-sdk'; +import { type IImageInfo } from '$types/matrix/common'; +import { type MatrixClient } from 'matrix-js-sdk'; // Utility function to add a sticker to the default sticker pack // For now this only works for unencrypted stickers diff --git a/src/app/utils/colorMXID.ts b/src/app/utils/colorMXID.ts index c94a19d48..3c512d99f 100644 --- a/src/app/utils/colorMXID.ts +++ b/src/app/utils/colorMXID.ts @@ -9,7 +9,7 @@ function hashCode(str?: string): number { const chr = str.codePointAt(i) ?? 0; // eslint-disable-next-line no-bitwise hash = (hash << 5) - hash + chr; - // eslint-disable-next-line no-bitwise + hash = Math.trunc(hash); } return Math.abs(hash); diff --git a/src/app/utils/common.ts b/src/app/utils/common.ts index fb1e0b16b..8a7fd79a5 100644 --- a/src/app/utils/common.ts +++ b/src/app/utils/common.ts @@ -1,4 +1,4 @@ -import { IconName, IconSrc } from 'folds'; +import { type IconName, type IconSrc } from 'folds'; export const bytesToSize = (bytes: number): string => { const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']; diff --git a/src/app/utils/debugLogger.ts b/src/app/utils/debugLogger.ts index 1e1c7e74b..0926f31fd 100644 --- a/src/app/utils/debugLogger.ts +++ b/src/app/utils/debugLogger.ts @@ -20,14 +20,14 @@ export type LogCategory = | 'error' | 'general'; -export interface LogEntry { +export type LogEntry = { timestamp: number; level: LogLevel; category: LogCategory; namespace: string; message: string; data?: unknown; -} +}; type LogListener = (entry: LogEntry) => void; diff --git a/src/app/utils/delayedEvents.ts b/src/app/utils/delayedEvents.ts index 488c51d1c..e893a3f27 100644 --- a/src/app/utils/delayedEvents.ts +++ b/src/app/utils/delayedEvents.ts @@ -1,17 +1,18 @@ import { EventType, - IContent, - MatrixClient, + type IContent, + type MatrixClient, MatrixEvent, - Room, + type Room, UpdateDelayedEventAction, + type DelayedEventInfo, + type SendDelayedEventResponse, } from '$types/matrix-sdk'; -import type { DelayedEventInfo, SendDelayedEventResponse } from '$types/matrix-sdk'; // Grab types needed for encryption -interface EncryptableBackend { +type EncryptableBackend = { encryptEvent(event: MatrixEvent, room: Room): Promise; -} +}; export async function supportsDelayedEvents(mx: MatrixClient): Promise { try { diff --git a/src/app/utils/keyboard.ts b/src/app/utils/keyboard.ts index ad0463dd1..861d60156 100644 --- a/src/app/utils/keyboard.ts +++ b/src/app/utils/keyboard.ts @@ -1,7 +1,7 @@ import { isKeyHotkey } from 'is-hotkey'; -import { KeyboardEventHandler } from 'react'; +import { type KeyboardEventHandler } from 'react'; -export interface KeyboardEventLike { +export type KeyboardEventLike = { key: string; which: number; altKey: boolean; @@ -9,7 +9,7 @@ export interface KeyboardEventLike { metaKey: boolean; shiftKey: boolean; preventDefault(): void; -} +}; export const onTabPress = (evt: KeyboardEventLike, callback: () => void) => { if (isKeyHotkey('tab', evt)) { diff --git a/src/app/utils/matrix-crypto.ts b/src/app/utils/matrix-crypto.ts index 144a51dfe..da69e01cc 100644 --- a/src/app/utils/matrix-crypto.ts +++ b/src/app/utils/matrix-crypto.ts @@ -1,4 +1,4 @@ -import { CryptoApi } from '$types/matrix-sdk'; +import { type CryptoApi } from '$types/matrix-sdk'; export const verifiedDevice = async ( api: CryptoApi, diff --git a/src/app/utils/matrix-uia.ts b/src/app/utils/matrix-uia.ts index 4fc10e448..6a6af369f 100644 --- a/src/app/utils/matrix-uia.ts +++ b/src/app/utils/matrix-uia.ts @@ -1,4 +1,4 @@ -import { AuthType, IAuthData, UIAFlow } from '$types/matrix-sdk'; +import { AuthType, type IAuthData, type UIAFlow } from '$types/matrix-sdk'; export const getSupportedUIAFlows = (uiaFlows: UIAFlow[], supportedStages: string[]): UIAFlow[] => { const supportedUIAFlows = uiaFlows.filter((flow) => diff --git a/src/app/utils/matrix.ts b/src/app/utils/matrix.ts index f04f71d90..f7562ce29 100644 --- a/src/app/utils/matrix.ts +++ b/src/app/utils/matrix.ts @@ -1,21 +1,21 @@ import { - EncryptedAttachmentInfo, + type EncryptedAttachmentInfo, decryptAttachment, encryptAttachment, } from 'browser-encrypt-attachment'; import { EventTimeline, - EventTimelineSet, - MatrixClient, + type EventTimelineSet, + type MatrixClient, MatrixError, - MatrixEvent, - Room, - RoomMember, - UploadProgress, - UploadResponse, + type MatrixEvent, + type Room, + type RoomMember, + type UploadProgress, + type UploadResponse, } from '$types/matrix-sdk'; import to from 'await-to-js'; -import { IImageInfo, IThumbnailContent, IVideoInfo } from '$types/matrix/common'; +import { type IImageInfo, type IThumbnailContent, type IVideoInfo } from '$types/matrix/common'; import { AccountDataEvent } from '$types/matrix/accountData'; import { Membership, MessageEvent, StateEvent } from '$types/matrix/room'; import * as Sentry from '@sentry/react'; diff --git a/src/app/utils/notifications.ts b/src/app/utils/notifications.ts index a6d47b7a8..2454b4f32 100644 --- a/src/app/utils/notifications.ts +++ b/src/app/utils/notifications.ts @@ -1,4 +1,4 @@ -import { MatrixClient, ReceiptType } from '$types/matrix-sdk'; +import { type MatrixClient, ReceiptType } from '$types/matrix-sdk'; export async function markAsRead(mx: MatrixClient, roomId: string, privateReceipt: boolean) { const room = mx.getRoom(roomId); diff --git a/src/app/utils/room.ts b/src/app/utils/room.ts index 34fb527d8..4cc6a1af7 100644 --- a/src/app/utils/room.ts +++ b/src/app/utils/room.ts @@ -1,34 +1,34 @@ -import { IconName, IconSrc } from 'folds'; +import { type IconName, type IconSrc } from 'folds'; import { EventTimeline, - EventTimelineSet, + type EventTimelineSet, EventType, - IMentions, - IPowerLevelsContent, - IPushRule, - IPushRules, + type IMentions, + type IPowerLevelsContent, + type IPushRule, + type IPushRules, JoinRule, - MatrixClient, - MatrixEvent, + type MatrixClient, + type MatrixEvent, NotificationCountType, PushProcessor, RelationType, - Room, - RoomMember, - CryptoBackend, + type Room, + type RoomMember, + type CryptoBackend, MsgType, } from '$types/matrix-sdk'; -import { AccountDataEvent } from '$types/matrix/accountData'; +import { type AccountDataEvent } from '$types/matrix/accountData'; import { - IRoomCreateContent, + type IRoomCreateContent, Membership, NotificationType, - RoomToParents, + type RoomToParents, RoomType, MessageEvent, StateEvent, - UnreadInfo, + type UnreadInfo, } from '$types/matrix/room'; import * as Sentry from '@sentry/react'; diff --git a/src/app/utils/sanitize.ts b/src/app/utils/sanitize.ts index e862fa9f3..524357f45 100644 --- a/src/app/utils/sanitize.ts +++ b/src/app/utils/sanitize.ts @@ -1,4 +1,4 @@ -import sanitizeHtml, { Transformer } from 'sanitize-html'; +import sanitizeHtml, { type Transformer } from 'sanitize-html'; const MAX_TAG_NESTING = 100; diff --git a/src/app/utils/sendFeedbackToUser.ts b/src/app/utils/sendFeedbackToUser.ts index c1fa7ab42..8f44b53b3 100644 --- a/src/app/utils/sendFeedbackToUser.ts +++ b/src/app/utils/sendFeedbackToUser.ts @@ -1,4 +1,4 @@ -import { MatrixEvent, Room } from 'matrix-js-sdk'; +import { MatrixEvent, type Room } from 'matrix-js-sdk'; export function sendFeedback(msg: string, room: Room, userId: string) { const localNotice = new MatrixEvent({ diff --git a/src/app/utils/sort.ts b/src/app/utils/sort.ts index 2f99e757a..42e12801e 100644 --- a/src/app/utils/sort.ts +++ b/src/app/utils/sort.ts @@ -1,4 +1,4 @@ -import { MatrixClient } from '$types/matrix-sdk'; +import { type MatrixClient } from '$types/matrix-sdk'; export type SortFunc = (a: T, b: T) => number; diff --git a/src/client/initMatrix.ts b/src/client/initMatrix.ts index 18809c5d2..67dc1ee43 100644 --- a/src/client/initMatrix.ts +++ b/src/client/initMatrix.ts @@ -1,18 +1,18 @@ import { ClientEvent, createClient, - MatrixClient, + type MatrixClient, IndexedDBStore, IndexedDBCryptoStore, SyncState, - ISyncStateData, + type ISyncStateData, } from '$types/matrix-sdk'; import { clearNavToActivePathStore } from '$state/navToActivePath'; import { - Session, - Sessions, - SessionStoreName, + type Session, + type Sessions, + type SessionStoreName, getSessionStoreName, MATRIX_SESSIONS_KEY, } from '$state/sessions'; @@ -22,7 +22,11 @@ import { createDebugLogger } from '$utils/debugLogger'; import * as Sentry from '@sentry/react'; import { pushSessionToSW } from '../sw-session'; import { cryptoCallbacks } from './secretStorageKeys'; -import { SlidingSyncConfig, SlidingSyncDiagnostics, SlidingSyncManager } from './slidingSync'; +import { + type SlidingSyncConfig, + type SlidingSyncDiagnostics, + SlidingSyncManager, +} from './slidingSync'; const log = createLogger('initMatrix'); const debugLog = createDebugLogger('initMatrix'); diff --git a/src/client/slidingSync.ts b/src/client/slidingSync.ts index a644bc2d9..3d2ac7c24 100644 --- a/src/client/slidingSync.ts +++ b/src/client/slidingSync.ts @@ -1,12 +1,12 @@ /* eslint-disable max-classes-per-file */ import { ClientEvent, - Extension, + type Extension, ExtensionState, - MatrixClient, - MSC3575List, - MSC3575RoomData, - MSC3575RoomSubscription, + type MatrixClient, + type MSC3575List, + type MSC3575RoomData, + type MSC3575RoomSubscription, MSC3575_WILDCARD, SlidingSync, SlidingSyncEvent, diff --git a/src/ext.d.ts b/src/ext.d.ts index 7ee0a20a8..ae4aad74b 100644 --- a/src/ext.d.ts +++ b/src/ext.d.ts @@ -5,7 +5,7 @@ declare const BUILD_HASH: string; declare const IS_RELEASE_TAG: boolean; declare module 'browser-encrypt-attachment' { - export interface EncryptedAttachmentInfo { + export type EncryptedAttachmentInfo = { v: string; key: { alg: string; @@ -16,12 +16,12 @@ declare module 'browser-encrypt-attachment' { }; iv: string; hashes: Record; - } + }; - export interface EncryptedAttachment { + export type EncryptedAttachment = { data: ArrayBuffer; info: EncryptedAttachmentInfo; - } + }; export function encryptAttachment(dataBuffer: ArrayBuffer): Promise; diff --git a/src/index.tsx b/src/index.tsx index 1cd63692c..9525c1c6e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -21,7 +21,7 @@ import { pushSessionToSW } from './sw-session'; import { getFallbackSession, MATRIX_SESSIONS_KEY, - Sessions, + type Sessions, ACTIVE_SESSION_KEY, } from './app/state/sessions'; import { createLogger } from './app/utils/debug'; diff --git a/src/instrument.ts b/src/instrument.ts index 3c6346b1d..8a9b6f9fb 100644 --- a/src/instrument.ts +++ b/src/instrument.ts @@ -15,6 +15,7 @@ import { matchRoutes, } from 'react-router-dom'; import { scrubMatrixIds, scrubDataObject, scrubMatrixUrl } from './app/utils/sentryScrubbers'; +import { getSentryEnabled, getSentryReplayEnabled } from './app/state/sentryStorage'; const dsn = import.meta.env.VITE_SENTRY_DSN; const environment = import.meta.env.VITE_SENTRY_ENVIRONMENT || import.meta.env.MODE; @@ -25,8 +26,8 @@ let sessionErrorCount = 0; const SESSION_ERROR_LIMIT = 50; // Default off: Sentry only runs when the user has opted in via the banner or Settings. -const sentryEnabled = localStorage.getItem('sable_sentry_enabled') === 'true'; -const replayEnabled = localStorage.getItem('sable_sentry_replay_enabled') === 'true'; +const sentryEnabled = getSentryEnabled(); +const replayEnabled = getSentryReplayEnabled(); // Only initialize if DSN is provided and user hasn't opted out if (dsn && sentryEnabled) { diff --git a/src/types/matrix-sdk-events.d.ts b/src/types/matrix-sdk-events.d.ts index 532170e08..1b9b190fe 100644 --- a/src/types/matrix-sdk-events.d.ts +++ b/src/types/matrix-sdk-events.d.ts @@ -3,16 +3,16 @@ import type { IRecentEmojiContent } from '$plugins/recent-emoji'; import type { InCinnySpacesContent } from '$hooks/useSidebarItems'; declare module 'matrix-js-sdk/lib/@types/event' { - interface StateEvents { + type StateEvents = { 'im.ponies.room_emotes': PackContent; 'in.cinny.room.power_level_tags': Record; - } + }; - interface AccountDataEvents { + type AccountDataEvents = { 'in.cinny.spaces': InCinnySpacesContent; 'io.element.recent_emoji': IRecentEmojiContent; 'im.ponies.user_emotes': PackContent; 'im.ponies.emote_rooms': EmoteRoomsContent; 'moe.sable.app.nicknames': Record; - } + }; } diff --git a/src/types/matrix/common.ts b/src/types/matrix/common.ts index 8cc96d7d6..d7c3b0f76 100644 --- a/src/types/matrix/common.ts +++ b/src/types/matrix/common.ts @@ -1,5 +1,5 @@ -import { EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; -import { MsgType } from '$types/matrix-sdk'; +import { type EncryptedAttachmentInfo } from 'browser-encrypt-attachment'; +import { type MsgType } from '$types/matrix-sdk'; export const MATRIX_BLUR_HASH_PROPERTY_NAME = 'xyz.amorgan.blurhash'; export const MATRIX_SPOILER_PROPERTY_NAME = 'page.codeberg.everypizza.msc4193.spoiler'; diff --git a/src/types/matrix/room.ts b/src/types/matrix/room.ts index a429aaf70..c003d6442 100644 --- a/src/types/matrix/room.ts +++ b/src/types/matrix/room.ts @@ -1,4 +1,4 @@ -import { IImageInfo } from './common'; +import { type IImageInfo } from './common'; export enum Membership { Invite = 'invite', From 746b872299752444085d49f32054393cfbefb737 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 11:59:31 -0400 Subject: [PATCH 3/8] chore: add changeset for code quality PR --- .changeset/chore-code-quality-enforcement.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chore-code-quality-enforcement.md diff --git a/.changeset/chore-code-quality-enforcement.md b/.changeset/chore-code-quality-enforcement.md new file mode 100644 index 000000000..39b8c218c --- /dev/null +++ b/.changeset/chore-code-quality-enforcement.md @@ -0,0 +1,5 @@ +--- +default: patch +--- + +Add pre-commit lint hooks, ESLint type-import rules, and a code quality guide. From b94d9992b7b8acb63761c26363cc0f4e8f42b21a Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 12:19:09 -0400 Subject: [PATCH 4/8] fix: restore interface/import for module augmentation in .d.ts files 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. --- src/app/components/editor/slate.d.ts | 14 +++++++++----- src/types/matrix-sdk-events.d.ts | 10 ++++++---- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/app/components/editor/slate.d.ts b/src/app/components/editor/slate.d.ts index 09ef3a8a0..fb64186fe 100644 --- a/src/app/components/editor/slate.d.ts +++ b/src/app/components/editor/slate.d.ts @@ -1,6 +1,9 @@ -import { type BaseEditor } from 'slate'; -import { type ReactEditor } from 'slate-react'; -import { type HistoryEditor } from 'slate-history'; +// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- required for declare module augmentation +import { BaseEditor } from 'slate'; +// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- required for declare module augmentation +import { ReactEditor } from 'slate-react'; +// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- required for declare module augmentation +import { HistoryEditor } from 'slate-history'; import { type BlockType } from './types'; export type HeadingLevel = 1 | 2 | 3; @@ -115,9 +118,10 @@ export type CustomElement = | HorizontalRuleElement; declare module 'slate' { - type CustomTypes = { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- interface required for declaration merging in module augmentation + interface CustomTypes { Editor: Editor; Element: CustomElement; Text: FormattedText & Text; - }; + } } diff --git a/src/types/matrix-sdk-events.d.ts b/src/types/matrix-sdk-events.d.ts index 1b9b190fe..fdcbfeb90 100644 --- a/src/types/matrix-sdk-events.d.ts +++ b/src/types/matrix-sdk-events.d.ts @@ -3,16 +3,18 @@ import type { IRecentEmojiContent } from '$plugins/recent-emoji'; import type { InCinnySpacesContent } from '$hooks/useSidebarItems'; declare module 'matrix-js-sdk/lib/@types/event' { - type StateEvents = { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- interface required for declaration merging in module augmentation + interface StateEvents { 'im.ponies.room_emotes': PackContent; 'in.cinny.room.power_level_tags': Record; - }; + } - type AccountDataEvents = { + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- interface required for declaration merging in module augmentation + interface AccountDataEvents { 'in.cinny.spaces': InCinnySpacesContent; 'io.element.recent_emoji': IRecentEmojiContent; 'im.ponies.user_emotes': PackContent; 'im.ponies.emote_rooms': EmoteRoomsContent; 'moe.sable.app.nicknames': Record; - }; + } } From b4766e08a59c4050fe204c0682fd6d3924234113 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 12:28:39 -0400 Subject: [PATCH 5/8] feat: enforce coverage thresholds and flag logic changes without tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- .github/workflows/quality-checks.yml | 74 ++++++++++++++++++++++++++++ vitest.config.ts | 9 +++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml index a9ac43708..5b091c007 100644 --- a/.github/workflows/quality-checks.yml +++ b/.github/workflows/quality-checks.yml @@ -97,6 +97,80 @@ jobs: - name: Run tests run: pnpm run test:run + coverage: + name: Coverage thresholds + runs-on: ubuntu-latest + if: github.head_ref != 'release' + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Setup app + uses: ./.github/actions/setup + + - name: Run tests with coverage + run: pnpm run test:run --coverage + + missing-tests: + name: Check for missing tests + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' && github.head_ref != 'release' + permissions: + contents: read + pull-requests: write + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + fetch-depth: 0 + + - name: Check changed logic files for missing tests + id: check + run: | + BASE=${{ github.event.pull_request.base.sha }} + HEAD=${{ github.event.pull_request.head.sha }} + changed=$(git diff --name-only "$BASE" "$HEAD" -- 'src/**/*.ts' 'src/**/*.tsx' \ + | grep -v '\.test\.' | grep -v '\.spec\.' | grep -v '\.d\.ts' \ + | grep -v 'src/index\.tsx' | grep -v 'src/sw' | grep -v 'src/instrument' \ + | grep -v 'src/test/' || true) + missing="" + for f in $changed; do + base="${f%.*}" + if ! ls "${base}.test."* "${base}.spec."* 2>/dev/null | grep -q .; then + missing="$missing\n- $f" + fi + done + if [ -n "$missing" ]; then + echo "missing=true" >> $GITHUB_OUTPUT + printf 'files<> $GITHUB_OUTPUT + fi + + - name: Comment on PR + if: steps.check.outputs.missing == 'true' + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const files = `${{ steps.check.outputs.files }}`; + const body = [ + '## ⚠️ 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.', + '', + files, + ].join('\n'); + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + build: name: Build runs-on: ubuntu-latest diff --git a/vitest.config.ts b/vitest.config.ts index fedea1151..feddfeb5d 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -45,7 +45,14 @@ export default defineConfig({ 'src/test/**', 'src/**/*.test.{ts,tsx}', 'src/**/*.spec.{ts,tsx}', - ], + ], // Baseline locked at current coverage. Raise these thresholds as test + // coverage improves — never lower them. + thresholds: { + statements: 1.5, + branches: 1, + functions: 1.5, + lines: 1.5, + }, }, }, }); From c68653cff2c197d4f36828706c598fc2d9e10187 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 13:09:17 -0400 Subject: [PATCH 6/8] refactor: replace vite resolve.alias with vite-tsconfig-paths --- package.json | 10 ++++++++-- pnpm-lock.yaml | 32 ++++++++++++++++++++++++++++++++ vite.config.ts | 17 ++--------------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 7f19cfa6b..fef4df709 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,13 @@ "prepare": "husky" }, "lint-staged": { - "*.{ts,tsx,js,jsx}": ["eslint --fix", "prettier --write"], - "*.{css,json,md,yaml,yml}": ["prettier --write"] + "*.{ts,tsx,js,jsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{css,json,md,yaml,yml}": [ + "prettier --write" + ] }, "keywords": [], "author": "7w1", @@ -140,6 +145,7 @@ "vite-plugin-static-copy": "^3.2.0", "vite-plugin-svgr": "4.5.0", "vite-plugin-top-level-await": "^1.6.0", + "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.1.0", "wrangler": "^4.70.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1bd06e3d..218eebb58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -326,6 +326,9 @@ importers: vite-plugin-top-level-await: specifier: ^1.6.0 version: 1.6.0(@swc/helpers@0.5.19)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) + vite-tsconfig-paths: + specifier: ^6.1.1 + version: 6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) vitest: specifier: ^4.1.0 version: 4.1.0(@types/node@24.10.13)(@vitest/ui@4.1.0)(jsdom@29.0.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)) @@ -5386,6 +5389,16 @@ packages: peerDependencies: typescript: '>=4.0.0' + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -5545,6 +5558,11 @@ packages: peerDependencies: vite: '>=2.8' + vite-tsconfig-paths@6.1.1: + resolution: {integrity: sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==} + peerDependencies: + vite: '*' + vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -11567,6 +11585,10 @@ snapshots: picomatch: 4.0.3 typescript: 5.9.3 + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -11781,6 +11803,16 @@ snapshots: - '@swc/helpers' - rollup + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + - typescript + vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 diff --git a/vite.config.ts b/vite.config.ts index a66f458a8..34f4ef0d0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -17,6 +17,7 @@ import path from 'path'; import { cloudflare } from '@cloudflare/vite-plugin'; import { createRequire } from 'module'; import { sentryVitePlugin } from '@sentry/vite-plugin'; +import tsconfigPaths from 'vite-tsconfig-paths'; import buildConfig from './build.config'; const packageJson = JSON.parse( @@ -124,21 +125,6 @@ export default defineConfig({ BUILD_HASH: JSON.stringify(buildHash ?? ''), IS_RELEASE_TAG: JSON.stringify(isReleaseTag), }, - resolve: { - alias: { - $hooks: path.resolve(__dirname, 'src/app/hooks'), - $plugins: path.resolve(__dirname, 'src/app/plugins'), - $components: path.resolve(__dirname, 'src/app/components'), - $features: path.resolve(__dirname, 'src/app/features'), - $state: path.resolve(__dirname, 'src/app/state'), - $styles: path.resolve(__dirname, 'src/app/styles'), - $utils: path.resolve(__dirname, 'src/app/utils'), - $pages: path.resolve(__dirname, 'src/app/pages'), - $types: path.resolve(__dirname, 'src/types'), - $public: path.resolve(__dirname, 'public'), - $client: path.resolve(__dirname, 'src/client'), - }, - }, server: { port: 8080, host: true, @@ -148,6 +134,7 @@ export default defineConfig({ }, }, plugins: [ + tsconfigPaths(), serverMatrixSdkCryptoWasm(), topLevelAwait({ // The export name of top-level await promise for each chunk module From f5464100a289e448219c89cee1b478052d38e305 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 13:14:32 -0400 Subject: [PATCH 7/8] docs: update CODE_QUALITY.md with test enforcement and vite-tsconfig-paths --- docs/CODE_QUALITY.md | 47 ++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/docs/CODE_QUALITY.md b/docs/CODE_QUALITY.md index 2c57bd26e..a3e388d94 100644 --- a/docs/CODE_QUALITY.md +++ b/docs/CODE_QUALITY.md @@ -4,11 +4,14 @@ This document describes the coding conventions and standards used throughout Sab ## Enforcement layers -| Layer | When it runs | What it checks | -| --------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------- | -| **Pre-commit hook** (`husky` + `lint-staged`) | On every `git commit` | ESLint (with auto-fix) + Prettier (with auto-fix) on staged files only | -| **CI quality checks** | On every PR and push to `dev` | Format, lint, typecheck, knip, tests, build | -| **Editor** | As you type | ESLint + Prettier via VS Code extensions | +| Layer | When it runs | What it checks | +| --------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------- | +| **Pre-commit hook** (`husky` + `lint-staged`) | On every `git commit` | ESLint (with auto-fix) + Prettier (with auto-fix) on staged files only | +| **CI — format / lint / typecheck / knip** | On every PR and push to `dev` | Prettier format, ESLint, TypeScript (`tsc --noEmit`), Knip dead-code analysis | +| **CI — tests** | On every PR and push to `dev` | Runs the full vitest suite; fails if any test fails | +| **CI — coverage thresholds** | On every PR and push to `dev` | `pnpm test:coverage`; fails if overall coverage drops below the locked baseline | +| **CI — missing tests warning** | On PRs only (advisory, not failing) | Comments listing changed logic files that have no `.test.` counterpart | +| **Editor** | As you type | ESLint + Prettier via VS Code extensions | PRs are **not merged** unless all CI quality checks are green. The pre-commit hook auto-fixes formatting and many lint issues for you; if it cannot, the commit is blocked with a clear error message. @@ -253,21 +256,31 @@ See [TESTING.md](./TESTING.md) for full details. Key conventions: - Use `@testing-library/react` for component tests — test behaviour, not implementation details - If your change touches logic with a clear input/output, add or update a test +### Coverage thresholds + +Coverage thresholds are locked in `vitest.config.ts` and enforced by CI (`pnpm test:coverage`). The numbers reflect the current baseline — **they should only ever be raised, never lowered**. If your PR causes the coverage job to fail, you either need to add tests or check that you haven't deleted an existing test. + +### Missing-tests advisory + +On every PR, CI checks whether any changed logic files lack a corresponding `.test.*` file and posts a comment listing them. This is **advisory only** — the job does not fail and does not block merging. If your changes don't warrant tests (e.g. a config tweak or a pure UI restyle), just note that in the PR description. + --- ## What the linter enforces automatically These rules run in CI and on every commit (and are auto-fixed when possible): -| Rule | Enforced as | -| -------------------------------------------------------- | ---------------------------- | -| `@typescript-eslint/consistent-type-definitions` | error (auto-fix) | -| `@typescript-eslint/consistent-type-imports` | error (auto-fix) | -| `@typescript-eslint/no-unused-vars` | error (auto-fix for imports) | -| `@typescript-eslint/no-shadow` | error | -| `react-hooks/rules-of-hooks` | error | -| `react-hooks/exhaustive-deps` | error | -| `react/no-unstable-nested-components` | error | -| No direct `localStorage` in `components/` or `features/` | error | -| Prettier formatting | error (auto-fix) | -| Knip (dead exports / unused files) | error | +| Rule | Enforced as | +| ---------------------------------------------------------------------- | ----------------------------- | +| `@typescript-eslint/consistent-type-definitions` | error (auto-fix) | +| `@typescript-eslint/consistent-type-imports` | error (auto-fix) | +| `@typescript-eslint/no-unused-vars` | error (auto-fix for imports) | +| `@typescript-eslint/no-shadow` | error | +| `react-hooks/rules-of-hooks` | error | +| `react-hooks/exhaustive-deps` | error | +| `react/no-unstable-nested-components` | error | +| No direct `localStorage` in `components/` or `features/` | error | +| Prettier formatting | error (auto-fix) | +| Knip (dead exports / unused files) | error | +| Coverage thresholds (statements/functions/lines ≥ 1.5%, branches ≥ 1%) | CI error (raise, never lower) | +| Logic files without a `.test.` counterpart | CI advisory comment on PR | From 3d14800a2115e1d3b06867e2ff107ed3630287e7 Mon Sep 17 00:00:00 2001 From: Evie Gauthier Date: Tue, 17 Mar 2026 13:58:34 -0400 Subject: [PATCH 8/8] fix: deduplicate missing-tests advisory PR comment --- .github/workflows/quality-checks.yml | 47 +++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/.github/workflows/quality-checks.yml b/.github/workflows/quality-checks.yml index 5b091c007..fad4e9bd9 100644 --- a/.github/workflows/quality-checks.yml +++ b/.github/workflows/quality-checks.yml @@ -150,13 +150,34 @@ jobs: printf 'files<> $GITHUB_OUTPUT fi - - name: Comment on PR - if: steps.check.outputs.missing == 'true' + - name: Update PR comment uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | + const marker = ''; + const missing = '${{ steps.check.outputs.missing }}' === 'true'; const files = `${{ steps.check.outputs.files }}`; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + }); + const existing = comments.find(c => c.body && c.body.includes(marker)); + + if (!missing) { + if (existing) { + await github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + }); + } + return; + } + const body = [ + marker, '## ⚠️ Logic changes without tests', '', 'The following changed files have no corresponding `.test.` file.', @@ -164,12 +185,22 @@ jobs: '', files, ].join('\n'); - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body, - }); + + if (existing) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing.id, + body, + }); + } else { + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body, + }); + } build: name: Build