/** * @description Report reasons * @type {string[]} */ const reasons = [ 'Cannot click', 'Page contains visual glitches', 'Page is blank', 'Page is laggy', 'Page is not responding', 'Popup showed up', ]; /** * @description Report dialog ID */ const reportDialogId = 'report-dialog'; /** * @description Report dialog outer HTML */ const reportDialogHtml = ` Cookie Dialog Monster ${chrome.i18n.getMessage('reportDialog_bodyText')} ${chrome.i18n.getMessage('reportDialog_cannotClickOption')} ${chrome.i18n.getMessage('reportDialog_pageVisualGlitchOption')} ${chrome.i18n.getMessage('reportDialog_blankPageOption')} ${chrome.i18n.getMessage('reportDialog_laggyPageOption')} ${chrome.i18n.getMessage('reportDialog_pageNotRespondingOption')} ${chrome.i18n.getMessage('reportDialog_popupShowUpOption')} ${chrome.i18n.getMessage('contextMenu_reportOption')?.replace('...', '')} `; /** * @description Dialog close button click handler * @param {MouseEvent} event */ const closeButtonClickHandler = (event) => { const dialog = document.getElementById(reportDialogId); event.preventDefault(); dialog?.remove(); }; /** * @description Hides report dialog */ const hideReportDialog = () => { document.getElementById(reportDialogId)?.remove(); }; /** * @description Dialog radio input click handler * @param {MouseEvent} event */ const radioClickHandler = (event) => { const dialog = document.getElementById(reportDialogId); const radios = dialog.getElementsByTagName('report-dialog-radio'); const submitButton = dialog?.getElementsByTagName('report-dialog-submit-button')[0]; for (const radio of radios) { radio.setAttribute('aria-checked', 'false'); } event.preventDefault(); event.currentTarget.setAttribute('aria-checked', 'true'); submitButton.setAttribute('aria-disabled', 'false'); submitButton.addEventListener('click', submitButtonClickHandler); }; /** * @description Shows report dialog */ const showReportDialog = () => { const parser = new DOMParser(); const result = parser.parseFromString(reportDialogHtml, 'text/html'); const dialog = result.body.firstElementChild; const closeButton = dialog.getElementsByTagName('report-dialog-close-button')[0]; const link = document.createElement('link'); const radios = dialog.getElementsByTagName('report-dialog-radio'); closeButton.addEventListener('click', closeButtonClickHandler); link.setAttribute('href', 'https://fonts.googleapis.com/css?family=Inter'); link.setAttribute('id', 'report-dialog-font'); link.setAttribute('rel', 'stylesheet'); for (const radio of radios) { radio.addEventListener('click', radioClickHandler); } dispatch({ type: 'INSERT_DIALOG_CSS' }); document.body.appendChild(dialog); dialog.showModal(); if (!document.getElementById('report-dialog-font')) { document.head.appendChild(link); } }; /** * @description Dialog submit button click handler * @param {MouseEvent} event */ const submitButtonClickHandler = (event) => { const dialog = document.getElementById(reportDialogId); const formView = dialog?.getElementsByTagName('report-dialog-form-view')[0]; const option = dialog?.querySelector('report-dialog-radio[aria-checked="true"]'); const reasonIndex = option?.dataset.value; const reason = Number.isNaN(reasonIndex) ? 'Unknown' : reasons[reasonIndex]; const submitView = dialog?.getElementsByTagName('report-dialog-submit-view')[0]; const userAgent = window.navigator.userAgent; event.preventDefault(); dispatch({ userAgent, reason, type: 'REPORT' }); formView?.setAttribute('hidden', 'true'); submitView?.removeAttribute('hidden'); }; /** * @description Listens to messages */ chrome.runtime.onMessage.addListener((message) => { switch (message.type) { case 'HIDE_REPORT_DIALOG': hideReportDialog(); break; case 'SHOW_REPORT_DIALOG': showReportDialog(); break; default: break; } });