diff --git a/client/src/pages/EQPage.tsx b/client/src/pages/EQPage.tsx index a77de24..ae144e4 100644 --- a/client/src/pages/EQPage.tsx +++ b/client/src/pages/EQPage.tsx @@ -68,6 +68,8 @@ import { bandToPeqFilter, buildPeqCatalogSyncKey, cloneBands, getUniquePresetNam import type { BandParamKind, PeqCatalogItem, PeqEqUi, PeqPresetLocalCache } from "./eq/types"; /* ── Main Component ── */ +const rawCurveCache = new Map(); + export default function EQPage() { const [, setLocation] = useLocation(); const { @@ -158,6 +160,7 @@ export default function EQPage() { const [isConfirmingTarget, setIsConfirmingTarget] = useState(false); const [currentRawCurve, setCurrentRawCurve] = useState(null); const [rawCurveLoading, setRawCurveLoading] = useState(false); + const rawCurveCacheRef = useRef(rawCurveCache); const allowPeqRemoteSyncRef = useRef(false); const lastPeqCatalogSyncKeyRef = useRef(""); const syncingHeadphoneRef = useRef(false); @@ -828,6 +831,17 @@ export default function EQPage() { const model = peq?.model?.trim() ?? ""; if (!brand || !model) return null; + const cacheKey = `${brand}|${model}`; + if (rawCurveCacheRef.current.has(cacheKey)) { + const cached = rawCurveCacheRef.current.get(cacheKey); + if (cached) { + console.log("[modelCurve] cache hit", { brand, model, rawLength: cached.length }); + } else { + console.log("[modelCurve] cache hit (no raw)", { brand, model }); + } + return cached ?? null; + } + const modelCurve = await getModelCurve(brand, model); if (modelCurve && typeof modelCurve === "object") { const payload = modelCurve as { @@ -853,6 +867,7 @@ export default function EQPage() { }) : null; const cleanedRaw = raw && raw.every((v) => Number.isFinite(v)) ? (raw as number[]) : null; + rawCurveCacheRef.current.set(cacheKey, cleanedRaw); console.log("[modelCurve] raw check", { brand, model,