@atlaskit/editor-plugin-insert-block
Version:
Insert block plugin for @atlaskit/editor-core
54 lines • 2.03 kB
JavaScript
import React, { createContext, useCallback, useContext, useMemo } from 'react';
import { INPUT_METHOD } from '@atlaskit/editor-common/analytics/types/enums';
import { insertSelectedItem } from '@atlaskit/editor-common/insert';
import { QuickInsertProvider } from '@atlaskit/editor-common/quick-insert/provider';
// Preview updates must remain live while react-virtualized caches row elements during scrolling.
export const RegisteredInsertMenuPreviewContext = /*#__PURE__*/createContext(undefined);
export const RegisteredInsertMenuItem = ({
editorView,
id,
isOffline,
isSelected,
menuOpenId,
onClose,
registration,
surfaceContext
}) => {
var _registration$compone;
const Component = (_registration$compone = registration.component) !== null && _registration$compone !== void 0 ? _registration$compone : React.Fragment;
const activePreviewItemKey = useContext(RegisteredInsertMenuPreviewContext);
const isPreviewActive = activePreviewItemKey === registration.key;
const select = useCallback(selectionHandler => {
// Close first so a registered item may safely focus the editor or open its picker.
onClose();
queueMicrotask(() => {
const {
state
} = editorView;
const insert = (content, options = {}) => insertSelectedItem(content, options)(state, state.tr, state.selection.head);
const transaction = selectionHandler({
insert,
source: INPUT_METHOD.INSERT_MENU
});
if (transaction) {
editorView.dispatch(transaction);
}
});
}, [editorView, onClose]);
const contextValue = useMemo(() => ({
editorView,
isOffline,
item: {
id,
isPreviewActive,
isSelected
},
menuOpenId,
select,
surface: 'toolbar',
surfaceContext
}), [editorView, id, isOffline, isPreviewActive, isSelected, menuOpenId, select, surfaceContext]);
return /*#__PURE__*/React.createElement(QuickInsertProvider, {
value: contextValue
}, /*#__PURE__*/React.createElement(Component, null, null));
};