import { z } from 'zod'; // Login Schema export const loginSchema = z.object({ email: z .string() .min(1, 'L\'email est requis') .email('Email invalide'), password: z .string() .min(1, 'Le mot de passe est requis') .min(8, 'Le mot de passe doit contenir au moins 8 caractères'), }); export type LoginFormData = z.infer; // Register Schema export const registerSchema = z.object({ email: z .string() .min(1, 'L\'email est requis') .email('Email invalide'), password: z .string() .min(1, 'Le mot de passe est requis') .min(8, 'Le mot de passe doit contenir au moins 8 caractères') .regex( /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, 'Le mot de passe doit contenir au moins une majuscule, une minuscule et un chiffre' ), confirmPassword: z .string() .min(1, 'Veuillez confirmer le mot de passe'), firstName: z .string() .min(1, 'Le prénom est requis') .min(2, 'Le prénom doit contenir au moins 2 caractères'), lastName: z .string() .min(1, 'Le nom est requis') .min(2, 'Le nom doit contenir au moins 2 caractères'), phone: z .string() .optional() .refine((val) => !val || /^(\+33|0)[1-9](\d{2}){4}$/.test(val), { message: 'Numéro de téléphone invalide', }), }).refine((data) => data.password === data.confirmPassword, { message: 'Les mots de passe ne correspondent pas', path: ['confirmPassword'], }); export type RegisterFormData = z.infer; // Ticket Code Schema export const ticketCodeSchema = z.object({ ticketCode: z .string() .min(1, 'Le code du ticket est requis') .length(10, 'Le code doit contenir exactement 10 caractères') .regex(/^[A-Z0-9]{10}$/, 'Le code doit contenir uniquement des lettres majuscules et des chiffres'), }); export type TicketCodeFormData = z.infer; // Profile Update Schema export const profileUpdateSchema = z.object({ firstName: z .string() .min(1, 'Le prénom est requis') .min(2, 'Le prénom doit contenir au moins 2 caractères'), lastName: z .string() .min(1, 'Le nom est requis') .min(2, 'Le nom doit contenir au moins 2 caractères'), phone: z .string() .optional() .refine((val) => !val || /^(\+33|0)[1-9](\d{2}){4}$/.test(val), { message: 'Numéro de téléphone invalide', }), }); export type ProfileUpdateFormData = z.infer; // Password Change Schema export const passwordChangeSchema = z.object({ currentPassword: z .string() .min(1, 'Le mot de passe actuel est requis'), newPassword: z .string() .min(8, 'Le nouveau mot de passe doit contenir au moins 8 caractères') .regex( /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/, 'Le mot de passe doit contenir au moins une majuscule, une minuscule et un chiffre' ), confirmNewPassword: z .string() .min(1, 'Veuillez confirmer le nouveau mot de passe'), }).refine((data) => data.newPassword === data.confirmNewPassword, { message: 'Les mots de passe ne correspondent pas', path: ['confirmNewPassword'], }); export type PasswordChangeFormData = z.infer;