Files
LogisicsApp_Client/validations/user.validator.ts

90 lines
2.8 KiB
TypeScript

import * as yup from "yup";
// ── Phone regex — same as backend ─────────────────────────────────────────────
const SAUDI_PHONE_RE = /^(\+966|966|0)?5[0-9]{8}$/;
// ── Create schema ─────────────────────────────────────────────────────────────
export const createUserSchema = yup.object({
name: yup
.string()
.required("الاسم الكامل مطلوب")
.min(2, "الاسم يجب أن يكون حرفين على الأقل"),
phone: yup
.string()
.required("رقم الهاتف مطلوب")
.matches(SAUDI_PHONE_RE, "رقم الجوال غير صالح — يجب أن يكون رقم سعودي صحيح"),
email: yup
.string()
.email("البريد الإلكتروني غير صالح")
.optional(),
password: yup
.string()
.required("كلمة المرور مطلوبة")
.min(8, "كلمة المرور يجب أن تكون 8 أحرف على الأقل"),
roleId: yup
.string()
.required("الدور مطلوب")
.uuid("معرّف الدور غير صالح"),
branchId: yup
.string()
.uuid("معرّف الفرع غير صالح")
.optional(),
});
// ── Update schema ─────────────────────────────────────────────────────────────
export const updateUserSchema = yup.object({
name: yup
.string()
.min(2, "الاسم يجب أن يكون حرفين على الأقل")
.optional(),
phone: yup
.string()
.matches(SAUDI_PHONE_RE, "رقم الجوال غير صالح — يجب أن يكون رقم سعودي صحيح")
.optional(),
email: yup
.string()
.email("البريد الإلكتروني غير صالح")
.optional(),
// password is optional on update — only sent if user wants to change it
password: yup
.string()
.min(8, "كلمة المرور يجب أن تكون 8 أحرف على الأقل")
.optional(),
isActive: yup.boolean().optional(),
roleId: yup
.string()
.uuid("معرّف الدور غير صالح")
.optional(),
branchId: yup
.string()
.uuid("معرّف الفرع غير صالح")
.optional(),
});
// ── Infer form error shape ────────────────────────────────────────────────────
export type UserSchemaErrors = Partial<
Record<
| "name"
| "phone"
| "email"
| "password"
| "roleId"
| "branchId"
| "isActive",
string
>
>;