"use client"; import type React from "react"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import SecretaryLayout from "@/components/secretary-layout"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { Calendar, Clock, User } from "lucide-react"; // Importações que você já tinha import { patientsService } from "@/services/patientsApi.mjs"; import { doctorsService } from "@/services/doctorsApi.mjs"; import { appointmentsService } from "@/services/appointmentsApi.mjs"; import { usersService } from "@/services/usersApi.mjs"; import { toast } from "sonner"; // Para notificações export default function ScheduleAppointment() { const router = useRouter(); const [patients, setPatients] = useState([]); const [doctors, setDoctors] = useState([]); const [currentUserId, setCurrentUserId] = useState(null); // Estados de loading e error para feedback visual e depuração const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Estados do formulário const [selectedPatient, setSelectedPatient] = useState(""); const [selectedDoctor, setSelectedDoctor] = useState(""); const [selectedDate, setSelectedDate] = useState(""); const [selectedTime, setSelectedTime] = useState(""); const [appointmentType, setAppointmentType] = useState("presencial"); const [durationMinutes, setDurationMinutes] = useState("30"); const [chiefComplaint, setChiefComplaint] = useState(""); const [patientNotes, setPatientNotes] = useState(""); const [internalNotes, setInternalNotes] = useState(""); const [insuranceProvider, setInsuranceProvider] = useState(""); const availableTimes = [ "08:00", "08:30", "09:00", "09:30", "10:00", "10:30", "11:00", "11:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30" ]; // --- NOVO/ATUALIZADO useEffect COM LOGS PARA DEPURAR --- useEffect(() => { const fetchInitialData = async () => { setLoading(true); setError(null); // Limpa qualquer erro anterior ao iniciar uma nova busca const results = await Promise.allSettled([ patientsService.list(), doctorsService.list(), usersService.getMe() ]); const [patientResult, doctorResult, userResult] = results; let hasFetchError = false; // Flag para saber se houve algum erro geral // Checar pacientes if (patientResult.status === 'fulfilled') { setPatients(patientResult.value || []); console.log("Pacientes carregados com sucesso:", patientResult.value); } else { console.error("ERRO AO CARREGAR PACIENTES:", patientResult.reason); hasFetchError = true; toast.error("Erro ao carregar lista de pacientes."); // Notificação para o usuário } // Checar médicos if (doctorResult.status === 'fulfilled') { setDoctors(doctorResult.value || []); console.log("Médicos carregados com sucesso:", doctorResult.value); // <-- CRÍTICO PARA DEPURAR } else { console.error("ERRO AO CARREGAR MÉDICOS:", doctorResult.reason); hasFetchError = true; setError("Falha ao carregar médicos."); // Define o erro para ser exibido no dropdown toast.error("Erro ao carregar lista de médicos."); // Notificação para o usuário } // Checar usuário logado if (userResult.status === 'fulfilled' && userResult.value?.user?.id) { setCurrentUserId(userResult.value.user.id); console.log("ID do usuário logado carregado:", userResult.value.user.id); } else { const reason = userResult.status === 'rejected' ? userResult.reason : "API não retornou um ID de usuário."; console.error("ERRO AO CARREGAR USUÁRIO:", reason); hasFetchError = true; toast.error("Não foi possível identificar o usuário logado. Por favor, faça login novamente."); // Notificação // Não definimos setError aqui, pois um erro no usuário não impede a renderização de médicos/pacientes } // Se houve qualquer erro na busca, defina uma mensagem geral de erro se não houver uma mais específica. if (hasFetchError && !error) { // Se 'error' já foi definido por um problema específico, mantenha-o. setError("Alguns dados não puderam ser carregados. Verifique o console."); } setLoading(false); // Finaliza o estado de carregamento console.log("Estado de carregamento finalizado:", false); }; fetchInitialData(); }, []); // O array de dependências vazio significa que ele roda apenas uma vez após a montagem inicial // --- LOGS PARA VERIFICAR OS ESTADOS ANTES DA RENDERIZAÇÃO --- console.log("Estado 'loading' no render:", loading); console.log("Estado 'error' no render:", error); console.log("Conteúdo de 'doctors' no render:", doctors); console.log("Número de médicos em 'doctors':", doctors.length); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); console.log("Botão de submit clicado!"); // Log para confirmar que o clique funciona if (!currentUserId) { toast.error("Sessão de usuário inválida. Por favor, faça login novamente."); return; } if (!selectedPatient || !selectedDoctor || !selectedDate || !selectedTime) { toast.error("Paciente, médico, data e horário são obrigatórios."); return; } try { const scheduledAt = new Date(`${selectedDate}T${selectedTime}:00Z`).toISOString(); const newAppointmentData = { patient_id: selectedPatient, doctor_id: selectedDoctor, scheduled_at: scheduledAt, duration_minutes: parseInt(durationMinutes, 10), appointment_type: appointmentType, status: "requested", chief_complaint: chiefComplaint || null, patient_notes: patientNotes || null, notes: internalNotes || null, insurance_provider: insuranceProvider || null, created_by: currentUserId, }; console.log("🚀 Enviando os seguintes dados para a API:", newAppointmentData); // A chamada para a API de criação await appointmentsService.create(newAppointmentData); toast.success("Consulta agendada com sucesso!"); router.push("/secretary/appointments"); } catch (error) { console.error("❌ Erro ao criar agendamento:", error); toast.error("Ocorreu um erro ao agendar a consulta. Verifique o console."); } }; return (

Agendar Consulta

Preencha os detalhes para criar um novo agendamento

Dados da Consulta Preencha as informações para agendar a consulta
{/* O restante do formulário permanece o mesmo */}
setSelectedDate(e.target.value)} min={new Date().toISOString().split("T")[0]} // Garante que a data mínima é hoje />
setDurationMinutes(e.target.value)} placeholder="Ex: 30" min="1" // Duração mínima />
setInsuranceProvider(e.target.value)} />