Spaces:
Running
Running
// 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(); | |
}); | |
}); | |
}; | |