import React, { useEffect, useRef, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import OrderForm from '@/routes/Orders/partials/OrderForm'; import { OrdersApi } from '@/lib/api'; import { showErrorToast, showSuccessToast, getPageLoadErrorMessage } from '@/lib/errorHandling'; import { ErrorCard } from '@/components/ErrorCard'; import { LoadingState } from '@/components/LoadingState'; import { __, sprintf } from '@/lib/i18n'; import { usePageHeader } from '@/contexts/PageHeaderContext'; import { Button } from '@/components/ui/button'; import { useFABConfig } from '@/hooks/useFABConfig'; import { MetaFields } from '@/components/MetaFields'; import { useMetaFields } from '@/hooks/useMetaFields'; export default function OrdersEdit() { const { id } = useParams(); const orderId = Number(id); const nav = useNavigate(); const qc = useQueryClient(); const { setPageHeader, clearPageHeader } = usePageHeader(); const formRef = useRef(null); // Level 1 compatibility: Meta fields from plugins const metaFields = useMetaFields('orders'); const [metaData, setMetaData] = useState>({}); // Hide FAB on edit page useFABConfig('none'); const countriesQ = useQuery({ queryKey: ['countries'], queryFn: OrdersApi.countries }); const paymentsQ = useQuery({ queryKey: ['payments'], queryFn: OrdersApi.payments }); const shippingsQ = useQuery({ queryKey: ['shippings'], queryFn: OrdersApi.shippings }); const orderQ = useQuery({ queryKey: ['order', orderId], enabled: Number.isFinite(orderId), queryFn: () => OrdersApi.get(orderId) }); const upd = useMutation({ mutationFn: (payload: any) => OrdersApi.update(orderId, payload), onSuccess: () => { qc.invalidateQueries({ queryKey: ['orders'] }); qc.invalidateQueries({ queryKey: ['order', orderId] }); showSuccessToast(__('Order updated successfully')); nav(`/orders/${orderId}`); }, onError: (error: any) => { showErrorToast(error); } }); const countriesData = React.useMemo(() => { const list = countriesQ.data?.countries ?? []; return list.map((c: any) => ({ code: String(c.code), name: String(c.name) })); }, [countriesQ.data]); const order = orderQ.data || {}; // Sync meta data from order useEffect(() => { if (order.meta) { setMetaData(order.meta); } }, [order.meta]); // Set page header with back button and save button useEffect(() => { const actions = (
); const title = order.number ? sprintf(__('Edit Order #%s'), order.number) : __('Edit Order'); setPageHeader(title, actions); return () => clearPageHeader(); }, [order.number, orderId, upd.isPending, setPageHeader, clearPageHeader, nav]); if (!Number.isFinite(orderId)) { return
{__('Invalid order id.')}
; } if (orderQ.isLoading || countriesQ.isLoading) { return ; } if (orderQ.isError) { return orderQ.refetch()} />; } return (
{ const payload = { ...form, meta: metaData } as any; upd.mutate(payload); }} /> {/* Level 1 compatibility: Custom meta fields from plugins */} {metaFields.length > 0 && ( { setMetaData(prev => ({ ...prev, [key]: value })); }} /> )}
); }