UNPKG

@react-aria/menu

Version:
99 lines (90 loc) 4.04 kB
import $czs6v$intlStringsmodulejs from "./intlStrings.mjs"; import {useId as $czs6v$useId} from "@react-aria/utils"; import {useLocalizedStringFormatter as $czs6v$useLocalizedStringFormatter} from "@react-aria/i18n"; import {useLongPress as $czs6v$useLongPress} from "@react-aria/interactions"; import {useOverlayTrigger as $czs6v$useOverlayTrigger} from "@react-aria/overlays"; function $parcel$interopDefault(a) { return a && a.__esModule ? a.default : a; } /* * Copyright 2020 Adobe. All rights reserved. * This file is licensed to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. You may obtain a copy * of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ function $168583247155ddda$export$dc9c12ed27dd1b49(props, state, ref) { let { type: type = 'menu', isDisabled: isDisabled, trigger: trigger = 'press' } = props; let menuTriggerId = (0, $czs6v$useId)(); let { triggerProps: triggerProps, overlayProps: overlayProps } = (0, $czs6v$useOverlayTrigger)({ type: type }, state, ref); let onKeyDown = (e)=>{ if (isDisabled) return; if (trigger === 'longPress' && !e.altKey) return; if (ref && ref.current) switch(e.key){ case 'Enter': case ' ': if (trigger === 'longPress') return; // fallthrough case 'ArrowDown': // Stop propagation, unless it would already be handled by useKeyboard. if (!('continuePropagation' in e)) e.stopPropagation(); e.preventDefault(); state.toggle('first'); break; case 'ArrowUp': if (!('continuePropagation' in e)) e.stopPropagation(); e.preventDefault(); state.toggle('last'); break; default: // Allow other keys. if ('continuePropagation' in e) e.continuePropagation(); } }; let stringFormatter = (0, $czs6v$useLocalizedStringFormatter)((0, ($parcel$interopDefault($czs6v$intlStringsmodulejs))), '@react-aria/menu'); let { longPressProps: longPressProps } = (0, $czs6v$useLongPress)({ isDisabled: isDisabled || trigger !== 'longPress', accessibilityDescription: stringFormatter.format('longPressMessage'), onLongPressStart () { state.close(); }, onLongPress () { state.open('first'); } }); let pressProps = { onPressStart (e) { // For consistency with native, open the menu on mouse/key down, but touch up. if (e.pointerType !== 'touch' && e.pointerType !== 'keyboard' && !isDisabled) // If opened with a screen reader, auto focus the first item. // Otherwise, the menu itself will be focused. state.open(e.pointerType === 'virtual' ? 'first' : null); }, onPress (e) { if (e.pointerType === 'touch' && !isDisabled) state.toggle(); } }; // omit onPress from triggerProps since we override it above. delete triggerProps.onPress; return { menuTriggerProps: { ...triggerProps, ...trigger === 'press' ? pressProps : longPressProps, id: menuTriggerId, onKeyDown: onKeyDown }, menuProps: { ...overlayProps, 'aria-labelledby': menuTriggerId, autoFocus: state.focusStrategy || true, onClose: state.close } }; } export {$168583247155ddda$export$dc9c12ed27dd1b49 as useMenuTrigger}; //# sourceMappingURL=useMenuTrigger.module.js.map