diff --git a/admin-spa/src/routes/Orders/partials/OrderForm.tsx b/admin-spa/src/routes/Orders/partials/OrderForm.tsx index fd84203..20b8456 100644 --- a/admin-spa/src/routes/Orders/partials/OrderForm.tsx +++ b/admin-spa/src/routes/Orders/partials/OrderForm.tsx @@ -215,9 +215,20 @@ export default function OrderForm({ return true; }, [effectiveShippingAddress, states]); + // Debounce city input to avoid hitting backend on every keypress + const [debouncedCity, setDebouncedCity] = React.useState(effectiveShippingAddress.city); + + React.useEffect(() => { + const timer = setTimeout(() => { + setDebouncedCity(effectiveShippingAddress.city); + }, 500); // Wait 500ms after user stops typing + + return () => clearTimeout(timer); + }, [effectiveShippingAddress.city]); + // Calculate shipping rates dynamically const { data: shippingRates, isLoading: shippingLoading } = useQuery({ - queryKey: ['shipping-rates', items.map(i => ({ product_id: i.product_id, qty: i.qty })), effectiveShippingAddress.country, effectiveShippingAddress.state, effectiveShippingAddress.city, effectiveShippingAddress.postcode, effectiveShippingAddress.address_1], + queryKey: ['shipping-rates', items.map(i => ({ product_id: i.product_id, qty: i.qty })), effectiveShippingAddress.country, effectiveShippingAddress.state, debouncedCity, effectiveShippingAddress.postcode], queryFn: async () => { return api.post('/shipping/calculate', { items: items.map(i => ({ product_id: i.product_id, qty: i.qty })), @@ -225,12 +236,13 @@ export default function OrderForm({ }); }, enabled: isShippingAddressComplete && items.length > 0, - staleTime: 5 * 60 * 1000, // Cache for 5 minutes - only refetch if query key changes + gcTime: 0, // Don't cache - always fresh data + 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.country, shippingData.state, shippingData.city, shippingData.postcode, shippingMethod, validatedCoupons.map(c => c.code)], + queryKey: ['order-preview', items.map(i => ({ product_id: i.product_id, qty: i.qty })), bCountry, bState, bPost, bCity, effectiveShippingAddress.country, effectiveShippingAddress.state, debouncedCity, effectiveShippingAddress.postcode, shippingMethod, validatedCoupons.map(c => c.code)], queryFn: async () => { return api.post('/orders/preview', { items: items.map(i => ({ product_id: i.product_id, qty: i.qty })), @@ -241,7 +253,8 @@ export default function OrderForm({ }); }, enabled: items.length > 0 && !!bCountry && !!shippingMethod, - staleTime: 5 * 60 * 1000, // Cache for 5 minutes - only refetch if query key changes + gcTime: 0, // Don't cache - always fresh data + staleTime: 0, // Always refetch when query key changes }); // --- Product search for Add Item ---