/** * State manager for checkbox updates * Tracks global and individual checkbox update states */ class CheckboxUpdateState { constructor() { this.updateCount = 0; this.listeners = new Set(); this.updatingCheckboxIds = new Set(); } // Global update state (for buttons quotation and checkout) isUpdating() { return this.updateCount > 0; } // Individual checkbox state isCheckboxUpdating(itemId) { return this.updatingCheckboxIds.has(String(itemId)); } // Start update startUpdate(itemId = null) { this.updateCount++; if (itemId !== null) { this.updatingCheckboxIds.add(String(itemId)); } this.notifyListeners(); return this.updateCount; } // End update endUpdate(itemId = null) { this.updateCount = Math.max(0, this.updateCount - 1); if (itemId !== null) { this.updatingCheckboxIds.delete(String(itemId)); } this.notifyListeners(); return this.updateCount; } // Reset all states reset() { this.updateCount = 0; this.updatingCheckboxIds.clear(); this.notifyListeners(); } // Listener management addListener(callback) { if (typeof callback === 'function') { this.listeners.add(callback); // Immediate callback with current state callback(this.isUpdating()); } } removeListener(callback) { this.listeners.delete(callback); } // Debug helpers getUpdateCount() { return this.updateCount; } getUpdatingCheckboxIds() { return [...this.updatingCheckboxIds]; } // Private method to notify listeners notifyListeners() { const isUpdating = this.isUpdating(); this.listeners.forEach((listener) => { try { listener(isUpdating); } catch (error) { console.error('Checkbox update state listener error:', error); } }); } } const checkboxUpdateState = new CheckboxUpdateState(); export default checkboxUpdateState;