the-tip-top-frontend/lib/validations.ts
2025-11-17 23:38:02 +01:00

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>;