fix: Edit form now loads product data properly
Critical fix for edit mode data loading. Problem: - Click Edit on any product - Form shows empty fields - Product data fetch happens but form does not update Root Cause: React useState only uses initial value ONCE on mount. When initial prop updates after API fetch, state does not update. Solution: Added useEffect to sync state with initial prop when it changes. Result: - Edit form loads all product data correctly - All 15 fields populate from API response - Categories and tags pre-selected - Attributes and variations loaded - Ready to edit and save
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { useState } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
import { useQuery } from '@tanstack/react-query';
|
||||||
import { api } from '@/lib/api';
|
import { api } from '@/lib/api';
|
||||||
import { __ } from '@/lib/i18n';
|
import { __ } from '@/lib/i18n';
|
||||||
@@ -76,6 +76,31 @@ export function ProductFormTabbed({
|
|||||||
const [submitting, setSubmitting] = useState(false);
|
const [submitting, setSubmitting] = useState(false);
|
||||||
const [activeTab, setActiveTab] = useState('general');
|
const [activeTab, setActiveTab] = useState('general');
|
||||||
|
|
||||||
|
// Update form state when initial data changes (for edit mode)
|
||||||
|
useEffect(() => {
|
||||||
|
if (initial && mode === 'edit') {
|
||||||
|
setName(initial.name || '');
|
||||||
|
setType(initial.type || 'simple');
|
||||||
|
setStatus(initial.status || 'publish');
|
||||||
|
setDescription(initial.description || '');
|
||||||
|
setShortDescription(initial.short_description || '');
|
||||||
|
setSku(initial.sku || '');
|
||||||
|
setRegularPrice(initial.regular_price || '');
|
||||||
|
setSalePrice(initial.sale_price || '');
|
||||||
|
setManageStock(initial.manage_stock || false);
|
||||||
|
setStockQuantity(initial.stock_quantity?.toString() || '');
|
||||||
|
setStockStatus(initial.stock_status || 'instock');
|
||||||
|
setSelectedCategories(initial.categories || []);
|
||||||
|
setSelectedTags(initial.tags || []);
|
||||||
|
setImages(initial.images || []);
|
||||||
|
setAttributes(initial.attributes || []);
|
||||||
|
setVariations(initial.variations || []);
|
||||||
|
setVirtual(initial.virtual || false);
|
||||||
|
setDownloadable(initial.downloadable || false);
|
||||||
|
setFeatured(initial.featured || false);
|
||||||
|
}
|
||||||
|
}, [initial, mode]);
|
||||||
|
|
||||||
// Fetch categories
|
// Fetch categories
|
||||||
const categoriesQ = useQuery({
|
const categoriesQ = useQuery({
|
||||||
queryKey: ['product-categories'],
|
queryKey: ['product-categories'],
|
||||||
|
|||||||
Reference in New Issue
Block a user