wpmind/src/editor/popup/index.js

142 lines
2.9 KiB
JavaScript
Raw Normal View History

/**
* Styles
*/
import './style.scss';
/**
* WordPress dependencies
*/
2023-08-04 08:55:12 +03:00
import { createRoot } from '@wordpress/element';
import { Modal } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { rawHandler } from '@wordpress/blocks';
import domReady from '@wordpress/dom-ready';
import clsx from 'clsx';
/**
* Internal dependencies
*/
2023-08-04 08:55:12 +03:00
import Input from './components/input';
import LoadingLine from './components/loading-line';
2023-08-04 08:55:12 +03:00
import Content from './components/content';
import Footer from './components/footer';
import NotConnectedScreen from './components/not-connected-screen';
const POPUP_CONTAINER_CLASS = 'mind-popup-container';
2023-08-04 08:55:12 +03:00
export default function Popup() {
const { setHighlightBlocks } = useDispatch('mind/blocks');
2023-08-04 08:55:12 +03:00
const { close, reset } = useDispatch('mind/popup');
const { connected, isOpen, insertionPlace, loading, response } = useSelect(
2023-08-04 08:55:12 +03:00
(select) => {
const { isConnected } = select('mind');
2023-08-04 08:55:12 +03:00
const {
isOpen: checkIsOpen,
getInsertionPlace,
getLoading,
getResponse,
} = select('mind/popup');
return {
connected: isConnected(),
2023-08-04 08:55:12 +03:00
isOpen: checkIsOpen(),
insertionPlace: getInsertionPlace(),
loading: getLoading(),
response: getResponse(),
};
}
);
const { selectedClientIds } = useSelect((select) => {
const { getSelectedBlockClientIds } = select('core/block-editor');
const ids = getSelectedBlockClientIds();
return {
selectedClientIds: ids,
};
}, []);
const { insertBlocks, replaceBlocks } = useDispatch('core/block-editor');
function insertResponse() {
const parsedBlocks = rawHandler({ HTML: response });
if (parsedBlocks.length) {
if (insertionPlace === 'selected-blocks') {
replaceBlocks(selectedClientIds, parsedBlocks);
} else {
insertBlocks(parsedBlocks);
}
setHighlightBlocks(
parsedBlocks.map((data) => {
return data.clientId;
})
);
}
}
function onInsert() {
insertResponse();
reset();
close();
}
if (!isOpen) {
return null;
}
return (
<Modal
title={false}
className={clsx(
'mind-popup',
!connected && 'mind-popup-not-connected'
)}
overlayClassName="mind-popup-overlay"
onRequestClose={() => {
reset();
close();
}}
__experimentalHideHeader
>
{connected ? (
<>
<Input onInsert={onInsert} />
{loading && <LoadingLine />}
<Content />
<Footer onInsert={onInsert} />
</>
) : (
<NotConnectedScreen />
)}
</Modal>
);
}
// .block-editor
// Insert popup renderer in editor.
domReady(() => {
// Check if popup exists already.
if (document.querySelector(`.${POPUP_CONTAINER_CLASS}`)) {
return;
}
const blockEditor = document.querySelector('.block-editor');
if (!blockEditor) {
return;
}
const toggleContainer = document.createElement('div');
toggleContainer.classList.add(POPUP_CONTAINER_CLASS);
blockEditor.appendChild(toggleContainer);
const root = createRoot(toggleContainer);
root.render(<Popup />);
});