@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
62 lines (61 loc) • 4.07 kB
JavaScript
import { __assign, __rest } from "tslib";
import React, { useEffect, useRef } from 'react';
import clsx from 'clsx';
import styles from './styles.css.js';
import { getBaseProps } from '../internal/base-component';
import Dropdown from '../internal/components/dropdown';
import ItemsList from './items-list';
import { useButtonDropdown } from './utils/use-button-dropdown';
import OptionsList from '../internal/components/options-list';
import { InternalButton } from '../button/internal';
import { useMobile } from '../internal/hooks/use-mobile';
import useForwardFocus from '../internal/hooks/forward-focus';
import { usePrevious } from '../internal/hooks/use-previous';
var InternalButtonDropdown = React.forwardRef(function (_a, ref) {
var items = _a.items, _b = _a.variant, variant = _b === void 0 ? 'normal' : _b, _c = _a.loading, loading = _c === void 0 ? false : _c, _d = _a.disabled, disabled = _d === void 0 ? false : _d, _e = _a.expandableGroups, expandableGroups = _e === void 0 ? false : _e, children = _a.children, onItemClick = _a.onItemClick, customTriggerBuilder = _a.customTriggerBuilder, _f = _a.allowHref, allowHref = _f === void 0 ? false : _f, props = __rest(_a, ["items", "variant", "loading", "disabled", "expandableGroups", "children", "onItemClick", "customTriggerBuilder", "allowHref"]);
var isInRestrictedView = useMobile();
var usingMouse = useRef(true);
var _g = useButtonDropdown({
items: items,
onItemClick: onItemClick,
hasExpandableGroups: expandableGroups,
isInRestrictedView: isInRestrictedView,
usingMouse: usingMouse
}), isOpen = _g.isOpen, highlightedItem = _g.highlightedItem, expandedItem = _g.expandedItem, onKeyDown = _g.onKeyDown, onKeyUp = _g.onKeyUp, onItemActivate = _g.onItemActivate, toggleDropdown = _g.toggleDropdown, onTriggerClick = _g.onTriggerClick, closeExpanded = _g.closeExpanded;
var handleMouseEvent = function () {
usingMouse.current = true;
};
var baseProps = getBaseProps(props);
var dropdownRef = useRef(null);
useForwardFocus(ref, dropdownRef);
var clickHandler = function (event) {
event.preventDefault();
if (!usingMouse.current) {
return;
}
if (!loading && !disabled) {
toggleDropdown();
closeExpanded();
onTriggerClick();
if (dropdownRef.current) {
dropdownRef.current.focus();
}
}
};
var canBeOpened = !loading && !disabled;
var wasOpen = usePrevious(isOpen);
useEffect(function () {
if (!isOpen && dropdownRef.current && wasOpen) {
dropdownRef.current.focus();
}
}, [isOpen]);
var trigger = customTriggerBuilder ? (customTriggerBuilder(clickHandler, dropdownRef, disabled, isOpen)) : (React.createElement(InternalButton, { ref: dropdownRef, iconName: "caret-down-filled", iconAlign: "right", iconClass: canBeOpened && isOpen ? styles['rotate-up'] : styles['rotate-down'], variant: variant, loading: loading, disabled: disabled, onClick: clickHandler, "aria-haspopup": true, "aria-expanded": canBeOpened && isOpen ? true : undefined, formAction: "none" }, children));
return (React.createElement("div", __assign({}, baseProps, { onKeyDown: onKeyDown, onKeyUp: onKeyUp, onMouseDown: handleMouseEvent, className: clsx(styles['button-dropdown'], baseProps.className) }),
React.createElement(Dropdown, { open: canBeOpened && isOpen, stretchWidth: false, onDropdownClose: function () {
toggleDropdown();
closeExpanded();
}, trigger: trigger },
React.createElement(OptionsList, { open: canBeOpened && isOpen, position: "static", role: "menu", decreaseTopMargin: true },
React.createElement(ItemsList, { items: items, onItemActivate: onItemActivate, hasExpandableGroups: expandableGroups, expandedItem: expandedItem, highlightedItem: highlightedItem, onItemClick: onItemClick, allowHref: allowHref })))));
});
export default InternalButtonDropdown;