{"version":3,"sources":["../src/components/Menu/MenuTrigger/useMenuTrigger.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useMenuTriggerBase_unstable } from '@fluentui/react-menu';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { isHTMLElement } from '@fluentui/react-utilities';\nimport { useMenuContext } from '../menuContext';\nimport { stringifyDataAttribute } from '../../../utils';\nimport type { MenuTriggerProps, MenuTriggerState } from '@fluentui/react-menu';\n\ntype TriggerChildProps = {\n  'data-open'?: string;\n  // eslint-disable-next-line @nx/workspace-consistent-callback-type -- can't change type of existing callback\n  onContextMenu?: React.MouseEventHandler<HTMLElement>;\n};\n\n/**\n * Mirrors the `isTargetDisabled` check used inside `@fluentui/react-menu`'s\n * `useMenuTriggerBase_unstable` onContextMenu handler. Kept local because the\n * helper is not exported by `@fluentui/react-menu`.\n */\nconst isTargetDisabled = (event: React.SyntheticEvent): boolean => {\n  const target = event.target;\n  if (!isHTMLElement(target)) {\n    return false;\n  }\n  return target.hasAttribute('disabled') || target.getAttribute('aria-disabled') === 'true';\n};\n\nconst FIRST_MENU_ITEM_SELECTOR =\n  ':is([role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"]):not([aria-disabled=\"true\"])';\n\nexport const useMenuTrigger = (props: MenuTriggerProps): MenuTriggerState => {\n  const menuPopoverRef = useMenuContext(ctx => ctx.menuPopoverRef);\n\n  const focusFirst = React.useCallback(() => {\n    const firstFocusable = menuPopoverRef.current?.querySelector<HTMLElement>(FIRST_MENU_ITEM_SELECTOR);\n    firstFocusable?.focus();\n  }, [menuPopoverRef]);\n\n  const baseState = useMenuTriggerBase_unstable({ ...props, focusFirst });\n  const open = useMenuContext(ctx => ctx.open);\n  const openOnContext = useMenuContext(ctx => ctx.openOnContext);\n  const setOpen = useMenuContext(ctx => ctx.setOpen);\n  const { targetDocument } = useFluent();\n\n  if (!baseState.children || !React.isValidElement(baseState.children)) {\n    return baseState;\n  }\n\n  const child = baseState.children as React.ReactElement<TriggerChildProps>;\n  const overrideProps: TriggerChildProps = {\n    'data-open': stringifyDataAttribute(open),\n  };\n\n  if (openOnContext && targetDocument) {\n    const consumerChild = props.children as React.ReactElement<TriggerChildProps> | undefined;\n    const consumerOnContextMenu = React.isValidElement(consumerChild) ? consumerChild.props.onContextMenu : undefined;\n\n    overrideProps.onContextMenu = (event: React.MouseEvent<HTMLElement>) => {\n      consumerOnContextMenu?.(event);\n\n      if (isTargetDisabled(event) || event.isDefaultPrevented()) {\n        return;\n      }\n\n      event.preventDefault();\n      const nativeEvent = event.nativeEvent;\n      const fire = () =>\n        setOpen(nativeEvent as unknown as React.MouseEvent<HTMLElement>, {\n          open: true,\n          type: 'menuTriggerContextMenu',\n          event: nativeEvent as unknown as React.MouseEvent<HTMLElement>,\n        });\n\n      if (event.button !== 2) {\n        fire();\n        return;\n      }\n\n      targetDocument.addEventListener('pointerup', fire, { once: true, capture: true });\n    };\n  }\n\n  return {\n    ...baseState,\n    children: React.cloneElement(child, overrideProps),\n  };\n};\n"],"names":["useMenuTrigger","isTargetDisabled","event","target","isHTMLElement","hasAttribute","getAttribute","FIRST_MENU_ITEM_SELECTOR","props","menuPopoverRef","useMenuContext","ctx","focusFirst","React","useCallback","firstFocusable","current","querySelector","focus","baseState","useMenuTriggerBase_unstable","open","openOnContext","setOpen","targetDocument","useFluent","children","isValidElement","child","overrideProps","stringifyDataAttribute","consumerChild","consumerOnContextMenu","onContextMenu","undefined","isDefaultPrevented","preventDefault","nativeEvent","fire","type","button","addEventListener","once","capture","cloneElement"],"mappings":"AAAA;;;;;+BAgCaA;;;eAAAA;;;;iEA9BU;2BACqB;qCACI;gCAClB;6BACC;uBACQ;AASvC;;;;CAIC,GACD,MAAMC,mBAAmB,CAACC;IACxB,MAAMC,SAASD,MAAMC,MAAM;IAC3B,IAAI,CAACC,IAAAA,6BAAa,EAACD,SAAS;QAC1B,OAAO;IACT;IACA,OAAOA,OAAOE,YAAY,CAAC,eAAeF,OAAOG,YAAY,CAAC,qBAAqB;AACrF;AAEA,MAAMC,2BACJ;AAEK,MAAMP,iBAAiB,CAACQ;IAC7B,MAAMC,iBAAiBC,IAAAA,2BAAc,EAACC,CAAAA,MAAOA,IAAIF,cAAc;IAE/D,MAAMG,aAAaC,OAAMC,WAAW,CAAC;QACnC,MAAMC,iBAAiBN,eAAeO,OAAO,EAAEC,cAA2BV;QAC1EQ,gBAAgBG;IAClB,GAAG;QAACT;KAAe;IAEnB,MAAMU,YAAYC,IAAAA,sCAA2B,EAAC;QAAE,GAAGZ,KAAK;QAAEI;IAAW;IACrE,MAAMS,OAAOX,IAAAA,2BAAc,EAACC,CAAAA,MAAOA,IAAIU,IAAI;IAC3C,MAAMC,gBAAgBZ,IAAAA,2BAAc,EAACC,CAAAA,MAAOA,IAAIW,aAAa;IAC7D,MAAMC,UAAUb,IAAAA,2BAAc,EAACC,CAAAA,MAAOA,IAAIY,OAAO;IACjD,MAAM,EAAEC,cAAc,EAAE,GAAGC,IAAAA,uCAAS;IAEpC,IAAI,CAACN,UAAUO,QAAQ,IAAI,CAACb,OAAMc,cAAc,CAACR,UAAUO,QAAQ,GAAG;QACpE,OAAOP;IACT;IAEA,MAAMS,QAAQT,UAAUO,QAAQ;IAChC,MAAMG,gBAAmC;QACvC,aAAaC,IAAAA,6BAAsB,EAACT;IACtC;IAEA,IAAIC,iBAAiBE,gBAAgB;QACnC,MAAMO,gBAAgBvB,MAAMkB,QAAQ;QACpC,MAAMM,wBAAwBnB,OAAMc,cAAc,CAACI,iBAAiBA,cAAcvB,KAAK,CAACyB,aAAa,GAAGC;QAExGL,cAAcI,aAAa,GAAG,CAAC/B;YAC7B8B,wBAAwB9B;YAExB,IAAID,iBAAiBC,UAAUA,MAAMiC,kBAAkB,IAAI;gBACzD;YACF;YAEAjC,MAAMkC,cAAc;YACpB,MAAMC,cAAcnC,MAAMmC,WAAW;YACrC,MAAMC,OAAO,IACXf,QAAQc,aAAyD;oBAC/DhB,MAAM;oBACNkB,MAAM;oBACNrC,OAAOmC;gBACT;YAEF,IAAInC,MAAMsC,MAAM,KAAK,GAAG;gBACtBF;gBACA;YACF;YAEAd,eAAeiB,gBAAgB,CAAC,aAAaH,MAAM;gBAAEI,MAAM;gBAAMC,SAAS;YAAK;QACjF;IACF;IAEA,OAAO;QACL,GAAGxB,SAAS;QACZO,UAAUb,OAAM+B,YAAY,CAAChB,OAAOC;IACtC;AACF"}