@atlaskit/editor-plugin-insert-block
Version:
Insert block plugin for @atlaskit/editor-core
140 lines (139 loc) • 7.38 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.RegisteredInsertButton = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactIntl = require("react-intl");
var _isOfflineMode = require("@atlaskit/editor-common/connectivity/isOfflineMode");
var _keymaps = require("@atlaskit/editor-common/keymaps");
var _insertBlock = require("@atlaskit/editor-common/messages/insert-block");
var _Popup = _interopRequireDefault(require("@atlaskit/editor-common/Popup"));
var _useMenuPopupSizing = require("@atlaskit/editor-common/quick-insert/use-menu-popup-sizing");
var _context = require("@atlaskit/editor-common/toolbar/context");
var _keys = require("@atlaskit/editor-common/toolbar/keys");
var _useSharedPluginStateWithSelector = require("@atlaskit/editor-common/useSharedPluginStateWithSelector");
var _constants = require("@atlaskit/editor-shared-styles/constants");
var _addIcon = require("@atlaskit/editor-toolbar/add-icon");
var _toolbarButton = require("@atlaskit/editor-toolbar/toolbar-button");
var _toolbarTooltip = require("@atlaskit/editor-toolbar/toolbar-tooltip");
var _uiContext = require("@atlaskit/editor-toolbar/ui-context");
var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
var _RegisteredInsertMenuContent = require("./RegisteredInsertMenuContent");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
var DEFAULT_MENU_MAX_HEIGHT = 520;
var POPUP_OFFSET = [0, 3];
/**
* The toolbar owns its popup lifecycle, but renders the same registered items
* and menu model as slash command.
*/
var RegisteredInsertButton = exports.RegisteredInsertButton = function RegisteredInsertButton(_ref) {
var api = _ref.api;
var _useEditorToolbar = (0, _context.useEditorToolbar)(),
editorView = _useEditorToolbar.editorView;
var isOptimistic = (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_ssr_toolbar_optimistic');
var _useIntl = (0, _reactIntl.useIntl)(),
formatMessage = _useIntl.formatMessage;
var _useToolbarUI = (0, _uiContext.useToolbarUI)(),
isDisabled = _useToolbarUI.isDisabled,
popupsBoundariesElement = _useToolbarUI.popupsBoundariesElement,
popupsMountPoint = _useToolbarUI.popupsMountPoint,
popupsScrollableElement = _useToolbarUI.popupsScrollableElement;
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isOpen = _useState2[0],
setIsOpen = _useState2[1];
var buttonRef = (0, _react.useRef)(null);
var menuHeight = (0, _useMenuPopupSizing.useMenuPopupSizing)({
target: buttonRef.current,
boundariesElement: popupsBoundariesElement,
scrollableElement: popupsScrollableElement,
maxHeight: DEFAULT_MENU_MAX_HEIGHT,
offset: POPUP_OFFSET[1],
isOpen: isOpen
});
var _useSharedPluginState = (0, _useSharedPluginStateWithSelector.useSharedPluginStateWithSelector)(api, ['connectivity', 'typeAhead'], function (states) {
var _states$connectivityS, _states$typeAheadStat;
return {
connectivityMode: (_states$connectivityS = states.connectivityState) === null || _states$connectivityS === void 0 ? void 0 : _states$connectivityS.mode,
isAllowed: (_states$typeAheadStat = states.typeAheadState) === null || _states$typeAheadStat === void 0 ? void 0 : _states$typeAheadStat.isAllowed
};
}),
connectivityMode = _useSharedPluginState.connectivityMode,
isAllowed = _useSharedPluginState.isAllowed;
var close = (0, _react.useCallback)(function () {
var restoreFocus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
setIsOpen(false);
if (restoreFocus) {
requestAnimationFrame(function () {
var _buttonRef$current;
return (_buttonRef$current = buttonRef.current) === null || _buttonRef$current === void 0 ? void 0 : _buttonRef$current.focus();
});
}
}, []);
var open = (0, _react.useCallback)(function () {
// Early clicks must not queue a popup to open when the editor becomes ready.
if (!editorView) {
return;
}
setIsOpen(true);
}, [editorView]);
var onPopupUnmount = (0, _react.useCallback)(function () {
// Outside dismissal must not move focus away from the element that was clicked.
setIsOpen(false);
}, []);
var closeAndRestoreFocus = (0, _react.useCallback)(function () {
return close(true);
}, [close]);
var closeForSelection = (0, _react.useCallback)(function () {
return close(false);
}, [close]);
if (!(api !== null && api !== void 0 && api.insertBlock) || !editorView && !isOptimistic) {
return null;
}
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_toolbarTooltip.ToolbarTooltip, {
content: /*#__PURE__*/_react.default.createElement(_keymaps.ToolTipContent, {
description: formatMessage(_insertBlock.toolbarInsertBlockMessages.insertMenu),
keymap: _keymaps.insertElements
})
}, /*#__PURE__*/_react.default.createElement(_toolbarButton.ToolbarButton, {
ariaKeyshortcuts: (0, _keymaps.getAriaKeyshortcuts)(_keymaps.insertElements),
iconBefore: /*#__PURE__*/_react.default.createElement(_addIcon.AddIcon, {
size: "small",
label: formatMessage(_insertBlock.toolbarInsertBlockMessages.insertMenu)
})
// Keep the optimistic SSR button visible before the live view is attached.
,
isDisabled: isDisabled || (!isOptimistic || !!editorView) && !isAllowed,
isSelected: isOpen,
onClick: isOpen ? function () {
return close(true);
} : open,
ref: buttonRef,
testId: _keys.TOOLBAR_BUTTON_TEST_ID.INSERT
})), isOpen && buttonRef.current && editorView && /*#__PURE__*/_react.default.createElement(_Popup.default, {
alignX: "right",
boundariesElement: popupsBoundariesElement,
fitHeight: menuHeight,
fitWidth: 350,
mountTo: popupsMountPoint,
offset: POPUP_OFFSET,
onUnmount: onPopupUnmount,
preventOverflow: true,
scrollableElement: popupsScrollableElement,
target: buttonRef.current,
zIndex: _constants.akEditorMenuZIndex
}, /*#__PURE__*/_react.default.createElement(_RegisteredInsertMenuContent.RegisteredInsertMenuContent, {
api: api,
maxHeight: menuHeight,
editorView: editorView,
isOffline: (0, _isOfflineMode.isOfflineMode)(connectivityMode),
onClose: closeAndRestoreFocus,
onDismiss: closeForSelection,
onSelect: closeForSelection,
target: buttonRef.current
})));
};