From c0f635d9086f71780a631501fb4023b8cf9fb84b Mon Sep 17 00:00:00 2001 From: Gabriel Lira Figueira Date: Wed, 12 Nov 2025 20:00:05 -0300 Subject: [PATCH 1/9] feat: Corrige e implementa o fluxo de auto-cadastro de paciente MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O formulário de registro estava incorretamente utilizando um endpoint que exigia autenticação, resultando em um erro de 'Invalid JWT' para novos usuários. Esta alteração refatora a página para usar o endpoint público 'register-patient', que inicia o fluxo de confirmação por e-mail. --- app/patient/register/page.tsx | 148 +++++++++++++++------------------- lib/utils.ts | 46 +++++++++++ services/usersApi.mjs | 8 ++ 3 files changed, 117 insertions(+), 85 deletions(-) diff --git a/app/patient/register/page.tsx b/app/patient/register/page.tsx index 7176abc..d521f2a 100644 --- a/app/patient/register/page.tsx +++ b/app/patient/register/page.tsx @@ -1,7 +1,6 @@ "use client" import type React from "react" - import { useState } from "react" import { useRouter } from "next/navigation" import Link from "next/link" @@ -9,24 +8,24 @@ import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" -import { Textarea } from "@/components/ui/textarea" -import { Eye, EyeOff, ArrowLeft } from "lucide-react" +import { ArrowLeft, Loader2 } from "lucide-react" +import { useToast } from "@/hooks/use-toast" +import { usersService } from "@/services/usersApi.mjs" // Mantém a importação +import { isValidCPF } from "@/lib/utils" export default function PatientRegister() { - const [showPassword, setShowPassword] = useState(false) - const [showConfirmPassword, setShowConfirmPassword] = useState(false) + // REMOVIDO: Estados para 'showPassword' e 'showConfirmPassword' const [formData, setFormData] = useState({ name: "", email: "", - password: "", - confirmPassword: "", phone: "", cpf: "", birthDate: "", - address: "", + // REMOVIDO: Campos 'password' e 'confirmPassword' }) const [isLoading, setIsLoading] = useState(false) const router = useRouter() + const { toast } = useToast() const handleInputChange = (field: string, value: string) => { setFormData((prev) => ({ @@ -37,22 +36,52 @@ export default function PatientRegister() { const handleRegister = async (e: React.FormEvent) => { e.preventDefault() + setIsLoading(true) - if (formData.password !== formData.confirmPassword) { - alert("As senhas não coincidem!") + // --- VALIDAÇÃO DE CPF --- + if (!isValidCPF(formData.cpf)) { + toast({ + title: "CPF Inválido", + description: "O CPF informado não é válido. Verifique os dígitos.", + variant: "destructive", + }) + setIsLoading(false) return } - setIsLoading(true) + // --- LÓGICA DE REGISTRO COM ENDPOINT PÚBLICO --- + try { + // ALTERADO: Payload ajustado para o endpoint 'register-patient' + const payload = { + email: formData.email.trim().toLowerCase(), + full_name: formData.name, + phone_mobile: formData.phone, // O endpoint espera 'phone_mobile' + cpf: formData.cpf.replace(/\D/g, ''), + birth_date: formData.birthDate, + } - // Simulação de registro - em produção, conectar com API real - setTimeout(() => { - // Salvar dados do usuário no localStorage para simulação - const { confirmPassword, ...userData } = formData - localStorage.setItem("patientData", JSON.stringify(userData)) - router.push("/patient/dashboard") + // ALTERADO: Chamada para a nova função de serviço + await usersService.registerPatient(payload) + + // ALTERADO: Mensagem de sucesso para refletir o fluxo de confirmação por e-mail + toast({ + title: "Cadastro enviado com sucesso!", + description: "Enviamos um link de confirmação para o seu e-mail. Por favor, verifique sua caixa de entrada para ativar sua conta.", + }) + + // Redireciona para a página de login + router.push("/login") + + } catch (error: any) { + console.error("Erro no registro:", error) + toast({ + title: "Erro ao Criar Conta", + description: error.message || "Não foi possível concluir o cadastro. Verifique seus dados e tente novamente.", + variant: "destructive", + }) + } finally { setIsLoading(false) - }, 1000) + } } return ( @@ -67,136 +96,85 @@ export default function PatientRegister() { - Cadastro de Paciente - Preencha seus dados para criar sua conta + Crie sua Conta de Paciente + Preencha seus dados para acessar o portal MedConnect
- + handleInputChange("name", e.target.value)} required + disabled={isLoading} />
- + handleInputChange("cpf", e.target.value)} placeholder="000.000.000-00" required + disabled={isLoading} />
- + handleInputChange("email", e.target.value)} required + disabled={isLoading} />
- + handleInputChange("phone", e.target.value)} placeholder="(11) 99999-9999" required + disabled={isLoading} />
- + handleInputChange("birthDate", e.target.value)} required + disabled={isLoading} />
-
- -