210 lines
7.4 KiB
TypeScript
210 lines
7.4 KiB
TypeScript
"use client"
|
|
|
|
import type React from "react"
|
|
|
|
import { useState } from "react"
|
|
import { useRouter } from "next/navigation"
|
|
import Link from "next/link"
|
|
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"
|
|
|
|
export default function PatientRegister() {
|
|
const [showPassword, setShowPassword] = useState(false)
|
|
const [showConfirmPassword, setShowConfirmPassword] = useState(false)
|
|
const [formData, setFormData] = useState({
|
|
name: "",
|
|
email: "",
|
|
password: "",
|
|
confirmPassword: "",
|
|
phone: "",
|
|
cpf: "",
|
|
birthDate: "",
|
|
address: "",
|
|
})
|
|
const [isLoading, setIsLoading] = useState(false)
|
|
const router = useRouter()
|
|
|
|
const handleInputChange = (field: string, value: string) => {
|
|
setFormData((prev) => ({
|
|
...prev,
|
|
[field]: value,
|
|
}))
|
|
}
|
|
|
|
const handleRegister = async (e: React.FormEvent) => {
|
|
e.preventDefault()
|
|
|
|
if (formData.password !== formData.confirmPassword) {
|
|
alert("As senhas não coincidem!")
|
|
return
|
|
}
|
|
|
|
setIsLoading(true)
|
|
|
|
// 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")
|
|
setIsLoading(false)
|
|
}, 1000)
|
|
}
|
|
|
|
return (
|
|
<div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 py-8 px-4">
|
|
<div className="max-w-2xl mx-auto">
|
|
<div className="mb-6">
|
|
<Link href="/" className="inline-flex items-center text-blue-600 hover:text-blue-800">
|
|
<ArrowLeft className="w-4 h-4 mr-2" />
|
|
Voltar ao início
|
|
</Link>
|
|
</div>
|
|
|
|
<Card>
|
|
<CardHeader className="text-center">
|
|
<CardTitle className="text-2xl">Cadastro de Paciente</CardTitle>
|
|
<CardDescription>Preencha seus dados para criar sua conta</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<form onSubmit={handleRegister} className="space-y-4">
|
|
<div className="grid md:grid-cols-2 gap-4">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="name">Nome Completo</Label>
|
|
<Input
|
|
id="name"
|
|
value={formData.name}
|
|
onChange={(e) => handleInputChange("name", e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="cpf">CPF</Label>
|
|
<Input
|
|
id="cpf"
|
|
value={formData.cpf}
|
|
onChange={(e) => handleInputChange("cpf", e.target.value)}
|
|
placeholder="000.000.000-00"
|
|
required
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="grid md:grid-cols-2 gap-4">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="email">Email</Label>
|
|
<Input
|
|
id="email"
|
|
type="email"
|
|
value={formData.email}
|
|
onChange={(e) => handleInputChange("email", e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="phone">Telefone</Label>
|
|
<Input
|
|
id="phone"
|
|
value={formData.phone}
|
|
onChange={(e) => handleInputChange("phone", e.target.value)}
|
|
placeholder="(11) 99999-9999"
|
|
required
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="birthDate">Data de Nascimento</Label>
|
|
<Input
|
|
id="birthDate"
|
|
type="date"
|
|
value={formData.birthDate}
|
|
onChange={(e) => handleInputChange("birthDate", e.target.value)}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="address">Endereço</Label>
|
|
<Textarea
|
|
id="address"
|
|
value={formData.address}
|
|
onChange={(e) => handleInputChange("address", e.target.value)}
|
|
placeholder="Rua, número, bairro, cidade, estado"
|
|
rows={3}
|
|
required
|
|
/>
|
|
</div>
|
|
|
|
<div className="grid md:grid-cols-2 gap-4">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="password">Senha</Label>
|
|
<div className="relative">
|
|
<Input
|
|
id="password"
|
|
type={showPassword ? "text" : "password"}
|
|
value={formData.password}
|
|
onChange={(e) => handleInputChange("password", e.target.value)}
|
|
required
|
|
/>
|
|
<Button
|
|
type="button"
|
|
variant="ghost"
|
|
size="sm"
|
|
className="absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent"
|
|
onClick={() => setShowPassword(!showPassword)}
|
|
>
|
|
{showPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="confirmPassword">Confirmar Senha</Label>
|
|
<div className="relative">
|
|
<Input
|
|
id="confirmPassword"
|
|
type={showConfirmPassword ? "text" : "password"}
|
|
value={formData.confirmPassword}
|
|
onChange={(e) => handleInputChange("confirmPassword", e.target.value)}
|
|
required
|
|
/>
|
|
<Button
|
|
type="button"
|
|
variant="ghost"
|
|
size="sm"
|
|
className="absolute right-0 top-0 h-full px-3 py-2 hover:bg-transparent"
|
|
onClick={() => setShowConfirmPassword(!showConfirmPassword)}
|
|
>
|
|
{showConfirmPassword ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<Button type="submit" className="w-full" disabled={isLoading}>
|
|
{isLoading ? "Criando conta..." : "Criar Conta"}
|
|
</Button>
|
|
</form>
|
|
|
|
<div className="mt-6 text-center">
|
|
<p className="text-sm text-gray-600">
|
|
Já tem uma conta?{" "}
|
|
<Link href="/patient/login" className="text-blue-600 hover:underline">
|
|
Faça login aqui
|
|
</Link>
|
|
</p>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|