diff --git a/addons/dine360_theme_chennora/views/checkout_address.xml b/addons/dine360_theme_chennora/views/checkout_address.xml index 89f5626..2f745f5 100644 --- a/addons/dine360_theme_chennora/views/checkout_address.xml +++ b/addons/dine360_theme_chennora/views/checkout_address.xml @@ -56,6 +56,11 @@ .active-mark { display: none; position: absolute; top: 10px; right: 10px; color: #00A67E; } .order-type-card.active .active-mark { display: block; } .section-header { font-weight: bold; margin: 30px 0 15px 0; padding-bottom: 8px; border-bottom: 2px solid #f8f9fa; font-size: 1.1rem; } + + .animated { animation-duration: 0.5s; animation-fill-mode: both; } + @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } + .fadeIn { animation-name: fadeIn; } + #uber_message strong { display: block; margin-bottom: 4px; }
@@ -102,6 +107,7 @@ const hiddenType = document.getElementById('hidden_fulfilment_type'); const msgDiv = document.getElementById('uber_message'); const submitBtn = document.querySelector('button[type="submit"]') || document.querySelector('.btn-primary'); + let debounceTimer; function getAddressContainers() { const addressNames = ['street', 'street2', 'city', 'zip', 'country_id', 'state_id']; @@ -147,36 +153,65 @@ }; function checkUber() { - if (hiddenType.value !== 'delivery') return; - const street = document.querySelector('input[name="street"]')?.value; - const zip = document.querySelector('input[name="zip"]')?.value; - if (!street || !zip) return; - - fetch('/shop/uber/quote', { - method: 'POST', headers: {'Content-Type': 'application/json'}, - body: JSON.stringify({ params: { address_data: { - street: street, - city: document.querySelector('input[name="city"]')?.value, - zip: zip, - country: document.querySelector('select[name="country_id"] option:checked')?.text || 'Canada' - } } }) - }).then(r => r.json()).then(data => { - if (data.result && data.result.success) { - msgDiv.className = 'alert alert-success my-3'; - msgDiv.style.display = ''; - msgDiv.innerText = "✓ Covered! Delivery charge: " + data.result.fee + "$"; - if (submitBtn) submitBtn.disabled = false; - } else { - msgDiv.className = 'alert alert-danger my-3'; - msgDiv.style.display = ''; - msgDiv.innerText = "✕ Not covered: " + (data.result?.error || "Distance too far."); - if (submitBtn) submitBtn.disabled = true; + clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => { + if (hiddenType.value !== 'delivery') return; + const street = document.querySelector('input[name="street"]')?.value; + const zip = document.querySelector('input[name="zip"]')?.value; + + if (!street || !zip) { + if (msgDiv) msgDiv.style.display = 'none'; + return; } - }); + + if (msgDiv) { + msgDiv.className = 'alert alert-info my-3'; + msgDiv.style.display = ''; + msgDiv.innerText = "Checking Uber coverage..."; + } + + fetch('/shop/uber/quote', { + method: 'POST', headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ params: { address_data: { + street: street, + street2: document.querySelector('input[name="street2"]')?.value, + city: document.querySelector('input[name="city"]')?.value, + zip: zip, + country: document.querySelector('select[name="country_id"] option:checked')?.text || 'Canada', + state: document.querySelector('select[name="state_id"] option:checked')?.text + } } }) + }).then(r => r.json()).then(data => { + msgDiv.classList.remove('fadeIn'); + void msgDiv.offsetWidth; // Trigger reflow for animation + msgDiv.classList.add('fadeIn'); + + if (data.result && data.result.success) { + msgDiv.className = 'alert alert-success my-3 animated fadeIn'; + msgDiv.style.display = ''; + msgDiv.innerHTML = `✓ Delivery Available!Uber Delivery Fee: $${data.result.fee} (Distance Based)`; + if (submitBtn) submitBtn.disabled = false; + } else { + msgDiv.className = 'alert alert-danger my-3 animated fadeIn'; + msgDiv.style.display = ''; + msgDiv.innerHTML = `✕ Delivery Unavailable${data.result?.error || "Distance too far for Uber Direct."}`; + if (submitBtn) submitBtn.disabled = true; + } + }).catch(err => { + console.error("Uber API Error:", err); + msgDiv.className = 'alert alert-warning my-3'; + msgDiv.innerText = "Error connecting to Uber service."; + }); + }, 500); // 500ms debounce } - const triggers = document.querySelectorAll('input[name="street"], input[name="zip"]'); - triggers.forEach(t => t.addEventListener('blur', checkUber)); + // Trigger on any address field change + const addressFields = 'input[name="street"], input[name="street2"], input[name="city"], input[name="zip"], select[name="country_id"], select[name="state_id"]'; + const triggers = document.querySelectorAll(addressFields); + triggers.forEach(t => { + t.addEventListener('blur', checkUber); + t.addEventListener('change', checkUber); + }); + setOrderType('delivery'); } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initUnifiedForm); else initUnifiedForm(); diff --git a/addons/dine360_uber/controllers/main.py b/addons/dine360_uber/controllers/main.py index 45bddfd..be57624 100644 --- a/addons/dine360_uber/controllers/main.py +++ b/addons/dine360_uber/controllers/main.py @@ -49,8 +49,13 @@ class UberDeliveryController(http.Controller): company = request.website.company_id pickup_address = f"{company.street}, {company.city}, {company.zip}, {company.country_id.name}" - # User entered address - dropoff_address = f"{address_data.get('street')}, {address_data.get('city')}, {address_data.get('zip')}, {address_data.get('country')}" + # User entered address - building comprehensive string for Uber Direct + street = address_data.get('street', '') + street2 = address_data.get('street2', '') + full_street = f"{street}, {street2}" if street2 else street + + dropoff_address = f"{full_street}, {address_data.get('city', '')}, {address_data.get('state', '')}, {address_data.get('zip', '')}, {address_data.get('country', 'Canada')}" + result = config.get_uber_quote(pickup_address, dropoff_address)