import { type FC, useState, useEffect, useMemo } from 'react' import type { FormikProps } from 'formik' import Input from '@/components/Input' import Select from '@/components/Select' import Textarea from '@/components/Textarea' import Button from '@/components/Button' import RadioGroup from '@/components/RadioGroup' import type { CreateProductType, ProductVariant, Category } from '../types/Types' import { PaymentType, PricingType, PurchaseUnit, PURCHASE_UNIT_LABELS } from '../enum/Enum' import { Add, Trash } from 'iconsax-react' type BasicInfoSectionProps = { formik: FormikProps categories: Category[] /** در صفحه ویرایش، اگر کالا تنوع دارد مقدار true پاس داده شود */ initialHasVariants?: boolean } const newVariant = (): ProductVariant => ({ value: '', price: 0 }) const purchaseUnitOptions = Object.values(PurchaseUnit).map((unit) => ({ value: unit, label: PURCHASE_UNIT_LABELS[unit], })) const BasicInfoSection: FC = ({ formik, categories, initialHasVariants }) => { const [hasVariants, setHasVariants] = useState(initialHasVariants ?? false) /** دسته اصلی انتخاب‌شده برای نمایش زیردسته‌ها */ const [parentCategoryId, setParentCategoryId] = useState('') const isVariablePricing = formik.values.pricingType === PricingType.VARIABLE const purchaseUnit = formik.values.purchaseUnit ?? PurchaseUnit.NUMBER const unitLabel = PURCHASE_UNIT_LABELS[purchaseUnit] const mainCategories = useMemo( () => categories.filter((c) => !c.parent).map((c) => ({ label: c.title, value: c.id })), [categories] ) const selectedParent = useMemo( () => categories.find((c) => c.id === parentCategoryId), [categories, parentCategoryId] ) const subCategories = useMemo( () => (selectedParent?.children || []).map((c) => ({ label: c.title, value: c.id })), [selectedParent] ) useEffect(() => { if (initialHasVariants !== undefined) { setHasVariants(initialHasVariants) } }, [initialHasVariants]) /** همگام‌سازی parentCategoryId با categoryId وقتی فرم مقداردهی می‌شود (مثلاً در ویرایش) */ useEffect(() => { const catId = formik.values.categoryId if (!catId) return const cat = categories.find((c) => c.id === catId) const child = categories.flatMap((c) => c.children || []).find((ch) => ch.id === catId) if (child) { setParentCategoryId(child.parent || '') } else if (cat && !cat.parent) { setParentCategoryId(catId) } }, [formik.values.categoryId, categories]) const handleHasVariantsChange = (value: string | boolean) => { const next = value === true setHasVariants(next) if (!next) { formik.setFieldValue('variants', []) formik.setFieldValue('attribute', '') } else if (formik.values.variants.length === 0) { formik.setFieldValue('variants', [newVariant()]) } } const handlePricingTypeChange = (value: string | boolean) => { const next = value as PricingType formik.setFieldValue('pricingType', next) if (next === PricingType.VARIABLE) { if (!formik.values.purchaseUnit) { formik.setFieldValue('purchaseUnit', PurchaseUnit.NUMBER) } } } const handlePaymentTypeChange = (value: string | boolean) => { const next = value as PaymentType formik.setFieldValue('paymentType', next) formik.setFieldValue('needAdminAcceptance', next === PaymentType.AFTER_PREPARATION) } const addVariant = () => { formik.setFieldValue('variants', [...formik.values.variants, newVariant()]) } const updateVariant = (index: number, field: keyof ProductVariant, value: string | number | undefined) => { const next = [...formik.values.variants] next[index] = { ...next[index], [field]: value } formik.setFieldValue('variants', next) } const removeVariant = (index: number) => { formik.setFieldValue( 'variants', formik.values.variants.filter((_, i) => i !== index) ) } const setOptionalNumberField = (name: keyof CreateProductType, raw: string) => { formik.setFieldValue(name, raw === '' ? undefined : Number(raw)) } const setOptionalDecimalField = (name: keyof CreateProductType, raw: string) => { if (raw === '' || raw === '.') { formik.setFieldValue(name, undefined) return } const num = parseFloat(raw) if (!Number.isNaN(num)) { formik.setFieldValue(name, num) } } return ( <>
s.value === formik.values.categoryId) ? formik.values.categoryId : '' } onChange={(e) => { const value = e.target.value formik.setFieldValue('categoryId', value || parentCategoryId) }} />
)}
{formik.touched.categoryId && formik.errors.categoryId && (
{formik.errors.categoryId}
)} {!isVariablePricing && (
setOptionalNumberField('maxPurchaseQuantity', e.target.value)} error_text={formik.touched.maxPurchaseQuantity && formik.errors.maxPurchaseQuantity ? formik.errors.maxPurchaseQuantity : ''} />
)} {/* بخش قیمت‌گذاری و تنوع */}
قیمت‌گذاری و تنوع

تعیین کنید کالا دارای تنوع (مثلاً رنگ، سایز) است یا یک قیمت ثابت دارد.

{!hasVariants ? ( isVariablePricing ? (
formik.setFieldValue('price', Number(e.target.value))} error_text={formik.touched.price && formik.errors.price ? formik.errors.price : ''} />
setOptionalDecimalField('minPurchaseQuantity', e.target.value)} error_text={formik.touched.minPurchaseQuantity && formik.errors.minPurchaseQuantity ? formik.errors.minPurchaseQuantity : ''} /> setOptionalDecimalField('maxPurchaseQuantity', e.target.value)} error_text={formik.touched.maxPurchaseQuantity && formik.errors.maxPurchaseQuantity ? formik.errors.maxPurchaseQuantity : ''} /> setOptionalDecimalField('purchasePitch', e.target.value)} error_text={formik.touched.purchasePitch && formik.errors.purchasePitch ? formik.errors.purchasePitch : ''} />
setOptionalNumberField('stock', e.target.value)} error_text={formik.touched.stock && formik.errors.stock ? formik.errors.stock : ''} /> formik.setFieldValue('discount', Number(e.target.value))} error_text={formik.touched.discount && formik.errors.discount ? formik.errors.discount : ''} /> formik.setFieldValue('order', Number(e.target.value))} error_text={formik.touched.order && formik.errors.order ? formik.errors.order : ''} />
) : (
formik.setFieldValue('price', Number(e.target.value))} error_text={formik.touched.price && formik.errors.price ? formik.errors.price : ''} /> setOptionalNumberField('stock', e.target.value)} error_text={formik.touched.stock && formik.errors.stock ? formik.errors.stock : ''} /> formik.setFieldValue('discount', Number(e.target.value))} error_text={formik.touched.discount && formik.errors.discount ? formik.errors.discount : ''} /> formik.setFieldValue('order', Number(e.target.value))} error_text={formik.touched.order && formik.errors.order ? formik.errors.order : ''} />
) ) : (
formik.setFieldValue('discount', Number(e.target.value))} error_text={formik.touched.discount && formik.errors.discount ? formik.errors.discount : ''} /> formik.setFieldValue('order', Number(e.target.value))} error_text={formik.touched.order && formik.errors.order ? formik.errors.order : ''} />
{formik.values.variants.map((v, index) => (
updateVariant(index, 'value', e.target.value)} className='flex-1 min-w-0' /> updateVariant(index, 'price', Number(e.target.value))} className='flex-1 min-w-0 shrink-0' /> { const val = e.target.value updateVariant(index, 'stock', val === '' ? undefined : Number(val)) }} className='flex-1 min-w-0 shrink-0' />
removeVariant(index)} color='red' size={20} />
))}
)}