From 5cb5cf1d24e11dd9334affdff32b822e25c02b63 Mon Sep 17 00:00:00 2001 From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com> Date: Tue, 30 Jun 2026 18:34:11 +0200 Subject: [PATCH] refactor(equalizer): co-locate equalizer UI into features/equalizer (eqStore/eqCurve stay audio-core) --- src/components/PlayerBar.tsx | 2 +- .../equalizer/components}/AutoEqSection.tsx | 2 +- .../equalizer}/components/Equalizer.test.tsx | 6 +++--- src/{ => features/equalizer}/components/Equalizer.tsx | 8 ++++---- .../equalizer/components}/VerticalFader.tsx | 0 src/{ => features/equalizer}/hooks/useAutoEq.ts | 2 +- src/features/equalizer/index.ts | 10 ++++++++++ src/features/settings/components/AudioTab.tsx | 2 +- 8 files changed, 21 insertions(+), 11 deletions(-) rename src/{components/equalizer => features/equalizer/components}/AutoEqSection.tsx (97%) rename src/{ => features/equalizer}/components/Equalizer.test.tsx (90%) rename src/{ => features/equalizer}/components/Equalizer.tsx (96%) rename src/{components/equalizer => features/equalizer/components}/VerticalFader.tsx (100%) rename src/{ => features/equalizer}/hooks/useAutoEq.ts (98%) create mode 100644 src/features/equalizer/index.ts diff --git a/src/components/PlayerBar.tsx b/src/components/PlayerBar.tsx index 344e712c..641a9e9c 100644 --- a/src/components/PlayerBar.tsx +++ b/src/components/PlayerBar.tsx @@ -12,7 +12,7 @@ import { usePlayerStore } from '@/features/playback/store/playerStore'; import { useShallow } from 'zustand/react/shallow'; import { useAuthStore } from '../store/authStore'; import { useThemeStore } from '../store/themeStore'; -import Equalizer from './Equalizer'; +import { Equalizer } from '@/features/equalizer'; import { useTranslation } from 'react-i18next'; import { usePlaybackLibraryNavigate } from '../hooks/usePlaybackLibraryNavigate'; import { useRadioMetadata } from '@/features/radio'; diff --git a/src/components/equalizer/AutoEqSection.tsx b/src/features/equalizer/components/AutoEqSection.tsx similarity index 97% rename from src/components/equalizer/AutoEqSection.tsx rename to src/features/equalizer/components/AutoEqSection.tsx index 0a390dfa..255d0a03 100644 --- a/src/components/equalizer/AutoEqSection.tsx +++ b/src/features/equalizer/components/AutoEqSection.tsx @@ -1,6 +1,6 @@ import { useTranslation } from 'react-i18next'; import { Search, X, ChevronDown, ChevronUp } from 'lucide-react'; -import { useAutoEq } from '../../hooks/useAutoEq'; +import { useAutoEq } from '@/features/equalizer/hooks/useAutoEq'; /** Collapsible AutoEQ search panel inside the Equalizer. Owns its own search * state via {@link useAutoEq}. */ diff --git a/src/components/Equalizer.test.tsx b/src/features/equalizer/components/Equalizer.test.tsx similarity index 90% rename from src/components/Equalizer.test.tsx rename to src/features/equalizer/components/Equalizer.test.tsx index 9663bbf7..44fe134b 100644 --- a/src/components/Equalizer.test.tsx +++ b/src/features/equalizer/components/Equalizer.test.tsx @@ -1,8 +1,8 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { cleanup, screen } from '@testing-library/react'; -import { renderWithProviders } from '../test/helpers/renderWithProviders'; -import Equalizer from './Equalizer'; -import { useEqStore } from '../store/eqStore'; +import { renderWithProviders } from '@/test/helpers/renderWithProviders'; +import Equalizer from '@/features/equalizer/components/Equalizer'; +import { useEqStore } from '@/store/eqStore'; const FLAT = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; diff --git a/src/components/Equalizer.tsx b/src/features/equalizer/components/Equalizer.tsx similarity index 96% rename from src/components/Equalizer.tsx rename to src/features/equalizer/components/Equalizer.tsx index 87cddc51..9d4ef939 100644 --- a/src/components/Equalizer.tsx +++ b/src/features/equalizer/components/Equalizer.tsx @@ -2,11 +2,11 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { Save, Trash2, RotateCcw } from 'lucide-react'; import CustomSelect from '@/ui/CustomSelect'; -import { useEqStore, EQ_BANDS, BUILTIN_PRESETS } from '../store/eqStore'; -import { useThemeStore } from '../store/themeStore'; +import { useEqStore, EQ_BANDS, BUILTIN_PRESETS } from '@/store/eqStore'; +import { useThemeStore } from '@/store/themeStore'; import { drawCurve } from '@/features/playback/utils/audio/eqCurve'; -import VerticalFader from './equalizer/VerticalFader'; -import AutoEqSection from './equalizer/AutoEqSection'; +import VerticalFader from '@/features/equalizer/components/VerticalFader'; +import AutoEqSection from '@/features/equalizer/components/AutoEqSection'; export default function Equalizer() { const { t } = useTranslation(); diff --git a/src/components/equalizer/VerticalFader.tsx b/src/features/equalizer/components/VerticalFader.tsx similarity index 100% rename from src/components/equalizer/VerticalFader.tsx rename to src/features/equalizer/components/VerticalFader.tsx diff --git a/src/hooks/useAutoEq.ts b/src/features/equalizer/hooks/useAutoEq.ts similarity index 98% rename from src/hooks/useAutoEq.ts rename to src/features/equalizer/hooks/useAutoEq.ts index 97ab2ccc..65db5e11 100644 --- a/src/hooks/useAutoEq.ts +++ b/src/features/equalizer/hooks/useAutoEq.ts @@ -1,7 +1,7 @@ import { useState, useRef, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { invoke } from '@tauri-apps/api/core'; -import { useEqStore } from '../store/eqStore'; +import { useEqStore } from '@/store/eqStore'; import { parseFixedBandEqString, type AutoEqVariant, type AutoEqResult } from '@/features/playback/utils/audio/autoEqParse'; /** AutoEQ search/apply state for the Equalizer. Loads the entries index lazily diff --git a/src/features/equalizer/index.ts b/src/features/equalizer/index.ts new file mode 100644 index 00000000..94ee8350 --- /dev/null +++ b/src/features/equalizer/index.ts @@ -0,0 +1,10 @@ +/** + * Equalizer feature — the graphic EQ panel (band faders, preset picker, EQ + * curve canvas) plus the auto-EQ section and its hook. Mounted from the + * settings audio tab and the player bar. + * + * Stays OUT (audio-core global state, consumed by the playback engine, not + * owned): `store/eqStore` (drives the audio graph; read by `eqDeviceSync` / + * `eqCurve` in the playback core) and the `eqCurve` renderer. + */ +export { default as Equalizer } from './components/Equalizer'; diff --git a/src/features/settings/components/AudioTab.tsx b/src/features/settings/components/AudioTab.tsx index 22fb310f..2214c5dc 100644 --- a/src/features/settings/components/AudioTab.tsx +++ b/src/features/settings/components/AudioTab.tsx @@ -2,7 +2,7 @@ import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Blend, Gauge, Sliders, Volume2, Waves } from 'lucide-react'; import { useAuthStore } from '@/store/authStore'; -import Equalizer from '@/components/Equalizer'; +import { Equalizer } from '@/features/equalizer'; import SettingsSubSection from '@/features/settings/components/SettingsSubSection'; import { SettingsGroup } from '@/features/settings/components/SettingsGroup'; import { SettingsToggle } from '@/features/settings/components/SettingsToggle';