@atlaskit/editor-plugin-type-ahead 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/.eslintrc.js +11 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/cjs/api.js +215 -0
  4. package/dist/cjs/commands/insert-type-ahead-item.js +205 -0
  5. package/dist/cjs/commands/update-list-items.js +23 -0
  6. package/dist/cjs/commands/update-query.js +27 -0
  7. package/dist/cjs/commands/update-selected-index.js +27 -0
  8. package/dist/cjs/constants.js +15 -0
  9. package/dist/cjs/index.js +8 -1
  10. package/dist/cjs/insert-utils.js +107 -0
  11. package/dist/cjs/messages.js +79 -0
  12. package/dist/cjs/plugin.js +382 -0
  13. package/dist/cjs/pm-plugins/actions.js +16 -0
  14. package/dist/cjs/pm-plugins/decorations.js +148 -0
  15. package/dist/cjs/pm-plugins/input-rules.js +36 -0
  16. package/dist/cjs/pm-plugins/insert-item-plugin.js +22 -0
  17. package/dist/cjs/pm-plugins/key.js +8 -0
  18. package/dist/cjs/pm-plugins/main.js +110 -0
  19. package/dist/cjs/pm-plugins/reducer.js +158 -0
  20. package/dist/cjs/pm-plugins/utils.js +18 -0
  21. package/dist/cjs/stats-modifier.js +42 -0
  22. package/dist/cjs/transforms/close-type-ahead.js +13 -0
  23. package/dist/cjs/transforms/open-typeahead-at-cursor.js +75 -0
  24. package/dist/cjs/transforms/set-selection-before-query.js +18 -0
  25. package/dist/cjs/ui/AssistiveText.js +120 -0
  26. package/dist/cjs/ui/InputQuery.js +400 -0
  27. package/dist/cjs/ui/TypeAheadList.js +285 -0
  28. package/dist/cjs/ui/TypeAheadListItem.js +181 -0
  29. package/dist/cjs/ui/TypeAheadPopup.js +230 -0
  30. package/dist/cjs/ui/WrapperTypeAhead.js +127 -0
  31. package/dist/cjs/ui/hooks/use-item-insert.js +109 -0
  32. package/dist/cjs/ui/hooks/use-load-items.js +50 -0
  33. package/dist/cjs/ui/hooks/use-on-force-select.js +41 -0
  34. package/dist/cjs/utils.js +130 -0
  35. package/dist/es2019/api.js +205 -0
  36. package/dist/es2019/commands/insert-type-ahead-item.js +204 -0
  37. package/dist/es2019/commands/update-list-items.js +17 -0
  38. package/dist/es2019/commands/update-query.js +21 -0
  39. package/dist/es2019/commands/update-selected-index.js +21 -0
  40. package/dist/es2019/constants.js +9 -0
  41. package/dist/es2019/index.js +1 -1
  42. package/dist/es2019/insert-utils.js +106 -0
  43. package/dist/es2019/messages.js +73 -0
  44. package/dist/es2019/plugin.js +381 -0
  45. package/dist/es2019/pm-plugins/actions.js +10 -0
  46. package/dist/es2019/pm-plugins/decorations.js +148 -0
  47. package/dist/es2019/pm-plugins/input-rules.js +29 -0
  48. package/dist/es2019/pm-plugins/insert-item-plugin.js +16 -0
  49. package/dist/es2019/pm-plugins/key.js +2 -0
  50. package/dist/es2019/pm-plugins/main.js +106 -0
  51. package/dist/es2019/pm-plugins/reducer.js +160 -0
  52. package/dist/es2019/pm-plugins/utils.js +12 -0
  53. package/dist/es2019/stats-modifier.js +33 -0
  54. package/dist/es2019/transforms/close-type-ahead.js +7 -0
  55. package/dist/es2019/transforms/open-typeahead-at-cursor.js +71 -0
  56. package/dist/es2019/transforms/set-selection-before-query.js +10 -0
  57. package/dist/es2019/ui/AssistiveText.js +88 -0
  58. package/dist/es2019/ui/InputQuery.js +393 -0
  59. package/dist/es2019/ui/TypeAheadList.js +273 -0
  60. package/dist/es2019/ui/TypeAheadListItem.js +216 -0
  61. package/dist/es2019/ui/TypeAheadPopup.js +233 -0
  62. package/dist/es2019/ui/WrapperTypeAhead.js +109 -0
  63. package/dist/es2019/ui/hooks/use-item-insert.js +112 -0
  64. package/dist/es2019/ui/hooks/use-load-items.js +41 -0
  65. package/dist/es2019/ui/hooks/use-on-force-select.js +38 -0
  66. package/dist/es2019/utils.js +126 -0
  67. package/dist/esm/api.js +209 -0
  68. package/dist/esm/commands/insert-type-ahead-item.js +198 -0
  69. package/dist/esm/commands/update-list-items.js +17 -0
  70. package/dist/esm/commands/update-query.js +21 -0
  71. package/dist/esm/commands/update-selected-index.js +21 -0
  72. package/dist/esm/constants.js +9 -0
  73. package/dist/esm/index.js +1 -1
  74. package/dist/esm/insert-utils.js +101 -0
  75. package/dist/esm/messages.js +73 -0
  76. package/dist/esm/plugin.js +374 -0
  77. package/dist/esm/pm-plugins/actions.js +10 -0
  78. package/dist/esm/pm-plugins/decorations.js +141 -0
  79. package/dist/esm/pm-plugins/input-rules.js +29 -0
  80. package/dist/esm/pm-plugins/insert-item-plugin.js +16 -0
  81. package/dist/esm/pm-plugins/key.js +2 -0
  82. package/dist/esm/pm-plugins/main.js +104 -0
  83. package/dist/esm/pm-plugins/reducer.js +151 -0
  84. package/dist/esm/pm-plugins/utils.js +12 -0
  85. package/dist/esm/stats-modifier.js +35 -0
  86. package/dist/esm/transforms/close-type-ahead.js +7 -0
  87. package/dist/esm/transforms/open-typeahead-at-cursor.js +69 -0
  88. package/dist/esm/transforms/set-selection-before-query.js +12 -0
  89. package/dist/esm/ui/AssistiveText.js +115 -0
  90. package/dist/esm/ui/InputQuery.js +390 -0
  91. package/dist/esm/ui/TypeAheadList.js +276 -0
  92. package/dist/esm/ui/TypeAheadListItem.js +171 -0
  93. package/dist/esm/ui/TypeAheadPopup.js +220 -0
  94. package/dist/esm/ui/WrapperTypeAhead.js +117 -0
  95. package/dist/esm/ui/hooks/use-item-insert.js +103 -0
  96. package/dist/esm/ui/hooks/use-load-items.js +43 -0
  97. package/dist/esm/ui/hooks/use-on-force-select.js +35 -0
  98. package/dist/esm/utils.js +124 -0
  99. package/dist/types/api.d.ts +61 -0
  100. package/dist/types/commands/insert-type-ahead-item.d.ts +12 -0
  101. package/dist/types/commands/update-list-items.d.ts +3 -0
  102. package/dist/types/commands/update-query.d.ts +2 -0
  103. package/dist/types/commands/update-selected-index.d.ts +2 -0
  104. package/dist/types/constants.d.ts +8 -0
  105. package/dist/types/index.d.ts +2 -1
  106. package/dist/types/insert-utils.d.ts +18 -0
  107. package/dist/types/messages.d.ts +72 -0
  108. package/dist/types/plugin.d.ts +10 -0
  109. package/dist/types/pm-plugins/actions.d.ts +9 -0
  110. package/dist/types/pm-plugins/decorations.d.ts +14 -0
  111. package/dist/types/pm-plugins/input-rules.d.ts +6 -0
  112. package/dist/types/pm-plugins/insert-item-plugin.d.ts +2 -0
  113. package/dist/types/pm-plugins/key.d.ts +3 -0
  114. package/dist/types/pm-plugins/main.d.ts +14 -0
  115. package/dist/types/pm-plugins/reducer.d.ts +10 -0
  116. package/dist/types/pm-plugins/utils.d.ts +4 -0
  117. package/dist/types/stats-modifier.d.ts +20 -0
  118. package/dist/types/transforms/close-type-ahead.d.ts +2 -0
  119. package/dist/types/transforms/open-typeahead-at-cursor.d.ts +11 -0
  120. package/dist/types/transforms/set-selection-before-query.d.ts +2 -0
  121. package/dist/types/types.d.ts +64 -3
  122. package/dist/types/ui/AssistiveText.d.ts +33 -0
  123. package/dist/types/ui/InputQuery.d.ts +26 -0
  124. package/dist/types/ui/TypeAheadList.d.ts +25 -0
  125. package/dist/types/ui/TypeAheadListItem.d.ts +18 -0
  126. package/dist/types/ui/TypeAheadPopup.d.ts +29 -0
  127. package/dist/types/ui/WrapperTypeAhead.d.ts +20 -0
  128. package/dist/types/ui/hooks/use-item-insert.d.ts +3 -0
  129. package/dist/types/ui/hooks/use-load-items.d.ts +3 -0
  130. package/dist/types/ui/hooks/use-on-force-select.d.ts +11 -0
  131. package/dist/types/utils.d.ts +27 -0
  132. package/dist/types-ts4.5/api.d.ts +61 -0
  133. package/dist/types-ts4.5/commands/insert-type-ahead-item.d.ts +12 -0
  134. package/dist/types-ts4.5/commands/update-list-items.d.ts +3 -0
  135. package/dist/types-ts4.5/commands/update-query.d.ts +2 -0
  136. package/dist/types-ts4.5/commands/update-selected-index.d.ts +2 -0
  137. package/dist/types-ts4.5/constants.d.ts +8 -0
  138. package/dist/types-ts4.5/index.d.ts +2 -1
  139. package/dist/types-ts4.5/insert-utils.d.ts +18 -0
  140. package/dist/types-ts4.5/messages.d.ts +72 -0
  141. package/dist/types-ts4.5/plugin.d.ts +10 -0
  142. package/dist/types-ts4.5/pm-plugins/actions.d.ts +9 -0
  143. package/dist/types-ts4.5/pm-plugins/decorations.d.ts +14 -0
  144. package/dist/types-ts4.5/pm-plugins/input-rules.d.ts +6 -0
  145. package/dist/types-ts4.5/pm-plugins/insert-item-plugin.d.ts +2 -0
  146. package/dist/types-ts4.5/pm-plugins/key.d.ts +3 -0
  147. package/dist/types-ts4.5/pm-plugins/main.d.ts +14 -0
  148. package/dist/types-ts4.5/pm-plugins/reducer.d.ts +10 -0
  149. package/dist/types-ts4.5/pm-plugins/utils.d.ts +4 -0
  150. package/dist/types-ts4.5/stats-modifier.d.ts +20 -0
  151. package/dist/types-ts4.5/transforms/close-type-ahead.d.ts +2 -0
  152. package/dist/types-ts4.5/transforms/open-typeahead-at-cursor.d.ts +11 -0
  153. package/dist/types-ts4.5/transforms/set-selection-before-query.d.ts +2 -0
  154. package/dist/types-ts4.5/types.d.ts +64 -3
  155. package/dist/types-ts4.5/ui/AssistiveText.d.ts +33 -0
  156. package/dist/types-ts4.5/ui/InputQuery.d.ts +26 -0
  157. package/dist/types-ts4.5/ui/TypeAheadList.d.ts +25 -0
  158. package/dist/types-ts4.5/ui/TypeAheadListItem.d.ts +18 -0
  159. package/dist/types-ts4.5/ui/TypeAheadPopup.d.ts +29 -0
  160. package/dist/types-ts4.5/ui/WrapperTypeAhead.d.ts +20 -0
  161. package/dist/types-ts4.5/ui/hooks/use-item-insert.d.ts +7 -0
  162. package/dist/types-ts4.5/ui/hooks/use-load-items.d.ts +3 -0
  163. package/dist/types-ts4.5/ui/hooks/use-on-force-select.d.ts +11 -0
  164. package/dist/types-ts4.5/utils.d.ts +27 -0
  165. package/package.json +21 -28
  166. package/report.api.md +32 -1
  167. package/tmp/api-report-tmp.d.ts +29 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.itemIcon = exports.TypeAheadListItem = exports.ITEM_PADDING = exports.ICON_WIDTH = exports.ICON_HEIGHT = void 0;
9
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _react2 = require("@emotion/react");
12
+ var _reactIntlNext = require("react-intl-next");
13
+ var _quickInsert = require("@atlaskit/editor-common/quick-insert");
14
+ var _typeAhead = require("@atlaskit/editor-common/type-ahead");
15
+ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
16
+ var _shortcut = require("@atlaskit/editor-shared-styles/shortcut");
17
+ var _menu = require("@atlaskit/menu");
18
+ var _colors = require("@atlaskit/theme/colors");
19
+ var _components = require("@atlaskit/theme/components");
20
+ var _constants = require("@atlaskit/theme/constants");
21
+ var _messages = require("../messages");
22
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
23
+ /** @jsx jsx */
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
+ var ICON_HEIGHT = exports.ICON_HEIGHT = 40;
27
+ var ICON_WIDTH = exports.ICON_WIDTH = 40;
28
+ var ITEM_PADDING = exports.ITEM_PADDING = 12;
29
+ var itemIcon = exports.itemIcon = (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n width: ", "px;\n height: ", "px;\n overflow: hidden;\n border: 1px solid ", "; /* N60 at 50% */\n border-radius: ", "px;\n box-sizing: border-box;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n div {\n width: ", "px;\n height: ", "px;\n }\n"])), ICON_WIDTH, ICON_HEIGHT, "var(--ds-border, rgba(223, 225, 229, 0.5))", (0, _constants.borderRadius)(), ICON_WIDTH, ICON_HEIGHT);
30
+ var itemBody = (0, _react2.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n"])));
31
+ var itemText = function itemText(theme) {
32
+ return (0, _react2.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n white-space: initial;\n color: ", ";\n .item-title {\n line-height: 1.4;\n }\n .item-description {\n font-size: ", ";\n color: ", ";\n margin-top: 3px;\n }\n"])), (0, _components.themed)({
33
+ light: "var(--ds-text, ".concat(_colors.N800, ")"),
34
+ dark: "var(--ds-text, ".concat(_colors.DN600, ")")
35
+ })(theme), (0, _editorSharedStyles.relativeFontSizeToBase16)(12), "var(--ds-text-subtlest, ".concat(_colors.N200, ")"));
36
+ };
37
+ var itemAfter = (0, _react2.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n flex: 0 0 auto;\n"])));
38
+ var customRenderItemDivStyle = (0, _react2.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n overflow: hidden;\n &:focus {\n box-shadow: inset 2px 0px 0px ", ";\n background-color: ", ";\n outline: none;\n }\n"])), "var(--ds-border-focused, ".concat(_colors.B400, ")"), "var(--ds-background-neutral-subtle-hovered, ".concat(_colors.N30, ")"));
39
+
40
+ /**
41
+ * This CSS emulates the desired behaviour with :focus-visible for firefox.
42
+ * Firefox unfortunately does not register keyboard focus if user mouseDown and drag a typeahead item
43
+ * resulting in focus-visible style not drawn.
44
+ */
45
+ var selectionFrame = {
46
+ '& > button:focus': {
47
+ boxShadow: "inset 2px 0px 0px ".concat("var(--ds-border-focused, ".concat(_colors.B400, ")"), ";"),
48
+ backgroundColor: "".concat("var(--ds-background-neutral-subtle-hovered, ".concat(_colors.N30, ")")),
49
+ outline: 'none',
50
+ '&:active': {
51
+ boxShadow: 'none'
52
+ }
53
+ },
54
+ '& > button:hover': {
55
+ backgroundColor: 'inherit',
56
+ outline: 'none'
57
+ }
58
+ };
59
+ var selectedStyle = (0, _react2.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n background-color: ", ";\n box-shadow: inset 2px 0px 0px ", ";\n"])), "var(--ds-background-neutral-subtle-hovered, ".concat(_colors.N30, ")"), "var(--ds-border-focused, ".concat(_colors.B400, ")"));
60
+ var FallbackIcon = /*#__PURE__*/_react.default.memo(function (_ref) {
61
+ var label = _ref.label;
62
+ return (0, _react2.jsx)(_quickInsert.IconFallback, null);
63
+ });
64
+ var noop = function noop() {};
65
+ var AssistiveText = function AssistiveText(_ref2) {
66
+ var title = _ref2.title,
67
+ description = _ref2.description,
68
+ shortcut = _ref2.shortcut;
69
+ var intl = (0, _reactIntlNext.useIntl)();
70
+ var descriptionText = description ? " ".concat(intl.formatMessage(_messages.typeAheadListMessages.descriptionLabel), " ").concat(description, ".") : '';
71
+ var shortcutText = shortcut ? " ".concat(intl.formatMessage(_messages.typeAheadListMessages.shortcutLabel), " ").concat(shortcut, ".") : '';
72
+ return (0, _react2.jsx)("span", {
73
+ className: "assistive"
74
+ }, "".concat(title, ". ").concat(descriptionText, " ").concat(shortcutText));
75
+ };
76
+ var TypeAheadListItem = exports.TypeAheadListItem = function TypeAheadListItem(_ref3) {
77
+ var item = _ref3.item,
78
+ itemsLength = _ref3.itemsLength,
79
+ selectedIndex = _ref3.selectedIndex,
80
+ onItemClick = _ref3.onItemClick,
81
+ itemIndex = _ref3.itemIndex,
82
+ ariaLabel = _ref3.ariaLabel;
83
+ /**
84
+ * To select and highlight the first Item when no item is selected
85
+ * However selectedIndex remains -1, So that user does not skip the first item when down arrow key is used from typeahead query(inputQuery.tsx)
86
+ */
87
+ var isSelected = itemIndex === selectedIndex || selectedIndex === -1 && itemIndex === 0;
88
+ var icon = item.icon,
89
+ title = item.title,
90
+ customRenderItem = item.render;
91
+ var elementIcon = (0, _react.useMemo)(function () {
92
+ return (0, _react2.jsx)("div", {
93
+ css: itemIcon
94
+ }, icon ? icon() : (0, _react2.jsx)(FallbackIcon, {
95
+ label: title
96
+ }));
97
+ }, [icon, title]);
98
+ var insertSelectedItem = (0, _react.useCallback)(function () {
99
+ onItemClick(_typeAhead.SelectItemMode.SELECTED, itemIndex);
100
+ }, [onItemClick, itemIndex]);
101
+ var customItemRef = /*#__PURE__*/_react.default.createRef();
102
+ var buttonItemRef = /*#__PURE__*/_react.default.createRef();
103
+ var shouldUpdateFocus = selectedIndex === itemIndex;
104
+ (0, _react.useLayoutEffect)(function () {
105
+ if (shouldUpdateFocus) {
106
+ var _customItemRef$curren;
107
+ customItemRef === null || customItemRef === void 0 || (_customItemRef$curren = customItemRef.current) === null || _customItemRef$curren === void 0 || _customItemRef$curren.focus();
108
+ }
109
+ }, [customItemRef, shouldUpdateFocus]);
110
+ (0, _react.useLayoutEffect)(function () {
111
+ if (shouldUpdateFocus) {
112
+ var _buttonItemRef$curren;
113
+ buttonItemRef === null || buttonItemRef === void 0 || (_buttonItemRef$curren = buttonItemRef.current) === null || _buttonItemRef$curren === void 0 || _buttonItemRef$curren.focus();
114
+ }
115
+ }, [buttonItemRef, shouldUpdateFocus]);
116
+ var customItem = (0, _react.useMemo)(function () {
117
+ if (!customRenderItem) {
118
+ return null;
119
+ }
120
+ var Comp = customRenderItem;
121
+ var listItemClasses = [customRenderItemDivStyle, isSelected && selectedStyle];
122
+ return (0, _react2.jsx)("div", {
123
+ "aria-selected": isSelected,
124
+ role: "option",
125
+ "aria-label": ariaLabel,
126
+ "aria-setsize": itemsLength,
127
+ "aria-posinset": itemIndex,
128
+ tabIndex: 0,
129
+ css: listItemClasses,
130
+ className: "ak-typeahead-item ".concat(isSelected ? 'typeahead-selected-item' : '')
131
+ //CSS classes added for test cases purpose
132
+ ,
133
+ ref: customItemRef
134
+ }, (0, _react2.jsx)("div", {
135
+ "aria-hidden": true
136
+ }, (0, _react2.jsx)(Comp, {
137
+ onClick: insertSelectedItem,
138
+ isSelected: false //The selection styles are handled in the parent div instead. Hence isSelected is made false always.
139
+ ,
140
+ onHover: noop
141
+ })));
142
+ }, [customRenderItem, isSelected, ariaLabel, itemsLength, customItemRef, insertSelectedItem, itemIndex]);
143
+ if (customItem) {
144
+ return customItem;
145
+ }
146
+ var listItemClasses = [selectionFrame, isSelected && selectedStyle];
147
+ return (0, _react2.jsx)("span", {
148
+ css: listItemClasses
149
+ }, (0, _react2.jsx)(_menu.ButtonItem, {
150
+ onClick: insertSelectedItem,
151
+ iconBefore: elementIcon,
152
+ isSelected: isSelected,
153
+ "aria-selected": isSelected,
154
+ "aria-label": title,
155
+ "aria-setsize": itemsLength,
156
+ "aria-posinset": itemIndex,
157
+ role: "option",
158
+ ref: buttonItemRef
159
+ // @ts-ignore
160
+ ,
161
+ css: listItemClasses
162
+ }, (0, _react2.jsx)("div", {
163
+ "aria-hidden": true
164
+ }, (0, _react2.jsx)("div", {
165
+ css: itemText
166
+ }, (0, _react2.jsx)("div", {
167
+ css: itemBody
168
+ }, (0, _react2.jsx)("div", {
169
+ className: "item-title"
170
+ }, item.title), (0, _react2.jsx)("div", {
171
+ css: itemAfter
172
+ }, item.keyshortcut && (0, _react2.jsx)("div", {
173
+ css: _shortcut.shortcutStyle
174
+ }, item.keyshortcut))), (0, _react2.jsx)("div", {
175
+ className: "item-description"
176
+ }, item.description))), (0, _react2.jsx)(AssistiveText, {
177
+ title: item.title,
178
+ description: item.description,
179
+ shortcut: item.keyshortcut
180
+ })));
181
+ };
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.TypeAheadPopup = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _react2 = require("@emotion/react");
13
+ var _rafSchd = _interopRequireDefault(require("raf-schd"));
14
+ var _analytics = require("@atlaskit/editor-common/analytics");
15
+ var _ui = require("@atlaskit/editor-common/ui");
16
+ var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
17
+ var _colors = require("@atlaskit/theme/colors");
18
+ var _constants = require("@atlaskit/theme/constants");
19
+ var _constants2 = require("../constants");
20
+ var _TypeAheadList = require("./TypeAheadList");
21
+ var _TypeAheadListItem = require("./TypeAheadListItem");
22
+ var _templateObject;
23
+ /** @jsx jsx */
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
+ var DEFAULT_TYPEAHEAD_MENU_HEIGHT = 380;
27
+ var typeAheadContent = (0, _react2.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n background: ", ";\n border-radius: ", "px;\n box-shadow: ", ";\n padding: ", " 0;\n width: 320px;\n max-height: 380px; /* ~5.5 visibile items */\n overflow-y: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n position: relative;\n"])), "var(--ds-surface-overlay, ".concat(_colors.N0, ")"), (0, _constants.borderRadius)(), "var(--ds-shadow-overlay, ".concat("0 0 1px ".concat(_colors.N60A, ", 0 4px 8px -2px ").concat(_colors.N50A), ")"), "var(--ds-space-050, 4px)");
28
+ var Highlight = function Highlight(_ref) {
29
+ var state = _ref.state,
30
+ triggerHandler = _ref.triggerHandler;
31
+ if (!(triggerHandler !== null && triggerHandler !== void 0 && triggerHandler.getHighlight)) {
32
+ return null;
33
+ }
34
+ return triggerHandler.getHighlight(state);
35
+ };
36
+ var OFFSET = [0, 8];
37
+ var TypeAheadPopup = exports.TypeAheadPopup = /*#__PURE__*/_react.default.memo(function (props) {
38
+ var editorView = props.editorView,
39
+ triggerHandler = props.triggerHandler,
40
+ anchorElement = props.anchorElement,
41
+ popupsMountPoint = props.popupsMountPoint,
42
+ popupsBoundariesElement = props.popupsBoundariesElement,
43
+ popupsScrollableElement = props.popupsScrollableElement,
44
+ items = props.items,
45
+ selectedIndex = props.selectedIndex,
46
+ onItemInsert = props.onItemInsert,
47
+ fireAnalyticsCallback = props.fireAnalyticsCallback,
48
+ isEmptyQuery = props.isEmptyQuery,
49
+ cancel = props.cancel;
50
+ var ref = (0, _react.useRef)(null);
51
+ var startTime = (0, _react.useMemo)(function () {
52
+ return performance.now();
53
+ },
54
+ // In case those props changes
55
+ // we need to recreate the startTime
56
+ [items, isEmptyQuery, fireAnalyticsCallback, triggerHandler] // eslint-disable-line react-hooks/exhaustive-deps
57
+ );
58
+
59
+ (0, _react.useEffect)(function () {
60
+ if (!fireAnalyticsCallback) {
61
+ return;
62
+ }
63
+ var stopTime = performance.now();
64
+ var time = stopTime - startTime;
65
+ fireAnalyticsCallback({
66
+ payload: {
67
+ action: _analytics.ACTION.RENDERED,
68
+ actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD,
69
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL,
70
+ attributes: {
71
+ time: time,
72
+ items: items.length,
73
+ initial: isEmptyQuery
74
+ }
75
+ }
76
+ });
77
+ }, [startTime, items, fireAnalyticsCallback, isEmptyQuery,
78
+ // In case the current triggerHandler changes
79
+ // e.g: Inserting a mention using the quick insert
80
+ // we need to send the event again
81
+ // eslint-disable-next-line react-hooks/exhaustive-deps
82
+ triggerHandler]);
83
+ (0, _react.useEffect)(function () {
84
+ if (!fireAnalyticsCallback) {
85
+ return;
86
+ }
87
+ fireAnalyticsCallback({
88
+ payload: {
89
+ action: _analytics.ACTION.VIEWED,
90
+ actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD_ITEM,
91
+ eventType: _analytics.EVENT_TYPE.OPERATIONAL,
92
+ attributes: {
93
+ index: selectedIndex,
94
+ items: items.length
95
+ }
96
+ }
97
+ });
98
+ }, [items, fireAnalyticsCallback, selectedIndex,
99
+ // In case the current triggerHandler changes
100
+ // e.g: Inserting a mention using the quick insert
101
+ // we need to send the event again
102
+ // eslint-disable-next-line react-hooks/exhaustive-deps
103
+ triggerHandler]);
104
+ var _useState = (0, _react.useState)(DEFAULT_TYPEAHEAD_MENU_HEIGHT),
105
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
106
+ fitHeight = _useState2[0],
107
+ setFitHeight = _useState2[1];
108
+ var getFitHeight = (0, _react.useCallback)(function () {
109
+ if (!anchorElement || !popupsMountPoint) {
110
+ return;
111
+ }
112
+ var target = anchorElement;
113
+ var _target$getBoundingCl = target.getBoundingClientRect(),
114
+ targetTop = _target$getBoundingCl.top,
115
+ targetHeight = _target$getBoundingCl.height;
116
+ var boundariesElement = document.body;
117
+ var _boundariesElement$ge = boundariesElement.getBoundingClientRect(),
118
+ boundariesHeight = _boundariesElement$ge.height,
119
+ boundariesTop = _boundariesElement$ge.top;
120
+
121
+ // Calculating the space above and space below our decoration
122
+ var spaceAbove = targetTop - (boundariesTop - boundariesElement.scrollTop);
123
+ var spaceBelow = boundariesTop + boundariesHeight - (targetTop + targetHeight);
124
+
125
+ // Keep default height if more than enough space
126
+ if (spaceBelow >= DEFAULT_TYPEAHEAD_MENU_HEIGHT) {
127
+ return setFitHeight(DEFAULT_TYPEAHEAD_MENU_HEIGHT);
128
+ }
129
+
130
+ // Determines whether typeahead will fit above or below decoration
131
+ // and return the space available.
132
+ var newFitHeight = spaceBelow >= spaceAbove ? spaceBelow : spaceAbove;
133
+
134
+ // Each typeahead item has some padding
135
+ // We want to leave some space at the top so first item
136
+ // is not partially cropped
137
+ var fitHeightWithSpace = newFitHeight - _TypeAheadListItem.ITEM_PADDING * 2;
138
+
139
+ // Ensure typeahead height is max its default height
140
+ var minFitHeight = Math.min(DEFAULT_TYPEAHEAD_MENU_HEIGHT, fitHeightWithSpace);
141
+ return setFitHeight(minFitHeight);
142
+ }, [anchorElement, popupsMountPoint]);
143
+ var getFitHeightDebounced = (0, _rafSchd.default)(getFitHeight);
144
+ (0, _react.useLayoutEffect)(function () {
145
+ var scrollableElement = popupsScrollableElement || (0, _ui.findOverflowScrollParent)(anchorElement);
146
+ getFitHeight();
147
+ window.addEventListener('resize', getFitHeightDebounced);
148
+ if (scrollableElement) {
149
+ scrollableElement.addEventListener('scroll', getFitHeightDebounced);
150
+ }
151
+ return function () {
152
+ window.removeEventListener('resize', getFitHeightDebounced);
153
+ if (scrollableElement) {
154
+ scrollableElement.removeEventListener('scroll', getFitHeightDebounced);
155
+ }
156
+ };
157
+ }, [anchorElement, popupsScrollableElement, getFitHeightDebounced, getFitHeight]);
158
+ (0, _react.useLayoutEffect)(function () {
159
+ var focusOut = function focusOut(event) {
160
+ var _window$getSelection;
161
+ var relatedTarget = event.relatedTarget;
162
+
163
+ // Given the user is changing the focus
164
+ // When the target is inside the TypeAhead Popup
165
+ // Then the popup should stay open
166
+ if (relatedTarget instanceof HTMLElement && relatedTarget.closest && (relatedTarget.closest(".".concat(_constants2.TYPE_AHEAD_POPUP_CONTENT_CLASS)) || relatedTarget.closest("[data-type-ahead=\"".concat(_constants2.TYPE_AHEAD_DECORATION_DATA_ATTRIBUTE, "\"]")))) {
167
+ return;
168
+ }
169
+ if (!(((_window$getSelection = window.getSelection()) === null || _window$getSelection === void 0 ? void 0 : _window$getSelection.type) === 'Range')) {
170
+ return;
171
+ }
172
+ cancel({
173
+ addPrefixTrigger: true,
174
+ setSelectionAt: _constants2.CloseSelectionOptions.AFTER_TEXT_INSERTED,
175
+ forceFocusOnEditor: false
176
+ });
177
+ };
178
+ var element = ref.current;
179
+ element === null || element === void 0 || element.addEventListener('focusout', focusOut);
180
+ return function () {
181
+ element === null || element === void 0 || element.removeEventListener('focusout', focusOut);
182
+ };
183
+ }, [ref, cancel]);
184
+
185
+ // ED-17443 When you press escape on typeahead panel, it should remove focus and close the panel
186
+ // This is the expected keyboard behaviour advised by the Accessibility team
187
+ (0, _react.useLayoutEffect)(function () {
188
+ var escape = function escape(event) {
189
+ if (event.key === 'Escape') {
190
+ cancel({
191
+ addPrefixTrigger: true,
192
+ setSelectionAt: _constants2.CloseSelectionOptions.AFTER_TEXT_INSERTED,
193
+ forceFocusOnEditor: true
194
+ });
195
+ }
196
+ };
197
+ var element = ref.current;
198
+ element === null || element === void 0 || element.addEventListener('keydown', escape);
199
+ return function () {
200
+ element === null || element === void 0 || element.removeEventListener('keydown', escape);
201
+ };
202
+ }, [ref, cancel]);
203
+ return (0, _react2.jsx)(_ui.Popup, {
204
+ zIndex: _editorSharedStyles.akEditorFloatingDialogZIndex,
205
+ target: anchorElement,
206
+ mountTo: popupsMountPoint,
207
+ boundariesElement: popupsBoundariesElement,
208
+ scrollableElement: popupsScrollableElement,
209
+ fitHeight: fitHeight,
210
+ fitWidth: 340,
211
+ offset: OFFSET
212
+ }, (0, _react2.jsx)("div", {
213
+ css: typeAheadContent,
214
+ tabIndex: 0,
215
+ className: _constants2.TYPE_AHEAD_POPUP_CONTENT_CLASS,
216
+ ref: ref
217
+ }, (0, _react2.jsx)(Highlight, {
218
+ state: editorView.state,
219
+ triggerHandler: triggerHandler
220
+ }), (0, _react2.jsx)(_TypeAheadList.TypeAheadList, {
221
+ items: items,
222
+ selectedIndex: selectedIndex,
223
+ onItemClick: onItemInsert,
224
+ fitHeight: fitHeight,
225
+ editorView: editorView,
226
+ decorationElement: anchorElement,
227
+ triggerHandler: triggerHandler
228
+ })));
229
+ });
230
+ TypeAheadPopup.displayName = 'TypeAheadPopup';
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.WrapperTypeAhead = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _typeAhead = require("@atlaskit/editor-common/type-ahead");
12
+ var _updateQuery = require("../commands/update-query");
13
+ var _utils = require("../utils");
14
+ var _useItemInsert3 = require("./hooks/use-item-insert");
15
+ var _useLoadItems = require("./hooks/use-load-items");
16
+ var _useOnForceSelect = require("./hooks/use-on-force-select");
17
+ var _InputQuery = require("./InputQuery");
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
20
+ var WrapperTypeAhead = exports.WrapperTypeAhead = /*#__PURE__*/_react.default.memo(function (_ref) {
21
+ var triggerHandler = _ref.triggerHandler,
22
+ editorView = _ref.editorView,
23
+ anchorElement = _ref.anchorElement,
24
+ shouldFocusCursorInsideQuery = _ref.shouldFocusCursorInsideQuery,
25
+ popupsMountPoint = _ref.popupsMountPoint,
26
+ popupsBoundariesElement = _ref.popupsBoundariesElement,
27
+ popupsScrollableElement = _ref.popupsScrollableElement,
28
+ createAnalyticsEvent = _ref.createAnalyticsEvent,
29
+ inputMethod = _ref.inputMethod,
30
+ getDecorationPosition = _ref.getDecorationPosition,
31
+ reopenQuery = _ref.reopenQuery,
32
+ onUndoRedo = _ref.onUndoRedo;
33
+ var _useState = (0, _react.useState)(false),
34
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
35
+ closed = _useState2[0],
36
+ setClosed = _useState2[1];
37
+ var _useState3 = (0, _react.useState)(reopenQuery || ''),
38
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
39
+ query = _useState4[0],
40
+ setQuery = _useState4[1];
41
+ var queryRef = (0, _react.useRef)(query);
42
+ var editorViewRef = (0, _react.useRef)(editorView);
43
+ var items = (0, _useLoadItems.useLoadItems)(triggerHandler, editorView, query);
44
+ (0, _react.useLayoutEffect)(function () {
45
+ queryRef.current = query;
46
+ }, [query]);
47
+ var _useItemInsert = (0, _useItemInsert3.useItemInsert)(triggerHandler, editorView, items),
48
+ _useItemInsert2 = (0, _slicedToArray2.default)(_useItemInsert, 2),
49
+ onItemInsert = _useItemInsert2[0],
50
+ onTextInsert = _useItemInsert2[1];
51
+ var selectNextItem = (0, _react.useMemo)(function () {
52
+ return (0, _utils.moveSelectedIndex)({
53
+ editorView: editorView,
54
+ direction: 'next'
55
+ });
56
+ }, [editorView]);
57
+ var selectPreviousItem = (0, _react.useMemo)(function () {
58
+ return (0, _utils.moveSelectedIndex)({
59
+ editorView: editorView,
60
+ direction: 'previous'
61
+ });
62
+ }, [editorView]);
63
+ var cancel = (0, _react.useCallback)(function (_ref2) {
64
+ var setSelectionAt = _ref2.setSelectionAt,
65
+ addPrefixTrigger = _ref2.addPrefixTrigger,
66
+ text = _ref2.text,
67
+ forceFocusOnEditor = _ref2.forceFocusOnEditor;
68
+ setClosed(true);
69
+ var fullquery = addPrefixTrigger ? "".concat(triggerHandler.trigger).concat(text) : text;
70
+ onTextInsert({
71
+ forceFocusOnEditor: forceFocusOnEditor,
72
+ setSelectionAt: setSelectionAt,
73
+ text: fullquery
74
+ });
75
+ }, [triggerHandler, onTextInsert]);
76
+ var insertSelectedItem = (0, _react.useCallback)(function () {
77
+ var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _typeAhead.SelectItemMode.SELECTED;
78
+ var view = editorViewRef.current;
79
+ var _ref3 = (0, _utils.getPluginState)(view.state),
80
+ selectedIndex = _ref3.selectedIndex;
81
+ setClosed(true);
82
+ queueMicrotask(function () {
83
+ onItemInsert({
84
+ mode: mode,
85
+ index: selectedIndex,
86
+ query: queryRef.current
87
+ });
88
+ });
89
+ }, [onItemInsert]);
90
+ var showTypeAheadPopupList = (0, _react.useCallback)(function () {}, []);
91
+ var closePopup = (0, _react.useCallback)(function () {
92
+ setClosed(true);
93
+ }, []);
94
+ (0, _react.useEffect)(function () {
95
+ var view = editorViewRef.current;
96
+ var pluginState = (0, _utils.getPluginState)(view.state);
97
+ if (query.length === 0 || query === (pluginState === null || pluginState === void 0 ? void 0 : pluginState.query) || !(pluginState !== null && pluginState !== void 0 && pluginState.triggerHandler)) {
98
+ return;
99
+ }
100
+ (0, _updateQuery.updateQuery)(query)(view.state, view.dispatch);
101
+ }, [query, reopenQuery]);
102
+ (0, _useOnForceSelect.useOnForceSelect)({
103
+ triggerHandler: triggerHandler,
104
+ items: items,
105
+ query: query,
106
+ editorView: editorView,
107
+ closePopup: closePopup
108
+ });
109
+ if (closed) {
110
+ return null;
111
+ }
112
+ return /*#__PURE__*/_react.default.createElement(_InputQuery.InputQuery, {
113
+ triggerQueryPrefix: triggerHandler.trigger,
114
+ onQueryChange: setQuery,
115
+ onItemSelect: insertSelectedItem,
116
+ selectNextItem: selectNextItem,
117
+ selectPreviousItem: selectPreviousItem,
118
+ onQueryFocus: showTypeAheadPopupList,
119
+ cancel: cancel,
120
+ forceFocus: shouldFocusCursorInsideQuery,
121
+ onUndoRedo: onUndoRedo,
122
+ reopenQuery: reopenQuery,
123
+ editorView: editorView,
124
+ items: items
125
+ });
126
+ });
127
+ WrapperTypeAhead.displayName = 'WrapperTypeAhead';
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useItemInsert = void 0;
7
+ var _react = require("react");
8
+ var _typeAhead = require("@atlaskit/editor-common/type-ahead");
9
+ var _insertTypeAheadItem = require("../../commands/insert-type-ahead-item");
10
+ var _constants = require("../../constants");
11
+ var _closeTypeAhead = require("../../transforms/close-type-ahead");
12
+ var _setSelectionBeforeQuery = require("../../transforms/set-selection-before-query");
13
+ var insertRawQuery = function insertRawQuery(_ref) {
14
+ var view = _ref.view,
15
+ setSelectionAt = _ref.setSelectionAt,
16
+ text = _ref.text,
17
+ forceFocusOnEditor = _ref.forceFocusOnEditor;
18
+ var _view$state = view.state,
19
+ tr = _view$state.tr,
20
+ schema = _view$state.schema;
21
+ (0, _closeTypeAhead.closeTypeAhead)(tr);
22
+ if (text.length > 0) {
23
+ tr.replaceSelectionWith(schema.text(text));
24
+ if (setSelectionAt === _constants.CloseSelectionOptions.BEFORE_TEXT_INSERTED) {
25
+ (0, _setSelectionBeforeQuery.setSelectionBeforeQuery)(text)(tr);
26
+ }
27
+ }
28
+ view.dispatch(tr);
29
+ if (forceFocusOnEditor) {
30
+ view.focus();
31
+ }
32
+ };
33
+ var useItemInsert = exports.useItemInsert = function useItemInsert(triggerHandler, editorView, items) {
34
+ var editorViewRef = (0, _react.useRef)(editorView);
35
+ var itemsRef = (0, _react.useRef)(items);
36
+ var onTextInsert = (0, _react.useCallback)(function (_ref2) {
37
+ var setSelectionAt = _ref2.setSelectionAt,
38
+ text = _ref2.text,
39
+ forceFocusOnEditor = _ref2.forceFocusOnEditor;
40
+ if (!triggerHandler) {
41
+ return;
42
+ }
43
+ var view = editorViewRef.current;
44
+ insertRawQuery({
45
+ view: view,
46
+ setSelectionAt: setSelectionAt,
47
+ text: text,
48
+ forceFocusOnEditor: forceFocusOnEditor
49
+ });
50
+ }, [triggerHandler]);
51
+ var onItemInsert = (0, _react.useCallback)(function (_ref3) {
52
+ var mode = _ref3.mode,
53
+ index = _ref3.index,
54
+ query = _ref3.query;
55
+ var sourceListItem = itemsRef.current;
56
+ if (sourceListItem.length === 0 || !triggerHandler) {
57
+ var text = "".concat(triggerHandler.trigger).concat(query);
58
+ onTextInsert({
59
+ forceFocusOnEditor: true,
60
+ setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED,
61
+ text: text
62
+ });
63
+ return;
64
+ }
65
+ var itemToInsert = sourceListItem[index];
66
+ if (!itemToInsert) {
67
+ return;
68
+ }
69
+ var view = editorViewRef.current;
70
+ (0, _insertTypeAheadItem.insertTypeAheadItem)(view)({
71
+ item: itemToInsert,
72
+ handler: triggerHandler,
73
+ mode: mode,
74
+ query: query,
75
+ sourceListItem: sourceListItem
76
+ });
77
+ }, [triggerHandler, onTextInsert]);
78
+ var onItemMatch = (0, _react.useCallback)(function (_ref4) {
79
+ var mode = _ref4.mode,
80
+ query = _ref4.query;
81
+ var _items = itemsRef.current;
82
+ if (_items && _items.length > 1) {
83
+ return false;
84
+ }
85
+ if (_items.length === 1) {
86
+ queueMicrotask(function () {
87
+ onItemInsert({
88
+ mode: mode,
89
+ query: query,
90
+ index: 0
91
+ });
92
+ });
93
+ } else {
94
+ var text = "".concat(triggerHandler.trigger).concat(query);
95
+ queueMicrotask(function () {
96
+ onTextInsert({
97
+ forceFocusOnEditor: true,
98
+ setSelectionAt: _constants.CloseSelectionOptions.AFTER_TEXT_INSERTED,
99
+ text: mode === _typeAhead.SelectItemMode.SPACE ? text.concat(' ') : text
100
+ });
101
+ });
102
+ }
103
+ return true;
104
+ }, [onItemInsert, triggerHandler, onTextInsert]);
105
+ (0, _react.useLayoutEffect)(function () {
106
+ itemsRef.current = items;
107
+ }, [items]);
108
+ return [onItemInsert, onTextInsert, onItemMatch];
109
+ };