UNPKG

carbon-react

Version:

A library of reusable React components for easily building user interfaces.

2 lines (1 loc) 3.96 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),o=require("invariant"),n=require("../action-popover.style.js"),r=require("../../../__internal__/utils/helpers/events/events.js"),i=require("../action-popover-item/action-popover-item.component.js");require("../action-popover-divider/action-popover-divider.component.js");var a=require("../__internal__/action-popover.context.js"),l=require("../__internal__/action-popover.utils.js");function s(e){return e&&e.__esModule?e:{default:e}}var u=s(t),p=s(o);function c(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}const f=u.default.forwardRef(((o,s)=>{var{children:f,parentID:d,focusIndex:m,isOpen:v,menuID:y,setOpen:b,setFocusIndex:O,placement:P="bottom"}=o,j=function(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)o=i[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}(o,["children","parentID","focusIndex","isOpen","menuID","setOpen","setFocusIndex","placement"]);const{focusButton:g,submenuPosition:h,horizontalAlignment:I}=a.useActionPopoverContext();p.default(b&&O&&void 0!==m,"ActionPopoverMenu must be used within an ActionPopover or ActionPopoverItem component");const D=t.useMemo((()=>!u.default.Children.toArray(f).find((e=>!u.default.isValidElement(e)||"ActionPopoverItem"!==e.type.displayName&&"ActionPopoverDivider"!==e.type.displayName))),[f]);p.default(D,`ActionPopoverMenu only accepts children of type \`${i.ActionPopoverItem.displayName}\` and \`${n.MenuItemDivider.displayName}\`.`);const w=t.useMemo((()=>l.getItems(f)),[f]),_=t.useCallback((e=>l.isItemDisabled(w[e])),[w]),x=l.findFirstFocusableItem(w),A=l.findLastFocusableItem(w),M=t.useCallback((e=>{if(r.default.isTabKey(e))e.preventDefault(),g(),b(!1);else if(r.default.isDownKey(e)){e.preventDefault(),e.stopPropagation();let t=m+1;for(;t<w.length&&_(t);)t+=1;t>=w.length&&(t=x),O(t)}else if(r.default.isUpKey(e)){e.preventDefault(),e.stopPropagation();let t=m-1;for(;t>=x&&_(t);)t-=1;t<x&&(t=A),O(t)}else if(r.default.isHomeKey(e))e.preventDefault(),e.stopPropagation(),O(x);else if(r.default.isEndKey(e))e.preventDefault(),e.stopPropagation(),O(A);else if(1===e.key.length){let t,o;e.stopPropagation(),w.forEach(((n,r)=>{u.default.isValidElement(n)&&!_(r)&&n.props.children.toLowerCase().startsWith(e.key.toLowerCase())&&(void 0===t&&(t=r),r>m&&void 0===o&&(o=r))})),void 0!==o?O(o):void 0!==t&&O(t)}}),[g,b,m,w,_,O,x,A]),[q,E]=t.useState(h),S=t.useMemo((()=>{let e=0;return u.default.Children.map(f,(t=>u.default.isValidElement(t)&&t.type===i.ActionPopoverItem?(e+=1,u.default.cloneElement(t,{focusItem:v&&m===e-1,currentSubmenuPosition:q,setCurrentSubmenuPosition:E})):t))}),[f,m,v,q]);return e.jsx(n.Menu,(C=function(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{},n=Object.keys(o);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(o).filter((function(e){return Object.getOwnPropertyDescriptor(o,e).enumerable})))),n.forEach((function(t){c(e,t,o[t])}))}return e}({"data-component":"action-popover","data-submenu-placement":P,isOpen:!!v,onKeyDown:M,id:y,"aria-labelledby":d,ref:s,role:"list",submenuLeft:"left"===q,iconLeft:"left"===I},j),k=null!=(k={children:S})?k:{},Object.getOwnPropertyDescriptors?Object.defineProperties(C,Object.getOwnPropertyDescriptors(k)):function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t.push.apply(t,o)}return t}(Object(k)).forEach((function(e){Object.defineProperty(C,e,Object.getOwnPropertyDescriptor(k,e))})),C));var C,k}));f.displayName="ActionPopoverMenu",exports.default=f;