Files
ludikevent_crm/assets/tools/FlowAddToCart.js
Serreau Jovann a6fc8fdf3b ```
 feat(reservation): Ajoute le panier et sélection de date globale

Ajoute un composant de panier accessible depuis toutes les pages de réservation et un sélecteur de date global.
```
2026-01-30 15:59:19 +01:00

73 lines
2.4 KiB
JavaScript

export class FlowAddToCart extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.btn = this.querySelector('button');
if (!this.btn) return;
this.productId = this.getAttribute('product-id');
this.btn.addEventListener('click', (e) => {
e.preventDefault();
this.addToCart();
});
}
async addToCart() {
// 1. Check Dates
const dates = JSON.parse(localStorage.getItem('reservation_dates') || '{}');
if (!dates.start || !dates.end) {
// Open Date Picker if no dates
document.dispatchEvent(new CustomEvent('open-date-picker'));
return;
}
// 2. Loading State
const originalContent = this.btn.innerHTML;
this.btn.disabled = true;
this.btn.innerHTML = '<span class="animate-spin inline-block w-4 h-4 border-2 border-white border-t-transparent rounded-full"></span>';
try {
// 3. Check Availability
const response = await fetch('/produit/check', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
id: this.productId,
start: dates.start,
end: dates.end
})
});
if (!response.ok) throw new Error('Network error');
const data = await response.json();
if (data.dispo) {
// 4. Add to Cart
const list = JSON.parse(localStorage.getItem('pl_list') || '[]');
if (!list.includes(this.productId)) {
list.push(this.productId);
localStorage.setItem('pl_list', JSON.stringify(list));
window.dispatchEvent(new CustomEvent('cart:updated'));
}
// Open Cart
const cart = document.querySelector('[is="flow-reserve"]');
if (cart) cart.open();
} else {
// 5. Not Available
alert("Ce produit n'est pas disponible pour les dates sélectionnées.");
}
} catch (error) {
console.error(error);
alert("Une erreur est survenue.");
} finally {
this.btn.disabled = false;
this.btn.innerHTML = originalContent;
}
}
}