import React, { useState, useEffect, useCallback } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useAuth } from '../context/AuthContext'; import { dashboardService, accountService } from '../services/api'; import useFormatters from '../hooks/useFormatters'; import CashflowChart from '../components/dashboard/CashflowChart'; import BalanceProjectionChart from '../components/dashboard/BalanceProjectionChart'; import OverpaymentsAnalysis from '../components/dashboard/OverpaymentsAnalysis'; import CalendarWidget from '../components/dashboard/CalendarWidget'; import UpcomingWidget from '../components/dashboard/UpcomingWidget'; import OverdueWidget from '../components/dashboard/OverdueWidget'; const Dashboard = () => { const { user } = useAuth(); const { t, i18n } = useTranslation(); const { currency } = useFormatters(); const navigate = useNavigate(); // Estados const [loading, setLoading] = useState(true); const [cashflowLoading, setCashflowLoading] = useState(true); const [variancesLoading, setVariancesLoading] = useState(true); // Dados do dashboard const [summary, setSummary] = useState(null); const [cashflow, setCashflow] = useState(null); const [variances, setVariances] = useState(null); const [accounts, setAccounts] = useState([]); // Filtros dos gráficos const [cashflowMonths, setCashflowMonths] = useState(12); const [variancesMonths, setVariancesMonths] = useState(12); // Carregar resumo geral const loadSummary = useCallback(async () => { try { const [summaryData, accountsData] = await Promise.all([ dashboardService.getSummary(), accountService.getAll(), ]); setSummary(summaryData); setAccounts(accountsData.data || []); } catch (error) { console.error('Error loading summary:', error); } finally { setLoading(false); } }, []); // Carregar fluxo de caixa const loadCashflow = useCallback(async () => { setCashflowLoading(true); try { const data = await dashboardService.getCashflow(cashflowMonths); setCashflow(data); } catch (error) { console.error('Error loading cashflow:', error); } finally { setCashflowLoading(false); } }, [cashflowMonths]); // Carregar variações de pagamento const loadVariances = useCallback(async () => { setVariancesLoading(true); try { const data = await dashboardService.getPaymentVariances(variancesMonths); setVariances(data); } catch (error) { console.error('Error loading variances:', error); } finally { setVariancesLoading(false); } }, [variancesMonths]); useEffect(() => { loadSummary(); }, [loadSummary]); useEffect(() => { loadCashflow(); }, [loadCashflow]); useEffect(() => { loadVariances(); }, [loadVariances]); // Handlers const handleMonthsChange = (months) => { setCashflowMonths(months); }; const handleVariancesMonthsChange = (months) => { setVariancesMonths(months); }; const handleTransactionClick = (transactionId) => { navigate(`/transactions?highlight=${transactionId}`); }; // Componente de Stat Card modernizado const StatCard = ({ icon, label, value, valueColor = 'text-white', trend = null, trendUp = true, subValue = null, accentColor = '#3b82f6' }) => (
{label}
{loading ? ({new Date().toLocaleDateString(i18n.language === 'pt-BR' ? 'pt-BR' : i18n.language === 'es' ? 'es-ES' : 'en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
{t('dashboard.noAccounts')}
{t('dashboard.createAccount')}