// EducationForm.tsx import React, { useEffect, useState } from "react"; import { Box, Button, MenuItem, TextField, Typography } from "@mui/material"; import { UploadFile } from "@mui/icons-material"; type DegreeValue = | "" | "زیر دیپلم" | "دیپلم" | "کاردانی" | "کارشناسی" | "کارشناسی ارشد" | "دکتری" | "حوزوی" | "سایر"; export interface EducationFormState { applicantId: string; degree: DegreeValue | string; // allow custom too field: string; university: string; startYear: number | ""; endYear: number | ""; gpa: number | ""; description: string; certificateImageId: string; // FK (uuid as string) } const initialValues: EducationFormState = { applicantId: "", degree: "", field: "", university: "", startYear: "", endYear: "", gpa: "", description: "", certificateImageId: "", }; function toNumberOrEmpty(v: string): number | "" { if (v === "") return ""; const n = Number(v); return Number.isFinite(n) ? n : ""; } export default function EducationForm(props: { value?: EducationFormState; onChange?: (next: EducationFormState) => void; applicantId?: string; // اگر آپلودر فایل داری، آیدی خروجی‌اش رو اینجا ست می‌کنی // onPickCertificateId?: () => void; // (اختیاری) }) { const { value, onChange, applicantId } = props; const [formData, setFormData] = useState( value ?? { ...initialValues, applicantId: applicantId ?? "" }, ); const [profilePhoto, setProfilePhoto] = useState(null); const [profilePhotoError, setProfilePhotoError] = useState(""); const handleProfilePhotoChange = ( event: React.ChangeEvent, ) => { const file = event.target.files?.[0]; if (!file) return; if (!file.type.startsWith("image/")) { setProfilePhoto(null); setProfilePhotoError("فقط فایل تصویری مجاز است"); return; } const maxSize = 500 * 1024; // 500KB if (file.size > maxSize) { setProfilePhoto(null); setProfilePhotoError("حجم عکس باید حداکثر ۵۰۰ کیلوبایت باشد"); return; } setProfilePhoto(file); setProfilePhotoError(""); }; // controlled sync useEffect(() => { if (value) setFormData(value); }, [value]); // applicantId sync when uncontrolled useEffect(() => { if (!value && applicantId) setFormData((p) => ({ ...p, applicantId })); }, [applicantId, value]); const setNext = ( updater: (prev: EducationFormState) => EducationFormState, ) => { setFormData((prev) => { const next = updater(prev); onChange?.(next); return next; }); }; const handleText = (field: keyof EducationFormState) => (e: React.ChangeEvent) => { const v = e.target.value; setNext((p) => ({ ...p, [field]: v }) as EducationFormState); }; const handleNumber = (field: keyof EducationFormState) => (e: React.ChangeEvent) => { const v = toNumberOrEmpty(e.target.value); setNext((p) => ({ ...p, [field]: v }) as EducationFormState); }; // Validation helpers (optional UI only) const startYearError = formData.startYear !== "" && (formData.startYear < 1300 || formData.startYear > 1600); const endYearError = formData.endYear !== "" && (formData.endYear < 1300 || formData.endYear > 1600); const endBeforeStart = formData.startYear !== "" && formData.endYear !== "" && Number(formData.endYear) < Number(formData.startYear); const gpaError = formData.gpa !== "" && (Number(formData.gpa) < 0 || Number(formData.gpa) > 20); return ( انتخاب کنید {( [ "زیر دیپلم", "دیپلم", "کاردانی", "کارشناسی", "کارشناسی ارشد", "دکتری", "حوزوی", "سایر", ] as const ).map((d) => ( {d} ))} تصوير مدرك تحصيلي فقط فایل تصویری مجاز است و حجم آن باید حداکثر ۵۰۰ کیلوبایت باشد. {profilePhoto && ( فایل انتخاب‌شده: {profilePhoto.name} )} {profilePhotoError && ( {profilePhotoError} )} ); } export { initialValues as educationInitialValues };