// Based on // https://github.com/ScratchAddons/ScratchAddons/blob/master/addon-api/content-script/modal.js import closeIcon from '../components/close-button/icon--close.svg'; import styles from './modal.css'; export const createEditorModal = (tab, title, {isOpen = false} = {}) => { const container = Object.assign(document.createElement('div'), { className: tab.scratchClass('modal_modal-overlay'), dir: tab.direction }); container.style.display = isOpen ? '' : 'none'; document.body.appendChild(container); const modal = Object.assign(document.createElement('div'), { className: tab.scratchClass('modal_modal-content') }); modal.addEventListener('click', e => e.stopPropagation()); container.appendChild(modal); const header = Object.assign(document.createElement('div'), { className: tab.scratchClass('modal_header') }); modal.appendChild(header); header.appendChild( Object.assign(document.createElement('div'), { className: tab.scratchClass('modal_header-item', 'modal_header-item-title'), innerText: title }) ); const closeContainer = Object.assign(document.createElement('div'), { className: tab.scratchClass('modal_header-item', 'modal_header-item-close') }); header.appendChild(closeContainer); const closeButton = Object.assign(document.createElement('div'), { className: tab.scratchClass('close-button_close-button', 'close-button_large') }); closeContainer.appendChild(closeButton); closeButton.appendChild( Object.assign(document.createElement('img'), { className: tab.scratchClass('close-button_close-icon'), src: closeIcon }) ); const content = Object.assign(document.createElement('div'), { className: styles.modalContent }); modal.appendChild(content); return { container: modal, content, backdrop: container, closeButton, open: () => { container.style.display = ''; }, close: () => { container.style.display = 'none'; }, remove: container.remove.bind(container) }; }; const createButtonRow = tab => { const buttonRow = Object.assign(document.createElement('div'), { className: tab.scratchClass('prompt_button-row') }); const cancelButton = Object.assign(document.createElement('button'), { className: tab.scratchClass('prompt_cancel-button'), innerText: tab.scratchMessage('gui.prompt.cancel') }); buttonRow.appendChild(cancelButton); const okButton = Object.assign(document.createElement('button'), { className: tab.scratchClass('prompt_ok-button'), innerText: tab.scratchMessage('gui.prompt.ok') }); buttonRow.appendChild(okButton); return {buttonRow, cancelButton, okButton}; }; export const confirm = (tab, title, message, {useEditorClasses = false} = {}) => { const {remove, container, content, backdrop, closeButton} = tab.createModal(title, { isOpen: true, useEditorClasses: useEditorClasses, useSizesClass: true }); const mode = tab.editorMode !== null && useEditorClasses ? 'editor' : tab.clientVersion; if (mode === 'editor') { container.classList.add(tab.scratchClass('prompt_modal-content')); content.classList.add(tab.scratchClass('prompt_body')); } content.appendChild( Object.assign(document.createElement('div'), { className: tab.scratchClass('prompt_label'), innerText: message }) ); const {buttonRow, cancelButton, okButton} = createButtonRow(tab, mode); content.appendChild(buttonRow); okButton.focus(); return new Promise(resolve => { const cancel = () => { remove(); resolve(false); }; const ok = () => { remove(); resolve(true); }; backdrop.addEventListener('click', cancel); closeButton.addEventListener('click', cancel); cancelButton.addEventListener('click', cancel); okButton.addEventListener('click', ok); container.addEventListener('keydown', e => { if (e.key === 'Enter') ok(); if (e.key === 'Escape') cancel(); }); }); }; export const prompt = (tab, title, message, defaultValue = '', {useEditorClasses = false} = {}) => { const {remove, container, content, backdrop, closeButton} = tab.createModal(title, { isOpen: true, useEditorClasses: useEditorClasses, useSizesClass: true }); container.classList.add(tab.scratchClass('prompt_modal-content')); content.classList.add(tab.scratchClass('prompt_body')); content.appendChild( Object.assign(document.createElement('div'), { className: tab.scratchClass('prompt_label'), innerText: message }) ); const input = Object.assign(document.createElement('input'), { className: tab.scratchClass('prompt_variable-name-text-input'), value: defaultValue }); content.appendChild(input); input.focus(); input.select(); const {buttonRow, cancelButton, okButton} = createButtonRow(tab); content.appendChild(buttonRow); return new Promise(resolve => { const cancel = () => { remove(); resolve(null); }; const ok = () => { remove(); resolve(input.value); }; backdrop.addEventListener('click', cancel); closeButton.addEventListener('click', cancel); cancelButton.addEventListener('click', cancel); okButton.addEventListener('click', ok); container.addEventListener('keydown', e => { if (e.key === 'Enter') ok(); if (e.key === 'Escape') cancel(); }); }); };