export class FlowReserve extends HTMLAnchorElement { constructor() { super(); this.sidebarId = 'flow-reserve-sidebar'; this.storageKey = 'pl_list'; this.apiUrl = '/basket/json'; this.isOpen = false; } connectedCallback() { this.addEventListener('click', (e) => { e.preventDefault(); this.toggleSidebar(); }); // Listen for updates to the cart from other components window.addEventListener('cart:updated', () => this.updateBadge()); // Initial badge update this.updateBadge(); } /** * Updates the notification badge on the icon */ updateBadge() { const list = this.getList(); const badge = this.querySelector('[data-count]'); if (badge) { badge.innerText = list.length; if (list.length > 0) { badge.classList.remove('hidden'); } else { badge.classList.add('hidden'); } } } getList() { try { return JSON.parse(localStorage.getItem(this.storageKey) || '[]'); } catch (e) { return []; } } removeFromList(id) { let list = this.getList(); list = list.filter(itemId => itemId.toString() !== id.toString()); localStorage.setItem(this.storageKey, JSON.stringify(list)); window.dispatchEvent(new CustomEvent('cart:updated')); this.refreshContent(); // Re-fetch and render } toggleSidebar() { if (this.isOpen) { this.close(); } else { this.open(); } } open() { this.ensureSidebarExists(); const sidebar = document.getElementById(this.sidebarId); const backdrop = sidebar.querySelector('.backdrop'); const panel = sidebar.querySelector('.panel'); sidebar.classList.remove('pointer-events-none'); backdrop.classList.remove('opacity-0'); panel.classList.remove('translate-x-full'); this.isOpen = true; this.refreshContent(); } close() { const sidebar = document.getElementById(this.sidebarId); if (!sidebar) return; const backdrop = sidebar.querySelector('.backdrop'); const panel = sidebar.querySelector('.panel'); backdrop.classList.add('opacity-0'); panel.classList.add('translate-x-full'); setTimeout(() => { sidebar.classList.add('pointer-events-none'); }, 300); // Match transition duration this.isOpen = false; } ensureSidebarExists() { if (document.getElementById(this.sidebarId)) return; const template = `
`; document.body.insertAdjacentHTML('beforeend', template); // Bind events const sidebar = document.getElementById(this.sidebarId); const closeHandler = (e) => { if (e) { e.preventDefault(); e.stopPropagation(); } this.close(); }; sidebar.querySelector('.backdrop').addEventListener('click', closeHandler); sidebar.querySelector('#flow-reserve-close').addEventListener('click', closeHandler); } async refreshContent() { const container = document.getElementById('flow-reserve-content'); const footer = document.getElementById('flow-reserve-footer'); // Loader container.innerHTML = `Une erreur est survenue lors du chargement de votre panier.
Votre période