import { z } from 'zod' const CommunicationBarrierSchema = z .enum(['YA', 'TIDAK'], { required_error: 'Mohon lengkapi Status Hambatan Berkomunikasi', }) .transform((val) => val === 'YA') const PatientSchema = z .object({ // Data Diri Pasien identityNumber: z .string({ required_error: 'Mohon lengkapi NIK', }) .min(16, 'NIK harus berupa angka 16 digit') .regex(/^\d+$/, 'NIK harus berupa angka 16 digit'), // identityCardFile: z.instanceof(File, { message: 'File KTP harus dipilih' }), // familyCardFile: z.instanceof(File, { message: 'File KK harus dipilih' }), // Informasi Dasar alias: z.string({ required_error: 'Mohon pilih sapaan', }), fullName: z.string({ required_error: 'Mohon lengkapi Nama', }), birthPlace: z .string({ required_error: 'Mohon lengkapi Tempat Lahir', }) .min(1, 'Mohon lengkapi Tempat Lahir'), birthDate: z .string({ required_error: 'Mohon lengkapi Tanggal Lahir', }) .refine( (date) => { // Jika kosong, return false untuk required validation if (!date || date.trim() === '') return false // Jika ada isi, validasi format tanggal try { const dateObj = new Date(date) // Cek apakah tanggal valid dan tahun >= 1900 return !isNaN(dateObj.getTime()) && dateObj.getFullYear() >= 1900 } catch { return false } }, { message: 'Mohon lengkapi Tanggal Lahir dengan format yang valid', }, ) .transform((dateStr) => new Date(dateStr).toISOString()), // Jenis Kelamin & Status gender: z.string({ required_error: 'Pilih Jenis Kelamin', }), maritalStatus: z.enum(['TIDAK_DIKETAHUI', 'BELUM_KAWIN', 'KAWIN', 'CERAI_HIDUP', 'CERAI_MATI'], { required_error: 'Pilih Status Perkawinan', }), // Informasi Lokasi & Sosial job: z .string({ required_error: 'Mohon lengkapi Pekerjaan', }) .min(1), nationality: z.string({ required_error: 'Pilih Kebangsaan', }), language: z.string({ required_error: 'Mohon pilih Preferensi Bahasa', }), education: z .string({ required_error: 'Mohon lengkapi Pendidikan', }) .min(1), religion: z .string({ required_error: 'Pilih Kepercayaan', }) .min(1), ethnicity: z.string().optional(), // Disabilitas disability: z.enum(['YA', 'TIDAK'], { required_error: 'Mohon lengkapi Status Disabilitas', }), disabilityType: z.string().optional(), // Informasi Kontak passportNumber: z.string().optional(), communicationBarrier: CommunicationBarrierSchema, note: z.string().optional(), drivingLicenseNumber: z.string().optional(), }) .refine((data) => (data.disability === 'TIDAK' ? !data.disabilityType : true), { message: "DisabilityType hanya boleh diisi jika disability = 'YA'", path: ['disabilityType'], }) .refine((data) => (data.disability === 'YA' ? !!data.disabilityType?.trim() : true), { message: 'Mohon pilih Jenis Disabilitas', path: ['disabilityType'], }) type PatientFormData = z.infer export { PatientSchema } export type { PatientFormData }