|
@@ -29,62 +29,68 @@ import { User } from '../data/schema'
|
|
|
|
|
|
|
|
const formSchema = z
|
|
const formSchema = z
|
|
|
.object({
|
|
.object({
|
|
|
- firstName: z.string().min(1, { message: 'First Name is required.' }),
|
|
|
|
|
- lastName: z.string().min(1, { message: 'Last Name is required.' }),
|
|
|
|
|
- username: z.string().min(1, { message: 'Username is required.' }),
|
|
|
|
|
- phoneNumber: z.string().min(1, { message: 'Phone number is required.' }),
|
|
|
|
|
- email: z
|
|
|
|
|
- .string()
|
|
|
|
|
- .min(1, { message: 'Email is required.' })
|
|
|
|
|
- .email({ message: 'Email is invalid.' }),
|
|
|
|
|
|
|
+ firstName: z.string().min(1, 'First Name is required.'),
|
|
|
|
|
+ lastName: z.string().min(1, 'Last Name is required.'),
|
|
|
|
|
+ username: z.string().min(1, 'Username is required.'),
|
|
|
|
|
+ phoneNumber: z.string().min(1, 'Phone number is required.'),
|
|
|
|
|
+ email: z.email({
|
|
|
|
|
+ error: (iss) => (iss.input === '' ? 'Email is required.' : undefined),
|
|
|
|
|
+ }),
|
|
|
password: z.string().transform((pwd) => pwd.trim()),
|
|
password: z.string().transform((pwd) => pwd.trim()),
|
|
|
- role: z.string().min(1, { message: 'Role is required.' }),
|
|
|
|
|
|
|
+ role: z.string().min(1, 'Role is required.'),
|
|
|
confirmPassword: z.string().transform((pwd) => pwd.trim()),
|
|
confirmPassword: z.string().transform((pwd) => pwd.trim()),
|
|
|
isEdit: z.boolean(),
|
|
isEdit: z.boolean(),
|
|
|
})
|
|
})
|
|
|
- .superRefine(({ isEdit, password, confirmPassword }, ctx) => {
|
|
|
|
|
- if (!isEdit || (isEdit && password !== '')) {
|
|
|
|
|
- if (password === '') {
|
|
|
|
|
- ctx.addIssue({
|
|
|
|
|
- code: z.ZodIssueCode.custom,
|
|
|
|
|
- message: 'Password is required.',
|
|
|
|
|
- path: ['password'],
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (password.length < 8) {
|
|
|
|
|
- ctx.addIssue({
|
|
|
|
|
- code: z.ZodIssueCode.custom,
|
|
|
|
|
- message: 'Password must be at least 8 characters long.',
|
|
|
|
|
- path: ['password'],
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!password.match(/[a-z]/)) {
|
|
|
|
|
- ctx.addIssue({
|
|
|
|
|
- code: z.ZodIssueCode.custom,
|
|
|
|
|
- message: 'Password must contain at least one lowercase letter.',
|
|
|
|
|
- path: ['password'],
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (!password.match(/\d/)) {
|
|
|
|
|
- ctx.addIssue({
|
|
|
|
|
- code: z.ZodIssueCode.custom,
|
|
|
|
|
- message: 'Password must contain at least one number.',
|
|
|
|
|
- path: ['password'],
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (password !== confirmPassword) {
|
|
|
|
|
- ctx.addIssue({
|
|
|
|
|
- code: z.ZodIssueCode.custom,
|
|
|
|
|
- message: "Passwords don't match.",
|
|
|
|
|
- path: ['confirmPassword'],
|
|
|
|
|
- })
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .refine(
|
|
|
|
|
+ (data) => {
|
|
|
|
|
+ if (data.isEdit && !data.password) return true
|
|
|
|
|
+ return data.password.length > 0
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ message: 'Password is required.',
|
|
|
|
|
+ path: ['password'],
|
|
|
}
|
|
}
|
|
|
- })
|
|
|
|
|
|
|
+ )
|
|
|
|
|
+ .refine(
|
|
|
|
|
+ ({ isEdit, password }) => {
|
|
|
|
|
+ if (isEdit && !password) return true
|
|
|
|
|
+ return password.length >= 8
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ message: 'Password must be at least 8 characters long.',
|
|
|
|
|
+ path: ['password'],
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ .refine(
|
|
|
|
|
+ ({ isEdit, password }) => {
|
|
|
|
|
+ if (isEdit && !password) return true
|
|
|
|
|
+ return /[a-z]/.test(password)
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ message: 'Password must contain at least one lowercase letter.',
|
|
|
|
|
+ path: ['password'],
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ .refine(
|
|
|
|
|
+ ({ isEdit, password }) => {
|
|
|
|
|
+ if (isEdit && !password) return true
|
|
|
|
|
+ return /\d/.test(password)
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ message: 'Password must contain at least one number.',
|
|
|
|
|
+ path: ['password'],
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
|
|
+ .refine(
|
|
|
|
|
+ ({ isEdit, password, confirmPassword }) => {
|
|
|
|
|
+ if (isEdit && !password) return true
|
|
|
|
|
+ return password === confirmPassword
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ message: "Passwords don't match.",
|
|
|
|
|
+ path: ['confirmPassword'],
|
|
|
|
|
+ }
|
|
|
|
|
+ )
|
|
|
type UserForm = z.infer<typeof formSchema>
|
|
type UserForm = z.infer<typeof formSchema>
|
|
|
|
|
|
|
|
interface Props {
|
|
interface Props {
|