107 lines
3.2 KiB
TypeScript
107 lines
3.2 KiB
TypeScript
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<typeof loginSchema>;
|
|
|
|
// 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<typeof registerSchema>;
|
|
|
|
// 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<typeof ticketCodeSchema>;
|
|
|
|
// 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<typeof profileUpdateSchema>;
|
|
|
|
// 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<typeof passwordChangeSchema>;
|