From 79c02a93cfc927b629ad10c65214e2d7ac0a307f Mon Sep 17 00:00:00 2001 From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com> Date: Tue, 30 Jun 2026 20:06:05 +0200 Subject: [PATCH] refactor(app): move Tauri IPC bridge hooks (tauriBridge/) into app/ where the shell composes them --- src/app/TauriEventBridge.tsx | 18 +++++++++--------- .../tauriBridge/useAudioDeviceBridge.test.ts | 2 +- .../tauriBridge/useAudioDeviceBridge.ts | 2 +- src/{hooks => app}/tauriBridge/useCliBridge.ts | 8 ++++---- .../tauriBridge/useCoverArtBridge.ts | 12 ++++++------ .../tauriBridge/useInAppKeybindings.ts | 6 +++--- .../tauriBridge/useLibraryDevSyncLog.ts | 2 +- .../tauriBridge/useMediaAndWindowBridge.ts | 2 +- .../tauriBridge/usePlayerSnapshotPublisher.ts | 2 +- .../tauriBridge/usePreviewBridge.ts | 0 .../tauriBridge/useTrayIconSync.ts | 2 +- 11 files changed, 28 insertions(+), 28 deletions(-) rename src/{hooks => app}/tauriBridge/useAudioDeviceBridge.test.ts (98%) rename src/{hooks => app}/tauriBridge/useAudioDeviceBridge.ts (98%) rename src/{hooks => app}/tauriBridge/useCliBridge.ts (97%) rename src/{hooks => app}/tauriBridge/useCoverArtBridge.ts (87%) rename src/{hooks => app}/tauriBridge/useInAppKeybindings.ts (87%) rename src/{hooks => app}/tauriBridge/useLibraryDevSyncLog.ts (98%) rename src/{hooks => app}/tauriBridge/useMediaAndWindowBridge.ts (99%) rename src/{hooks => app}/tauriBridge/usePlayerSnapshotPublisher.ts (98%) rename src/{hooks => app}/tauriBridge/usePreviewBridge.ts (100%) rename src/{hooks => app}/tauriBridge/useTrayIconSync.ts (89%) diff --git a/src/app/TauriEventBridge.tsx b/src/app/TauriEventBridge.tsx index 78c11480..ae762196 100644 --- a/src/app/TauriEventBridge.tsx +++ b/src/app/TauriEventBridge.tsx @@ -1,14 +1,14 @@ import { useNavigate } from 'react-router-dom'; import { useZipDownloadBridge } from '@/features/offline'; -import { usePreviewBridge } from '../hooks/tauriBridge/usePreviewBridge'; -import { useAudioDeviceBridge } from '../hooks/tauriBridge/useAudioDeviceBridge'; -import { useCliBridge } from '../hooks/tauriBridge/useCliBridge'; -import { useTrayIconSync } from '../hooks/tauriBridge/useTrayIconSync'; -import { useInAppKeybindings } from '../hooks/tauriBridge/useInAppKeybindings'; -import { useMediaAndWindowBridge } from '../hooks/tauriBridge/useMediaAndWindowBridge'; -import { usePlayerSnapshotPublisher } from '../hooks/tauriBridge/usePlayerSnapshotPublisher'; -import { useLibraryDevSyncLog } from '../hooks/tauriBridge/useLibraryDevSyncLog'; -import { useCoverArtBridge } from '../hooks/tauriBridge/useCoverArtBridge'; +import { usePreviewBridge } from '@/app/tauriBridge/usePreviewBridge'; +import { useAudioDeviceBridge } from '@/app/tauriBridge/useAudioDeviceBridge'; +import { useCliBridge } from '@/app/tauriBridge/useCliBridge'; +import { useTrayIconSync } from '@/app/tauriBridge/useTrayIconSync'; +import { useInAppKeybindings } from '@/app/tauriBridge/useInAppKeybindings'; +import { useMediaAndWindowBridge } from '@/app/tauriBridge/useMediaAndWindowBridge'; +import { usePlayerSnapshotPublisher } from '@/app/tauriBridge/usePlayerSnapshotPublisher'; +import { useLibraryDevSyncLog } from '@/app/tauriBridge/useLibraryDevSyncLog'; +import { useCoverArtBridge } from '@/app/tauriBridge/useCoverArtBridge'; /** * Single mount point for everything that bridges Rust ↔ React in the main diff --git a/src/hooks/tauriBridge/useAudioDeviceBridge.test.ts b/src/app/tauriBridge/useAudioDeviceBridge.test.ts similarity index 98% rename from src/hooks/tauriBridge/useAudioDeviceBridge.test.ts rename to src/app/tauriBridge/useAudioDeviceBridge.test.ts index 2e58814e..c560924f 100644 --- a/src/hooks/tauriBridge/useAudioDeviceBridge.test.ts +++ b/src/app/tauriBridge/useAudioDeviceBridge.test.ts @@ -19,7 +19,7 @@ import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useAuthStore } from '@/store/authStore'; import { getSeekFallbackVisualTarget, setSeekFallbackVisualTarget } from '@/features/playback/store/seekFallbackState'; import { setIsAudioPaused } from '@/features/playback/store/engineState'; -import { useAudioDeviceBridge } from './useAudioDeviceBridge'; +import { useAudioDeviceBridge } from '@/app/tauriBridge/useAudioDeviceBridge'; const track = makeTrack({ id: 't1', duration: 300 }); diff --git a/src/hooks/tauriBridge/useAudioDeviceBridge.ts b/src/app/tauriBridge/useAudioDeviceBridge.ts similarity index 98% rename from src/hooks/tauriBridge/useAudioDeviceBridge.ts rename to src/app/tauriBridge/useAudioDeviceBridge.ts index 7f679513..fc39162d 100644 --- a/src/hooks/tauriBridge/useAudioDeviceBridge.ts +++ b/src/app/tauriBridge/useAudioDeviceBridge.ts @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { listen } from '@tauri-apps/api/event'; import { usePlayerStore } from '@/features/playback/store/playerStore'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { setSeekFallbackVisualTarget } from '@/features/playback/store/seekFallbackState'; import { getIsAudioPaused } from '@/features/playback/store/engineState'; diff --git a/src/hooks/tauriBridge/useCliBridge.ts b/src/app/tauriBridge/useCliBridge.ts similarity index 97% rename from src/hooks/tauriBridge/useCliBridge.ts rename to src/app/tauriBridge/useCliBridge.ts index 806a0ce8..7917ae19 100644 --- a/src/hooks/tauriBridge/useCliBridge.ts +++ b/src/app/tauriBridge/useCliBridge.ts @@ -5,14 +5,14 @@ import type { NavigateFunction } from 'react-router-dom'; import { getSimilarSongs } from '@/lib/api/subsonicArtists'; import { getMusicFolders } from '@/lib/api/subsonicLibrary'; import { search as subsonicSearch } from '@/lib/api/subsonicSearch'; -import { filterSongsForLuckyMixRatings, getMixMinRatingsConfigFromAuth } from '../../utils/mix/mixRatingFilter'; +import { filterSongsForLuckyMixRatings, getMixMinRatingsConfigFromAuth } from '@/utils/mix/mixRatingFilter'; import { shuffleArray } from '@/lib/util/shuffleArray'; import { songToTrack } from '@/lib/media/songToTrack'; -import { showToast } from '../../utils/ui/toast'; -import { switchActiveServer } from '../../utils/server/switchActiveServer'; +import { showToast } from '@/utils/ui/toast'; +import { switchActiveServer } from '@/utils/server/switchActiveServer'; import i18n from '@/lib/i18n'; import { usePlayerStore } from '@/features/playback/store/playerStore'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { executeCliPlayerCommand } from '@/config/shortcutActions'; /** The full `cli:*` listener surface forwarded from the Rust single-instance diff --git a/src/hooks/tauriBridge/useCoverArtBridge.ts b/src/app/tauriBridge/useCoverArtBridge.ts similarity index 87% rename from src/hooks/tauriBridge/useCoverArtBridge.ts rename to src/app/tauriBridge/useCoverArtBridge.ts index 116c83a4..dc188afe 100644 --- a/src/hooks/tauriBridge/useCoverArtBridge.ts +++ b/src/app/tauriBridge/useCoverArtBridge.ts @@ -4,12 +4,12 @@ import { clearAllDiskSrcCache, forgetDiskSrcForServer, forgetDiskSrcPrefix, -} from '../../cover/diskSrcCache'; -import { rememberDiskSrcLadder } from '../../cover/diskSrcLookup'; -import { notifyCoverDiskReady } from '../../cover/diskHandoff'; -import { invalidateCacheKey } from '../../utils/imageCache'; -import { COVER_ART_TIERS } from '../../cover/tiers'; -import type { CoverArtTier, CoverCacheKind } from '../../cover/types'; +} from '@/cover/diskSrcCache'; +import { rememberDiskSrcLadder } from '@/cover/diskSrcLookup'; +import { notifyCoverDiskReady } from '@/cover/diskHandoff'; +import { invalidateCacheKey } from '@/utils/imageCache'; +import { COVER_ART_TIERS } from '@/cover/tiers'; +import type { CoverArtTier, CoverCacheKind } from '@/cover/types'; type CoverTierReadyPayload = { serverIndexKey: string; diff --git a/src/hooks/tauriBridge/useInAppKeybindings.ts b/src/app/tauriBridge/useInAppKeybindings.ts similarity index 87% rename from src/hooks/tauriBridge/useInAppKeybindings.ts rename to src/app/tauriBridge/useInAppKeybindings.ts index 7f6cb6a8..c9844713 100644 --- a/src/hooks/tauriBridge/useInAppKeybindings.ts +++ b/src/app/tauriBridge/useInAppKeybindings.ts @@ -1,9 +1,9 @@ import { useEffect } from 'react'; import type { NavigateFunction } from 'react-router-dom'; -import { useKeybindingsStore, buildInAppBinding } from '../../store/keybindingsStore'; -import { useGlobalShortcutsStore } from '../../store/globalShortcutsStore'; +import { useKeybindingsStore, buildInAppBinding } from '@/store/keybindingsStore'; +import { useGlobalShortcutsStore } from '@/store/globalShortcutsStore'; import { DEFAULT_IN_APP_BINDINGS, executeRuntimeAction } from '@/config/shortcutActions'; -import { matchInAppShortcutAction } from '../../shortcuts/runtime'; +import { matchInAppShortcutAction } from '@/shortcuts/runtime'; /** Configurable in-app keybindings: matches keydown chords against the user's * bindings, skipping chords claimed by a registered global shortcut. */ diff --git a/src/hooks/tauriBridge/useLibraryDevSyncLog.ts b/src/app/tauriBridge/useLibraryDevSyncLog.ts similarity index 98% rename from src/hooks/tauriBridge/useLibraryDevSyncLog.ts rename to src/app/tauriBridge/useLibraryDevSyncLog.ts index e481f9cd..c3c70aa9 100644 --- a/src/hooks/tauriBridge/useLibraryDevSyncLog.ts +++ b/src/app/tauriBridge/useLibraryDevSyncLog.ts @@ -1,5 +1,5 @@ import { useEffect } from 'react'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { libraryGetStatus, libraryGetPlaybackHint, diff --git a/src/hooks/tauriBridge/useMediaAndWindowBridge.ts b/src/app/tauriBridge/useMediaAndWindowBridge.ts similarity index 99% rename from src/hooks/tauriBridge/useMediaAndWindowBridge.ts rename to src/app/tauriBridge/useMediaAndWindowBridge.ts index f79c5817..d4b190b0 100644 --- a/src/hooks/tauriBridge/useMediaAndWindowBridge.ts +++ b/src/app/tauriBridge/useMediaAndWindowBridge.ts @@ -8,7 +8,7 @@ import { playListenSessionFinalize } from '@/features/playback/store/playListenS import { playbackReportStopped } from '@/features/playback/store/playbackReportSession'; import { getPlaybackProgressSnapshot } from '@/features/playback/store/playbackProgress'; import { usePlayerStore } from '@/features/playback/store/playerStore'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { useOrbitStore } from '@/features/orbit'; import { endOrbitSession, leaveOrbitSession } from '@/features/orbit'; import { diff --git a/src/hooks/tauriBridge/usePlayerSnapshotPublisher.ts b/src/app/tauriBridge/usePlayerSnapshotPublisher.ts similarity index 98% rename from src/hooks/tauriBridge/usePlayerSnapshotPublisher.ts rename to src/app/tauriBridge/usePlayerSnapshotPublisher.ts index 17aceab8..47b6a3e5 100644 --- a/src/hooks/tauriBridge/usePlayerSnapshotPublisher.ts +++ b/src/app/tauriBridge/usePlayerSnapshotPublisher.ts @@ -2,7 +2,7 @@ import { useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; import { getPlaybackProgressSnapshot } from '@/features/playback/store/playbackProgress'; import { usePlayerStore } from '@/features/playback/store/playerStore'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; import { resolveQueueTrack } from '@/features/playback/store/queueTrackView'; /** Half-width of the CLI snapshot queue window (thin-state — like the mini diff --git a/src/hooks/tauriBridge/usePreviewBridge.ts b/src/app/tauriBridge/usePreviewBridge.ts similarity index 100% rename from src/hooks/tauriBridge/usePreviewBridge.ts rename to src/app/tauriBridge/usePreviewBridge.ts diff --git a/src/hooks/tauriBridge/useTrayIconSync.ts b/src/app/tauriBridge/useTrayIconSync.ts similarity index 89% rename from src/hooks/tauriBridge/useTrayIconSync.ts rename to src/app/tauriBridge/useTrayIconSync.ts index 6c994a2f..c0bd1ba8 100644 --- a/src/hooks/tauriBridge/useTrayIconSync.ts +++ b/src/app/tauriBridge/useTrayIconSync.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import { invoke } from '@tauri-apps/api/core'; -import { useAuthStore } from '../../store/authStore'; +import { useAuthStore } from '@/store/authStore'; /** Sync tray-icon visibility with the user's stored setting. Runs once on mount * (initial sync) and again whenever the setting changes. */