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)