refactor(app): move app-shell chrome into app/ (TitleBar, ConnectionIndicator, ErrorBoundary, AppShellQueueResizerSeam, dev overlays + PerfOverlaySparkline)

This commit is contained in:
Psychotoxical
2026-06-30 19:04:37 +02:00
parent d876781fcb
commit ba9e0d6541
11 changed files with 37 additions and 37 deletions
+4 -4
View File
@@ -10,7 +10,7 @@ import PlayerBar from '@/features/playback/components/PlayerBar';
import BottomNav from '../components/BottomNav';
import { useIsMobile } from '@/lib/hooks/useIsMobile';
import { LiveSearch } from '@/features/search';
import DevNetworkModeToggle from '../components/DevNetworkModeToggle';
import DevNetworkModeToggle from '@/app/DevNetworkModeToggle';
import { NowPlayingDropdown } from '@/features/nowPlaying';
import QueuePanel from '@/features/queue';
import AppRoutes from './AppRoutes';
@@ -27,11 +27,11 @@ import {
APP_MAIN_SCROLL_VIEWPORT_ID,
mainRouteInpageScrollViewportId,
} from '../constants/appScroll';
import ConnectionIndicator from '../components/ConnectionIndicator';
import ConnectionIndicator from '@/app/ConnectionIndicator';
import MusicNetworkIndicator from '../components/MusicNetworkIndicator';
import { OfflineBanner } from '@/features/offline';
import AppUpdater from '../components/AppUpdater';
import TitleBar from '../components/TitleBar';
import TitleBar from '@/app/TitleBar';
import { OrbitSessionBar, OrbitStartTrigger } from '@/features/orbit';
import { useOrbitHost } from '@/features/orbit';
import { useOrbitGuest } from '@/features/orbit';
@@ -53,7 +53,7 @@ import { useLiveSearchRouteScope } from '@/features/search';
import { useNowPlayingPrewarm } from '@/features/nowPlaying';
import { useOfflineAutoNav } from '@/features/offline';
import { useOfflineLibraryFilterSuspend } from '@/features/offline';
import { AppShellQueueResizerSeam } from '../components/AppShellQueueResizerSeam';
import { AppShellQueueResizerSeam } from '@/app/AppShellQueueResizerSeam';
import { IS_LINUX, IS_MACOS } from '@/lib/util/platform';
import { useConnectionStatus } from '../hooks/useConnectionStatus';
import { useIdlePlayQueuePull } from '../hooks/useIdlePlayQueuePull';
@@ -1,7 +1,7 @@
import React from 'react';
import type { TFunction } from 'i18next';
import { PanelRight, PanelRightClose } from 'lucide-react';
import { shouldSuppressQueueResizerMouseDown } from '../utils/componentHelpers/appShellHelpers';
import { shouldSuppressQueueResizerMouseDown } from '@/utils/componentHelpers/appShellHelpers';
interface Props {
isQueueVisible: boolean;
@@ -4,13 +4,13 @@ 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 { usePlayQueueSyncLedState } from '../hooks/usePlayQueueSyncLedState';
import type { ServerProfile } from '../store/authStoreTypes';
import { useAuthStore } from '../store/authStore';
import { switchActiveServer } from '../utils/server/switchActiveServer';
import { showToast } from '../utils/ui/toast';
import { serverListDisplayLabel } from '../utils/server/serverDisplayName';
import type { ConnectionStatus } from '@/hooks/useConnectionStatus';
import { usePlayQueueSyncLedState } from '@/hooks/usePlayQueueSyncLedState';
import type { ServerProfile } from '@/store/authStoreTypes';
import { useAuthStore } from '@/store/authStore';
import { switchActiveServer } from '@/utils/server/switchActiveServer';
import { showToast } from '@/utils/ui/toast';
import { serverListDisplayLabel } from '@/utils/server/serverDisplayName';
interface Props {
status: ConnectionStatus;
@@ -1,38 +1,38 @@
import { useEffect, useMemo, useState, type CSSProperties } from 'react';
import { createPortal } from 'react-dom';
import { analysisGetPipelineQueueStats, type AnalysisPipelineQueueStatsDto } from '../api/analysis';
import { coverGetPipelineQueueStats, type CoverPipelineQueueStatsDto } from '../api/coverCache';
import { coverEnsureQueueStats } from '../cover/ensureQueue';
import { coverPeekQueueStats } from '../cover/peekQueue';
import PerfOverlaySparkline from './perf/PerfOverlaySparkline';
import { usePerfProbeFlags } from '../utils/perf/perfFlags';
import { analysisGetPipelineQueueStats, type AnalysisPipelineQueueStatsDto } from '@/api/analysis';
import { coverGetPipelineQueueStats, type CoverPipelineQueueStatsDto } from '@/api/coverCache';
import { coverEnsureQueueStats } from '@/cover/ensureQueue';
import { coverPeekQueueStats } from '@/cover/peekQueue';
import PerfOverlaySparkline from '@/app/PerfOverlaySparkline';
import { usePerfProbeFlags } from '@/utils/perf/perfFlags';
import {
formatPerfMs,
getAnalysisTracksPerMinute,
useAnalysisPerfLast,
} from '../utils/perf/analysisPerfStore';
import { formatAnalysisPipelineQueueOverlay } from '../utils/perf/formatAnalysisQueueStats';
import { formatCoverPipelineQueueOverlay } from '../utils/perf/formatCoverPipelineQueueOverlay';
} from '@/utils/perf/analysisPerfStore';
import { formatAnalysisPipelineQueueOverlay } from '@/utils/perf/formatAnalysisQueueStats';
import { formatCoverPipelineQueueOverlay } from '@/utils/perf/formatCoverPipelineQueueOverlay';
import {
buildLiveOverlayItems,
type LiveOverlayItem,
} from '../utils/perf/formatLiveOverlayItems';
} from '@/utils/perf/formatLiveOverlayItems';
import {
getPerfLiveHistorySamples,
} from '../utils/perf/perfLiveHistory';
import { usePerfLiveSnapshot } from '../utils/perf/perfLiveStore';
import { usePerfLiveOverlayPins } from '../utils/perf/perfOverlayPins';
} from '@/utils/perf/perfLiveHistory';
import { usePerfLiveSnapshot } from '@/utils/perf/perfLiveStore';
import { usePerfLiveOverlayPins } from '@/utils/perf/perfOverlayPins';
import {
perfOverlayCornerClass,
usePerfOverlayAppearance,
} from '../utils/perf/perfOverlayAppearance';
} from '@/utils/perf/perfOverlayAppearance';
import {
resolveOverlayVisibility,
usePerfOverlayMode,
} from '../utils/perf/perfOverlayMode';
import { useAnalysisPerfListener } from '../hooks/useAnalysisPerfListener';
import { useCoverPerfListener } from '../hooks/useCoverPerfListener';
import { getCoverCachedPerMinute, getCoverUiPerMinute } from '../utils/perf/coverPerfStore';
} from '@/utils/perf/perfOverlayMode';
import { useAnalysisPerfListener } from '@/hooks/useAnalysisPerfListener';
import { useCoverPerfListener } from '@/hooks/useCoverPerfListener';
import { getCoverCachedPerMinute, getCoverUiPerMinute } from '@/utils/perf/coverPerfStore';
const SAMPLE_MS = 500;
const TPM_REFRESH_MS = 500;
+2 -2
View File
@@ -9,7 +9,7 @@ import { DragDropProvider } from '@/lib/dnd/DragDropContext';
import PasteClipboardHandler from '../components/PasteClipboardHandler';
import ExportPickerModal from '../components/ExportPickerModal';
import { ZipDownloadOverlay } from '@/features/offline';
import FpsOverlay from '../components/FpsOverlay';
import FpsOverlay from '@/app/FpsOverlay';
import { useAuthStore } from '../store/authStore';
import { useLibraryIndexStore } from '../store/libraryIndexStore';
import { useGlobalShortcutsStore } from '../store/globalShortcutsStore';
@@ -33,7 +33,7 @@ import { useMigrationOrchestrator } from '../hooks/useMigrationOrchestrator';
import { IS_WINDOWS } from '@/lib/util/platform';
import TauriEventBridge from './TauriEventBridge';
import AppShell from './AppShell';
import ErrorBoundary from '../components/ErrorBoundary';
import ErrorBoundary from '@/app/ErrorBoundary';
import BlockingMigrationGate from './BlockingMigrationGate';
import RequireAuth from './RequireAuth';
import { useMigrationStore } from '../store/migrationStore';
+1 -1
View File
@@ -31,7 +31,7 @@ vi.mock('@/lib/i18n', () => ({
vi.mock('@/features/miniPlayer', () => ({ default: () => <div data-testid="mini-player" /> }));
vi.mock('../components/GlobalConfirmModal', () => ({ default: () => <div data-testid="confirm-modal" /> }));
vi.mock('@/ui/TooltipPortal', () => ({ default: () => <div data-testid="tooltip-portal" /> }));
vi.mock('../components/FpsOverlay', () => ({ default: () => <div data-testid="fps-overlay" /> }));
vi.mock('@/app/FpsOverlay', () => ({ default: () => <div data-testid="fps-overlay" /> }));
vi.mock('@/lib/dnd/DragDropContext', () => ({
DragDropProvider: ({ children }: { children: React.ReactNode }) => <>{children}</>,
}));
+1 -1
View File
@@ -3,7 +3,7 @@ import { DragDropProvider } from '@/lib/dnd/DragDropContext';
import MiniPlayer from '@/features/miniPlayer';
import GlobalConfirmModal from '../components/GlobalConfirmModal';
import TooltipPortal from '@/ui/TooltipPortal';
import FpsOverlay from '../components/FpsOverlay';
import FpsOverlay from '@/app/FpsOverlay';
import { useThemeStore } from '../store/themeStore';
import { useFontStore } from '../store/fontStore';
import { useKeybindingsStore } from '../store/keybindingsStore';
@@ -1,6 +1,6 @@
import { useMemo, useRef } from 'react';
import type { PerfLiveSample } from '../../utils/perf/perfLiveHistory';
import { PERF_LIVE_HISTORY_MS } from '../../utils/perf/perfLiveHistory';
import type { PerfLiveSample } from '@/utils/perf/perfLiveHistory';
import { PERF_LIVE_HISTORY_MS } from '@/utils/perf/perfLiveHistory';
type SparklineKind = 'cpu' | 'memory';
@@ -2,7 +2,7 @@ import React from 'react';
import { getCurrentWindow } from '@tauri-apps/api/window';
import { Minus, Square, X } from 'lucide-react';
import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useAuthStore } from '../store/authStore';
import { useAuthStore } from '@/store/authStore';
import { IS_MACOS } from '@/lib/util/platform';
export default function TitleBar() {