fix: improve file_ids handling in VariantManager and ProductFormPage

This commit is contained in:
hossein taromi 2025-07-30 14:23:37 +03:30
parent a228605ba0
commit b97f72aeae
2 changed files with 16 additions and 5 deletions

View File

@ -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 { Plus, Trash2, Edit3, Package, X, Edit, Image as ImageIcon } from 'lucide-react';
import { ProductVariantFormData, ProductImage } from '../../pages/products/core/_models'; import { ProductVariantFormData, ProductImage } from '../../pages/products/core/_models';
import { Button } from './Button'; import { Button } from './Button';
@ -44,7 +44,11 @@ const VariantForm: React.FC<VariantFormProps> = ({ variant, onSave, onCancel, is
} }
); );
const [uploadedImages, setUploadedImages] = useState<ProductImage[]>(variant?.file_ids || []); const [uploadedImages, setUploadedImages] = useState<ProductImage[]>(
Array.isArray(variant?.file_ids) && variant.file_ids.length > 0 && typeof variant.file_ids[0] === 'object'
? variant.file_ids
: []
);
const [attributes, setAttributes] = useState<Record<string, any>>(variant?.attributes || {}); const [attributes, setAttributes] = useState<Record<string, any>>(variant?.attributes || {});
const [meta, setMeta] = useState<Record<string, any>>(variant?.meta || {}); const [meta, setMeta] = useState<Record<string, any>>(variant?.meta || {});
const [newAttributeKey, setNewAttributeKey] = useState(''); const [newAttributeKey, setNewAttributeKey] = useState('');
@ -55,6 +59,11 @@ const VariantForm: React.FC<VariantFormProps> = ({ variant, onSave, onCancel, is
const { mutateAsync: uploadFile } = useFileUpload(); const { mutateAsync: uploadFile } = useFileUpload();
const { mutate: deleteFile } = useFileDelete(); 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) => { const handleInputChange = (field: keyof ProductVariantFormData, value: any) => {
if (typeof value === 'string') { if (typeof value === 'string') {
value = persianToEnglish(value); value = persianToEnglish(value);
@ -125,11 +134,13 @@ const VariantForm: React.FC<VariantFormProps> = ({ variant, onSave, onCancel, is
}; };
const handleSave = () => { const handleSave = () => {
const fileIds = uploadedImages.map(img => Number(img.id)).filter(id => !isNaN(id));
const convertedData = convertPersianNumbersInObject({ const convertedData = convertPersianNumbersInObject({
...formData, ...formData,
attributes, attributes,
meta, meta,
file_ids: uploadedImages file_ids: fileIds
}); });
onSave(convertedData); onSave(convertedData);

View File

@ -223,7 +223,7 @@ const ProductFormPage = () => {
stock_number: variant.stock_number, stock_number: variant.stock_number,
weight: variant.weight, weight: variant.weight,
product_option_id: variant.product_option_id || null, 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 : {}, attributes: variant.attributes && Object.keys(variant.attributes).length > 0 ? variant.attributes : {},
meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {} meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {}
})) || []; })) || [];
@ -248,7 +248,7 @@ const ProductFormPage = () => {
stock_number: variant.stock_number, stock_number: variant.stock_number,
weight: variant.weight, weight: variant.weight,
product_option_id: variant.product_option_id || null, 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 : {}, attributes: variant.attributes && Object.keys(variant.attributes).length > 0 ? variant.attributes : {},
meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {} meta: variant.meta && Object.keys(variant.meta).length > 0 ? variant.meta : {}
})) || []; })) || [];