diff --git a/client/scripts/eslint-baseline.json b/client/scripts/eslint-baseline.json index e02a8db56..c203cf0c8 100644 --- a/client/scripts/eslint-baseline.json +++ b/client/scripts/eslint-baseline.json @@ -20,7 +20,7 @@ "no-useless-assignment": 7, "no-empty": 19, "trek/no-window-globals": 41, - "react-refresh/only-export-components": 45, + "react-refresh/only-export-components": 44, "unused-disable-directive": 6, "max-depth": 21, "react-hooks/void-use-memo": 1, diff --git a/client/src/components/Admin/AddonManager.tsx b/client/src/components/Admin/AddonManager.tsx index 4cdf3edf6..99d96ca3c 100644 --- a/client/src/components/Admin/AddonManager.tsx +++ b/client/src/components/Admin/AddonManager.tsx @@ -5,7 +5,7 @@ import { Puzzle, ListChecks, Wallet, FileText, CalendarDays, Globe, Briefcase, I import EmptyState from '../shared/EmptyState' import DawarichIcon from '../shared/DawarichIcon' import AirTrailIcon from '../shared/AirTrailIcon' -import { DOCUMENT_PROVIDER_ICONS } from '../shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../shared/documentProviderIconMap' import AddonTile from './AddonTile' import AddonSubRow from './AddonSubRow' import { Tooltip } from '../shared/Tooltip' diff --git a/client/src/components/Files/docsync/DocSyncBinding.tsx b/client/src/components/Files/docsync/DocSyncBinding.tsx index 81ef95827..8c5042a13 100644 --- a/client/src/components/Files/docsync/DocSyncBinding.tsx +++ b/client/src/components/Files/docsync/DocSyncBinding.tsx @@ -7,7 +7,7 @@ import CustomSelect from '../../shared/CustomSelect' import ToggleSwitch from '../../Settings/ToggleSwitch' import Tooltip from '../../shared/Tooltip' import { useTranslation } from '../../../i18n/TranslationContext' -import { DOCUMENT_PROVIDER_ICONS } from '../../shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../shared/documentProviderIconMap' import DocSyncFlow, { type SyncDirection } from './DocSyncFlow' import { Badge, CONFLICT_POLICIES, conflictPolicyKey, LastRun, StateBadge } from './DocSyncBits' import { bindingNotice, needsReauth, type DocSyncLink, type useDocSync } from './useDocSync' diff --git a/client/src/components/Files/docsync/DocSyncConnectModal.tsx b/client/src/components/Files/docsync/DocSyncConnectModal.tsx index 828dfb7b8..2ae95ce21 100644 --- a/client/src/components/Files/docsync/DocSyncConnectModal.tsx +++ b/client/src/components/Files/docsync/DocSyncConnectModal.tsx @@ -6,7 +6,7 @@ import ToggleSwitch from '../../Settings/ToggleSwitch' import { useTranslation } from '../../../i18n/TranslationContext' import { useConnectForm } from './useConnectForm' import { Badge } from './DocSyncBits' -import { DOCUMENT_PROVIDER_ICONS } from '../../shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../shared/documentProviderIconMap' import type { DocSyncProvider, DocSyncVerdict, useDocSync } from './useDocSync' /** diff --git a/client/src/components/Files/docsync/DocSyncFlow.tsx b/client/src/components/Files/docsync/DocSyncFlow.tsx index 7a658f9fe..dc84ad708 100644 --- a/client/src/components/Files/docsync/DocSyncFlow.tsx +++ b/client/src/components/Files/docsync/DocSyncFlow.tsx @@ -1,6 +1,6 @@ import { ArrowLeft, ArrowRight } from 'lucide-react' import { useTranslation } from '../../../i18n/TranslationContext' -import { DOCUMENT_PROVIDER_ICONS } from '../../shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../shared/documentProviderIconMap' import TrekIcon from '../../shared/TrekIcon' import { Badge } from './DocSyncBits' import { toggledDirection, type SyncDirection } from './docSyncModel' diff --git a/client/src/components/Files/docsync/DocSyncPanel.tsx b/client/src/components/Files/docsync/DocSyncPanel.tsx index 2027bb808..d12c9b5fd 100644 --- a/client/src/components/Files/docsync/DocSyncPanel.tsx +++ b/client/src/components/Files/docsync/DocSyncPanel.tsx @@ -2,7 +2,7 @@ import { useEffect, useId, useMemo, useState } from 'react' import { AlertCircle, ArrowRight, Check, FolderSync, Loader2, Plus } from 'lucide-react' import { DialogHeader, DialogShell, DialogTile, NEUTRAL_TINT } from '../../shared/DialogShell' import { useTranslation } from '../../../i18n/TranslationContext' -import { DOCUMENT_PROVIDER_ICONS } from '../../shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../shared/documentProviderIconMap' import { StateBadge } from './DocSyncBits' import { slugFor } from './docSyncModel' import { useConflicts } from './useConflicts' diff --git a/client/src/components/shared/DocumentProviderIcons.test.tsx b/client/src/components/shared/DocumentProviderIcons.test.tsx index c5ee09395..41727ad27 100644 --- a/client/src/components/shared/DocumentProviderIcons.test.tsx +++ b/client/src/components/shared/DocumentProviderIcons.test.tsx @@ -13,7 +13,7 @@ import { describe, it, expect } from 'vitest' import { DOCUMENT_PROVIDER_IDS } from '@trek/shared' import { render } from '../../../tests/helpers/render' -import { DOCUMENT_PROVIDER_ICONS } from './DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from './documentProviderIconMap' import TrekIcon from './TrekIcon' const marks = Object.entries(DOCUMENT_PROVIDER_ICONS) diff --git a/client/src/components/shared/DocumentProviderIcons.tsx b/client/src/components/shared/DocumentProviderIcons.tsx index 0c6b1ce32..ef53dd861 100644 --- a/client/src/components/shared/DocumentProviderIcons.tsx +++ b/client/src/components/shared/DocumentProviderIcons.tsx @@ -15,7 +15,7 @@ import React from 'react' * for legibility in a monochrome row. */ -interface GlyphProps { +export interface GlyphProps { size?: number className?: string } @@ -34,7 +34,7 @@ function frame(size: number, className: string | undefined) { } /** Paperless-ngx: the leaf, with the shoot curling out of its stem. */ -function PaperlessIcon({ size = 20, className }: GlyphProps): React.ReactElement { +export function PaperlessIcon({ size = 20, className }: GlyphProps): React.ReactElement { return ( @@ -98,7 +98,7 @@ function NextcloudIcon({ size = 20, className }: GlyphProps): React.ReactElement } /** OpenCloud: the open hexagon with the junction inside it. */ -function OpenCloudIcon({ size = 20, className }: GlyphProps): React.ReactElement { +export function OpenCloudIcon({ size = 20, className }: GlyphProps): React.ReactElement { return ( @@ -112,7 +112,7 @@ function OpenCloudIcon({ size = 20, className }: GlyphProps): React.ReactElement } /** Synology Drive: the wordmark's own glyph, as the addon list already draws it. */ -function SynologyDriveIcon({ size = 20, className }: GlyphProps): React.ReactElement { +export function SynologyDriveIcon({ size = 20, className }: GlyphProps): React.ReactElement { return ( ) } - -/** Keyed by the provider ids in `document_providers`. */ -export const DOCUMENT_PROVIDER_ICONS: Record> = { - paperless: PaperlessIcon, - papra: PapraIcon, - nextcloud: NextcloudIcon, - opencloud: OpenCloudIcon, - synologydrive: SynologyDriveIcon, -} diff --git a/client/src/components/shared/documentProviderIconMap.ts b/client/src/components/shared/documentProviderIconMap.ts new file mode 100644 index 000000000..755990510 --- /dev/null +++ b/client/src/components/shared/documentProviderIconMap.ts @@ -0,0 +1,21 @@ +import type React from 'react'; +import { + type GlyphProps, + NextcloudIcon, + OpenCloudIcon, + PaperlessIcon, + PapraIcon, + SynologyDriveIcon, +} from './DocumentProviderIcons'; + +/** + * The document providers' marks keyed by the provider ids in `document_providers`. + * Kept apart from the drawings so that module exports components only. + */ +export const DOCUMENT_PROVIDER_ICONS: Record> = { + paperless: PaperlessIcon, + papra: PapraIcon, + nextcloud: NextcloudIcon, + opencloud: OpenCloudIcon, + synologydrive: SynologyDriveIcon, +}; diff --git a/client/src/mobile/screens/admin/MAdminAddonManager.tsx b/client/src/mobile/screens/admin/MAdminAddonManager.tsx index d603fd569..74f224e5e 100644 --- a/client/src/mobile/screens/admin/MAdminAddonManager.tsx +++ b/client/src/mobile/screens/admin/MAdminAddonManager.tsx @@ -7,7 +7,7 @@ import { } from 'lucide-react' import DawarichIcon from '../../../components/shared/DawarichIcon' import AirTrailIcon from '../../../components/shared/AirTrailIcon' -import { DOCUMENT_PROVIDER_ICONS } from '../../../components/shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../../components/shared/documentProviderIconMap' import MToggle from '../../components/MToggle' import { type Addon, diff --git a/client/src/mobile/screens/trip/tabs/MDocSyncSheet.tsx b/client/src/mobile/screens/trip/tabs/MDocSyncSheet.tsx index 43b52e25a..160235640 100644 --- a/client/src/mobile/screens/trip/tabs/MDocSyncSheet.tsx +++ b/client/src/mobile/screens/trip/tabs/MDocSyncSheet.tsx @@ -9,7 +9,7 @@ import MToggle from '../../../components/MToggle' import MConfirmSheet from '../../settings/MConfirmSheet' import { TileHeader } from '../sheets/MTripSheetUi' import { useTranslation } from '../../../../i18n' -import { DOCUMENT_PROVIDER_ICONS } from '../../../../components/shared/DocumentProviderIcons' +import { DOCUMENT_PROVIDER_ICONS } from '../../../../components/shared/documentProviderIconMap' import TrekIcon from '../../../../components/shared/TrekIcon' import { bindingNotice, needsReauth, storeName, useDocSync, type DocSyncLink, type DocSyncProvider, type DocSyncVerdict,