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({
{__('Subtotal')} - {itemsTotal ? money(itemsTotal) : '—'} + {orderPreview ? money(orderPreview.subtotal) : itemsTotal ? money(itemsTotal) : '—'}
- {shippingCost > 0 && ( + {(orderPreview?.shipping_total > 0 || shippingCost > 0) && (
{__('Shipping')} - {money(shippingCost)} + {orderPreview ? money(orderPreview.shipping_total) : money(shippingCost)}
)} - {couponDiscount > 0 && ( + {(orderPreview?.discount_total > 0 || couponDiscount > 0) && (
{__('Discount')} - -{money(couponDiscount)} + -{orderPreview ? money(orderPreview.discount_total) : money(couponDiscount)} +
+ )} + {orderPreview?.total_tax > 0 && ( +
+ {__('Tax')} + {money(orderPreview.total_tax)}
)}
{__('Total')} - {money(orderTotal)} + + {previewLoading ? ( + {__('Calculating...')} + ) : orderPreview ? ( + money(orderPreview.total) + ) : ( + money(orderTotal) + )} +
@@ -913,14 +956,31 @@ export default function OrderForm({ {hasPhysicalProduct && (
- + {shippingLoading ? ( +
{__('Calculating rates...')}
+ ) : shippingRates?.methods && shippingRates.methods.length > 0 ? ( + + ) : shippingData.country ? ( +
{__('No shipping methods available')}
+ ) : ( + + )}
)}