mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
refactor(components): co-locate feature-specific components (HostApprovalQueue->orbit, Playback{Delay,Schedule}->playback, LicensesPanel->settings)
This commit is contained in:
@@ -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({
|
||||||
|
|||||||
+1
-1
@@ -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;
|
||||||
+2
-2
@@ -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,
|
||||||
+1
-1
@@ -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';
|
||||||
|
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
+2
-2
@@ -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';
|
||||||
|
|||||||
Reference in New Issue
Block a user