From b97f72aeae50342fd9b071ad622bb70e3148ff43 Mon Sep 17 00:00:00 2001 From: hossein taromi Date: Wed, 30 Jul 2025 14:23:37 +0330 Subject: [PATCH] fix: improve file_ids handling in VariantManager and ProductFormPage --- src/components/ui/VariantManager.tsx | 17 ++++++++++++++--- .../products/product-form/ProductFormPage.tsx | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/ui/VariantManager.tsx b/src/components/ui/VariantManager.tsx index edac25e..68a0511 100644 --- a/src/components/ui/VariantManager.tsx +++ b/src/components/ui/VariantManager.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { Plus, Trash2, Edit3, Package, X, Edit, Image as ImageIcon } from 'lucide-react'; import { ProductVariantFormData, ProductImage } from '../../pages/products/core/_models'; import { Button } from './Button'; @@ -44,7 +44,11 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is } ); - const [uploadedImages, setUploadedImages] = useState(variant?.file_ids || []); + const [uploadedImages, setUploadedImages] = useState( + Array.isArray(variant?.file_ids) && variant.file_ids.length > 0 && typeof variant.file_ids[0] === 'object' + ? variant.file_ids + : [] + ); const [attributes, setAttributes] = useState>(variant?.attributes || {}); const [meta, setMeta] = useState>(variant?.meta || {}); const [newAttributeKey, setNewAttributeKey] = useState(''); @@ -55,6 +59,11 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is const { mutateAsync: uploadFile } = useFileUpload(); const { mutate: deleteFile } = useFileDelete(); + // Sync formData.file_ids with uploadedImages + useEffect(() => { + setFormData(prev => ({ ...prev, file_ids: uploadedImages })); + }, [uploadedImages]); + const handleInputChange = (field: keyof ProductVariantFormData, value: any) => { if (typeof value === 'string') { value = persianToEnglish(value); @@ -125,11 +134,13 @@ const VariantForm: React.FC = ({ variant, onSave, onCancel, is }; const handleSave = () => { + const fileIds = uploadedImages.map(img => Number(img.id)).filter(id => !isNaN(id)); + const convertedData = convertPersianNumbersInObject({ ...formData, attributes, meta, - file_ids: uploadedImages + file_ids: fileIds }); onSave(convertedData); diff --git a/src/pages/products/product-form/ProductFormPage.tsx b/src/pages/products/product-form/ProductFormPage.tsx index 13396fa..83c177b 100644 --- a/src/pages/products/product-form/ProductFormPage.tsx +++ b/src/pages/products/product-form/ProductFormPage.tsx @@ -223,7 +223,7 @@ const ProductFormPage = () => { stock_number: variant.stock_number, weight: variant.weight, product_option_id: variant.product_option_id || null, - file_ids: (variant.file_ids || []).map((img: any) => Number(img.id)).filter((id: number) => !isNaN(id)), + file_ids: Array.isArray(variant.file_ids) ? variant.file_ids.filter((id: any) => typeof id === 'number' && !isNaN(id)) : [], attributes: variant.attributes && Object.keys(variant.attributes).length > 0 ? variant.attributes : {}, meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {} })) || []; @@ -248,7 +248,7 @@ const ProductFormPage = () => { stock_number: variant.stock_number, weight: variant.weight, product_option_id: variant.product_option_id || null, - file_ids: (variant.file_ids || []).map((img: any) => Number(img.id)).filter((id: number) => !isNaN(id)), + file_ids: Array.isArray(variant.file_ids) ? variant.file_ids.filter((id: any) => typeof id === 'number' && !isNaN(id)) : [], attributes: variant.attributes && Object.keys(variant.attributes).length > 0 ? variant.attributes : {}, meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {} })) || [];