/* ═══════════════════════════════════════════════════════════════ SIGNAUX + VOLATILE screens ═══════════════════════════════════════════════════════════════ */ const { useState: useStateSig } = React; function SignauxScreen({ onAction, stateShowcase = "active" }) { const { SIGNALS } = window.MOCK; const [filter, setFilter] = useStateSig("all"); const filtered = SIGNALS.filter(s => { if (filter === "all") return true; if (filter === "long") return s.direction === "LONG"; if (filter === "short") return s.direction === "SHORT"; if (filter === "premium") return s.score >= 8; if (filter === "volume") return s.volume > 100; if (filter === "usa") return true; return true; }); if (stateShowcase === "loading") { return (
{[0,1,2,3].map(i => )}
); } if (stateShowcase === "empty") { return (
); } if (stateShowcase === "error") { return (
Connexion OKX perdue. Dernière donnée reçue il y a 4min 12s.
{filtered.slice(0, 4).map(s =>
)}
); } return (
{filtered.map(s => )}
); } function SignauxHeader({ filter, setFilter }) { const { SIGNALS } = window.MOCK; const [scanning, setScanning] = useStateSig(false); const [countdown, setCountdown] = useStateSig(15); React.useEffect(() => { const t = setInterval(() => setCountdown(c => c <= 1 ? 15 : c - 1), 1000); return () => clearInterval(t); }, []); async function doScan() { setScanning(true); await window.fbScan(); setCountdown(15); setScanning(false); emitToast({ type: "success", msg: "Scan terminé" }); } return ( <>

Signaux

Scanner FoxBot · {SIGNALS.length} paires analysées
Refresh dans {countdown}s
{[ { id:"all", label:"Tous", n: SIGNALS.length }, { id:"long", label:"LONG", n: SIGNALS.filter(s=>s.direction==="LONG").length }, { id:"short", label:"SHORT", n: SIGNALS.filter(s=>s.direction==="SHORT").length }, { id:"premium", label:"Score ≥ 8", n: SIGNALS.filter(s=>s.score>=8).length }, { id:"volume", label:"Volume > 100%", n: SIGNALS.filter(s=>s.volume>100).length }, { id:"usa", label:"USA Session", n: 4 }, ].map(c => (
setFilter(c.id)}> {c.label} {c.n}
))}
); } function SignalSkeleton() { return (
{[0,1,2,3,4,5].map(i =>
)}
); } function EmptyState() { return (

Aucun setup détecté

Le scanner n'a rien trouvé qui remplisse les critères FoxBot.
Patiente jusqu'au prochain scan ou ajuste les filtres.

); } function VolatileScreen({ onAction }) { const { VOLATILE } = window.MOCK; return (

Volatile

Top 10 paires volatiles · tri par ATR%
ATR moyen {VOLATILE.length ? (VOLATILE.reduce((s,v)=>s+v.atr,0)/VOLATILE.length).toFixed(2)+"%" : "—"}
{["Tous","ATR > 2%","ATR > 3%","Hot 🔥","LONG","SHORT"].map((t, i) => (
{t.replace("🔥","")} {i===3&&·}
))}
{VOLATILE.map(s => (
{s.hot &&
HOT
}
))}
); } Object.assign(window, { SignauxScreen, VolatileScreen });