index.js (4784B)
1 const {compose} = wp.compose; 2 const {withDispatch, withSelect} = wp.data; 3 const { useState, useEffect} = wp.element; 4 import '../stores'; 5 6 import {Modal, ModalManager} from '../modal-manager' 7 import TabHeader from '../components/tab-header'; 8 import WithSidebarLayout from './layout-with-sidebar'; 9 import CollectionView from './view-collection'; 10 import SavedView from './view-saved'; 11 import ImportWizard from '../modal-import-wizard'; 12 import PromotorScoreModal from '../modal-promotor-score'; 13 import ErrorNotice from '../components/error-notice'; 14 import ChallengeFinalTemplate from '~redux-templates/challenge/final-templates'; 15 import FabWrapper from '../components/fab-wrapper'; 16 import {processImportHelper} from '~redux-templates/stores/actionHelper'; 17 import './style.scss' 18 19 20 function LibraryModal(props) { 21 const { 22 fetchLibraryFromAPI, activeCollection, activeItemType, errorMessages, importingTemplate, challengeFinalStatus, isChallengeOpen, 23 setLoading, setImportingTemplate, clearSearch, clearState 24 } = props; 25 const [loaded, setLoaded] = useState(false); 26 const [escKeyPressed, setEscKeyPressed] = useState(false); 27 const [isPSModalVisible, setPSModalVisible] = useState(false); 28 29 let stateLibrary = null; 30 useEffect(() => { 31 clearState(); 32 stateLibrary = fetchLibraryFromAPI(); 33 if (stateLibrary === null && loaded === false) { // One to be called at first. 34 setLoading(true); 35 setLoaded(true); 36 } 37 setPSModalVisible(!!redux_templates.nps); 38 const handleKeyUp = ({keyCode}) => { 39 if (keyCode === 27) { 40 setEscKeyPressed(true); 41 } 42 } 43 document.addEventListener('keyup', handleKeyUp); 44 return () => { 45 document.removeEventListener('keyup', handleKeyUp); 46 } 47 }, []); 48 49 useEffect(() => { 50 if (escKeyPressed) { 51 setEscKeyPressed(false); 52 if (ModalManager.isCustomizerOpened()) { 53 ModalManager.closeCustomizer(); 54 } else { 55 if (importingTemplate) 56 setImportingTemplate(null); 57 else { 58 ModalManager.close(); 59 } 60 } 61 } 62 }, [escKeyPressed]) 63 64 const hasSidebar = () => { 65 return ((activeItemType !== 'collection' || activeCollection === null) && activeItemType !== 'saved'); 66 } 67 68 // read block data to import and give the control to actual import 69 const processImport = () => { 70 if (importingTemplate) processImportHelper(); 71 } 72 73 74 return ( 75 <Modal className="redux-templates-builder-modal-pages-list" 76 customClass="redux-templates-builder-modal-template-list" 77 openTimeoutMS={0} closeTimeoutMS={0}> 78 <TabHeader/> 79 { 80 errorMessages && errorMessages.length > 0 && 81 <ErrorNotice errorMessages={errorMessages}/> 82 } 83 <div className="redux-templates-collections-modal-body"> 84 {hasSidebar() && <WithSidebarLayout/>} 85 {(hasSidebar() === false && activeItemType === 'collection') && <CollectionView/>} 86 {(hasSidebar() === false && activeItemType !== 'collection') && <SavedView/>} 87 </div> 88 { 89 importingTemplate && <ImportWizard startImportTemplate={processImport} /> 90 } 91 { 92 isPSModalVisible && <PromotorScoreModal propOnClose={() => setPSModalVisible(false)}/> 93 } 94 { (challengeFinalStatus !== '') && <ChallengeFinalTemplate finalStatus={challengeFinalStatus} /> } 95 { !isChallengeOpen && <FabWrapper /> } 96 </Modal> 97 ); 98 } 99 100 101 export default compose([ 102 withDispatch((dispatch) => { 103 const { 104 setLoading, 105 setLibrary, 106 setImportingTemplate, 107 clearSearch, 108 clearState 109 } = dispatch('redux-templates/sectionslist'); 110 111 return { 112 setLoading, 113 setLibrary, 114 setImportingTemplate, 115 clearSearch, 116 clearState 117 }; 118 }), 119 120 withSelect((select) => { 121 const {fetchLibraryFromAPI, getActiveCollection, getActiveItemType, getErrorMessages, getImportingTemplate, getChallengeOpen, getChallengeFinalStatus} = select('redux-templates/sectionslist'); 122 return { 123 fetchLibraryFromAPI, 124 activeCollection: getActiveCollection(), 125 activeItemType: getActiveItemType(), 126 errorMessages: getErrorMessages(), 127 importingTemplate: getImportingTemplate(), 128 challengeFinalStatus: getChallengeFinalStatus(), 129 isChallengeOpen: getChallengeOpen() 130 }; 131 }) 132 ])(LibraryModal);