refactor(playback): co-locate player bar UI (PlayerBar + playerBar/* + PlaybackBufferingOverlay) into features/playback/components

This commit is contained in:
Psychotoxical
2026-06-30 18:37:06 +02:00
parent 5cb5cf1d24
commit 5c3a135040
13 changed files with 40 additions and 40 deletions
+1 -1
View File
@@ -6,7 +6,7 @@ import { getCurrentWebview } from '@tauri-apps/api/webview';
import { PanelRight } from 'lucide-react';
import { useTranslation } from 'react-i18next';
import Sidebar from '@/features/sidebar';
import PlayerBar from '../components/PlayerBar';
import PlayerBar from '@/features/playback/components/PlayerBar';
import BottomNav from '../components/BottomNav';
import { useIsMobile } from '@/lib/hooks/useIsMobile';
import { LiveSearch } from '@/features/search';
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest';
import { screen } from '@testing-library/react';
import { renderWithProviders } from '@/test/helpers/renderWithProviders';
import { PlaybackBufferingOverlay } from './PlaybackBufferingOverlay';
import { PlaybackBufferingOverlay } from '@/features/playback/components/PlaybackBufferingOverlay';
describe('PlaybackBufferingOverlay', () => {
it('exposes buffering status for assistive tech', () => {
@@ -37,7 +37,7 @@ vi.mock('@/lib/api/subsonic', () => ({
}));
import PlayerBar from './PlayerBar';
import PlayerBar from '@/features/playback/components/PlayerBar';
import { renderWithProviders } from '@/test/helpers/renderWithProviders';
import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useAuthStore } from '@/store/authStore';
@@ -1,6 +1,6 @@
import { queueSongStar } from '@/features/playback/store/pendingStarSync';
import { coverArtIdFromRadio } from '../cover/ids';
import { resolvePlaybackTrackCoverArtId } from '../cover/resolveCoverArtId';
import { coverArtIdFromRadio } from '@/cover/ids';
import { resolvePlaybackTrackCoverArtId } from '@/cover/resolveCoverArtId';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { createPortal } from 'react-dom';
import {
@@ -10,32 +10,32 @@ import {
import { invoke } from '@tauri-apps/api/core';
import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useShallow } from 'zustand/react/shallow';
import { useAuthStore } from '../store/authStore';
import { useThemeStore } from '../store/themeStore';
import { useAuthStore } from '@/store/authStore';
import { useThemeStore } from '@/store/themeStore';
import { Equalizer } from '@/features/equalizer';
import { useTranslation } from 'react-i18next';
import { usePlaybackLibraryNavigate } from '../hooks/usePlaybackLibraryNavigate';
import { usePlaybackLibraryNavigate } from '@/hooks/usePlaybackLibraryNavigate';
import { useRadioMetadata } from '@/features/radio';
import { useRadioMprisSync } from '@/features/radio';
import { usePlaybackDelayPress } from '../hooks/usePlaybackDelayPress';
import PlaybackDelayModal from './PlaybackDelayModal';
import { usePlaybackScheduleRemaining } from '../utils/format/playbackScheduleFormat';
import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress';
import PlaybackDelayModal from '@/components/PlaybackDelayModal';
import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
import { usePreviewStore } from '@/features/playback/store/previewStore';
import { usePerfProbeFlags } from '../utils/perf/perfFlags';
import { usePerfProbeFlags } from '@/utils/perf/perfFlags';
import { coerceOpenArtistRefs } from '@/lib/api/openArtistRefs';
import { resolveTrackArtistRefs } from '@/features/playback/utils/playback/trackArtistRefs';
import { PlayerTrackInfo } from './playerBar/PlayerTrackInfo';
import { PlayerTransportControls } from './playerBar/PlayerTransportControls';
import { PlayerSeekbarSection } from './playerBar/PlayerSeekbarSection';
import { PlayerPlaybackRate } from './playerBar/PlayerPlaybackRate';
import { PlayerVolume } from './playerBar/PlayerVolume';
import { PlayerOverflowMenu } from './playerBar/PlayerOverflowMenu';
import { useFloatingPlayerBar } from '../hooks/useFloatingPlayerBar';
import { useUtilityOverflowMenu } from '../hooks/useUtilityOverflowMenu';
import { PlayerTrackInfo } from '@/features/playback/components/playerBar/PlayerTrackInfo';
import { PlayerTransportControls } from '@/features/playback/components/playerBar/PlayerTransportControls';
import { PlayerSeekbarSection } from '@/features/playback/components/playerBar/PlayerSeekbarSection';
import { PlayerPlaybackRate } from '@/features/playback/components/playerBar/PlayerPlaybackRate';
import { PlayerVolume } from '@/features/playback/components/playerBar/PlayerVolume';
import { PlayerOverflowMenu } from '@/features/playback/components/playerBar/PlayerOverflowMenu';
import { useFloatingPlayerBar } from '@/hooks/useFloatingPlayerBar';
import { useUtilityOverflowMenu } from '@/hooks/useUtilityOverflowMenu';
import {
usePlayerBarLayoutStore,
type PlayerBarLayoutItemId,
} from '../store/playerBarLayoutStore';
} from '@/store/playerBarLayoutStore';
export default function PlayerBar() {
const { t } = useTranslation();
@@ -3,12 +3,12 @@ import { createPortal } from 'react-dom';
import { PictureInPicture2, SlidersVertical } from 'lucide-react';
import { invoke } from '@tauri-apps/api/core';
import type { TFunction } from 'i18next';
import { PlayerVolume } from './PlayerVolume';
import { PlayerPlaybackRateMenuSection } from './PlayerPlaybackRate';
import { PlayerVolume } from '@/features/playback/components/playerBar/PlayerVolume';
import { PlayerPlaybackRateMenuSection } from '@/features/playback/components/playerBar/PlayerPlaybackRate';
import {
usePlayerBarLayoutStore,
type PlayerBarLayoutItemId,
} from '../../store/playerBarLayoutStore';
} from '@/store/playerBarLayoutStore';
interface Props {
utilityMenuRef: React.RefObject<HTMLDivElement | null>;
@@ -15,7 +15,7 @@ import {
varispeedSpeedFromSemitones,
} from '@/features/playback/utils/audio/playbackRateHelpers';
import { isOrbitPlaybackSyncActive } from '@/features/orbit';
import { usePlayerBarAnchoredPopover } from '../../hooks/usePlayerBarAnchoredPopover';
import { usePlayerBarAnchoredPopover } from '@/hooks/usePlayerBarAnchoredPopover';
const POPOVER_WIDTH = 320;
@@ -1,10 +1,10 @@
import { ArrowLeftRight } from 'lucide-react';
import type { TFunction } from 'i18next';
import type { RadioMetadata } from '@/features/radio';
import { useThemeStore } from '../../store/themeStore';
import { useThemeStore } from '@/store/themeStore';
import { formatTrackTime, playbarMinuteFieldWidth } from '@/lib/format/formatDuration';
import { WaveformSeek } from '@/features/waveform';
import { PlaybackTime, ToggleClock } from './PlaybackClock';
import { PlaybackTime, ToggleClock } from '@/features/playback/components/playerBar/PlaybackClock';
interface Props {
isRadio: boolean;
@@ -6,22 +6,22 @@ import type { Track } from '@/lib/media/trackTypes';
import type { PlayerState } from '@/features/playback/store/playerStoreTypes';
import type { RadioMetadata } from '@/features/radio';
import type { PreviewingTrack } from '@/features/playback/store/previewStore';
import { CoverArtImage } from '../../cover/CoverArtImage';
import { albumCoverRef } from '../../cover/ref';
import { useAlbumCoverRef } from '../../cover/useLibraryCoverRef';
import { usePlaybackTrackCoverRef } from '../../cover/useLibraryCoverRef';
import { CoverArtImage } from '@/cover/CoverArtImage';
import { albumCoverRef } from '@/cover/ref';
import { useAlbumCoverRef } from '@/cover/useLibraryCoverRef';
import { usePlaybackTrackCoverRef } from '@/cover/useLibraryCoverRef';
import MarqueeText from '@/ui/MarqueeText';
import { OpenArtistRefInline } from '@/features/artist';
import StarRating from '@/ui/StarRating';
import { PlaybackBufferingOverlay } from '../playback/PlaybackBufferingOverlay';
import { PlaybackBufferingOverlay } from '@/features/playback/components/PlaybackBufferingOverlay';
import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useEnrichmentPrimaryLabel } from '../../hooks/useEnrichmentPrimaryLabel';
import { useEnrichmentPrimaryIcon } from '../../hooks/useEnrichmentPrimaryIcon';
import { renderPresetIcon } from '../settings/musicNetwork/presetIcon';
import { useEnrichmentPrimaryLabel } from '@/hooks/useEnrichmentPrimaryLabel';
import { useEnrichmentPrimaryIcon } from '@/hooks/useEnrichmentPrimaryIcon';
import { renderPresetIcon } from '@/components/settings/musicNetwork/presetIcon';
import {
usePlayerBarLayoutStore,
type PlayerBarLayoutItemId,
} from '../../store/playerBarLayoutStore';
} from '@/store/playerBarLayoutStore';
import { useOfflineBrowseContext } from '@/features/offline';
import { offlineActionPolicy } from '@/features/offline';
@@ -5,9 +5,9 @@ import type { TFunction } from 'i18next';
import type { PlayerState } from '@/features/playback/store/playerStoreTypes';
import { useAutodjTransitionUi } from '@/features/playback/store/autodjTransitionUi';
import { usePreviewStore } from '@/features/playback/store/previewStore';
import PlaybackScheduleBadge from '../PlaybackScheduleBadge';
import { usePlaybackDelayPress } from '../../hooks/usePlaybackDelayPress';
import { usePlaybackScheduleRemaining } from '../../utils/format/playbackScheduleFormat';
import PlaybackScheduleBadge from '@/components/PlaybackScheduleBadge';
import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress';
import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
type RepeatMode = PlayerState['repeatMode'];
type PlayPauseBind = ReturnType<typeof usePlaybackDelayPress>['playPauseBind'];
@@ -13,7 +13,7 @@ import { effectiveLoudnessPreAnalysisAttenuationDb } from '@/utils/audio/loudnes
import { formatQueueBpmTech, formatQueueMoodLabels } from '@/lib/library/trackEnrichment';
import { useQueueTrackEnrichment } from '@/features/queue/hooks/useQueueTrackEnrichment';
import { QueueLufsTargetMenu } from '@/features/queue/components/QueueLufsTargetMenu';
import { PlaybackBufferingOverlay } from '@/components/playback/PlaybackBufferingOverlay';
import { PlaybackBufferingOverlay } from '@/features/playback/components/PlaybackBufferingOverlay';
import { CoverArtImage } from '@/cover/CoverArtImage';
import { OpenArtistRefInline } from '@/features/artist';
import { usePlaybackTrackCoverRef } from '@/cover/useLibraryCoverRef';