diff --git a/admin-spa/src/routes/Orders/partials/OrderForm.tsx b/admin-spa/src/routes/Orders/partials/OrderForm.tsx index f68ad62..72bc72f 100644 --- a/admin-spa/src/routes/Orders/partials/OrderForm.tsx +++ b/admin-spa/src/routes/Orders/partials/OrderForm.tsx @@ -187,7 +187,7 @@ export default function OrderForm({ // 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], + 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', { @@ -196,11 +196,12 @@ export default function OrderForm({ }); }, enabled: !!shippingData.country && items.length > 0, + staleTime: 0, // Always refetch when 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, shippingMethod, validatedCoupons.map(c => c.code)], + 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', { @@ -212,6 +213,7 @@ export default function OrderForm({ }); }, enabled: items.length > 0 && !!bCountry, + staleTime: 0, // Always refetch when query key changes }); // --- Product search for Add Item --- @@ -301,6 +303,21 @@ export default function OrderForm({ setValidatedCoupons(validatedCoupons.filter(c => c.code !== code)); }; + // Auto-select first shipping rate when rates change + React.useEffect(() => { + if (shippingRates?.methods && shippingRates.methods.length > 0) { + const firstRateId = shippingRates.methods[0].id; + // Only auto-select if no method selected or current method not in new rates + const currentMethodExists = shippingRates.methods.some((m: any) => m.id === shippingMethod); + if (!shippingMethod || !currentMethodExists) { + setShippingMethod(firstRateId); + } + } else if (shippingRates?.methods && shippingRates.methods.length === 0) { + // Clear selection if no rates available + setShippingMethod(''); + } + }, [shippingRates?.methods]); + // Check if cart has physical products const hasPhysicalProduct = React.useMemo( () => items.some(item => {