class ConfirmModal { constructor(options = {}) { this.modal = document.querySelector(options.modalSelector || "#confirm-modal") this.message = this.modal.querySelector(options.messageSelector || "#msg") this.confirmBtn = this.modal.querySelector(options.confirmSelector || "#confirm") this.cancelBtn = this.modal.querySelector(options.cancelSelector || "#cancel") this.linkSelector = options.linkSelector || '.confirm-link' this.messageGenerator = options.messageGenerator || this.defaultMessageGenerator.bind(this) this.currentUrl = null if (options.confirmText) this.confirmBtn.textContent = options.confirmText if (options.cancelText) this.cancelBtn.textContent = options.cancelText this.init() } init() { document.querySelectorAll(this.linkSelector).forEach(link => { link.addEventListener('click', (e) => { e.preventDefault() const message = this.messageGenerator(link) this.show(link.href, message) }) }) this.confirmBtn.addEventListener('click', () => this.confirm()) this.cancelBtn.addEventListener('click', () => this.hide()) this.modal.addEventListener('click', (e) => { if (e.target === this.modal) this.hide() }) document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && this.modal.style.display === 'block') { this.hide() } }) } defaultMessageGenerator(link) { return link.dataset.message || 'Are you sure you want to continue?' } show(url, message) { this.currentUrl = url this.message.textContent = message this.modal.style.display = 'block' this.confirmBtn.focus() } hide() { this.modal.style.display = 'none' this.currentUrl = null } confirm() { if (this.currentUrl) { window.location.href = this.currentUrl } this.hide() } }