import React, { useEffect, useMemo, useState } from "react"; import { Box, MenuItem, TextField } from "@mui/material"; type BloodType = "" | "A+" | "A-" | "B+" | "B-" | "AB+" | "AB-" | "O+" | "O-"; export interface PhysicalInfoFormState { applicantId: string; bloodType: BloodType; height: number | ""; // cm weight: number | ""; // kg bmi: number | ""; // auto or manual hasDisability: boolean; disabilityDescription: string; hasChronicDisease: boolean; chronicDiseaseDescription: string; surgeryHistory: string; medications: string; specialMark: string; } const initialValues: PhysicalInfoFormState = { applicantId: "", bloodType: "", height: "", weight: "", bmi: "", hasDisability: false, disabilityDescription: "", hasChronicDisease: false, chronicDiseaseDescription: "", surgeryHistory: "", medications: "", specialMark: "", }; function toNumberOrEmpty(v: string): number | "" { if (v === "") return ""; const n = Number(v); return Number.isFinite(n) ? n : ""; } function round1(n: number) { return Math.round(n * 10) / 10; } export default function PhysicalInfoForm(props: { value?: PhysicalInfoFormState; onChange?: (next: PhysicalInfoFormState) => void; applicantId?: string; // اگر خواستی از بیرون تزریق کنی }) { const { value, onChange, applicantId } = props; const [formData, setFormData] = useState( value ?? { ...initialValues, applicantId: applicantId ?? "" }, ); // اگر value کنترل‌شده بود، همگام‌سازی useEffect(() => { if (value) setFormData(value); }, [value]); // اگر applicantId از بیرون تغییر کرد useEffect(() => { if (!value && applicantId) { setFormData((p) => ({ ...p, applicantId })); } }, [applicantId, value]); const setNext = ( updater: (prev: PhysicalInfoFormState) => PhysicalInfoFormState, ) => { setFormData((prev) => { const next = updater(prev); onChange?.(next); return next; }); }; const handleText = (field: keyof PhysicalInfoFormState) => (e: React.ChangeEvent) => { const v = e.target.value; setNext((p) => ({ ...p, [field]: v }) as PhysicalInfoFormState); }; const handleNumber = (field: keyof PhysicalInfoFormState) => (e: React.ChangeEvent) => { const v = toNumberOrEmpty(e.target.value); setNext((p) => ({ ...p, [field]: v }) as PhysicalInfoFormState); }; const handleBoolSelect = (field: "hasDisability" | "hasChronicDisease") => (e: React.ChangeEvent) => { const v = e.target.value === "true"; setNext((p) => { // اگر false شد، توضیحات را پاک می‌کنیم تا داده کثیف نماند if (field === "hasDisability" && !v) { return { ...p, hasDisability: false, disabilityDescription: "" }; } if (field === "hasChronicDisease" && !v) { return { ...p, hasChronicDisease: false, chronicDiseaseDescription: "", }; } return { ...p, [field]: v }; }); }; // محاسبه BMI از روی قد و وزن (cm, kg) const computedBmi = useMemo(() => { if (formData.height === "" || formData.weight === "") return ""; const hMeters = Number(formData.height) / 100; if (!hMeters || hMeters <= 0) return ""; const bmi = Number(formData.weight) / (hMeters * hMeters); return Number.isFinite(bmi) ? round1(bmi) : ""; }, [formData.height, formData.weight]); // sync bmi (فقط وقتی قد/وزن داریم) useEffect(() => { // اگر بخوای دستی BMI وارد کنی، این بخش رو حذف کن. setNext((p) => ({ ...p, bmi: computedBmi })); // eslint-disable-next-line react-hooks/exhaustive-deps }, [computedBmi]); return ( {/* bloodType */} انتخاب کنید {(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"] as const).map( (bt) => ( {bt} ), )} {/* height */} {/* weight */} {/* bmi */} {/* specialMark */} {/* hasDisability */} خیر بله {/* hasChronicDisease */} خیر بله {/* disabilityDescription */} {formData.hasDisability && ( )} {/* chronicDiseaseDescription */} {formData.hasChronicDisease && ( )} {/* surgeryHistory */} {/* medications */} ); }