mirror of
https://github.com/kilyabin/psysonic.git
synced 2026-07-22 14:35:41 +00:00
cca000d3af
Extract the canvas frequency-response math, the custom vertical fader, the AutoEQ parser, and the AutoEQ search panel out of Equalizer.tsx: - utils/eqCurve.ts biquadPeakResponse + drawCurve - utils/autoEqParse.ts AutoEq types + parseFixedBandEqString - components/equalizer/VerticalFader.tsx - hooks/useAutoEq.ts AutoEQ search/apply state - components/equalizer/AutoEqSection.tsx Pure code-move, no behaviour change. Both call sites (AudioTab, PlayerBar) default-import Equalizer unchanged.
74 lines
2.7 KiB
TypeScript
74 lines
2.7 KiB
TypeScript
import { useTranslation } from 'react-i18next';
|
|
import { Search, X, ChevronDown, ChevronUp } from 'lucide-react';
|
|
import { useAutoEq } from '../../hooks/useAutoEq';
|
|
|
|
/** Collapsible AutoEQ search panel inside the Equalizer. Owns its own search
|
|
* state via {@link useAutoEq}. */
|
|
export default function AutoEqSection() {
|
|
const { t } = useTranslation();
|
|
const {
|
|
autoEqOpen, autoEqQuery, autoEqResults, autoEqLoading, autoEqError, autoEqApplied,
|
|
entriesLoading, setAutoEqQuery, setAutoEqError, setAutoEqResults,
|
|
applyAutoEqResult, toggleOpen,
|
|
} = useAutoEq();
|
|
|
|
return (
|
|
<div className="eq-autoeq-section">
|
|
<button className="eq-autoeq-toggle" onClick={toggleOpen}>
|
|
<Search size={13} />
|
|
<span>{t('settings.eqAutoEqTitle')}</span>
|
|
{autoEqOpen ? <ChevronUp size={13} /> : <ChevronDown size={13} />}
|
|
</button>
|
|
|
|
{autoEqOpen && (
|
|
<div className="eq-autoeq-body">
|
|
<div className="eq-autoeq-search-row">
|
|
<input
|
|
className="input"
|
|
placeholder={t('settings.eqAutoEqPlaceholder')}
|
|
value={autoEqQuery}
|
|
onChange={e => { setAutoEqQuery(e.target.value); setAutoEqError(null); }}
|
|
autoFocus
|
|
style={{ flex: 1, padding: '6px 12px', fontSize: 13 }}
|
|
/>
|
|
{autoEqQuery && (
|
|
<button className="eq-ctrl-btn" onClick={() => { setAutoEqQuery(''); setAutoEqResults([]); }}>
|
|
<X size={13} />
|
|
</button>
|
|
)}
|
|
</div>
|
|
|
|
{(entriesLoading || autoEqLoading) && (
|
|
<div className="eq-autoeq-status">{t('settings.eqAutoEqSearching')}</div>
|
|
)}
|
|
{autoEqError && (
|
|
<div className="eq-autoeq-status eq-autoeq-error">{autoEqError}</div>
|
|
)}
|
|
{autoEqApplied && (
|
|
<div className="eq-autoeq-status eq-autoeq-applied">✓ {autoEqApplied}</div>
|
|
)}
|
|
|
|
{autoEqResults.length > 0 && (
|
|
<div className="eq-autoeq-results">
|
|
{autoEqResults.map((r, i) => (
|
|
<button
|
|
key={`${r.name}|${r.source}|${i}`}
|
|
className="eq-autoeq-result-btn"
|
|
onClick={() => applyAutoEqResult(r)}
|
|
>
|
|
<span>{r.name}</span>
|
|
<span className="eq-autoeq-result-source">{r.source}</span>
|
|
</button>
|
|
))}
|
|
</div>
|
|
)}
|
|
|
|
{!entriesLoading && !autoEqLoading && !autoEqError && autoEqQuery.length >= 2 && autoEqResults.length === 0 && (
|
|
<div className="eq-autoeq-status">{t('settings.eqAutoEqNoResults')}</div>
|
|
)}
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|