Files
banu-front/src/features/auth/schema/student-register.js
T
sajjadtalkhabi e700609236
Deploy banu-front / deploy (push) Successful in 1m20s
fix
2026-06-27 20:07:58 +03:30

115 lines
3.7 KiB
JavaScript

import { array, mixed, number, object, string } from 'yup'
import { phoneNumberRule } from '@/constants/rules/phoneNumberRule'
import { nationalCodeRule } from '@/constants/rules/nationalCodeRule'
const requiredString = (min = 0) => {
const base = string().required()
return min > 0 ? base.min(min) : base
}
export const personalInformationSchema = object().shape({
avatar: mixed().notRequired(),
avatarId: mixed().notRequired(),
name: requiredString(3),
birthDate: string().required(),
nationalCode: nationalCodeRule,
maritalStatus: string().required(),
gender: string().required(),
phone: phoneNumberRule,
provinceId: mixed().required(),
cityId: mixed().required(),
address: requiredString(10),
})
export const educationalInformationSchema = object().shape({
educationStatus: string().required(),
seminaryLevel: string().required(),
universityLevel: string().required(),
universityName: requiredString(5),
fieldOfStudy: requiredString(5),
workExperienceSummary: requiredString(10),
activitySummary: requiredString(10),
})
export const professionalInformationSchema = object().shape({
propagationExperienceYears: number()
.typeError('سنوات تجربه تبلیغ باید عدد باشد')
.required()
.min(0)
.max(70),
propagationMethodDescription: requiredString(10),
specializedTopics: requiredString(10),
propagationPlatforms: array()
.of(string())
.min(1, 'حداقل یک بستر فعالیت را انتخاب کنید')
.max(6, 'حداکثر ۶ بستر فعالیت قابل انتخاب است')
.required()
.test(
'no-both-none-and-others',
'نمی‌توانید همزمان "فعالیتی نداشته‌ام" و سایر گزینه‌ها را انتخاب کنید',
(value) => {
if (!value) return false
const hasNone = value.includes('none')
const hasOthers = value.some((v) => v !== 'none')
return !(hasNone && hasOthers)
}
),
onlinePlatformDetails: string().when('propagationPlatforms', {
is: (val) => Array.isArray(val) && val.includes('online'),
then: (s) => s.required().min(10),
otherwise: (s) => s.notRequired().nullable(),
}),
otherPlatformDetails: string().when('propagationPlatforms', {
is: (val) => Array.isArray(val) && val.includes('other'),
then: (s) => s.required().min(10),
otherwise: (s) => s.notRequired().nullable(),
}),
})
const skillSelectWithOtherSchema = (selectField, descField) =>
object().shape({
[selectField]: string().required(),
[descField]: string().when(selectField, {
is: 'other',
then: (s) => s.required().min(10),
otherwise: (s) => s.notRequired().nullable(),
}),
})
export const skillAssessmentPart1Schema = skillSelectWithOtherSchema(
'responseToLowSatisfaction',
'responseToLowSatisfactionDescription'
)
export const skillAssessmentPart2Schema = skillSelectWithOtherSchema(
'responseToSessionCancellation',
'responseToSessionCancellationDescription'
)
export const skillAssessmentPart3Schema = skillSelectWithOtherSchema(
'responseToAudienceConflict',
'responseToAudienceConflictDescription'
)
export const skillAssessmentPart4Schema = skillSelectWithOtherSchema(
'responseToCompetingPropagator',
'responseToCompetingPropagatorDescription'
)
export const skillAssessmentPart5Schema = object().shape({
responseToUnqualifiedAdvisors: requiredString(10),
relevantCertificates: requiredString(10),
hijabApproach: requiredString(10),
})
export const skillAssessmentPart6Schema = object().shape({
faithProductionAudio: mixed().required(),
faithProductionId: mixed().notRequired(),
})
export const skillAssessmentPart7Schema = object().shape({
leaderMessageVideo: mixed().required(),
leaderMessageId: mixed().notRequired(),
})