index.js (3671B)
1 import {__} from '@wordpress/i18n'; 2 import {Component, Fragment} from '@wordpress/element'; 3 4 var onClose, node, customizerNode, feedbackNode = null; 5 6 export class Modal extends Component { 7 constructor(props) { 8 super(props) 9 this.state = { 10 afterOpen: false, 11 beforeClose: false, 12 } 13 } 14 15 close() { 16 if (!this.props.onRequestClose || this.props.onRequestClose()) { 17 if (customizerNode) ModalManager.closeCustomizer() 18 else ModalManager.close() 19 } 20 } 21 22 componentDidMount() { 23 const {openTimeoutMS, closeTimeoutMS} = this.props 24 setTimeout(() => this.setState({afterOpen: true}), openTimeoutMS ? openTimeoutMS : 150) 25 26 onClose = (callback) => { 27 this.setState({beforeClose: true}, () => { 28 this.closeTimer = setTimeout(callback, closeTimeoutMS ? closeTimeoutMS : 150) 29 }); 30 }; 31 } 32 33 componentWillUnmount() { 34 onClose = null; 35 clearTimeout(this.closeTimer) 36 } 37 38 render() { 39 40 return ( 41 <Fragment> 42 <span onClick={e => { 43 this.close() 44 }} className={'redux-templates-pagelist-modal-overlay'}> </span> 45 <div className={ this.props.compactMode ? 'redux-templates-modal-inner' : 'redux-templates-pagelist-modal-inner'} onClick={e => e.stopPropagation()}> 46 {this.props.children} 47 </div> 48 </Fragment> 49 ); 50 } 51 } 52 53 54 export const ModalManager = { 55 open(component) { 56 if (onClose) { 57 this.close(); 58 // throw __('There is already one modal.It must be closed before one new modal will be opened'); 59 } 60 if (!node) { 61 node = document.createElement('div') 62 node.className = 'redux-templates-builder-modal' 63 document.body.appendChild(node) 64 } 65 wp.element.render(component, node) 66 document.body.classList.add('redux-templates-builder-modal-open') 67 }, 68 close() { 69 onClose && onClose(() => { 70 wp.element.unmountComponentAtNode(node) 71 document.body.classList.remove('redux-templates-builder-modal-open') 72 }); 73 }, 74 openCustomizer(component) { 75 if (!customizerNode) { 76 customizerNode = document.createElement('div'); 77 document.body.appendChild(customizerNode); 78 } 79 wp.element.render(component, customizerNode); 80 }, 81 closeCustomizer() { 82 if (customizerNode) { 83 wp.element.unmountComponentAtNode(customizerNode); 84 customizerNode = false 85 } 86 }, 87 openFeedback(component) { 88 feedbackNode = document.getElementsByClassName('feedback-wrapper'); 89 if (!feedbackNode || feedbackNode.length < 1) { 90 feedbackNode = document.createElement('div'); 91 feedbackNode.className = 'feedback-wrapper'; 92 document.body.appendChild(feedbackNode); 93 } else { 94 feedbackNode = feedbackNode[0]; 95 } 96 wp.element.render(component, feedbackNode); 97 }, 98 closeFeedback() { 99 if (feedbackNode) { 100 wp.element.unmountComponentAtNode(feedbackNode); 101 feedbackNode = false; 102 } 103 }, 104 isCustomizerOpened() { 105 return customizerNode ? true : false; 106 }, 107 hide () { 108 document.body.classList.remove('redux-templates-builder-modal-open') 109 node.classList.add('hidden') 110 }, 111 show () { 112 document.body.classList.add('redux-templates-builder-modal-open') 113 if (node) 114 node.classList.remove('hidden') 115 } 116 }