UNPKG

@atlaskit/editor-plugin-quick-insert

Version:

Quick insert plugin for @atlaskit/editor-core

141 lines 6.65 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { ACTION, ACTION_SUBJECT, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics'; import { isOfflineMode } from '@atlaskit/editor-common/connectivity/isOfflineMode'; import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks'; import { insertSelectedItem } from '@atlaskit/editor-common/insert'; import { MENU } from '@atlaskit/editor-common/quick-insert/keys'; import { closeElementBrowser } from '../../pm-plugins/commands'; import { pluginKey } from '../../pm-plugins/plugin-key'; import { RegistryElementBrowser } from './RegistryElementBrowser'; export var RegistryElementBrowserContainer = function RegistryElementBrowserContainer(_ref) { var _pluginKey$getState; var editorView = _ref.editorView, pluginInjectionAPI = _ref.pluginInjectionAPI, helpUrl = _ref.helpUrl; var _useSharedPluginState = useSharedPluginStateWithSelector(pluginInjectionAPI, ['quickInsert', 'connectivity'], function (state) { var _state$quickInsertSta, _state$quickInsertSta2, _state$quickInsertSta3, _state$connectivitySt; return { isElementBrowserOpen: (_state$quickInsertSta = (_state$quickInsertSta2 = state.quickInsertState) === null || _state$quickInsertSta2 === void 0 ? void 0 : _state$quickInsertSta2.isElementBrowserOpen) !== null && _state$quickInsertSta !== void 0 ? _state$quickInsertSta : false, emptyStateHandler: (_state$quickInsertSta3 = state.quickInsertState) === null || _state$quickInsertSta3 === void 0 ? void 0 : _state$quickInsertSta3.emptyStateHandler, mode: (_state$connectivitySt = state.connectivityState) === null || _state$connectivitySt === void 0 ? void 0 : _state$connectivitySt.mode }; }), currentEmptyStateHandler = _useSharedPluginState.emptyStateHandler, isElementBrowserOpen = _useSharedPluginState.isElementBrowserOpen, mode = _useSharedPluginState.mode; var _useState = useState([]), _useState2 = _slicedToArray(_useState, 2), snapshot = _useState2[0], setSnapshot = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), hasInitialized = _useState4[0], setHasInitialized = _useState4[1]; var _useState5 = useState(), _useState6 = _slicedToArray(_useState5, 2), emptyStateHandler = _useState6[0], setEmptyStateHandler = _useState6[1]; var wasOpen = useRef(false); var selectionHandler = useRef(undefined); var isInsertConfirmed = useRef(false); var lifecycleOpen = useRef(false); var fireLifecycleEvent = useCallback(function (action) { var _pluginInjectionAPI$a; pluginInjectionAPI === null || pluginInjectionAPI === void 0 || (_pluginInjectionAPI$a = pluginInjectionAPI.analytics) === null || _pluginInjectionAPI$a === void 0 || _pluginInjectionAPI$a.actions.fireAnalyticsEvent({ action: action, actionSubject: ACTION_SUBJECT.ELEMENT_BROWSER, attributes: { mode: 'full' }, eventType: EVENT_TYPE.UI }); }, [pluginInjectionAPI]); useEffect(function () { if (isElementBrowserOpen && !wasOpen.current) { var _pluginInjectionAPI$u, _pluginInjectionAPI$u2; setSnapshot((_pluginInjectionAPI$u = pluginInjectionAPI === null || pluginInjectionAPI === void 0 || (_pluginInjectionAPI$u2 = pluginInjectionAPI.uiControlRegistry) === null || _pluginInjectionAPI$u2 === void 0 ? void 0 : _pluginInjectionAPI$u2.actions.getComponents(MENU.key)) !== null && _pluginInjectionAPI$u !== void 0 ? _pluginInjectionAPI$u : []); setHasInitialized(true); selectionHandler.current = undefined; setEmptyStateHandler(function () { return currentEmptyStateHandler; }); isInsertConfirmed.current = false; lifecycleOpen.current = true; fireLifecycleEvent(ACTION.OPENED); } else if (!isElementBrowserOpen && wasOpen.current && lifecycleOpen.current) { lifecycleOpen.current = false; fireLifecycleEvent(ACTION.CLOSED); } wasOpen.current = isElementBrowserOpen; }, [currentEmptyStateHandler, fireLifecycleEvent, isElementBrowserOpen, pluginInjectionAPI]); useEffect(function () { return function () { if (lifecycleOpen.current) { lifecycleOpen.current = false; fireLifecycleEvent(ACTION.CLOSED); } }; }, [fireLifecycleEvent]); var focusInEditor = useCallback(function () { if (!editorView.hasFocus()) { editorView.focus(); } }, [editorView]); var onClose = useCallback(function () { if (!isInsertConfirmed.current) { selectionHandler.current = undefined; } closeElementBrowser()(editorView.state, editorView.dispatch); focusInEditor(); }, [editorView, focusInEditor]); var onCloseComplete = useCallback(function () { var handler = isInsertConfirmed.current ? selectionHandler.current : undefined; selectionHandler.current = undefined; isInsertConfirmed.current = false; focusInEditor(); if (!handler) { return; } var insert = function insert(maybeNode) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return insertSelectedItem(maybeNode, options)(editorView.state, editorView.state.tr, editorView.state.selection.head); }; var transaction = handler({ insert: insert, source: INPUT_METHOD.ELEMENT_BROWSER }); if (transaction) { editorView.dispatch(transaction); } }, [editorView, focusInEditor]); var onSelect = useCallback(function (handler) { selectionHandler.current = handler; }, []); var onClearSelection = useCallback(function () { selectionHandler.current = undefined; isInsertConfirmed.current = false; }, []); var onConfirmInsert = useCallback(function () { if (!selectionHandler.current) { return; } isInsertConfirmed.current = true; onClose(); }, [onClose]); return /*#__PURE__*/React.createElement(RegistryElementBrowser, { components: snapshot, emptyStateHandler: emptyStateHandler, helpUrl: helpUrl, defaultSection: (_pluginKey$getState = pluginKey.getState(editorView.state)) === null || _pluginKey$getState === void 0 ? void 0 : _pluginKey$getState.elementBrowserInitialCategory, editorView: editorView, isOffline: isOfflineMode(mode), isLoading: !hasInitialized, isOpen: isElementBrowserOpen, onClearSelection: onClearSelection, onClose: onClose, onCloseComplete: onCloseComplete, onConfirmInsert: onConfirmInsert, onSelect: onSelect }); };