diff --git a/admin-spa/src/routes/Orders/partials/OrderForm.tsx b/admin-spa/src/routes/Orders/partials/OrderForm.tsx index 88c98c1..f68ad62 100644 --- a/admin-spa/src/routes/Orders/partials/OrderForm.tsx +++ b/admin-spa/src/routes/Orders/partials/OrderForm.tsx @@ -185,6 +185,35 @@ export default function OrderForm({ enabled: items.length > 0, }); + // Calculate shipping rates dynamically + const { data: shippingRates, isLoading: shippingLoading } = useQuery({ + queryKey: ['shipping-rates', items.map(i => ({ product_id: i.product_id, qty: i.qty })), shippingData.country, shippingData.postcode, shippingData.state], + queryFn: async () => { + if (!shippingData.country) return null; + return api.post('/shipping/calculate', { + items: items.map(i => ({ product_id: i.product_id, qty: i.qty })), + shipping: shippingData, + }); + }, + enabled: !!shippingData.country && items.length > 0, + }); + + // Calculate order preview with taxes + const { data: orderPreview, isLoading: previewLoading } = useQuery({ + queryKey: ['order-preview', items.map(i => ({ product_id: i.product_id, qty: i.qty })), bCountry, bState, bPost, bCity, shippingData, shippingMethod, validatedCoupons.map(c => c.code)], + queryFn: async () => { + if (items.length === 0) return null; + return api.post('/orders/preview', { + items: items.map(i => ({ product_id: i.product_id, qty: i.qty })), + billing: { country: bCountry, state: bState, postcode: bPost, city: bCity }, + shipping: shipDiff ? shippingData : undefined, + shipping_method: shippingMethod, + coupons: validatedCoupons.map(c => c.code), + }); + }, + enabled: items.length > 0 && !!bCountry, + }); + // --- Product search for Add Item --- const [searchQ, setSearchQ] = React.useState(''); const [customerSearchQ, setCustomerSearchQ] = React.useState(''); @@ -555,24 +584,38 @@ export default function OrderForm({