'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' import { useAuth } from '@/hooks/useAuth' import { sendMagicLink } from '@/lib/api' import { ENV_CONFIG } from '@/lib/env-config' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Alert, AlertDescription } from '@/components/ui/alert' import { AuthenticationError } from '@/lib/auth' export default function LoginPacientePage() { const [credentials, setCredentials] = useState({ email: '', password: '' }) const [error, setError] = useState('') const [magicMessage, setMagicMessage] = useState('') const [magicError, setMagicError] = useState('') const [magicLoading, setMagicLoading] = useState(false) const [loading, setLoading] = useState(false) const router = useRouter() const { login } = useAuth() const handleLogin = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) setError('') try { // Tentar fazer login usando o contexto com tipo paciente const success = await login(credentials.email, credentials.password, 'paciente') if (success) { // Redirecionar para a página do paciente router.push('/paciente') } } catch (err) { console.error('[LOGIN-PACIENTE] Erro no login:', err) if (err instanceof AuthenticationError) { // Verificar se é erro de credenciais inválidas (pode ser email não confirmado) if (err.code === '400' || err.details?.error_code === 'invalid_credentials') { setError( '⚠️ Email ou senha incorretos. Se você acabou de se cadastrar, ' + 'verifique sua caixa de entrada e clique no link de confirmação ' + 'que foi enviado para ' + credentials.email ) } else { setError(err.message) } } else { setError('Erro inesperado. Tente novamente.') } } finally { setLoading(false) } } const handleSendMagicLink = async () => { if (!credentials.email) { setMagicError('Por favor, preencha o email antes de solicitar o magic link.') return } setMagicLoading(true) setMagicError('') setMagicMessage('') try { const res = await sendMagicLink(credentials.email, { target: 'paciente' }) setMagicMessage(res?.message ?? 'Magic link enviado. Verifique seu email.') } catch (err: any) { console.error('[MAGIC-LINK PACIENTE] erro ao enviar:', err) setMagicError(err?.message ?? String(err)) } finally { setMagicLoading(false) } } // --- Auto-cadastro (client-side) --- const [showRegister, setShowRegister] = useState(false) const [reg, setReg] = useState({ email: '', full_name: '', phone_mobile: '', cpf: '', birth_date: '' }) const [regLoading, setRegLoading] = useState(false) const [regError, setRegError] = useState('') const [regSuccess, setRegSuccess] = useState('') function cleanCpf(cpf: string) { return String(cpf || '').replace(/\D/g, '') } function validateCPF(cpfRaw: string) { const cpf = cleanCpf(cpfRaw) if (!/^\d{11}$/.test(cpf)) return false if (/^([0-9])\1+$/.test(cpf)) return false const digits = cpf.split('').map((d) => Number(d)) const calc = (len: number) => { let sum = 0 for (let i = 0; i < len; i++) sum += digits[i] * (len + 1 - i) const v = (sum * 10) % 11 return v === 10 ? 0 : v } return calc(9) === digits[9] && calc(10) === digits[10] } const handleRegister = async (e?: React.FormEvent) => { if (e) e.preventDefault() setRegError('') setRegSuccess('') // client-side validation if (!reg.email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(reg.email)) return setRegError('Email inválido') if (!reg.full_name || reg.full_name.trim().length < 3) return setRegError('Nome deve ter ao menos 3 caracteres') if (!reg.phone_mobile || !/^\d{10,11}$/.test(reg.phone_mobile)) return setRegError('Telefone inválido (10-11 dígitos)') if (!reg.cpf || !/^\d{11}$/.test(cleanCpf(reg.cpf))) return setRegError('CPF deve conter 11 dígitos') if (!validateCPF(reg.cpf)) return setRegError('CPF inválido') setRegLoading(true) try { const url = `${ENV_CONFIG.SUPABASE_URL}/functions/v1/register-patient` const body = { email: reg.email, full_name: reg.full_name, phone_mobile: reg.phone_mobile, cpf: cleanCpf(reg.cpf), // always include redirect to patient landing as requested redirect_url: 'https://mediconecta-app-liart.vercel.app/' } as any if (reg.birth_date) body.birth_date = reg.birth_date const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', apikey: ENV_CONFIG.SUPABASE_ANON_KEY, Accept: 'application/json' }, body: JSON.stringify(body), }) const json = await res.json().catch(() => null) if (res.ok) { setRegSuccess(json?.message ?? 'Cadastro realizado com sucesso! Verifique seu email para acessar a plataforma.') // clear form but keep email for convenience setReg({ ...reg, full_name: '', phone_mobile: '', cpf: '', birth_date: '' }) } else if (res.status === 400) { setRegError(json?.error ?? json?.message ?? 'Dados inválidos') } else if (res.status === 409) { setRegError(json?.error ?? 'CPF ou email já cadastrado') } else if (res.status === 429) { setRegError(json?.error ?? 'Rate limit excedido. Tente novamente mais tarde.') } else { setRegError(json?.error ?? json?.message ?? `Erro (${res.status})`) } } catch (err: any) { console.error('[REGISTER PACIENTE] erro', err) setRegError(err?.message ?? String(err)) } finally { setRegLoading(false) } } return (

Sou Paciente

Acesse sua área pessoal e gerencie suas consultas

Entrar como Paciente
setCredentials({...credentials, email: e.target.value})} required className="mt-1" disabled={loading} />
setCredentials({...credentials, password: e.target.value})} required className="mt-1" disabled={loading} />
{error && ( {error} )}
Ou entre usando um magic link (sem senha)
{magicError && ( {magicError} )} {magicMessage && ( {magicMessage} )}
Ainda não tem conta?
{showRegister && ( Auto-cadastro de Paciente
setReg({...reg, full_name: e.target.value})} required />
setReg({...reg, email: e.target.value})} required />
setReg({...reg, phone_mobile: e.target.value.replace(/\D/g,'')})} placeholder="11999998888" required />
setReg({...reg, cpf: e.target.value.replace(/\D/g,'')})} placeholder="12345678901" required />
setReg({...reg, birth_date: e.target.value})} />
{regError && ( {regError} )} {regSuccess && ( {regSuccess} )}
)}
) }