import { useState } from "react"; import toast from "react-hot-toast"; import Select from "react-select"; import makeAnimated from "react-select/animated"; // فرض می‌کنیم JobFormData اینجا تعریف شده باشد اگر در فایل دیگری نیست interface JobFormData { job_title: string; seniority_level: string[]; type_of_co_operation: string[]; at_least_work_experience: number | null; internship: boolean; province: string; city: string; address: string; advantage_list: string[]; // این فیلد در این فرم نیست، اما اگر در جای دیگری استفاده می‌شود، خوب است که باشد content: string; // این فیلد در این فرم نیست owner_name: string; // این فیلد در این فرم نیست } interface SelectOption { value: string; label: string; } // نمونه داده‌ها const seniorityOptions: SelectOption[] = [ { value: "entry_level", label: "بدون سابقه (کارآموز)" }, { value: "junior", label: "سطح پایین (تا 2 سال)" }, { value: "mid_level", label: "نیمه ماهر (2 تا 5 سال)" }, { value: "senior", label: "ارشد (5+ سال)" }, { value: "lead", label: "سرپرست" }, ]; const cooperationOptions: SelectOption[] = [ { value: "full_time", label: "تمام وقت" }, { value: "part_time", label: "پاره وقت" }, { value: "contract", label: "پروژه‌ای/قراردادی" }, { value: "remote", label: "دورکاری" }, { value: "percentage", label: "درصدی" }, ]; const animatedComponents = makeAnimated(); // استایل‌های سفارشی برای react-select const selectStyles = { control: (base: any, { isFocused }: any) => ({ ...base, padding: "0.7rem 0.8rem", // کمی padding بیشتر borderRadius: "8px", border: isFocused ? "1px solid #60a5fa" : "1px solid #d1d5eb", // آبی ملایم در فوکوس boxShadow: isFocused ? "0 0 0 2px rgba(96, 165, 250, 0.3)" : "none", // سایه ظریف در فوکوس "&:hover": { borderColor: "#93c5fd" }, // آبی روشن‌تر در هاور minHeight: "50px", // ارتفاع بیشتر fontSize: "0.95rem", // فونت کمی بزرگتر }), multiValue: (base: any) => ({ ...base, backgroundColor: "#3b82f6", // رنگ اصلی آبی borderRadius: "4px", color: "white", padding: "2px 6px", }), multiValueLabel: (base: any) => ({ ...base, color: "white", fontSize: "0.9rem", }), multiValueRemove: (base: any) => ({ ...base, backgroundColor: "#f87171", // رنگ قرمز ملایم برای حذف color: "white", borderRadius: "4px", padding: "4px", marginLeft: "6px", "&:hover": { backgroundColor: "#ef4444" }, // قرمز تیره‌تر در هاور }), option: (base: any, { isFocused, isSelected }: any) => ({ ...base, backgroundColor: isSelected ? "#3b82f6" : (isFocused ? "#e0e7ff" : "white"), // آبی برای انتخاب شده، آبی خیلی روشن برای فوکوس color: isSelected ? "white" : "black", // متن سفید در حالت انتخاب شده padding: "0.8rem", fontSize: "0.9rem", cursor: "pointer", }), placeholder: (base: any) => ({ ...base, color: "#9ca3af", fontSize: "0.95rem" }), // خاکستری تیره‌تر برای placeholder input: (base: any) => ({ ...base, margin: "0", padding: "0" }), valueContainer: (base: any) => ({ ...base, padding: "0 0.5rem" }), indicatorSeparator: (base: any) => ({ ...base, display: 'none' }), // حذف جداکننده }; interface StepOneFormProps { formData: JobFormData; setFormData: React.Dispatch>; // اصلاح type onNextStep: () => void; } const StepOneForm: React.FC = ({ formData, setFormData, onNextStep }) => { const [selectedSeniority, setSelectedSeniority] = useState( (formData?.seniority_level?.map((val) => seniorityOptions.find((opt) => opt.value === val)) as SelectOption[])?.filter(Boolean) || [], ); const [selectedCooperation, setSelectedCooperation] = useState( (formData?.type_of_co_operation?.map((val) => cooperationOptions.find((opt) => opt.value === val)) as SelectOption[])?.filter(Boolean) || [], ); // مدیریت تغییرات ورودی‌های عادی const handleInputChange = (e: React.ChangeEvent) => { //@ts-ignore const { name, value, type, checked } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "checkbox" ? checked : value })); }; // مدیریت تغییرات سلکت‌ها const handleSelectChange = (selectedOptions: any, actionMeta: any) => { const name = actionMeta.name; if (actionMeta.action === "clear") { if (name === "seniority") { setSelectedSeniority([]); setFormData((prev) => ({ ...prev, seniority_level: [] })); } else if (name === "cooperation") { setSelectedCooperation([]); setFormData((prev) => ({ ...prev, type_of_co_operation: [] })); } return; } const newSelected = selectedOptions as SelectOption[]; const values = newSelected.map((opt) => opt.value); if (name === "seniority") { setSelectedSeniority(newSelected); setFormData((prev) => ({ ...prev, seniority_level: values })); } else if (name === "cooperation") { setSelectedCooperation(newSelected); setFormData((prev) => ({ ...prev, type_of_co_operation: values })); } }; // اعتبارسنجی فرم const validateStepOne = (): boolean => { let isValid = true; if (!formData?.job_title?.trim()) { toast.error("عنوان شغلی الزامی است."); isValid = false; } if (!formData?.seniority_level || formData?.seniority_level.length === 0) { toast.error("حداقل یک رده سازمانی انتخاب کنید."); isValid = false; } if (!formData?.type_of_co_operation || formData?.type_of_co_operation.length === 0) { toast.error("حداقل یک نوع همکاری انتخاب کنید."); isValid = false; } const experience = formData?.at_least_work_experience; console.log(experience); if (experience !== null && typeof experience === "number" && experience < 0) { toast.error("سابقه کار باید یک عدد نامنفی باشد."); isValid = false; } // می‌تونید اعتبارسنجی‌های بیشتری اضافه کنید (مثلا برای شهر و استان) return isValid; }; // رفتن به مرحله بعد const handleNext = () => { if (validateStepOne()) { onNextStep(); } }; return (
{/* پس‌زمینه سفید، padding، گرد، سایه و حداکثر عرض */}

اطلاعات شغلی

{/* عنوان بزرگ و مرکز */} {/* عنوان شغلی */}
{/* چیدمان دو ستونه */} {/* رده سازمانی */}
{/* حداقل سابقه کار */}
{/* استان و شهر (در صورت نیاز به فیلدهای جداگانه) */} {/* این قسمت رو میشه بهتر کرد، مثلا با استفاده از کامپوننت‌های مخصوص شهر و استان */}
{/* آدرس */}