import { useEffect, useState } from 'react'; import { Card } from '@/components/ui/card'; import { PieChart, Pie, Cell, ResponsiveContainer, Legend, Tooltip } from 'recharts'; import { supabase } from '@/integrations/supabase/client'; type SignalCount = { name: string; value: number; color: string; }; const COLORS = { LONG: '#00FF88', SHORT: '#FF6B35', HOLD: '#888888', }; export const SignalDistributionChart = () => { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [totalSignals, setTotalSignals] = useState(0); useEffect(() => { fetchData(); const interval = setInterval(fetchData, 30000); // Refresh every 30s return () => clearInterval(interval); }, []); const fetchData = async () => { try { const { data: signals, error } = await supabase .from('trading_signals') .select('signal_type') .gte('timestamp', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()); if (error) throw error; const counts: Record = { LONG: 0, SHORT: 0, HOLD: 0, }; (signals || []).forEach((signal) => { counts[signal.signal_type]++; }); const total = Object.values(counts).reduce((sum, val) => sum + val, 0); setTotalSignals(total); const chartData = Object.entries(counts) .filter(([_, value]) => value > 0) .map(([name, value]) => ({ name, value, color: COLORS[name as keyof typeof COLORS], })); setData(chartData); } catch (error) { console.error('Error fetching signal distribution:', error); } finally { setLoading(false); } }; if (loading) { return (

Signal Distribution

Loading data...

); } return (

📊 Signal Distribution (24h)

Breakdown of LONG, SHORT, and HOLD signals

{data.length > 0 ? ( <> `${name}: ${(percent * 100).toFixed(0)}%`} outerRadius={80} fill="#8884d8" dataKey="value" > {data.map((entry, index) => ( ))}

Total Signals: {totalSignals}

) : (

No signals yet. Start the field on /aureon to begin tracking.

)}
); };