@amaui/ui-react
Version:
UI for React
240 lines (239 loc) • 15 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const jsx_runtime_1 = require("react/jsx-runtime");
const react_1 = __importDefault(require("react"));
const utils_1 = require("@amaui/utils");
const style_react_1 = require("@amaui/style-react");
const IconMaterialExpandMoreW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialExpandMoreW100"));
const IconMaterialArrowRightW100_1 = __importDefault(require("@amaui/icons-material-rounded-react/IconMaterialArrowRightW100"));
const ListItem_1 = __importDefault(require("../ListItem"));
const List_1 = __importDefault(require("../List"));
const IconButton_1 = __importDefault(require("../IconButton"));
const Menu_1 = __importDefault(require("../Menu"));
const Expand_1 = __importDefault(require("../Expand"));
const Fade_1 = __importDefault(require("../Fade"));
const utils_2 = require("../utils");
const useStyle = (0, style_react_1.style)(theme => ({
icon: {
transition: theme.methods.transitions.make('transform')
},
icon_open: {
transform: 'rotate(-180deg)'
}
}), { name: 'amaui-ListItem' });
const ListItemDelays = {
Transition: {
enter: 70
}
};
const MenuItem = react_1.default.forwardRef((props_, ref) => {
const theme = (0, style_react_1.useAmauiTheme)();
const props = react_1.default.useMemo(() => { var _a, _b, _c, _d, _e, _f, _g, _h; return (Object.assign(Object.assign(Object.assign({}, (_d = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.all) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.default), (_h = (_g = (_f = (_e = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _e === void 0 ? void 0 : _e.elements) === null || _f === void 0 ? void 0 : _f.amauiMenuItem) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.default), props_)); }, [props_]);
const ListItem = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.ListItem) || ListItem_1.default; }, [theme]);
const List = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.List) || List_1.default; }, [theme]);
const IconButton = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.IconButton) || IconButton_1.default; }, [theme]);
const Menu = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Menu) || Menu_1.default; }, [theme]);
const Expand = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Expand) || Expand_1.default; }, [theme]);
const Fade = react_1.default.useMemo(() => { var _a; return ((_a = theme === null || theme === void 0 ? void 0 : theme.elements) === null || _a === void 0 ? void 0 : _a.Fade) || Fade_1.default; }, [theme]);
const { tonal = true, color = 'default', colorSelected = props.color, size = 'regular', menu, menuId, menuOpen, openMenu: openMenu_, openMenuDefault, openList: openList_, openListDefault, menuItem, list: list_, preselected, selected, inset, end: end_, indicator = true, include, footer, menuCloseOnClick, listCloseOnClick, disabled, onClick: onClick_, onFocus: onFocus_, onBlur: onBlur_, onMouseEnter: onMouseEnter_, onMouseLeave: onMouseLeave_, ExpandIcon = IconMaterialExpandMoreW100_1.default, ListTransitionComponent = Fade, ListProps, ListTransitionComponentProps: ListTransitionComponentProps_, ExpandProps, MenuProps = {
autoSelect: true
} } = props, other = __rest(props, ["tonal", "color", "colorSelected", "size", "menu", "menuId", "menuOpen", "openMenu", "openMenuDefault", "openList", "openListDefault", "menuItem", "list", "preselected", "selected", "inset", "end", "indicator", "include", "footer", "menuCloseOnClick", "listCloseOnClick", "disabled", "onClick", "onFocus", "onBlur", "onMouseEnter", "onMouseLeave", "ExpandIcon", "ListTransitionComponent", "ListProps", "ListTransitionComponentProps", "ExpandProps", "MenuProps"]);
const { classes } = useStyle();
const [openMenu, setOpenMenu] = react_1.default.useState(openMenuDefault !== undefined ? openMenuDefault : openMenu_);
const [openList, setOpenList] = react_1.default.useState(openListDefault !== undefined ? openListDefault : openList_);
const [hover, setHover] = react_1.default.useState(false);
const [focus, setFocus] = react_1.default.useState(false);
const refs = {
root: react_1.default.useRef(undefined),
props: react_1.default.useRef(undefined),
openMenu: react_1.default.useRef(undefined),
openList: react_1.default.useRef(undefined),
focus: react_1.default.useRef(undefined),
ids: {
primary: react_1.default.useId(),
secondary: react_1.default.useId()
}
};
refs.props.current = props;
refs.openMenu.current = openMenu;
refs.openList.current = openList;
refs.focus.current = focus;
const ListTransitionComponentProps = Object.assign({ add: true, delay: {
enter: ListItemDelays.Transition.enter
} }, ListTransitionComponentProps_);
const list = list_ && react_1.default.Children.toArray(list_).map((item, index) => (react_1.default.cloneElement(item, Object.assign({ key: index, onClick: (event) => {
if (item.props.listCloseOnClick)
onCloseList();
if ((0, utils_1.is)('function', item.props.onClick))
item.props.onClick(event);
} }, item === null || item === void 0 ? void 0 : item.props))));
const onClick = react_1.default.useCallback((event) => {
if (!refs.props.current.disabled) {
if (refs.props.current.list)
setOpenList(!refs.openList.current);
}
if ((0, utils_1.is)('function', onClick_))
onClick_(event);
}, [onClick_]);
let end = end_;
if (menu)
end = end_ || (0, jsx_runtime_1.jsx)(IconMaterialArrowRightW100_1.default, {});
if (list)
end = end_ || (indicator && ((0, jsx_runtime_1.jsx)(IconButton, Object.assign({ size: 24, fontSize: utils_2.iconFontSize, onClick: onClick, className: (0, style_react_1.classNames)([
(0, utils_2.staticClassName)('ListItem', theme) && [
'amaui-ListItem-icon-button'
],
classes.iconButton
]) }, { children: (0, jsx_runtime_1.jsx)(ExpandIcon, { className: (0, style_react_1.classNames)([
classes.icon,
openList && classes.icon_open
]) }) }))));
react_1.default.useEffect(() => {
var _a;
const onKeyDown = (event) => {
if (!refs.props.current.disabled) {
if (menu) {
if (refs.openMenu.current && ((theme.direction === 'ltr' && event.key === 'ArrowLeft') || (theme.direction === 'rtl' && event.key === 'ArrowRight')))
setOpenMenu(false);
if (!refs.openMenu.current && ((theme.direction === 'ltr' && event.key === 'ArrowRight') || (theme.direction === 'rtl' && event.key === 'ArrowLeft')))
setOpenMenu(true);
}
else if (list) {
if (refs.openList.current && (event.key === 'ArrowUp' || (theme.direction === 'ltr' && event.key === 'ArrowLeft') || (theme.direction === 'rtl' && event.key === 'ArrowRight')))
setOpenMenu(false);
if (!refs.openList.current && (event.key === 'ArrowDown' || (theme.direction === 'ltr' && event.key === 'ArrowRight') || (theme.direction === 'rtl' && event.key === 'ArrowLeft')))
setOpenMenu(true);
if (event.key === 'Enter' && refs.focus.current)
onClick();
}
else {
if (event.key === 'Enter' && !refs.props.current.button && refs.focus.current) {
if ((0, utils_1.is)('function', refs.props.current.onClick))
refs.props.current.onClick(event);
}
}
}
};
const rootDocument = (0, utils_1.isEnvironment)('browser') ? (((_a = refs.root.current) === null || _a === void 0 ? void 0 : _a.ownerDocument) || window.document) : undefined;
rootDocument.addEventListener('keydown', onKeyDown);
return () => {
rootDocument.removeEventListener('keydown', onKeyDown);
};
}, []);
react_1.default.useEffect(() => {
if (openMenu_ !== openMenu)
setOpenMenu(openMenu_);
}, [openMenu_]);
react_1.default.useEffect(() => {
if (openList_ !== openList)
setOpenList(openList_);
}, [openList_]);
react_1.default.useEffect(() => {
if (menuOpen && preselected)
refs.root.current.focus();
}, [preselected, menuOpen]);
react_1.default.useEffect(() => {
if (menu)
setOpenMenu(hover || preselected || selected);
}, [hover]);
react_1.default.useEffect(() => {
if (menu)
setOpenMenu(hover || focus || preselected || selected);
}, [focus]);
const onMouseEnter = react_1.default.useCallback((event) => {
if (!disabled)
setHover(true);
if ((0, utils_1.is)('function', onMouseEnter_))
onMouseEnter_(event);
}, []);
const onMouseLeave = react_1.default.useCallback((event) => {
if (!disabled) {
setHover(false);
setFocus(false);
}
if ((0, utils_1.is)('function', onMouseLeave_))
onMouseLeave_(event);
}, []);
const onFocus = react_1.default.useCallback((event) => {
if (event.target === event.currentTarget && !disabled)
setFocus(true);
if ((0, utils_1.is)('function', onFocus_))
onFocus_(event);
}, []);
const onBlur = react_1.default.useCallback((event) => {
if (event.target === event.currentTarget && !disabled)
setFocus(false);
if ((0, utils_1.is)('function', onBlur_))
onBlur_(event);
}, []);
const onCloseList = react_1.default.useCallback(() => {
if (!disabled) {
setOpenList(false);
setHover(false);
setFocus(false);
// if (is('function', onClose_)) onClose_();
}
}, []);
const onCloseMenu = react_1.default.useCallback(() => {
if (!disabled) {
setOpenMenu(false);
setHover(false);
setFocus(false);
// if (is('function', onClose_)) onClose_();
}
}, []);
ListTransitionComponentProps.in = !!openList;
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)(ListItem, Object.assign({ ref: item => {
if (ref) {
if ((0, utils_1.is)('function', ref))
ref(item);
else if (ref === null || ref === void 0 ? void 0 : ref.current)
ref.current = item;
}
refs.root.current = item;
}, tonal: tonal, color: color, colorSelected: colorSelected, size: size, inset: inset, selected: selected, preselected: preselected, end: end, disabled: disabled, onClick: onClick, onFocus: onFocus, onBlur: onBlur, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, "aria-haspopup": !!menu, "aria-expanded": openMenu, menuItem: true, className: (0, style_react_1.classNames)([
(0, utils_2.staticClassName)('MenuItem', theme) && [
'amaui-MenuItem-root',
`amaui-MenuItem-size-${size}`
],
classes.root
]), InteractionProps: {
focus
}, RootProps: {
className: (0, style_react_1.classNames)([
(0, utils_2.staticClassName)('ListItem', theme) && [
menu && `amaui-ListItem-menu`,
list && `amaui-ListItem-list`,
menuItem && `amaui-ListItem-menu-item`,
menuOpen && `amaui-ListItem-menu-open`,
openMenu && `amaui-ListItem-open-menu`,
openList && `amaui-ListItem-open-list`,
menuItem && [
inset && `amaui-ListItem-menu-item-inset`
],
]
])
}, footer: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [footer, (0, jsx_runtime_1.jsx)(Expand, Object.assign({ in: openList, parent: refs.root.current }, ExpandProps, { children: (0, jsx_runtime_1.jsx)(ListTransitionComponent, Object.assign({}, ListTransitionComponentProps, { children: (0, jsx_runtime_1.jsx)(List, Object.assign({ indent: 5 }, ListProps, { className: (0, style_react_1.classNames)([
(0, utils_2.staticClassName)('ListItem', theme) && [
'amaui-ListItem-list'
],
ListProps === null || ListProps === void 0 ? void 0 : ListProps.className,
classes.list
]) }, { children: list })) })) })), menu && ((0, jsx_runtime_1.jsx)(Menu, Object.assign({ open: !!openMenu, include: include, onClose: onCloseMenu, closeOnClickAway: false, anchorElement: refs.root.current, menuItems: menu, transformOrigin: 'left top', transformOriginSwitch: 'right top', transformOriginRtl: 'left top', transformOriginRtlSwitch: 'right top', position: 'right', alignment: 'start', onMouseEnter: onMouseEnter }, MenuProps)))] }) }, other)) });
});
MenuItem.displayName = 'amaui-MenuItem';
exports.default = MenuItem;
;