@primer/components 0.0.0-2021816151443 → 0.0.0-2021816212749

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 (112) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/dist/browser.esm.js +667 -621
  3. package/dist/browser.esm.js.map +1 -1
  4. package/dist/browser.umd.js +301 -255
  5. package/dist/browser.umd.js.map +1 -1
  6. package/lib/ActionList/Item.js +3 -3
  7. package/lib/AnchoredOverlay/AnchoredOverlay.js +2 -2
  8. package/lib/Avatar.d.ts +4 -0
  9. package/lib/Dialog/Dialog.js +4 -4
  10. package/lib/FilteredActionList/FilteredActionList.js +3 -3
  11. package/lib/Overlay.d.ts +0 -1
  12. package/lib/Overlay.js +5 -10
  13. package/lib/SelectMenu/SelectMenu.d.ts +11 -327
  14. package/lib/SelectMenu/SelectMenuFilter.d.ts +1 -1
  15. package/lib/TextInput.d.ts +6 -6
  16. package/lib/TextInput.js +21 -16
  17. package/lib/Timeline.js +12 -15
  18. package/lib/hooks/useOverlay.d.ts +1 -2
  19. package/lib/hooks/useOverlay.js +6 -11
  20. package/lib/index.d.ts +1 -0
  21. package/lib/index.js +14 -0
  22. package/lib/theme-preval.js +1705 -1957
  23. package/lib/utils/ssr.d.ts +1 -0
  24. package/lib/utils/ssr.js +19 -0
  25. package/lib/utils/testing.d.ts +2431 -2929
  26. package/lib/utils/uniqueId.js +1 -0
  27. package/lib-esm/ActionList/Item.js +4 -4
  28. package/lib-esm/AnchoredOverlay/AnchoredOverlay.js +3 -3
  29. package/lib-esm/Avatar.d.ts +4 -0
  30. package/lib-esm/Dialog/Dialog.js +3 -3
  31. package/lib-esm/FilteredActionList/FilteredActionList.js +3 -3
  32. package/lib-esm/Overlay.d.ts +0 -1
  33. package/lib-esm/Overlay.js +5 -8
  34. package/lib-esm/SelectMenu/SelectMenu.d.ts +11 -327
  35. package/lib-esm/SelectMenu/SelectMenuFilter.d.ts +1 -1
  36. package/lib-esm/TextInput.d.ts +6 -6
  37. package/lib-esm/TextInput.js +22 -16
  38. package/lib-esm/Timeline.js +8 -13
  39. package/lib-esm/hooks/useOverlay.d.ts +1 -2
  40. package/lib-esm/hooks/useOverlay.js +6 -11
  41. package/lib-esm/index.d.ts +1 -0
  42. package/lib-esm/index.js +2 -1
  43. package/lib-esm/theme-preval.js +1705 -1957
  44. package/lib-esm/utils/ssr.d.ts +1 -0
  45. package/lib-esm/utils/ssr.js +1 -0
  46. package/lib-esm/utils/testing.d.ts +2431 -2929
  47. package/lib-esm/utils/uniqueId.js +1 -0
  48. package/package.json +5 -7
  49. package/lib/Autocomplete/Autocomplete.d.ts +0 -8
  50. package/lib/Autocomplete/Autocomplete.js +0 -49
  51. package/lib/Autocomplete/AutocompleteContext.d.ts +0 -13
  52. package/lib/Autocomplete/AutocompleteContext.js +0 -11
  53. package/lib/Autocomplete/AutocompleteInput.d.ts +0 -7
  54. package/lib/Autocomplete/AutocompleteInput.js +0 -78
  55. package/lib/Autocomplete/AutocompleteMenu.d.ts +0 -19
  56. package/lib/Autocomplete/AutocompleteMenu.js +0 -226
  57. package/lib/Badge/Badge.d.ts +0 -8
  58. package/lib/Badge/Badge.js +0 -59
  59. package/lib/Badge/BadgeState.d.ts +0 -13
  60. package/lib/Badge/BadgeState.js +0 -51
  61. package/lib/Badge/_badgeStyleUtils.d.ts +0 -3
  62. package/lib/Badge/_badgeStyleUtils.js +0 -39
  63. package/lib/TextInputTokens.d.ts +0 -32
  64. package/lib/TextInputTokens.js +0 -225
  65. package/lib/TextInputWithTokens.d.ts +0 -41
  66. package/lib/TextInputWithTokens.js +0 -396
  67. package/lib/Token/Token.d.ts +0 -7
  68. package/lib/Token/Token.js +0 -66
  69. package/lib/Token/TokenBase.d.ts +0 -16
  70. package/lib/Token/TokenBase.js +0 -76
  71. package/lib/Token/TokenLabel.d.ts +0 -8
  72. package/lib/Token/TokenLabel.js +0 -116
  73. package/lib/Token/TokenProfile.d.ts +0 -7
  74. package/lib/Token/TokenProfile.js +0 -45
  75. package/lib/Token/_AddTokenButton.d.ts +0 -3
  76. package/lib/Token/_AddTokenButton.js +0 -42
  77. package/lib/Token/_RemoveTokenButton.d.ts +0 -3
  78. package/lib/Token/_RemoveTokenButton.js +0 -42
  79. package/lib/Token/_tokenButtonUtils.d.ts +0 -8
  80. package/lib/Token/_tokenButtonUtils.js +0 -42
  81. package/lib-esm/Autocomplete/Autocomplete.d.ts +0 -8
  82. package/lib-esm/Autocomplete/Autocomplete.js +0 -36
  83. package/lib-esm/Autocomplete/AutocompleteContext.d.ts +0 -13
  84. package/lib-esm/Autocomplete/AutocompleteContext.js +0 -2
  85. package/lib-esm/Autocomplete/AutocompleteInput.d.ts +0 -7
  86. package/lib-esm/Autocomplete/AutocompleteInput.js +0 -59
  87. package/lib-esm/Autocomplete/AutocompleteMenu.d.ts +0 -19
  88. package/lib-esm/Autocomplete/AutocompleteMenu.js +0 -203
  89. package/lib-esm/Badge/Badge.d.ts +0 -8
  90. package/lib-esm/Badge/Badge.js +0 -44
  91. package/lib-esm/Badge/BadgeState.d.ts +0 -13
  92. package/lib-esm/Badge/BadgeState.js +0 -40
  93. package/lib-esm/Badge/_badgeStyleUtils.d.ts +0 -3
  94. package/lib-esm/Badge/_badgeStyleUtils.js +0 -29
  95. package/lib-esm/TextInputTokens.d.ts +0 -32
  96. package/lib-esm/TextInputTokens.js +0 -195
  97. package/lib-esm/TextInputWithTokens.d.ts +0 -41
  98. package/lib-esm/TextInputWithTokens.js +0 -361
  99. package/lib-esm/Token/Token.d.ts +0 -7
  100. package/lib-esm/Token/Token.js +0 -46
  101. package/lib-esm/Token/TokenBase.d.ts +0 -16
  102. package/lib-esm/Token/TokenBase.js +0 -56
  103. package/lib-esm/Token/TokenLabel.d.ts +0 -8
  104. package/lib-esm/Token/TokenLabel.js +0 -100
  105. package/lib-esm/Token/TokenProfile.d.ts +0 -7
  106. package/lib-esm/Token/TokenProfile.js +0 -28
  107. package/lib-esm/Token/_AddTokenButton.d.ts +0 -3
  108. package/lib-esm/Token/_AddTokenButton.js +0 -27
  109. package/lib-esm/Token/_RemoveTokenButton.d.ts +0 -3
  110. package/lib-esm/Token/_RemoveTokenButton.js +0 -27
  111. package/lib-esm/Token/_tokenButtonUtils.d.ts +0 -8
  112. package/lib-esm/Token/_tokenButtonUtils.js +0 -26
@@ -1,3 +1,4 @@
1
+ // Note: uniqueId may be unsafe in SSR contexts if it is used create DOM IDs or otherwise cause a hydration warning. Use useSSRSafeId instead.
1
2
  let idSeed = 10000;
2
3
  export function uniqueId() {
3
4
  return `__primer_id_${idSeed++}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@primer/components",
3
- "version": "0.0.0-2021816151443",
3
+ "version": "0.0.0-2021816212749",
4
4
  "description": "Primer react components",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -44,8 +44,8 @@
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
46
  "@primer/octicons-react": "^13.0.0",
47
- "@primer/primitives": "4.7.1",
48
- "@radix-ui/react-polymorphic": "0.0.14",
47
+ "@primer/primitives": "4.6.4",
48
+ "@react-aria/ssr": "3.1.0",
49
49
  "@styled-system/css": "5.1.5",
50
50
  "@styled-system/props": "5.1.5",
51
51
  "@styled-system/theme-get": "5.1.2",
@@ -57,8 +57,7 @@
57
57
  "classnames": "2.3.1",
58
58
  "deepmerge": "4.2.2",
59
59
  "focus-visible": "5.2.0",
60
- "styled-system": "5.1.5",
61
- "tinycolor2": "1.4.2"
60
+ "styled-system": "5.1.5"
62
61
  },
63
62
  "devDependencies": {
64
63
  "@babel/cli": "7.14.5",
@@ -90,7 +89,6 @@
90
89
  "@types/jest-axe": "3.5.1",
91
90
  "@types/lodash.isempty": "4.4.6",
92
91
  "@types/lodash.isobject": "3.0.6",
93
- "@types/tinycolor2": "1.4.3",
94
92
  "@typescript-eslint/eslint-plugin": "4.26.1",
95
93
  "@typescript-eslint/parser": "4.26.1",
96
94
  "@wojtekmaj/enzyme-adapter-react-17": "0.6.3",
@@ -124,7 +122,7 @@
124
122
  "react": "17.0.2",
125
123
  "react-dom": "17.0.2",
126
124
  "react-test-renderer": "17.0.2",
127
- "rollup": "2.51.2",
125
+ "rollup": "2.56.3",
128
126
  "rollup-plugin-babel": "4.4.0",
129
127
  "rollup-plugin-terser": "7.0.2",
130
128
  "rollup-plugin-visualizer": "5.5.0",
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { ItemInput } from '../ActionList/List';
3
- interface Props {
4
- filterValue?: string;
5
- filterFn?: (item: ItemInput, i: number) => boolean;
6
- }
7
- declare const Autocomplete: React.FC<Props>;
8
- export default Autocomplete;
@@ -1,49 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _AutocompleteContext = require("./AutocompleteContext");
11
-
12
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
-
14
- 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; }
15
-
16
- const defaultItemFilter = filterValue => (item, _i) => {
17
- var _item$text;
18
-
19
- return Boolean(item === null || item === void 0 ? void 0 : (_item$text = item.text) === null || _item$text === void 0 ? void 0 : _item$text.toLowerCase().startsWith(filterValue.toLowerCase()));
20
- };
21
-
22
- const Autocomplete = ({
23
- children,
24
- filterValue = '',
25
- filterFn: externalFilterFn
26
- }) => {
27
- const activeDescendantRef = (0, _react.useRef)(null);
28
- const inputRef = (0, _react.useRef)(null);
29
- const [inputValue, setInputValue] = (0, _react.useState)(filterValue);
30
- const [showMenu, setShowMenu] = (0, _react.useState)(false);
31
- const [autocompleteSuggestion, setAutocompleteSuggestion] = (0, _react.useState)('');
32
- return /*#__PURE__*/_react.default.createElement(_AutocompleteContext.AutocompleteContext.Provider, {
33
- value: {
34
- activeDescendantRef,
35
- autocompleteSuggestion,
36
- filterFn: externalFilterFn ? externalFilterFn : defaultItemFilter(inputValue),
37
- inputRef,
38
- inputValue,
39
- showMenu,
40
- setAutocompleteSuggestion,
41
- setInputValue,
42
- setShowMenu
43
- }
44
- }, children);
45
- };
46
-
47
- Autocomplete.displayName = "Autocomplete";
48
- var _default = Autocomplete;
49
- exports.default = _default;
@@ -1,13 +0,0 @@
1
- /// <reference types="react" />
2
- import { ItemInput } from '../ActionList/List';
3
- export declare const AutocompleteContext: import("react").Context<{
4
- activeDescendantRef?: import("react").MutableRefObject<HTMLElement | null> | undefined;
5
- autocompleteSuggestion?: string | undefined;
6
- filterFn?: ((item: ItemInput, i: number) => boolean) | undefined;
7
- inputRef?: import("react").MutableRefObject<HTMLInputElement | null> | undefined;
8
- inputValue?: string | undefined;
9
- showMenu?: boolean | undefined;
10
- setAutocompleteSuggestion?: import("react").Dispatch<import("react").SetStateAction<string>> | undefined;
11
- setShowMenu?: import("react").Dispatch<import("react").SetStateAction<boolean>> | undefined;
12
- setInputValue?: import("react").Dispatch<import("react").SetStateAction<string>> | undefined;
13
- }>;
@@ -1,11 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.AutocompleteContext = void 0;
7
-
8
- var _react = require("react");
9
-
10
- const AutocompleteContext = /*#__PURE__*/(0, _react.createContext)({});
11
- exports.AutocompleteContext = AutocompleteContext;
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import type * as Polymorphic from "@radix-ui/react-polymorphic";
3
- interface Props {
4
- as?: React.ComponentType<any>;
5
- }
6
- declare const AutocompleteInput: Polymorphic.ForwardRefComponent<"input", Props>;
7
- export default AutocompleteInput;
@@ -1,78 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _AutocompleteContext = require("./AutocompleteContext");
11
-
12
- var _TextInput = _interopRequireDefault(require("../TextInput"));
13
-
14
- var _useCombinedRefs = require("../hooks/useCombinedRefs");
15
-
16
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
-
18
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
-
20
- 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; }
21
-
22
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
23
-
24
- const AutocompleteInput = /*#__PURE__*/_react.default.forwardRef(({
25
- as: Component = _TextInput.default,
26
- onFocus,
27
- onChange,
28
- onKeyDown,
29
- onKeyPress,
30
- ...props
31
- }, forwardedRef) => {
32
- const {
33
- activeDescendantRef,
34
- autocompleteSuggestion,
35
- inputRef,
36
- setInputValue,
37
- setShowMenu
38
- } = (0, _react.useContext)(_AutocompleteContext.AutocompleteContext);
39
- const combinedInputRef = (0, _useCombinedRefs.useCombinedRefs)(inputRef, forwardedRef);
40
-
41
- const handleInputFocus = () => {
42
- if (setShowMenu) {
43
- setShowMenu(true);
44
- }
45
- };
46
-
47
- const handleInputChange = e => {
48
- if (setInputValue) {
49
- setInputValue(e.currentTarget.value);
50
- }
51
- };
52
-
53
- const handleInputKeyDown = e => {
54
- if (setInputValue && e.key === 'ArrowRight' && autocompleteSuggestion) {
55
- setInputValue(autocompleteSuggestion);
56
- }
57
- };
58
-
59
- const onInputKeyPress = (0, _react.useCallback)(event => {
60
- if (activeDescendantRef && event.key === 'Enter' && activeDescendantRef.current) {
61
- event.preventDefault();
62
- event.nativeEvent.stopImmediatePropagation(); // Forward Enter key press to active descendant so that item gets activated
63
-
64
- const activeDescendantEvent = new KeyboardEvent(event.type, event.nativeEvent);
65
- activeDescendantRef.current.dispatchEvent(activeDescendantEvent);
66
- }
67
- }, [activeDescendantRef]);
68
- return /*#__PURE__*/_react.default.createElement(Component, _extends({
69
- onFocus: handleInputFocus,
70
- onChange: handleInputChange,
71
- onKeyDown: handleInputKeyDown,
72
- onKeyPress: onInputKeyPress,
73
- ref: combinedInputRef
74
- }, props));
75
- });
76
-
77
- var _default = AutocompleteInput;
78
- exports.default = _default;
@@ -1,19 +0,0 @@
1
- import React from 'react';
2
- import { ItemProps } from '../ActionList';
3
- import { ItemInput } from '../ActionList/List';
4
- import { ComponentProps } from '../utils/types';
5
- declare type AutocompleteMenuInternalProps = {
6
- selectableItems: ItemInput[];
7
- selectedItemIds: Array<string | number>;
8
- selectedSortFn?: (itemIdA: string | number, itemIdB: string | number) => number;
9
- onItemSelect: NonNullable<ItemProps['onAction']>;
10
- onItemDeselect: NonNullable<ItemProps['onAction']>;
11
- emptyStateText?: React.ReactNode | false;
12
- addNewItem?: Omit<ItemInput, 'onAction'>;
13
- onCloseOptionsList?: () => void;
14
- maxHeight?: React.CSSProperties['maxHeight'];
15
- loading?: boolean;
16
- };
17
- declare const AutocompleteMenu: React.ForwardRefExoticComponent<AutocompleteMenuInternalProps & React.RefAttributes<HTMLInputElement>>;
18
- export declare type AutocompleteMenuProps = ComponentProps<typeof AutocompleteMenu>;
19
- export default AutocompleteMenu;
@@ -1,226 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _react = _interopRequireWildcard(require("react"));
9
-
10
- var _ActionList = require("../ActionList");
11
-
12
- var _hooks = require("../hooks");
13
-
14
- var _useFocusZone = require("../hooks/useFocusZone");
15
-
16
- var _Overlay = _interopRequireDefault(require("../Overlay"));
17
-
18
- var _ = require("../");
19
-
20
- var _Portal = require("../Portal");
21
-
22
- var _AutocompleteContext = require("./AutocompleteContext");
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
-
28
- 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; }
29
-
30
- const DROPDOWN_PORTAL_CONTAINER_NAME = '__listcontainerportal__';
31
-
32
- const getDefaultSortFn = isItemSelectedFn => (itemIdA, itemIdB) => isItemSelectedFn(itemIdA) === isItemSelectedFn(itemIdB) ? 0 : isItemSelectedFn(itemIdA) ? -1 : 1;
33
-
34
- function scrollIntoViewingArea(child, container, margin = 8, behavior = 'smooth') {
35
- const {
36
- top: childTop,
37
- bottom: childBottom
38
- } = child.getBoundingClientRect();
39
- const {
40
- top: containerTop,
41
- bottom: containerBottom
42
- } = container.getBoundingClientRect();
43
- const isChildTopAboveViewingArea = childTop < containerTop + margin;
44
- const isChildBottomBelowViewingArea = childBottom > containerBottom - margin;
45
-
46
- if (isChildTopAboveViewingArea) {
47
- const scrollHeightToChildTop = childTop - containerTop + container.scrollTop;
48
- container.scrollTo({
49
- behavior,
50
- top: scrollHeightToChildTop - margin
51
- });
52
- } else if (isChildBottomBelowViewingArea) {
53
- const scrollHeightToChildBottom = childBottom - containerBottom + container.scrollTop;
54
- container.scrollTo({
55
- behavior,
56
- top: scrollHeightToChildBottom + margin
57
- });
58
- } // either completely in view or outside viewing area on both ends, don't scroll
59
-
60
- }
61
-
62
- // TODO:
63
- // insteaad of using `forwardRef`, just use a regular Functional Component
64
- // get rid of unused props
65
- const AutocompleteMenu = /*#__PURE__*/_react.default.forwardRef(({
66
- selectableItems,
67
- selectedItemIds,
68
- selectedSortFn,
69
- onItemSelect,
70
- onItemDeselect,
71
- emptyStateText,
72
- addNewItem,
73
- onCloseOptionsList,
74
- loading
75
- }, ref) => {
76
- const {
77
- activeDescendantRef,
78
- filterFn,
79
- inputRef,
80
- inputValue,
81
- showMenu,
82
- setAutocompleteSuggestion,
83
- setShowMenu,
84
- setInputValue
85
- } = (0, _react.useContext)(_AutocompleteContext.AutocompleteContext);
86
- const listContainerRef = (0, _react.useRef)(null);
87
- const scrollContainerRef = (0, _react.useRef)(null);
88
- const [highlightedItem, setHighlightedItem] = (0, _react.useState)(); // TODO: clean up this mess by making id required on ItemProps
89
-
90
- const [sortedItemIds, setSortedItemIds] = (0, _react.useState)(selectableItems.map(({
91
- id
92
- }) => id || id === 0 ? id : ''));
93
- const {
94
- floatingElementRef,
95
- position
96
- } = (0, _hooks.useAnchoredPosition)({
97
- side: 'outside-bottom',
98
- align: 'start',
99
- anchorElementRef: inputRef
100
- }, [showMenu, selectedItemIds]); // TODO: replace this with the fn from the AutocompleteContext
101
-
102
- const closeOptionList = () => {
103
- if (setShowMenu) {
104
- setShowMenu(false);
105
- }
106
-
107
- if (onCloseOptionsList) {
108
- onCloseOptionsList();
109
- }
110
- };
111
-
112
- const isItemSelected = itemId => {
113
- var _selectableItems$find;
114
-
115
- return ((_selectableItems$find = selectableItems.find(selectableItem => selectableItem.id === itemId)) === null || _selectableItems$find === void 0 ? void 0 : _selectableItems$find.selected) || selectedItemIds.includes(itemId);
116
- };
117
-
118
- const itemsToRender = [// selectable tokens
119
- ...selectableItems.map(selectableItem => {
120
- return { ...selectableItem,
121
- //TODO: just make `id` required
122
- selected: isItemSelected(selectableItem.id),
123
- onAction: (item, e) => {
124
- if (!item.selected) {
125
- onItemSelect(item, e);
126
-
127
- if (setInputValue) {
128
- setInputValue('');
129
- }
130
-
131
- if (setAutocompleteSuggestion) {
132
- setAutocompleteSuggestion('');
133
- }
134
- } else {
135
- onItemDeselect(item, e);
136
- }
137
- }
138
- };
139
- }), // menu item used for creating a token from whatever is in the text input
140
- ...(addNewItem ? [{ ...addNewItem,
141
- onAction: (_item, e) => {
142
- onItemSelect({
143
- text: inputValue,
144
- id: `randomlyGeneratedId-${inputValue}`
145
- }, e);
146
- }
147
- }] : [])];
148
- (0, _useFocusZone.useFocusZone)({
149
- containerRef: listContainerRef,
150
- focusOutBehavior: 'wrap',
151
- focusableElementFilter: element => {
152
- return !(element instanceof HTMLInputElement);
153
- },
154
- activeDescendantFocus: inputRef,
155
- onActiveDescendantChanged: (current, _previous, directlyActivated) => {
156
- if (activeDescendantRef && current) {
157
- activeDescendantRef.current = current;
158
- }
159
-
160
- const selectedItem = itemsToRender.find(item => {
161
- var _item$id;
162
-
163
- return ((_item$id = item.id) === null || _item$id === void 0 ? void 0 : _item$id.toString()) === (current === null || current === void 0 ? void 0 : current.dataset.id);
164
- });
165
- setHighlightedItem(selectedItem);
166
-
167
- if (current && scrollContainerRef.current && directlyActivated) {
168
- scrollIntoViewingArea(current, scrollContainerRef.current);
169
- }
170
- }
171
- });
172
- (0, _react.useEffect)(() => {
173
- var _highlightedItem$text;
174
-
175
- if (!setAutocompleteSuggestion) {
176
- return;
177
- }
178
-
179
- if (inputValue && highlightedItem !== null && highlightedItem !== void 0 && (_highlightedItem$text = highlightedItem.text) !== null && _highlightedItem$text !== void 0 && _highlightedItem$text.startsWith(inputValue)) {
180
- setAutocompleteSuggestion(highlightedItem.text);
181
- } else {
182
- setAutocompleteSuggestion('');
183
- }
184
- }, [highlightedItem, inputValue]);
185
- (0, _react.useEffect)(() => {
186
- setSortedItemIds([...sortedItemIds].sort(selectedSortFn ? selectedSortFn : getDefaultSortFn(isItemSelected)));
187
- }, [showMenu]);
188
-
189
- if (listContainerRef.current) {
190
- (0, _Portal.registerPortalRoot)(listContainerRef.current, DROPDOWN_PORTAL_CONTAINER_NAME);
191
- }
192
-
193
- const itemSortOrderData = sortedItemIds.reduce((acc, curr, i) => {
194
- acc[curr] = i;
195
- return acc;
196
- }, {});
197
- return /*#__PURE__*/_react.default.createElement("div", {
198
- ref: listContainerRef
199
- }, showMenu && emptyStateText ? /*#__PURE__*/_react.default.createElement(_Overlay.default, {
200
- returnFocusRef: inputRef,
201
- portalContainerName: DROPDOWN_PORTAL_CONTAINER_NAME,
202
- preventFocusOnOpen: true,
203
- onClickOutside: closeOptionList,
204
- onEscape: closeOptionList,
205
- ref: floatingElementRef,
206
- top: position === null || position === void 0 ? void 0 : position.top,
207
- left: position === null || position === void 0 ? void 0 : position.left
208
- }, loading ? /*#__PURE__*/_react.default.createElement(_.Box, {
209
- p: 3,
210
- display: "flex",
211
- justifyContent: "center"
212
- }, /*#__PURE__*/_react.default.createElement(_.Spinner, null)) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, itemsToRender.length ? /*#__PURE__*/_react.default.createElement(_ActionList.ActionList, {
213
- selectionVariant: "multiple",
214
- items: [...(filterFn ? itemsToRender.filter(filterFn) : itemsToRender)].sort((a, b) => itemSortOrderData[a.id] - itemSortOrderData[b.id]),
215
- role: "listbox"
216
- }) : /*#__PURE__*/_react.default.createElement(_.Box, {
217
- p: 3
218
- }, emptyStateText))) : null);
219
- });
220
-
221
- AutocompleteMenu.defaultProps = {
222
- emptyStateText: 'No selectable options'
223
- };
224
- AutocompleteMenu.displayName = 'AutocompleteMenu';
225
- var _default = AutocompleteMenu;
226
- exports.default = _default;