diff --git a/admin-spa/src/routes/Orders/partials/OrderForm.tsx b/admin-spa/src/routes/Orders/partials/OrderForm.tsx index 72bc72f..f6fd754 100644 --- a/admin-spa/src/routes/Orders/partials/OrderForm.tsx +++ b/admin-spa/src/routes/Orders/partials/OrderForm.tsx @@ -185,25 +185,36 @@ export default function OrderForm({ enabled: items.length > 0, }); + // Check if shipping address is complete enough to calculate rates + const isShippingAddressComplete = React.useMemo(() => { + // Need at minimum: country, state (if applicable), city + if (!shippingData.country) return false; + if (!shippingData.city) return false; + // If country has states, require state + const countryStates = states[shippingData.country]; + if (countryStates && Object.keys(countryStates).length > 0 && !shippingData.state) { + return false; + } + return true; + }, [shippingData.country, shippingData.state, shippingData.city, states]); + // 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.state, shippingData.city, shippingData.postcode, shippingData.address_1], 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, - staleTime: 0, // Always refetch when query key changes + enabled: isShippingAddressComplete && items.length > 0, + staleTime: 5 * 60 * 1000, // Cache for 5 minutes - only refetch if query key changes }); // 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.country, shippingData.state, shippingData.city, shippingData.postcode, 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 }, @@ -212,8 +223,8 @@ export default function OrderForm({ coupons: validatedCoupons.map(c => c.code), }); }, - enabled: items.length > 0 && !!bCountry, - staleTime: 0, // Always refetch when query key changes + enabled: items.length > 0 && !!bCountry && !!shippingMethod, + staleTime: 5 * 60 * 1000, // Cache for 5 minutes - only refetch if query key changes }); // --- Product search for Add Item ---