diff --git a/frontend/src/app/cadastro/candidato/page.tsx b/frontend/src/app/cadastro/candidato/page.tsx index c4b9b48..7d26aae 100644 --- a/frontend/src/app/cadastro/candidato/page.tsx +++ b/frontend/src/app/cadastro/candidato/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from "react"; +import { useMemo, useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import Image from "next/image"; @@ -41,37 +41,43 @@ import { motion } from "framer-motion"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; +import { useTranslation } from "@/lib/i18n"; -const candidateSchema = z.object({ - fullName: z.string().min(2, "Nome deve ter pelo menos 2 caracteres"), - email: z.string().email("Email inválido"), - password: z.string().min(6, "Senha deve ter pelo menos 6 caracteres"), - confirmPassword: z.string(), - phone: z.string().min(10, "Telefone deve ter pelo menos 10 dígitos"), - birthDate: z.string().min(1, "Data de nascimento é obrigatória"), - address: z.string().min(5, "Endereço deve ter pelo menos 5 caracteres"), - city: z.string().min(2, "Cidade é obrigatória"), - state: z.string().min(2, "Estado é obrigatório"), - zipCode: z.string().min(8, "CEP deve ter 8 dígitos"), - education: z.string().min(1, "Nível de escolaridade é obrigatório"), - experience: z.string().min(1, "Experiência profissional é obrigatória"), - skills: z.string().optional(), - objective: z.string().optional(), - acceptTerms: z.boolean().refine(val => val === true, "Você deve aceitar os termos"), - acceptNewsletter: z.boolean().optional(), -}).refine(data => data.password === data.confirmPassword, { - message: "Senhas não coincidem", - path: ["confirmPassword"], -}); +const createCandidateSchema = (t: (key: string, params?: Record) => string) => + z.object({ + fullName: z.string().min(2, t("register.candidate.validation.fullName")), + email: z.string().email(t("register.candidate.validation.email")), + password: z.string().min(6, t("register.candidate.validation.password")), + confirmPassword: z.string(), + phone: z.string().min(10, t("register.candidate.validation.phone")), + birthDate: z.string().min(1, t("register.candidate.validation.birthDate")), + address: z.string().min(5, t("register.candidate.validation.address")), + city: z.string().min(2, t("register.candidate.validation.city")), + state: z.string().min(2, t("register.candidate.validation.state")), + zipCode: z.string().min(8, t("register.candidate.validation.zipCode")), + education: z.string().min(1, t("register.candidate.validation.education")), + experience: z.string().min(1, t("register.candidate.validation.experience")), + skills: z.string().optional(), + objective: z.string().optional(), + acceptTerms: z + .boolean() + .refine(val => val === true, t("register.candidate.validation.acceptTerms")), + acceptNewsletter: z.boolean().optional(), + }).refine(data => data.password === data.confirmPassword, { + message: t("register.candidate.validation.passwordMismatch"), + path: ["confirmPassword"], + }); -type CandidateFormData = z.infer; +type CandidateFormData = z.infer>; export default function CandidateRegisterPage() { const router = useRouter(); + const { t } = useTranslation(); const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const [currentStep, setCurrentStep] = useState(1); + const candidateSchema = useMemo(() => createCandidateSchema(t), [t]); const { register, @@ -94,7 +100,7 @@ export default function CandidateRegisterPage() { console.log("Dados do candidato:", data); // Redirecionar para login após cadastro - router.push("/login?message=Cadastro realizado com sucesso! Faça login para continuar."); + router.push(`/login?message=${encodeURIComponent(t("register.candidate.success"))}`); } catch (error) { console.error("Erro no cadastro:", error); } finally { @@ -130,30 +136,29 @@ export default function CandidateRegisterPage() {

- Cadastre-se como Candidato + {t("register.candidate.hero.title")}

- Crie sua conta e tenha acesso às melhores oportunidades de emprego. - Encontre a vaga dos seus sonhos hoje mesmo! + {t("register.candidate.hero.subtitle")}

- Acesso a milhares de vagas + {t("register.candidate.hero.bullets.jobs")}
- Candidaturas rápidas e fáceis + {t("register.candidate.hero.bullets.fastApplications")}
- Perfil profissional completo + {t("register.candidate.hero.bullets.profile")}
- Notificações de novas oportunidades + {t("register.candidate.hero.bullets.notifications")}
@@ -169,25 +174,27 @@ export default function CandidateRegisterPage() { className="inline-flex items-center gap-2 text-muted-foreground hover:text-foreground mb-4 transition-colors" > - Voltar ao Login + {t("register.candidate.actions.backToLogin")}

- Criar Conta - Candidato + {t("register.candidate.title")}

- Preencha seus dados para criar sua conta + {t("register.candidate.subtitle")}

{/* Progress Indicator */}
- Etapa {currentStep} de 3 + + {t("register.candidate.progress.step", { current: currentStep, total: 3 })} + - {currentStep === 1 && "Dados Pessoais"} - {currentStep === 2 && "Endereço e Contato"} - {currentStep === 3 && "Perfil Profissional"} + {currentStep === 1 && t("register.candidate.steps.personal")} + {currentStep === 2 && t("register.candidate.steps.address")} + {currentStep === 3 && t("register.candidate.steps.professional")}
@@ -210,13 +217,13 @@ export default function CandidateRegisterPage() { className="space-y-4" >
- +
@@ -227,13 +234,13 @@ export default function CandidateRegisterPage() {
- +
@@ -244,13 +251,13 @@ export default function CandidateRegisterPage() {
- +
@@ -274,13 +281,13 @@ export default function CandidateRegisterPage() {
- +
@@ -304,7 +311,7 @@ export default function CandidateRegisterPage() {
- +
)} @@ -336,13 +343,13 @@ export default function CandidateRegisterPage() { className="space-y-4" >
- +
@@ -353,13 +360,13 @@ export default function CandidateRegisterPage() {
- +
@@ -371,11 +378,11 @@ export default function CandidateRegisterPage() {
- + {errors.city && ( @@ -384,10 +391,10 @@ export default function CandidateRegisterPage() {
- + {errors.zipCode && ( @@ -440,10 +447,10 @@ export default function CandidateRegisterPage() {
@@ -460,19 +467,19 @@ export default function CandidateRegisterPage() { className="space-y-4" >
- + {errors.education && ( @@ -481,18 +488,18 @@ export default function CandidateRegisterPage() {
- + {errors.experience && ( @@ -501,20 +508,20 @@ export default function CandidateRegisterPage() {
- +