38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
import { z } from "zod";
|
|
|
|
// --- ESQUEMA DE CONTACTO ---
|
|
export const ContactoSchema = z.object({
|
|
nombre: z.string().min(2, "El nombre es demasiado corto"),
|
|
email: z.string().email("Introduce un correo electrónico válido"),
|
|
mensaje: z.string().min(10, "Cuéntanos un poco más sobre tu proyecto"),
|
|
privacidad: z.boolean().refine((val) => val === true, {
|
|
message: "Debes aceptar la política de privacidad",
|
|
}),
|
|
});
|
|
|
|
export type ContactoFormData = z.infer<typeof ContactoSchema>;
|
|
|
|
|
|
// --- ESQUEMA DE PARTICIPACIÓN ---
|
|
export const ParticipaSchema = z.object({
|
|
nombre: z.string().min(2, "El nombre es demasiado corto"),
|
|
apellidos: z.string().min(2, "Los apellidos son necesarios"),
|
|
email: z.string().email("Introduce un correo electrónico válido"),
|
|
telefono: z.string().min(9, "El teléfono no es válido"),
|
|
provincia: z.string().min(2, "Indica tu provincia"),
|
|
edad: z.string().refine((val) => !isNaN(Number(val)) && Number(val) > 0, {
|
|
message: "Introduce una edad válida",
|
|
}),
|
|
|
|
// SOLUCIÓN: Ahora acepta un string genérico (el ID de Supabase) o vacío (opcional)
|
|
interes: z.string().optional(),
|
|
|
|
mensaje: z.string().optional(),
|
|
|
|
// Usar boolean().refine() es más seguro con checkboxes en React Hook Form
|
|
privacidad: z.boolean().refine((val) => val === true, {
|
|
message: "Debes aceptar la política de privacidad",
|
|
}),
|
|
});
|
|
|
|
export type ParticipaFormData = z.infer<typeof ParticipaSchema>; |