115 lines
3.7 KiB
JavaScript
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(),
|
|
})
|