MCPcopy Index your code
hub / github.com/adobe/react-spectrum / useMenuTrigger

Function useMenuTrigger

packages/react-aria/src/menu/useMenuTrigger.ts:49–157  ·  view source on GitHub ↗
(
  props: AriaMenuTriggerProps,
  state: MenuTriggerState,
  ref: RefObject<Element | null>
)

Source from the content-addressed store, hash-verified

47 * @param ref - Ref to the HTML element trigger for the menu.
48 */
49export function useMenuTrigger<T>(
50 props: AriaMenuTriggerProps,
51 state: MenuTriggerState,
52 ref: RefObject<Element | null>
53): MenuTriggerAria<T> {
54 let {type = 'menu', isDisabled, trigger = 'press'} = props;
55
56 let menuTriggerId = useId();
57 let {triggerProps, overlayProps} = useOverlayTrigger({type}, state, ref);
58
59 let onKeyDown = e => {
60 if (isDisabled) {
61 return;
62 }
63
64 if (trigger === 'longPress' && !e.altKey) {
65 return;
66 }
67
68 if (ref && ref.current) {
69 switch (e.key) {
70 case 'Enter':
71 case ' ':
72 // React puts listeners on the same root, so even if propagation was stopped, immediate propagation is still possible.
73 // useTypeSelect will handle the spacebar first if it's running, so we don't want to open if it's handled it already.
74 // We use isDefaultPrevented() instead of isPropagationStopped() because createEventHandler stops propagation by default.
75 // And default prevented means that the event was handled by something else (typeahead), so we don't want to open the menu.
76 if (trigger === 'longPress' || e.isDefaultPrevented()) {
77 return;
78 }
79 // fallthrough
80 case 'ArrowDown':
81 // Stop propagation, unless it would already be handled by useKeyboard.
82 if (!('continuePropagation' in e)) {
83 e.stopPropagation();
84 }
85 e.preventDefault();
86 state.toggle('first');
87 break;
88 case 'ArrowUp':
89 if (!('continuePropagation' in e)) {
90 e.stopPropagation();
91 }
92 e.preventDefault();
93 state.toggle('last');
94 break;
95 default:
96 // Allow other keys.
97 if ('continuePropagation' in e) {
98 e.continuePropagation();
99 }
100 }
101 }
102 };
103
104 let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-aria/menu');
105 let {longPressProps} = useLongPress({
106 isDisabled: isDisabled || trigger !== 'longPress',

Callers 6

renderMenuTriggerHookFunction · 0.90
useComboBoxFunction · 0.90
useSelectFunction · 0.90
MenuButtonFunction · 0.90
MenuTriggerFunction · 0.90
MenuTrigger.tsxFile · 0.90

Calls 5

useIdFunction · 0.90
useOverlayTriggerFunction · 0.90
useLongPressFunction · 0.90
formatMethod · 0.45

Tested by 1

renderMenuTriggerHookFunction · 0.72