/** * WordPress dependencies */ import { registerPlugin } from "@wordpress/plugins"; import { debounce } from "@wordpress/compose"; import { subscribe } from "@wordpress/data"; import { createRoot } from "@wordpress/element"; import Library from "./Library"; import { LibraryButtonIcon } from "./icons"; import { CSS_CLASSES, DEFAULTS, KEYBOARD_KEYS } from "./constants"; import "./editor.scss"; import { SmartPostShowLogoIcon } from "../icons/icons"; /** * Add Prebuilt Library button to Gutenberg toolbar */ let modalRoot; function ToolbarLibrary() { const renderButton = (selector) => { const enableDesignLibraryModule = sp_smart_post_block_localize?.modulesOptions?.["template-library"]; if ( ! enableDesignLibraryModule ) { return; } // Avoid adding duplicate buttons. if (selector.querySelector(`.${CSS_CLASSES.TOOLBAR_LIBRARY}`) ) return; const patternButton = document.createElement("div"); patternButton.classList.add(CSS_CLASSES.TOOLBAR_LIBRARY); selector.appendChild(patternButton); const root = createRoot(patternButton); root.render( Smart Design Library ); }; const onInsertButtonClick = (e) => { e.preventDefault(); // If modal already exists, don't create another. if (document.querySelector(`.${CSS_CLASSES.MODAL}`)) return; const node = document.createElement("div"); node.className = `${CSS_CLASSES.MODAL} sp-smart-blocks-layouts`; document.body.appendChild(node); modalRoot = createRoot(node); modalRoot.render(); document.body.classList.add(CSS_CLASSES.POPUP_OPEN); // Optional: close when clicking outside setTimeout(() => { node.addEventListener("click", (e) => { if (e.target === node) removeModal(); }); }, 0); }; const removeModal = () => { const modal = document.querySelector(`.${CSS_CLASSES.MODAL}`); if (modal) { // Unmount React component first. if (modalRoot) { modalRoot.unmount(); } // Then remove modal from DOM. modal.remove(); document.body.classList.remove(CSS_CLASSES.POPUP_OPEN); } }; const debouncedRender = debounce(() => { const editToolbar = document.querySelector(".edit-post-header-toolbar"); if (editToolbar) { renderButton(editToolbar); } }, DEFAULTS.DEBOUNCE_DELAY); const unsubscribe = subscribe(() => { debouncedRender(); unsubscribe(); }); return null; } registerPlugin("sp-smart-toolbar-library", { render: ToolbarLibrary, });