UNPKG

@atlaskit/editor-plugin-type-ahead

Version:

Type-ahead plugin for @atlaskit/editor-core

174 lines (172 loc) 8.55 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.WrapperTypeAhead = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _analytics = require("@atlaskit/editor-common/analytics"); var _typeAhead = require("@atlaskit/editor-common/type-ahead"); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); var _experiments = require("@atlaskit/tmp-editor-statsig/experiments"); var _analytics2 = require("../pm-plugins/analytics"); var _updateQuery = require("../pm-plugins/commands/update-query"); var _itemIsDisabled2 = require("../pm-plugins/item-is-disabled"); var _utils = require("../pm-plugins/utils"); var _useItemInsert3 = require("./hooks/use-item-insert"); var _useLoadItems = require("./hooks/use-load-items"); var _useOnForceSelect = require("./hooks/use-on-force-select"); var _InputQuery = require("./InputQuery"); 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 WrapperTypeAhead = exports.WrapperTypeAhead = /*#__PURE__*/_react.default.memo(function (_ref) { var triggerHandler = _ref.triggerHandler, editorView = _ref.editorView, anchorElement = _ref.anchorElement, shouldFocusCursorInsideQuery = _ref.shouldFocusCursorInsideQuery, popupsMountPoint = _ref.popupsMountPoint, popupsBoundariesElement = _ref.popupsBoundariesElement, popupsScrollableElement = _ref.popupsScrollableElement, inputMethod = _ref.inputMethod, getDecorationPosition = _ref.getDecorationPosition, reopenQuery = _ref.reopenQuery, onUndoRedo = _ref.onUndoRedo, api = _ref.api; // @ts-ignore var openElementBrowserModal = triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.openElementBrowserModal; var showMoreOptionsButton = false; if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) { showMoreOptionsButton = !!(triggerHandler !== null && triggerHandler !== void 0 && triggerHandler.getMoreOptionsButtonConfig); } var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), closed = _useState2[0], setClosed = _useState2[1]; var _useState3 = (0, _react.useState)(reopenQuery || ''), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), query = _useState4[0], setQuery = _useState4[1]; var queryRef = (0, _react.useRef)(query); var editorViewRef = (0, _react.useRef)(editorView); var items = (0, _useLoadItems.useLoadItems)(triggerHandler, editorView, query, showMoreOptionsButton, api); (0, _react.useEffect)(function () { if (!closed && (0, _platformFeatureFlags.fg)('platform_editor_ease_of_use_metrics')) { var _api$metrics; api === null || api === void 0 || api.core.actions.execute(api === null || api === void 0 || (_api$metrics = api.metrics) === null || _api$metrics === void 0 ? void 0 : _api$metrics.commands.handleIntentToStartEdit({ shouldStartTimer: false, shouldPersistActiveSession: true })); } }, [closed, api]); (0, _react.useLayoutEffect)(function () { queryRef.current = query; }, [query]); var _useItemInsert = (0, _useItemInsert3.useItemInsert)(triggerHandler, editorView, items, api), _useItemInsert2 = (0, _slicedToArray2.default)(_useItemInsert, 2), onItemInsert = _useItemInsert2[0], onTextInsert = _useItemInsert2[1]; var selectNextItem = (0, _react.useMemo)(function () { return (0, _utils.moveSelectedIndex)({ editorView: editorView, direction: 'next', api: api }); }, [editorView, api]); var selectPreviousItem = (0, _react.useMemo)(function () { return (0, _utils.moveSelectedIndex)({ editorView: editorView, direction: 'previous', api: api }); }, [editorView, api]); var cancel = (0, _react.useCallback)(function (_ref2) { var setSelectionAt = _ref2.setSelectionAt, addPrefixTrigger = _ref2.addPrefixTrigger, text = _ref2.text, forceFocusOnEditor = _ref2.forceFocusOnEditor; if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) { var _getPluginState; (0, _analytics2.fireTypeAheadClosedAnalyticsEvent)(api, _analytics.ACTION.CANCELLED, !!queryRef.current, _analytics.INPUT_METHOD.KEYBOARD, (_getPluginState = (0, _utils.getPluginState)(editorView.state)) === null || _getPluginState === void 0 ? void 0 : _getPluginState.inputMethod); } setClosed(true); var fullquery = addPrefixTrigger ? "".concat(triggerHandler.trigger).concat(text) : text; onTextInsert({ forceFocusOnEditor: forceFocusOnEditor, setSelectionAt: setSelectionAt, text: fullquery }); }, [triggerHandler.trigger, onTextInsert, api, editorView.state]); var insertSelectedItem = (0, _react.useCallback)(function () { var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _typeAhead.SelectItemMode.SELECTED; var view = editorViewRef.current; // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion var _ref3 = (0, _utils.getPluginState)(view.state), selectedIndex = _ref3.selectedIndex; var safeSelectedIndex = (0, _utils.skipForwardToSafeItem)({ currentIndex: selectedIndex, nextIndex: 1, listSize: items.length, itemIsDisabled: function itemIsDisabled(idx) { return (0, _itemIsDisabled2.itemIsDisabled)(items[idx], api); } }); // If the only safe index is -1 then none are safe - do not insert item if (safeSelectedIndex === -1) { return; } if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) { var _getPluginState2; (0, _analytics2.fireTypeAheadClosedAnalyticsEvent)(api, _analytics.ACTION.INSERTED, !!queryRef.current, _analytics.INPUT_METHOD.KEYBOARD, (_getPluginState2 = (0, _utils.getPluginState)(editorView.state)) === null || _getPluginState2 === void 0 ? void 0 : _getPluginState2.inputMethod); } setClosed(true); queueMicrotask(function () { onItemInsert({ mode: mode, index: selectedIndex, query: queryRef.current }); }); }, [items, api, editorView.state, onItemInsert]); var showTypeAheadPopupList = (0, _react.useCallback)(function () {}, []); var closePopup = (0, _react.useCallback)(function () { setClosed(true); }, []); (0, _react.useEffect)(function () { var view = editorViewRef.current; var pluginState = (0, _utils.getPluginState)(view.state); if (query.length === 0 || query === (pluginState === null || pluginState === void 0 ? void 0 : pluginState.query) || !(pluginState !== null && pluginState !== void 0 && pluginState.triggerHandler)) { return; } (0, _updateQuery.updateQuery)(query)(view.state, view.dispatch); }, [query, reopenQuery]); (0, _useOnForceSelect.useOnForceSelect)({ triggerHandler: triggerHandler, items: items, query: query, editorView: editorView, closePopup: closePopup }); if (closed) { return null; } if (!triggerHandler) { return null; } return /*#__PURE__*/_react.default.createElement(_InputQuery.InputQuery, { triggerQueryPrefix: triggerHandler === null || triggerHandler === void 0 ? void 0 : triggerHandler.trigger, onQueryChange: setQuery, onItemSelect: insertSelectedItem, selectNextItem: selectNextItem, selectPreviousItem: selectPreviousItem, onQueryFocus: showTypeAheadPopupList, cancel: cancel, forceFocus: shouldFocusCursorInsideQuery, onUndoRedo: onUndoRedo, reopenQuery: reopenQuery, editorView: editorView, items: items }); }); WrapperTypeAhead.displayName = 'WrapperTypeAhead';