diff --git a/frontend/src/pages/LibraryScan.jsx b/frontend/src/pages/LibraryScan.jsx index 78c48ae..7546750 100644 --- a/frontend/src/pages/LibraryScan.jsx +++ b/frontend/src/pages/LibraryScan.jsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import api from "../lib/api"; import { toast } from "sonner"; import { RefreshCcw, Download, Check, Sparkles, CheckSquare, Square } from "lucide-react"; @@ -16,21 +16,25 @@ export default function LibraryScan() { const [loading, setLoading] = useState(false); const [importing, setImporting] = useState(false); const [enrich, setEnrich] = useState(null); + const requestSeq = useRef(0); const load = async (k = kind) => { + const seq = ++requestSeq.current; setLoading(true); setSelected(new Set()); try { const { data } = await api.get(`/scan/${k}`); + if (seq !== requestSeq.current) return; // a newer tab switch/rescan superseded this response setResults(data); } catch (err) { + if (seq !== requestSeq.current) return; toast.error(err.response?.data?.detail || "Scan failed"); } finally { - setLoading(false); + if (seq === requestSeq.current) setLoading(false); } }; - useEffect(() => { load(kind); }, [kind]); + useEffect(() => { setResults([]); load(kind); }, [kind]); useEffect(() => { if (!enrich?.running) return;