@awsui/components-react
Version:
AWS UI is a collection of [React](https://reactjs.org/) components that help create intuitive, responsive, and accessible user experiences for web applications. It is developed by Amazon Web Services (AWS). This work is available under the terms of the [A
94 lines (93 loc) • 3.91 kB
JavaScript
import { __assign, __rest, __spreadArrays } from "tslib";
import { useCallback, useMemo } from 'react';
import { fireNonCancelableEvent } from '../internal/events';
import { filterOptions } from './utils/utils';
import { KeyCode } from '../internal/keycode';
import { generateTestIndexes } from '../internal/components/options-list/utils/test-indexes';
var parentMap = new WeakMap();
export var getParentGroup = function (item) { return parentMap.get(item); };
export var useAutosuggestItems = function (options) {
if (options === void 0) { options = []; }
return useMemo(function () {
return options.reduce(function (acc, option) {
if ('options' in option) {
var options_1 = option.options, rest = __rest(option, ["options"]);
var groupHeader_1 = __assign(__assign({}, rest), { type: 'parent' });
acc.push(groupHeader_1);
var groupDisabled_1 = false;
options_1.forEach(function (child) {
acc.push(__assign(__assign({ disabled: groupHeader_1.disabled }, child), { type: 'child' }));
parentMap.set(acc[acc.length - 1], option);
groupDisabled_1 = groupDisabled_1 || !!child.disabled;
});
if (groupDisabled_1) {
groupHeader_1.disabled = true;
}
}
else {
acc.push(__assign({}, option));
}
return acc;
}, []);
}, [options]);
};
export var useFilteredItems = function (autosuggestItems, value, filteringType, showAll) {
return useMemo(function () {
var filteredItems = filteringType === 'auto' && !showAll ? filterOptions(autosuggestItems, value) : __spreadArrays(autosuggestItems);
if (value) {
filteredItems.unshift({ value: value, type: 'use-entered' });
}
generateTestIndexes(filteredItems, getParentGroup);
return filteredItems;
}, [autosuggestItems, value, filteringType, showAll]);
};
export var useSelectOption = function (onChange, closeDropdown) {
return useCallback(function (option) {
fireNonCancelableEvent(onChange, { value: option.value || '' });
closeDropdown();
}, [onChange, closeDropdown]);
};
export var useSelectVisibleOption = function (filteredItems, selectOption, isInteractive) {
return useCallback(function (index) {
var option = filteredItems[index];
if (option && isInteractive(option)) {
selectOption(option);
}
}, [filteredItems, selectOption, isInteractive]);
};
export var useHighlightVisibleOption = function (filteredItems, setHighlightedIndex, isInteractive) {
return useCallback(function (index) {
var option = filteredItems[index];
if (option && isInteractive(option)) {
setHighlightedIndex(index);
}
}, [filteredItems, setHighlightedIndex, isInteractive]);
};
export var useKeyboardHandler = function (moveHighlight, openDropdown, selectHighlighted, usingMouse, onKeyDown) {
return useCallback(function (e) {
switch (e.detail.keyCode) {
case KeyCode.down: {
moveHighlight(1);
openDropdown();
usingMouse.current = false;
e.preventDefault();
break;
}
case KeyCode.up: {
moveHighlight(-1);
openDropdown();
usingMouse.current = false;
e.preventDefault();
break;
}
case KeyCode.enter: {
selectHighlighted();
e.preventDefault();
break;
}
default: {
onKeyDown && onKeyDown(e);
}
}
}, [moveHighlight, selectHighlighted, onKeyDown, usingMouse, openDropdown]);
};