From f2cf8a08dff89c61c2d1aaf8db11e62aa5873733 Mon Sep 17 00:00:00 2001 From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com> Date: Wed, 1 Jul 2026 14:38:23 +0200 Subject: [PATCH] refactor(hooks): move cross-cutting hooks into lib/hooks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The five residual src/hooks/ hooks (useConnectionStatus, useCardGridMetrics, useTracklistColumns, useNavidromeAdminRole, useAnalysisPerfListener) are all domain-agnostic — none imports @/features — so they join the other shared hooks in src/lib/hooks/ (with their two colocated tests). Consumers repointed; relative-up imports in the moved files become the @/ alias. src/hooks/ is removed. Pure move + import updates, no behavior change. The layering baseline gains five lib->store entries (the three hooks that read authStore/devOfflineBrowseStore are only now caught under lib/) — same documented debt class as the api move. --- .dependency-cruiser-known-violations.json | 85 +++++++++++++++++++ src/app/AppShell.tsx | 2 +- src/app/ConnectionIndicator.tsx | 2 +- src/app/FpsOverlay.tsx | 2 +- src/app/hooks/useIdlePlayQueuePull.ts | 2 +- src/app/hooks/usePlayQueueSyncLedState.ts | 2 +- .../album/components/AlbumTrackList.tsx | 2 +- src/features/album/components/TrackRow.tsx | 2 +- .../album/components/TracklistHeaderRow.tsx | 2 +- .../album/utils/albumTrackListHelpers.ts | 2 +- .../artist/hooks/useArtistDetailData.ts | 2 +- .../favorites/components/FavoriteSongRow.tsx | 2 +- .../components/FavoritesSongsTracklist.tsx | 2 +- .../favorites/hooks/useFavoritesData.ts | 2 +- src/features/favorites/pages/Favorites.tsx | 2 +- src/features/home/pages/Home.tsx | 2 +- .../nowPlaying/hooks/useNowPlayingFetchers.ts | 2 +- .../offline/hooks/useOfflineBrowseContext.ts | 2 +- .../offline/utils/offlineBrowseContext.ts | 2 +- .../offline/utils/offlineBrowseMode.ts | 2 +- .../playlist/components/PlaylistRow.tsx | 2 +- .../components/PlaylistSuggestions.tsx | 2 +- .../playlist/components/PlaylistTracklist.tsx | 2 +- .../playlist/pages/PlaylistDetail.tsx | 2 +- src/features/radio/pages/InternetRadio.tsx | 2 +- .../SidebarPerfProbeConnectionsTab.tsx | 4 +- .../SidebarPerfProbeServerSection.tsx | 2 +- .../sidebar/hooks/useSidebarPerfProbe.ts | 2 +- .../hooks/useAnalysisPerfListener.ts | 0 src/{ => lib}/hooks/useCardGridMetrics.ts | 4 +- .../hooks/useConnectionStatus.test.ts | 0 src/{ => lib}/hooks/useConnectionStatus.ts | 2 +- .../hooks/useNavidromeAdminRole.test.ts | 0 src/{ => lib}/hooks/useNavidromeAdminRole.ts | 2 +- src/{ => lib}/hooks/useTracklistColumns.ts | 0 src/ui/TracklistColumnPicker.test.tsx | 2 +- src/ui/TracklistColumnPicker.tsx | 2 +- src/ui/VirtualCardGrid.tsx | 2 +- 38 files changed, 120 insertions(+), 35 deletions(-) rename src/{ => lib}/hooks/useAnalysisPerfListener.ts (100%) rename src/{ => lib}/hooks/useCardGridMetrics.ts (92%) rename src/{ => lib}/hooks/useConnectionStatus.test.ts (100%) rename src/{ => lib}/hooks/useConnectionStatus.ts (99%) rename src/{ => lib}/hooks/useNavidromeAdminRole.test.ts (100%) rename src/{ => lib}/hooks/useNavidromeAdminRole.ts (98%) rename src/{ => lib}/hooks/useTracklistColumns.ts (100%) diff --git a/.dependency-cruiser-known-violations.json b/.dependency-cruiser-known-violations.json index 51c0c08d..3d0f7fbf 100644 --- a/.dependency-cruiser-known-violations.json +++ b/.dependency-cruiser-known-violations.json @@ -533,6 +533,91 @@ "name": "lib-is-the-floor" } }, + { + "type": "dependency", + "from": "src/lib/hooks/useCardGridMetrics.ts", + "to": "src/store/authStore.ts", + "unresolvedTo": "@/store/authStore", + "dependencyTypes": [ + "aliased", + "aliased-tsconfig", + "aliased-tsconfig-paths", + "local", + "import" + ], + "rule": { + "severity": "error", + "name": "lib-is-the-floor" + } + }, + { + "type": "dependency", + "from": "src/lib/hooks/useCardGridMetrics.ts", + "to": "src/store/authStoreHelpers.ts", + "unresolvedTo": "@/store/authStoreHelpers", + "dependencyTypes": [ + "aliased", + "aliased-tsconfig", + "aliased-tsconfig-paths", + "local", + "import" + ], + "rule": { + "severity": "error", + "name": "lib-is-the-floor" + } + }, + { + "type": "dependency", + "from": "src/lib/hooks/useConnectionStatus.ts", + "to": "src/store/authStore.ts", + "unresolvedTo": "@/store/authStore", + "dependencyTypes": [ + "aliased", + "aliased-tsconfig", + "aliased-tsconfig-paths", + "local", + "import" + ], + "rule": { + "severity": "error", + "name": "lib-is-the-floor" + } + }, + { + "type": "dependency", + "from": "src/lib/hooks/useConnectionStatus.ts", + "to": "src/store/devOfflineBrowseStore.ts", + "unresolvedTo": "@/store/devOfflineBrowseStore", + "dependencyTypes": [ + "aliased", + "aliased-tsconfig", + "aliased-tsconfig-paths", + "local", + "import" + ], + "rule": { + "severity": "error", + "name": "lib-is-the-floor" + } + }, + { + "type": "dependency", + "from": "src/lib/hooks/useNavidromeAdminRole.ts", + "to": "src/store/authStore.ts", + "unresolvedTo": "@/store/authStore", + "dependencyTypes": [ + "aliased", + "aliased-tsconfig", + "aliased-tsconfig-paths", + "local", + "import" + ], + "rule": { + "severity": "error", + "name": "lib-is-the-floor" + } + }, { "type": "dependency", "from": "src/lib/library/hooks/useLibraryAnalysisBackfill.ts", diff --git a/src/app/AppShell.tsx b/src/app/AppShell.tsx index 2a3b33de..bcecb106 100644 --- a/src/app/AppShell.tsx +++ b/src/app/AppShell.tsx @@ -55,7 +55,7 @@ import { useOfflineAutoNav } from '@/features/offline'; import { useOfflineLibraryFilterSuspend } from '@/features/offline'; import { AppShellQueueResizerSeam } from '@/app/AppShellQueueResizerSeam'; import { IS_LINUX, IS_MACOS } from '@/lib/util/platform'; -import { useConnectionStatus } from '../hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { useIdlePlayQueuePull } from '@/app/hooks/useIdlePlayQueuePull'; import { useAuthStore } from '../store/authStore'; import { usePlayerStore } from '@/features/playback/store/playerStore'; diff --git a/src/app/ConnectionIndicator.tsx b/src/app/ConnectionIndicator.tsx index cf2ba816..3f56570f 100644 --- a/src/app/ConnectionIndicator.tsx +++ b/src/app/ConnectionIndicator.tsx @@ -4,7 +4,7 @@ import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { Check, ChevronDown, RefreshCw } from 'lucide-react'; -import type { ConnectionStatus } from '@/hooks/useConnectionStatus'; +import type { ConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { usePlayQueueSyncLedState } from '@/app/hooks/usePlayQueueSyncLedState'; import type { ServerProfile } from '@/store/authStoreTypes'; import { useAuthStore } from '@/store/authStore'; diff --git a/src/app/FpsOverlay.tsx b/src/app/FpsOverlay.tsx index f6c97404..b19035bf 100644 --- a/src/app/FpsOverlay.tsx +++ b/src/app/FpsOverlay.tsx @@ -30,7 +30,7 @@ import { resolveOverlayVisibility, usePerfOverlayMode, } from '@/lib/perf/perfOverlayMode'; -import { useAnalysisPerfListener } from '@/hooks/useAnalysisPerfListener'; +import { useAnalysisPerfListener } from '@/lib/hooks/useAnalysisPerfListener'; import { useCoverPerfListener } from '@/cover/useCoverPerfListener'; import { getCoverCachedPerMinute, getCoverUiPerMinute } from '@/lib/perf/coverPerfStore'; diff --git a/src/app/hooks/useIdlePlayQueuePull.ts b/src/app/hooks/useIdlePlayQueuePull.ts index 229a247b..f216193e 100644 --- a/src/app/hooks/useIdlePlayQueuePull.ts +++ b/src/app/hooks/useIdlePlayQueuePull.ts @@ -11,7 +11,7 @@ import { markPlaybackIdle, } from '@/features/playback/store/queuePlaybackIdle'; import { hasPendingQueueSync } from '@/features/playback/store/queueSync'; -import type { ConnectionStatus } from '@/hooks/useConnectionStatus'; +import type { ConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { canAutoIdlePlayQueuePull } from '@/app/hooks/usePlayQueueSyncLedState'; const IDLE_THRESHOLD_MS = 30_000; diff --git a/src/app/hooks/usePlayQueueSyncLedState.ts b/src/app/hooks/usePlayQueueSyncLedState.ts index 3924eaf9..69962e4b 100644 --- a/src/app/hooks/usePlayQueueSyncLedState.ts +++ b/src/app/hooks/usePlayQueueSyncLedState.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react'; import { useTranslation } from 'react-i18next'; -import type { ConnectionStatus } from '@/hooks/useConnectionStatus'; +import type { ConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { pullPlayQueueFromActiveServer } from '@/features/playback/store/applyServerPlayQueue'; import { useAuthStore } from '@/store/authStore'; import { useOrbitStore } from '@/features/orbit'; diff --git a/src/features/album/components/AlbumTrackList.tsx b/src/features/album/components/AlbumTrackList.tsx index 0b548bb6..a2c0b517 100644 --- a/src/features/album/components/AlbumTrackList.tsx +++ b/src/features/album/components/AlbumTrackList.tsx @@ -1,7 +1,7 @@ import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import type { Track } from '@/lib/media/trackTypes'; import React, { useMemo, useState, useEffect } from 'react'; -import { useTracklistColumns } from '@/hooks/useTracklistColumns'; +import { useTracklistColumns } from '@/lib/hooks/useTracklistColumns'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useTranslation } from 'react-i18next'; import { useIsMobile } from '@/lib/hooks/useIsMobile'; diff --git a/src/features/album/components/TrackRow.tsx b/src/features/album/components/TrackRow.tsx index 03fe879e..c111d36e 100644 --- a/src/features/album/components/TrackRow.tsx +++ b/src/features/album/components/TrackRow.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { AudioLines, ChevronRight, Heart, Play, Square } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import type { Track } from '@/lib/media/trackTypes'; import { songToTrack } from '@/lib/media/songToTrack'; diff --git a/src/features/album/components/TracklistHeaderRow.tsx b/src/features/album/components/TracklistHeaderRow.tsx index 49a6977e..6dc95879 100644 --- a/src/features/album/components/TracklistHeaderRow.tsx +++ b/src/features/album/components/TracklistHeaderRow.tsx @@ -1,6 +1,6 @@ import React from 'react'; import type { TFunction } from 'i18next'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import { CENTERED_COLS, isSortable, type ColKey, type SortKey } from '@/features/album/utils/albumTrackListHelpers'; interface Props { diff --git a/src/features/album/utils/albumTrackListHelpers.ts b/src/features/album/utils/albumTrackListHelpers.ts index 87124e00..18e2b148 100644 --- a/src/features/album/utils/albumTrackListHelpers.ts +++ b/src/features/album/utils/albumTrackListHelpers.ts @@ -1,4 +1,4 @@ -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; export function codecLabel(song: { suffix?: string; bitRate?: number }, showBitrate: boolean): string { const parts: string[] = []; diff --git a/src/features/artist/hooks/useArtistDetailData.ts b/src/features/artist/hooks/useArtistDetailData.ts index 4e66a10a..1a0ea54f 100644 --- a/src/features/artist/hooks/useArtistDetailData.ts +++ b/src/features/artist/hooks/useArtistDetailData.ts @@ -6,7 +6,7 @@ import type { SubsonicAlbum, SubsonicArtist, SubsonicArtistInfo, SubsonicSong, } from '@/lib/api/subsonicTypes'; import { useAuthStore } from '@/store/authStore'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { loadArtistFromLibraryIndex } from '@/features/offline'; import { useOfflineBrowseContext } from '@/features/offline'; import { loadArtistFromLocalPlayback, offlineLocalBrowseEnabled } from '@/features/offline'; diff --git a/src/features/favorites/components/FavoriteSongRow.tsx b/src/features/favorites/components/FavoriteSongRow.tsx index db759926..351d0b97 100644 --- a/src/features/favorites/components/FavoriteSongRow.tsx +++ b/src/features/favorites/components/FavoriteSongRow.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { AudioLines, ChevronRight, Play, Square, X } from 'lucide-react'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { codecLabel } from '@/lib/format/playlistDetailHelpers'; import { formatLastSeen } from '@/lib/format/userMgmtHelpers'; diff --git a/src/features/favorites/components/FavoritesSongsTracklist.tsx b/src/features/favorites/components/FavoritesSongsTracklist.tsx index 70794767..5ea0d17f 100644 --- a/src/features/favorites/components/FavoritesSongsTracklist.tsx +++ b/src/features/favorites/components/FavoritesSongsTracklist.tsx @@ -4,7 +4,7 @@ import FavoriteSongRow, { type FavoriteSongRowCallbacks } from '@/features/favor import { TracklistColumnPicker } from '@/ui/TracklistColumnPicker'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { previewInputFromSong, usePreviewStore } from '@/features/playback/store/previewStore'; diff --git a/src/features/favorites/hooks/useFavoritesData.ts b/src/features/favorites/hooks/useFavoritesData.ts index 359d11bc..72c05b86 100644 --- a/src/features/favorites/hooks/useFavoritesData.ts +++ b/src/features/favorites/hooks/useFavoritesData.ts @@ -7,7 +7,7 @@ import type { import { useAuthStore } from '@/store/authStore'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import type { TopFavoriteArtist } from '@/features/favorites/components/TopFavoriteArtists'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { isActiveServerReachable } from '@/lib/network/activeServerReachability'; import { useOfflineBrowseContext } from '@/features/offline'; import { useOfflineBrowseReloadToken } from '@/features/offline'; diff --git a/src/features/favorites/pages/Favorites.tsx b/src/features/favorites/pages/Favorites.tsx index 7617746d..55bb813e 100644 --- a/src/features/favorites/pages/Favorites.tsx +++ b/src/features/favorites/pages/Favorites.tsx @@ -1,6 +1,6 @@ import { queueSongStar, queueSongRating } from '@/features/playback/store/pendingStarSync'; import React, { useEffect, useMemo, useState } from 'react'; -import { useTracklistColumns, type ColDef } from '@/hooks/useTracklistColumns'; +import { useTracklistColumns, type ColDef } from '@/lib/hooks/useTracklistColumns'; import { TopFavoriteArtistsRow } from '@/features/favorites/components/TopFavoriteArtists'; import { RadioStationRow } from '@/features/favorites/components/RadioFavorites'; import FavoritesSongsSectionHeader from '@/features/favorites/components/FavoritesSongsSectionHeader'; diff --git a/src/features/home/pages/Home.tsx b/src/features/home/pages/Home.tsx index 743d5b60..001388fd 100644 --- a/src/features/home/pages/Home.tsx +++ b/src/features/home/pages/Home.tsx @@ -28,7 +28,7 @@ import { writeHomeFeedCache, type HomeFeedSnapshot, } from '@/features/home/store/homeFeedCache'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { useOfflineBrowseContext } from '@/features/offline'; import { useOfflineBrowseReloadToken } from '@/features/offline'; import { useDevOfflineBrowseStore } from '@/features/offline'; diff --git a/src/features/nowPlaying/hooks/useNowPlayingFetchers.ts b/src/features/nowPlaying/hooks/useNowPlayingFetchers.ts index db317aea..588763fc 100644 --- a/src/features/nowPlaying/hooks/useNowPlayingFetchers.ts +++ b/src/features/nowPlaying/hooks/useNowPlayingFetchers.ts @@ -7,7 +7,7 @@ import type { ArtistStats, TrackStats } from '@/music-network'; import { getMusicNetworkRuntimeOrNull } from '@/music-network'; import { makeCache } from '@/lib/cache/nowPlayingCache'; import { shouldAttemptSubsonicForServer } from '@/lib/network/subsonicNetworkGuard'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; // Module-level TTL caches (shared across mounts) const songMetaCache = makeCache(); diff --git a/src/features/offline/hooks/useOfflineBrowseContext.ts b/src/features/offline/hooks/useOfflineBrowseContext.ts index 3af49c6c..06fbc20c 100644 --- a/src/features/offline/hooks/useOfflineBrowseContext.ts +++ b/src/features/offline/hooks/useOfflineBrowseContext.ts @@ -1,6 +1,6 @@ import { useAuthStore } from '@/store/authStore'; import { useOfflineStore } from '@/features/offline/store/offlineStore'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { usePlayerStatsRecordingEnabled } from '@/features/stats'; import { hasOfflineBrowsingContent } from '@/features/offline/utils/favoritesOfflineBrowse'; import { useOfflineBrowseActive } from '@/features/offline/utils/offlineBrowseMode'; diff --git a/src/features/offline/utils/offlineBrowseContext.ts b/src/features/offline/utils/offlineBrowseContext.ts index c6030c5f..1bf96ed4 100644 --- a/src/features/offline/utils/offlineBrowseContext.ts +++ b/src/features/offline/utils/offlineBrowseContext.ts @@ -1,4 +1,4 @@ -import type { ConnectionStatus } from '@/hooks/useConnectionStatus'; +import type { ConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import type { OfflineAlbumMeta } from '@/features/offline/store/offlineStore'; import { favoritesOfflineBrowseEnabled } from '@/features/offline/utils/favoritesOfflineBrowse'; import { hasOfflineBrowseCapability } from '@/features/offline/utils/offlineBrowseRouting'; diff --git a/src/features/offline/utils/offlineBrowseMode.ts b/src/features/offline/utils/offlineBrowseMode.ts index a784b313..4e408039 100644 --- a/src/features/offline/utils/offlineBrowseMode.ts +++ b/src/features/offline/utils/offlineBrowseMode.ts @@ -2,7 +2,7 @@ import { isDevOfflineBrowseForced, useDevOfflineBrowseStore, } from '@/store/devOfflineBrowseStore'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; import { isActiveServerReachable } from '@/lib/network/activeServerReachability'; /** True when browse/detail pages should use local-bytes-only data sources. */ diff --git a/src/features/playlist/components/PlaylistRow.tsx b/src/features/playlist/components/PlaylistRow.tsx index ee8ec04e..76a46e95 100644 --- a/src/features/playlist/components/PlaylistRow.tsx +++ b/src/features/playlist/components/PlaylistRow.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { AudioLines, ChevronRight, Heart, Play, Square, Trash2 } from 'lucide-react'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { codecLabel } from '@/lib/format/playlistDetailHelpers'; import { formatLastSeen } from '@/lib/format/userMgmtHelpers'; diff --git a/src/features/playlist/components/PlaylistSuggestions.tsx b/src/features/playlist/components/PlaylistSuggestions.tsx index 4d1eef76..092b5d89 100644 --- a/src/features/playlist/components/PlaylistSuggestions.tsx +++ b/src/features/playlist/components/PlaylistSuggestions.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { ChevronRight, Heart, Play, Plus, RefreshCw, Square } from 'lucide-react'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { usePreviewStore } from '@/features/playback/store/previewStore'; diff --git a/src/features/playlist/components/PlaylistTracklist.tsx b/src/features/playlist/components/PlaylistTracklist.tsx index 9f94d991..e523927e 100644 --- a/src/features/playlist/components/PlaylistTracklist.tsx +++ b/src/features/playlist/components/PlaylistTracklist.tsx @@ -9,7 +9,7 @@ import { useNavigate } from 'react-router-dom'; import { ListPlus, Search, Trash2, X, } from 'lucide-react'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; import type { SubsonicSong } from '@/lib/api/subsonicTypes'; import type { Track } from '@/lib/media/trackTypes'; import { usePlayerStore } from '@/features/playback/store/playerStore'; diff --git a/src/features/playlist/pages/PlaylistDetail.tsx b/src/features/playlist/pages/PlaylistDetail.tsx index 03749fcc..d08e2ec7 100644 --- a/src/features/playlist/pages/PlaylistDetail.tsx +++ b/src/features/playlist/pages/PlaylistDetail.tsx @@ -2,7 +2,7 @@ import { updatePlaylist } from '@/lib/api/subsonicPlaylists'; import type { SubsonicPlaylist, SubsonicSong } from '@/lib/api/subsonicTypes'; import React, { useEffect, useState, useCallback, useMemo } from 'react'; import { useParams, useNavigate, useLocation } from 'react-router-dom'; -import { useTracklistColumns, type ColDef } from '@/hooks/useTracklistColumns'; +import { useTracklistColumns, type ColDef } from '@/lib/hooks/useTracklistColumns'; import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useShallow } from 'zustand/react/shallow'; import { usePlaylistStore } from '@/features/playlist/store/playlistStore'; diff --git a/src/features/radio/pages/InternetRadio.tsx b/src/features/radio/pages/InternetRadio.tsx index ba7b98aa..7022e26d 100644 --- a/src/features/radio/pages/InternetRadio.tsx +++ b/src/features/radio/pages/InternetRadio.tsx @@ -15,7 +15,7 @@ import RadioEditModal from '@/features/radio/components/RadioEditModal'; import RadioDirectoryModal from '@/features/radio/components/RadioDirectoryModal'; import { usePerfProbeFlags } from '@/lib/perf/perfFlags'; import { VirtualCardGrid } from '@/ui/VirtualCardGrid'; -import { useNavidromeAdminRole, canManageNavidromeRadio } from '@/hooks/useNavidromeAdminRole'; +import { useNavidromeAdminRole, canManageNavidromeRadio } from '@/lib/hooks/useNavidromeAdminRole'; export default function InternetRadio() { const { t } = useTranslation(); diff --git a/src/features/sidebar/components/perfProbe/SidebarPerfProbeConnectionsTab.tsx b/src/features/sidebar/components/perfProbe/SidebarPerfProbeConnectionsTab.tsx index 9d3db27f..abbb4eb8 100644 --- a/src/features/sidebar/components/perfProbe/SidebarPerfProbeConnectionsTab.tsx +++ b/src/features/sidebar/components/perfProbe/SidebarPerfProbeConnectionsTab.tsx @@ -1,7 +1,7 @@ import { useAuthStore } from '@/store/authStore'; import { usePlayerStore } from '@/features/playback/store/playerStore'; -import { useConnectionStatus } from '@/hooks/useConnectionStatus'; -import { useNavidromeAdminRole } from '@/hooks/useNavidromeAdminRole'; +import { useConnectionStatus } from '@/lib/hooks/useConnectionStatus'; +import { useNavidromeAdminRole } from '@/lib/hooks/useNavidromeAdminRole'; import { serverListDisplayLabel } from '@/lib/server/serverDisplayName'; import { findServerByIdOrIndexKey } from '@/lib/server/serverLookup'; import { PerfProbeMetricSection } from '@/features/sidebar/components/perfProbe/PerfProbeMetricCard'; diff --git a/src/features/sidebar/components/perfProbe/SidebarPerfProbeServerSection.tsx b/src/features/sidebar/components/perfProbe/SidebarPerfProbeServerSection.tsx index b2bd4236..24fec320 100644 --- a/src/features/sidebar/components/perfProbe/SidebarPerfProbeServerSection.tsx +++ b/src/features/sidebar/components/perfProbe/SidebarPerfProbeServerSection.tsx @@ -1,5 +1,5 @@ import { useAuthStore } from '@/store/authStore'; -import type { NavidromeAdminRole } from '@/hooks/useNavidromeAdminRole'; +import type { NavidromeAdminRole } from '@/lib/hooks/useNavidromeAdminRole'; import { isNavidromeServer, formatServerSoftware } from '@/lib/server/subsonicServerIdentity'; import { FEATURE_AUDIOMUSE_SIMILAR_TRACKS, OP_SIMILAR_TRACKS } from '@/serverCapabilities/catalog'; import { diff --git a/src/features/sidebar/hooks/useSidebarPerfProbe.ts b/src/features/sidebar/hooks/useSidebarPerfProbe.ts index 0eaeb1d3..bb32e77f 100644 --- a/src/features/sidebar/hooks/useSidebarPerfProbe.ts +++ b/src/features/sidebar/hooks/useSidebarPerfProbe.ts @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react'; import { acquirePerfLivePoll, patchPerfLiveAnalysis } from '@/lib/perf/perfLiveStore'; import { setPerfProbeTelemetryActive } from '@/lib/perf/perfTelemetry'; import { useAnalysisPerfLast } from '@/lib/perf/analysisPerfStore'; -import { useAnalysisPerfListener } from '@/hooks/useAnalysisPerfListener'; +import { useAnalysisPerfListener } from '@/lib/hooks/useAnalysisPerfListener'; import { useCoverPerfListener, useCoverUiThroughputPoll } from '@/cover/useCoverPerfListener'; import { getPerfProbeFlags, diff --git a/src/hooks/useAnalysisPerfListener.ts b/src/lib/hooks/useAnalysisPerfListener.ts similarity index 100% rename from src/hooks/useAnalysisPerfListener.ts rename to src/lib/hooks/useAnalysisPerfListener.ts diff --git a/src/hooks/useCardGridMetrics.ts b/src/lib/hooks/useCardGridMetrics.ts similarity index 92% rename from src/hooks/useCardGridMetrics.ts rename to src/lib/hooks/useCardGridMetrics.ts index 35271d09..6453c009 100644 --- a/src/hooks/useCardGridMetrics.ts +++ b/src/lib/hooks/useCardGridMetrics.ts @@ -1,6 +1,6 @@ import { useLayoutEffect, useState, type RefObject } from 'react'; -import { useAuthStore } from '../store/authStore'; -import { clampLibraryGridMaxColumns } from '../store/authStoreHelpers'; +import { useAuthStore } from '@/store/authStore'; +import { clampLibraryGridMaxColumns } from '@/store/authStoreHelpers'; import { type CardGridRowHeightVariant, computeCardGridColumnCount, diff --git a/src/hooks/useConnectionStatus.test.ts b/src/lib/hooks/useConnectionStatus.test.ts similarity index 100% rename from src/hooks/useConnectionStatus.test.ts rename to src/lib/hooks/useConnectionStatus.test.ts diff --git a/src/hooks/useConnectionStatus.ts b/src/lib/hooks/useConnectionStatus.ts similarity index 99% rename from src/hooks/useConnectionStatus.ts rename to src/lib/hooks/useConnectionStatus.ts index a0ea2dc4..3f068883 100644 --- a/src/hooks/useConnectionStatus.ts +++ b/src/lib/hooks/useConnectionStatus.ts @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback, useRef, useMemo, useSyncExternalStore } from 'react'; -import { useAuthStore } from '../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { scheduleInstantMixProbeForServer } from '@/lib/api/subsonic'; import { serverListDisplayLabel } from '@/lib/server/serverDisplayName'; import { diff --git a/src/hooks/useNavidromeAdminRole.test.ts b/src/lib/hooks/useNavidromeAdminRole.test.ts similarity index 100% rename from src/hooks/useNavidromeAdminRole.test.ts rename to src/lib/hooks/useNavidromeAdminRole.test.ts diff --git a/src/hooks/useNavidromeAdminRole.ts b/src/lib/hooks/useNavidromeAdminRole.ts similarity index 98% rename from src/hooks/useNavidromeAdminRole.ts rename to src/lib/hooks/useNavidromeAdminRole.ts index 1d55b1e2..d95705e9 100644 --- a/src/hooks/useNavidromeAdminRole.ts +++ b/src/lib/hooks/useNavidromeAdminRole.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; import { ndLogin } from '@/lib/api/navidromeAdmin'; -import { useAuthStore } from '../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { isNavidromeServer } from '@/lib/server/subsonicServerIdentity'; export type NavidromeAdminRole = 'idle' | 'checking' | 'admin' | 'user' | 'na' | 'error'; diff --git a/src/hooks/useTracklistColumns.ts b/src/lib/hooks/useTracklistColumns.ts similarity index 100% rename from src/hooks/useTracklistColumns.ts rename to src/lib/hooks/useTracklistColumns.ts diff --git a/src/ui/TracklistColumnPicker.test.tsx b/src/ui/TracklistColumnPicker.test.tsx index c4501803..801ae511 100644 --- a/src/ui/TracklistColumnPicker.test.tsx +++ b/src/ui/TracklistColumnPicker.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import type { TFunction } from 'i18next'; import { renderWithProviders } from '@/test/helpers/renderWithProviders'; import { TracklistColumnPicker } from '@/ui/TracklistColumnPicker'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; const COLUMNS: readonly ColDef[] = [ { key: 'title', i18nKey: 'title', minWidth: 100, defaultWidth: 200, required: true }, diff --git a/src/ui/TracklistColumnPicker.tsx b/src/ui/TracklistColumnPicker.tsx index 5b193021..3312f4cf 100644 --- a/src/ui/TracklistColumnPicker.tsx +++ b/src/ui/TracklistColumnPicker.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import { Check, ChevronDown, RotateCcw } from 'lucide-react'; import type { TFunction } from 'i18next'; -import type { ColDef } from '@/hooks/useTracklistColumns'; +import type { ColDef } from '@/lib/hooks/useTracklistColumns'; interface Props { /** Every column (required ones are filtered out of the menu). */ diff --git a/src/ui/VirtualCardGrid.tsx b/src/ui/VirtualCardGrid.tsx index bd1b7a73..a65d4055 100644 --- a/src/ui/VirtualCardGrid.tsx +++ b/src/ui/VirtualCardGrid.tsx @@ -4,7 +4,7 @@ import { useWarmGridCovers } from '@/cover/useWarmGridCovers'; import { useVirtualizer } from '@tanstack/react-virtual'; import { APP_MAIN_SCROLL_VIEWPORT_ID } from '@/constants/appScroll'; import { useElementClientHeightById } from '@/lib/hooks/useResizeClientHeight'; -import { useCardGridMetrics } from '@/hooks/useCardGridMetrics'; +import { useCardGridMetrics } from '@/lib/hooks/useCardGridMetrics'; import { useRemeasureGridVirtualizer } from '@/lib/hooks/useRemeasureGridVirtualizer'; import { useVirtualizerScrollMargin } from '@/lib/hooks/useVirtualizerScrollMargin'; import type { CardGridRowHeightVariant } from '@/lib/util/cardGridLayout';