// Caminho: secretary/appointments/page.tsx (Refatorado) "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"; import { patientsService } from "@/services/pacientesApi"; import { doctorsService } from "@/services/medicosApi"; import { appointmentsService } from "@/services/agendamentosApi"; import { usuariosService } from "@/services/usuariosApi"; // Alterado import { toast } from "sonner"; export default function ScheduleAppointment() { const router = useRouter(); const [patients, setPatients] = useState([]); const [doctors, setDoctors] = useState([]); const [currentUserId, setCurrentUserId] = useState(null); 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" ]; useEffect(() => { const fetchInitialData = async () => { try { const [patientList, doctorList, currentUser] = await Promise.all([ patientsService.list(), doctorsService.list(), usuariosService.getCurrentUser() // Alterado ]); setPatients(patientList); setDoctors(doctorList); if (currentUser && currentUser.id) { setCurrentUserId(currentUser.id); } else { toast.error("Não foi possível identificar o usuário logado. O agendamento pode falhar."); } } catch (error) { console.error("Falha ao buscar dados iniciais:", error); toast.error("Não foi possível carregar os dados necessários para a página."); } }; fetchInitialData(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); 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, }; 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. Tente novamente."); } }; return ( {/* O JSX restante permanece exatamente o mesmo */}

Agendar Consulta

Preencha os detalhes para criar um novo agendamento

Dados da ConsultaPreencha as informações para agendar a consulta
setSelectedDate(e.target.value)} min={new Date().toISOString().split("T")[0]} />
setDurationMinutes(e.target.value)} placeholder="Ex: 30" />
setInsuranceProvider(e.target.value)} />