import React, { useState, useEffect } from "react"; import { Calendar, Users, UserCheck, Clock, ArrowRight } from "lucide-react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { patientService, doctorService, appointmentService } from "../services"; import { MetricCard } from "../components/MetricCard"; import { HeroBanner } from "../components/HeroBanner"; import { i18n } from "../i18n"; import { useAuth } from "../hooks/useAuth"; import RecoveryRedirect from "../components/auth/RecoveryRedirect"; const Home: React.FC = () => { const [stats, setStats] = useState({ totalPacientes: 0, totalMedicos: 0, consultasHoje: 0, consultasPendentes: 0, }); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); const navigate = useNavigate(); const [searchParams] = useSearchParams(); const { user } = useAuth(); // Verificar se há parâmetros de magic link e redirecionar para AuthCallback useEffect(() => { const hash = window.location.hash; if ( hash && (hash.includes("access_token") || hash.includes("type=magiclink")) ) { console.log( "[Home] Detectado magic link, redirecionando para /auth/callback" ); navigate(`/auth/callback${hash}`, { replace: true }); return; } }, [navigate]); // Limpar cache se houver parâmetro ?clear=true useEffect(() => { if (searchParams.get("clear") === "true") { console.log("🧹 Limpando cache via URL..."); localStorage.clear(); sessionStorage.clear(); // Remove o parâmetro da URL e recarrega window.location.href = "/"; } }, [searchParams]); useEffect(() => { // Só buscar estatísticas se o usuário estiver autenticado if (user) { fetchStats(); } else { setLoading(false); } }, [user]); const fetchStats = async () => { try { setLoading(true); setError(false); // Silenciar erros 401 (não autenticado) - são esperados na home pública const [pacientes, medicos, consultasRaw] = await Promise.all([ patientService.list().catch((err) => { if (err.response?.status !== 401) console.error("Erro ao buscar pacientes:", err); return []; }), doctorService.list().catch((err) => { if (err.response?.status !== 401) console.error("Erro ao buscar médicos:", err); return []; }), appointmentService.list().catch((err) => { if (err.response?.status !== 401) console.error("Erro ao buscar consultas:", err); return []; }), ]); // Ensure consultas is an array const consultas = Array.isArray(consultasRaw) ? consultasRaw : []; const hoje = new Date().toISOString().split("T")[0]; const consultasHoje = consultas.filter((c) => c.scheduled_at?.startsWith(hoje) ).length; const consultasPendentes = consultas.filter( (c) => c.status === "requested" || c.status === "confirmed" ).length; setStats({ totalPacientes: pacientes.length, totalMedicos: medicos.length, consultasHoje, consultasPendentes, }); } catch (err) { console.error("Erro ao carregar estatísticas:", err); setError(true); } finally { setLoading(false); } }; const handleCTA = (action: string, destination: string) => { console.log(`CTA clicked: ${action} -> ${destination}`); navigate(destination); }; return (
{description}