UNPKG

@amaui/ui-react

Version:
240 lines (239 loc) 15 kB
"use strict"; 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;