import React, { useRef, useEffect, useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useNavigate, useParams } from 'react-router-dom'; import { api } from '@/lib/api'; import { __ } from '@/lib/i18n'; import { toast } from 'sonner'; import { useFABConfig } from '@/hooks/useFABConfig'; import { usePageHeader } from '@/contexts/PageHeaderContext'; import { ProductFormTabbed as ProductForm, ProductFormData } from './partials/ProductFormTabbed'; import { Button } from '@/components/ui/button'; import { ErrorCard } from '@/components/ErrorCard'; import { getPageLoadErrorMessage } from '@/lib/errorHandling'; import { Skeleton } from '@/components/ui/skeleton'; import { MetaFields } from '@/components/MetaFields'; import { useMetaFields } from '@/hooks/useMetaFields'; export default function ProductEdit() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); const formRef = useRef(null); const { setPageHeader, clearPageHeader } = usePageHeader(); // Level 1 compatibility: Meta fields from plugins const metaFields = useMetaFields('products'); const [metaData, setMetaData] = useState>({}); // Hide FAB on edit product page useFABConfig('none'); // Fetch product const productQ = useQuery({ queryKey: ['products', id], queryFn: () => api.get(`/products/${id}`), enabled: !!id, }); // Update mutation const updateMutation = useMutation({ mutationFn: async (data: ProductFormData) => { return api.put(`/products/${id}`, data); }, onSuccess: (response: any) => { toast.success(__('Product updated successfully')); queryClient.invalidateQueries({ queryKey: ['products'] }); queryClient.invalidateQueries({ queryKey: ['products', id] }); // Navigate back to products list navigate('/products'); }, onError: (error: any) => { toast.error(error.message || __('Failed to update product')); }, }); const handleSubmit = async (data: ProductFormData) => { // Merge meta data with form data (Level 1 compatibility) const payload = { ...data, meta: metaData }; await updateMutation.mutateAsync(payload); }; // Sync meta data from product useEffect(() => { if (productQ.data?.meta) { setMetaData(productQ.data.meta); } }, [productQ.data?.meta]); // Smart back handler: go back in history if available, otherwise fallback to /products const handleBack = () => { if (window.history.state?.idx > 0) { navigate(-1); // Go back in history } else { navigate('/products'); // Fallback to products index } }; // Set page header with back button and save button useEffect(() => { const actions = (
); setPageHeader(__('Edit Product'), actions); return () => clearPageHeader(); }, [updateMutation.isPending, productQ.isLoading, setPageHeader, clearPageHeader, navigate]); // Loading state if (productQ.isLoading) { return (
); } // Error state if (productQ.isError) { return ( productQ.refetch()} /> ); } const product = productQ.data; return (
{/* Level 1 compatibility: Custom meta fields from plugins */} {metaFields.length > 0 && ( { setMetaData(prev => ({ ...prev, [key]: value })); }} /> )}
); }