refactor(components): co-locate feature-specific components (HostApprovalQueue->orbit, Playback{Delay,Schedule}->playback, LicensesPanel->settings)

This commit is contained in:
Psychotoxical
2026-06-30 18:55:48 +02:00
parent 9eee4eed5b
commit d876781fcb
10 changed files with 14 additions and 14 deletions
+2 -2
View File
@@ -24,8 +24,8 @@ import {
} from '@/features/playback/store/queueTrackResolver'; } from '@/features/playback/store/queueTrackResolver';
import LyricsPane from './LyricsPane'; import LyricsPane from './LyricsPane';
import { usePlaybackDelayPress } from '../hooks/usePlaybackDelayPress'; import { usePlaybackDelayPress } from '../hooks/usePlaybackDelayPress';
import PlaybackDelayModal from './PlaybackDelayModal'; import PlaybackDelayModal from '@/features/playback/components/PlaybackDelayModal';
import PlaybackScheduleBadge from './PlaybackScheduleBadge'; import PlaybackScheduleBadge from '@/features/playback/components/PlaybackScheduleBadge';
import { usePlaybackScheduleRemaining } from '../utils/format/playbackScheduleFormat'; import { usePlaybackScheduleRemaining } from '../utils/format/playbackScheduleFormat';
// ── Color extraction ────────────────────────────────────────────────────────── // ── Color extraction ──────────────────────────────────────────────────────────
@@ -4,8 +4,8 @@ import { useTranslation } from 'react-i18next';
import { usePlayerStore } from '@/features/playback/store/playerStore'; import { usePlayerStore } from '@/features/playback/store/playerStore';
import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress'; import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress';
import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat'; import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
import PlaybackDelayModal from '@/components/PlaybackDelayModal'; import PlaybackDelayModal from '@/features/playback/components/PlaybackDelayModal';
import PlaybackScheduleBadge from '@/components/PlaybackScheduleBadge'; import PlaybackScheduleBadge from '@/features/playback/components/PlaybackScheduleBadge';
// Play/Pause button (isolated — subscribes to isPlaying only). // Play/Pause button (isolated — subscribes to isPlaying only).
export const FsPlayBtn = memo(function FsPlayBtn({ export const FsPlayBtn = memo(function FsPlayBtn({
@@ -9,7 +9,7 @@ import {
declineOrbitSuggestion, declineOrbitSuggestion,
suggestionKey, suggestionKey,
} from '@/features/orbit'; } from '@/features/orbit';
import { TrackCoverArtImage } from '../cover/TrackCoverArtImage'; import { TrackCoverArtImage } from '@/cover/TrackCoverArtImage';
import { ORBIT_DEFAULT_SETTINGS } from '@/features/orbit'; import { ORBIT_DEFAULT_SETTINGS } from '@/features/orbit';
const HOST_APPROVAL_COVER_CSS_PX = 36; const HOST_APPROVAL_COVER_CSS_PX = 36;
@@ -3,11 +3,11 @@ import { createPortal } from 'react-dom';
import { X, Moon, Sunrise } from 'lucide-react'; import { X, Moon, Sunrise } from 'lucide-react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { usePlayerStore } from '@/features/playback/store/playerStore'; import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useAuthStore } from '../store/authStore'; import { useAuthStore } from '@/store/authStore';
import { useShallow } from 'zustand/react/shallow'; import { useShallow } from 'zustand/react/shallow';
import type { TFunction } from 'i18next'; import type { TFunction } from 'i18next';
import { formatPlaybackScheduleRemaining } from '../utils/format/playbackScheduleFormat'; import { formatPlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
import { formatClockTime } from '@/lib/format/formatClockTime'; import { formatClockTime } from '@/lib/format/formatClockTime';
import { import {
isValidPlaybackSchedulePreviewTimestamp, isValidPlaybackSchedulePreviewTimestamp,
@@ -3,7 +3,7 @@ import { createPortal } from 'react-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { usePlayerStore } from '@/features/playback/store/playerStore'; import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useShallow } from 'zustand/react/shallow'; import { useShallow } from 'zustand/react/shallow';
import { formatPlaybackScheduleRemaining } from '../utils/format/playbackScheduleFormat'; import { formatPlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
import { useWindowVisibility } from '@/lib/hooks/useWindowVisibility'; import { useWindowVisibility } from '@/lib/hooks/useWindowVisibility';
export interface PlaybackScheduleBadgeProps { export interface PlaybackScheduleBadgeProps {
@@ -18,7 +18,7 @@ import { usePlaybackLibraryNavigate } from '@/hooks/usePlaybackLibraryNavigate';
import { useRadioMetadata } from '@/features/radio'; import { useRadioMetadata } from '@/features/radio';
import { useRadioMprisSync } from '@/features/radio'; import { useRadioMprisSync } from '@/features/radio';
import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress'; import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress';
import PlaybackDelayModal from '@/components/PlaybackDelayModal'; import PlaybackDelayModal from '@/features/playback/components/PlaybackDelayModal';
import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat'; import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
import { usePreviewStore } from '@/features/playback/store/previewStore'; import { usePreviewStore } from '@/features/playback/store/previewStore';
import { usePerfProbeFlags } from '@/utils/perf/perfFlags'; import { usePerfProbeFlags } from '@/utils/perf/perfFlags';
@@ -5,7 +5,7 @@ import type { TFunction } from 'i18next';
import type { PlayerState } from '@/features/playback/store/playerStoreTypes'; import type { PlayerState } from '@/features/playback/store/playerStoreTypes';
import { useAutodjTransitionUi } from '@/features/playback/store/autodjTransitionUi'; import { useAutodjTransitionUi } from '@/features/playback/store/autodjTransitionUi';
import { usePreviewStore } from '@/features/playback/store/previewStore'; import { usePreviewStore } from '@/features/playback/store/previewStore';
import PlaybackScheduleBadge from '@/components/PlaybackScheduleBadge'; import PlaybackScheduleBadge from '@/features/playback/components/PlaybackScheduleBadge';
import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress'; import { usePlaybackDelayPress } from '@/hooks/usePlaybackDelayPress';
import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat'; import { usePlaybackScheduleRemaining } from '@/utils/format/playbackScheduleFormat';
+1 -1
View File
@@ -7,7 +7,7 @@ import { useState, useRef, useMemo } from 'react';
import { usePlayerStore } from '@/features/playback/store/playerStore'; import { usePlayerStore } from '@/features/playback/store/playerStore';
import { useOrbitStore } from '@/features/orbit'; import { useOrbitStore } from '@/features/orbit';
import { OrbitGuestQueue, OrbitQueueHead } from '@/features/orbit'; import { OrbitGuestQueue, OrbitQueueHead } from '@/features/orbit';
import HostApprovalQueue from '@/components/HostApprovalQueue'; import HostApprovalQueue from '@/features/orbit/components/HostApprovalQueue';
import { usePlaylistStore } from '@/features/playlist'; import { usePlaylistStore } from '@/features/playlist';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { usePlaybackLibraryNavigate } from '@/hooks/usePlaybackLibraryNavigate'; import { usePlaybackLibraryNavigate } from '@/hooks/usePlaybackLibraryNavigate';
@@ -8,8 +8,8 @@ import {
loadLicensesData, loadLicensesData,
type LicenseEntry, type LicenseEntry,
type LicensesData, type LicensesData,
} from '../utils/licensesData'; } from '@/utils/licensesData';
import LicenseTextModal from './LicenseTextModal'; import LicenseTextModal from '@/components/LicenseTextModal';
const ROW_HEIGHT = 56; const ROW_HEIGHT = 56;
@@ -13,7 +13,7 @@ import { IS_LINUX } from '@/lib/util/platform';
import { showToast } from '@/utils/ui/toast'; import { showToast } from '@/utils/ui/toast';
import { AboutPsysonicBrandHeader } from '@/components/AboutPsysonicLol'; import { AboutPsysonicBrandHeader } from '@/components/AboutPsysonicLol';
import CustomSelect from '@/ui/CustomSelect'; import CustomSelect from '@/ui/CustomSelect';
import LicensesPanel from '@/components/LicensesPanel'; import LicensesPanel from '@/features/settings/components/LicensesPanel';
import SettingsSubSection from '@/features/settings/components/SettingsSubSection'; import SettingsSubSection from '@/features/settings/components/SettingsSubSection';
import { SettingsGroup } from '@/features/settings/components/SettingsGroup'; import { SettingsGroup } from '@/features/settings/components/SettingsGroup';
import { SettingsToggle } from '@/features/settings/components/SettingsToggle'; import { SettingsToggle } from '@/features/settings/components/SettingsToggle';