import React, { useState, useEffect } from 'react'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, ResponsiveContainer, ReferenceLine, Tooltip } from 'recharts'; import { HelpCircle, Download, Share2, AlertCircle } from 'lucide-react'; import { Alert, AlertDescription } from '@/components/ui/alert'; const atores = ["TODOS", "EMPRESÁRIO", "POLÍTICO", "DIPLOMATA"]; const categorias = ["Todas", "ECONOMIA", "POLÍTICA", "CULTURA", "TECNOLOGIA", "MEIO-AMBIENTE"]; const paises = ["MUNDO", "ARGENTINA", "BRASIL", "ESTADOS UNIDOS", "CHINA", "JAPÃO"]; const DashboardBrasil = () => { const [currentTime, setCurrentTime] = useState(new Date()); const [graphData, setGraphData] = useState([]); const [periodoSelecionado, setPeriodoSelecionado] = useState('24h'); const [paisSelecionado, setPaisSelecionado] = useState('ARGENTINA'); const [categoriaSelecionada, setCategoriaSelecionada] = useState('TODAS'); const [atorSelecionado, setAtorSelecionado] = useState('TODOS'); const [showPaisDropdown, setShowPaisDropdown] = useState(false); const [showCategoriaDropdown, setShowCategoriaDropdown] = useState(false); const [showAtorDropdown, setShowAtorDropdown] = useState(false); const [loading, setLoading] = useState(false); const [currentValue, setCurrentValue] = useState(77); const [eventCount, setEventCount] = useState(1635); const getInitialData = () => { const data = []; let currentValue = 77; // Gerar 97 pontos (24 horas = 96 períodos de 15min + AGORA) for (let i = 96; i >= 0; i--) { const hora = i === 0 ? 'AGORA' : `-${i * 0.25}h`; data.push({ dia: hora, valor: currentValue, showLabel: hora === '-24h' || hora === '-20h' || hora === '-16h' || hora === '-8h' || hora === '-4h' || hora === 'AGORA' }); } return data; }; const [lastBigVariationTime, setLastBigVariationTime] = useState(null); const [historicalData, setHistoricalData] = useState(getInitialData()); useEffect(() => { setLoading(true); setTimeout(() => { setGraphData(historicalData); setLoading(false); }, 100); const clockTimer = setInterval(() => { const now = new Date(); setCurrentTime(now); // Atualizar valores nos segundos 00, 15, 30 e 45 if (now.getSeconds() % 15 === 0) { // Atualizar contador de eventos const randomCount = Math.floor(Math.random() * (3100 - 1200 + 1)) + 1200; setEventCount(randomCount); // Calcular se pode ter variação grande (10%) const canHaveBigVariation = lastBigVariationTime === null || (now.getTime() - lastBigVariationTime.getTime()) >= 3 * 60 * 1000; // Decidir se terá variação grande (10% de chance quando permitido) const willHaveBigVariation = canHaveBigVariation && Math.random() < 0.1; // Calcular nova variação const maxVariationPercent = willHaveBigVariation ? 10 : 5; const maxVariation = (currentValue * maxVariationPercent) / 100; const variation = (Math.random() * 2 - 1) * maxVariation; // Variação entre -max e +max // Calcular novo valor mantendo entre 60 e 110 let newValue = currentValue + variation; newValue = Math.min(110, Math.max(60, newValue)); // Atualizar timestamp da última variação grande se necessário if (willHaveBigVariation && Math.abs(variation) > (currentValue * 0.05)) { setLastBigVariationTime(now); } setCurrentValue(Math.round(newValue)); // Atualizar dados históricos // Atualizar dados históricos com deslocamento setHistoricalData(prevData => { // Remover o primeiro ponto e deslocar todos os outros const shiftedData = prevData.slice(1).map((item, index) => { const horaNum = index * 0.25; const hora = `-${horaNum}h`; return { ...item, dia: hora, showLabel: hora === '-24h' || hora === '-20h' || hora === '-16h' || hora === '-8h' || hora === '-4h' }; }); // Adicionar o novo ponto como 'AGORA' shiftedData.push({ dia: 'AGORA', valor: Math.round(newValue), showLabel: true }); return shiftedData; }); } }, 1000); return () => clearInterval(clockTimer); }, [periodoSelecionado]); const formatDate = (date) => { const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); const year = date.getFullYear(); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${day}/${month}/${year} ${hours}:${minutes}:${seconds}`; }; const CustomTooltip = ({ active, payload }) => { if (active && payload && payload.length) { const data = payload[0].payload; return (

{data.dia}

Valor: {data.valor}

); } return null; }; const Dropdown = ({ title, items, selected, onSelect, show, onToggle }) => (

{title}

{show && (
{items.map((item, index) => ( ))}
)}
); return (
{/* Header */}

INDICADOR FGV DA
IMAGEM DO BRASIL NO EXTERIOR
{currentValue}
{formatDate(currentTime)}

{/* Periods */}
{[ { value: '24h', label: '24h' }, { value: '7d', label: '7 DIAS' }, { value: '30d', label: '30 DIAS' }, { value: '1a', label: '1 ANO' }, { value: '2020', label: 'DESDE 2020' } ].map((periodo) => ( ))}
{/* Graph */}
{loading ? (
) : ( { if (['-24h', '-20h', '-16h', '-8h', '-4h', 'AGORA'].includes(value)) { return value; } return ''; }} /> } /> )}
{/* Filters Grid */}
setShowPaisDropdown(!showPaisDropdown)} /> setShowAtorDropdown(!showAtorDropdown)} /> setShowAtorDropdown(!showAtorDropdown)} />
{/* Events Counter */}
Eventos analisados na última hora: {eventCount.toLocaleString()}
{[...Array(6)].map((_, i) => (
))}
); }; export default DashboardBrasil;