diff --git a/app/page.tsx b/app/page.tsx index e61a99c..a309c83 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -14,7 +14,7 @@ import YieldsTab from "@/components/YieldsTab"; import NewsTab from "@/components/NewsTab"; import CotTab from "@/components/CotTab"; import ReportTab from "@/components/ReportTab"; -import { TvMiniChart } from "@/components/TvChart"; +import { TvAdvancedChart } from "@/components/TvChart"; import type { CalendarEvent } from "@/app/api/calendar/route"; import type { NewsItem } from "@/app/api/news/route"; import type { CotHistory } from "@/app/api/cot-history/route"; @@ -607,10 +607,10 @@ export default function Dashboard() {
- - - - + + + +
)} diff --git a/components/NewsTab.tsx b/components/NewsTab.tsx index 9357eaf..0a2f500 100644 --- a/components/NewsTab.tsx +++ b/components/NewsTab.tsx @@ -91,7 +91,7 @@ interface Props { } export default function NewsTab({ items, loading, onRefresh }: Props) { - const [selectedCats, setSelectedCats] = useState>(new Set()); + const [selectedCats, setSelectedCats] = useState([]); const [filterDir, setFilterDir] = useState<"all" | "bullish" | "bearish">("all"); const [priorityOnly, setPriorityOnly] = useState(false); const [autoRefresh, setAutoRefresh] = useState(true); @@ -106,23 +106,20 @@ export default function NewsTab({ items, loading, onRefresh }: Props) { }, [autoRefresh, onRefresh]); const toggleCat = (cat: string) => { - setSelectedCats(prev => { - const next = new Set(prev); - if (next.has(cat)) next.delete(cat); - else next.add(cat); - return next; - }); + setSelectedCats(prev => + prev.includes(cat) ? prev.filter(c => c !== cat) : [...prev, cat] + ); }; // Filtre + tri — articles avec catégories macro et articles sans const { topFiltered, otherItems } = useMemo(() => { - const hasActiveFilter = selectedCats.size > 0 || filterDir !== "all" || priorityOnly; + const hasActiveFilter = selectedCats.length > 0 || filterDir !== "all" || priorityOnly; // Articles filtrés (tous) const allFiltered = items .filter(item => { if (priorityOnly && !item.categories.some(c => HIGH_PRIO.has(c))) return false; - if (selectedCats.size > 0 && !item.categories.some(c => selectedCats.has(c))) return false; + if (selectedCats.length > 0 && !item.categories.some(c => selectedCats.includes(c))) return false; if (filterDir !== "all" && !item.impacts.some(i => i.direction === filterDir)) return false; return true; }) @@ -143,14 +140,14 @@ export default function NewsTab({ items, loading, onRefresh }: Props) { // Boutons de catégories : dynamiques + catégories "toujours visibles" const activeCats = useMemo(() => { - const set = new Set(); - for (const item of items) item.categories.forEach(c => set.add(c)); - ALWAYS_VISIBLE.forEach(c => set.add(c)); // toujours afficher ces catégories - return PRIORITY_CATS.filter(c => set.has(c)); + const seen = new Set(); + for (const item of items) item.categories.forEach(c => seen.add(c)); + ALWAYS_VISIBLE.forEach(c => seen.add(c)); + return PRIORITY_CATS.filter(c => seen.has(c)); }, [items]); - const anyFilter = selectedCats.size > 0 || filterDir !== "all" || priorityOnly; - const clearFilters = () => { setSelectedCats(new Set()); setFilterDir("all"); setPriorityOnly(false); }; + const anyFilter = selectedCats.length > 0 || filterDir !== "all" || priorityOnly; + const clearFilters = () => { setSelectedCats([]); setFilterDir("all"); setPriorityOnly(false); }; return (
@@ -226,9 +223,9 @@ export default function NewsTab({ items, loading, onRefresh }: Props) { Catégorie - {activeCats.map(cat => { const meta = CATEGORY_META[cat]; - const isActive = selectedCats.has(cat); + const isActive = selectedCats.includes(cat); return (