@gluestack-ui/core
Version:
Universal UI components for React Native, Expo, and Next.js
68 lines • 4.47 kB
JSX
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;
};
import React, { useCallback } from 'react';
import { composeEventHandlers } from '@gluestack-ui/utils/common';
import { useHover, usePress } from '@gluestack-ui/utils/aria';
import { useFocusRing } from '@gluestack-ui/utils/aria';
import { useMenuItem } from '../aria';
import { Platform } from 'react-native';
const usePressed = (onPressIn, onPressOut, onPress, isDisabled) => {
if (isDisabled)
return {};
return {
pressEvents: {
onPressIn,
onPressOut,
onPress,
},
};
};
export function MenuItem({ StyledMenuItem, item, state, onAction, onClose, closeOnSelect, }) {
const itemProps = Object.assign({}, item.props);
const ref = React.useRef(null);
const _a = useMenuItem(Object.assign({ 'key': item.key, onAction,
onClose,
closeOnSelect, 'aria-label': itemProps.textValue }, itemProps), state, ref).menuItemProps, { focusable } = _a, restMenuProps = __rest(_a, ["focusable"]);
const toggleSelection = useCallback(() => {
if (Platform.OS === 'web') {
state.selectionManager.toggleSelection(item.key);
}
}, [state.selectionManager, item.key]);
const { focusProps: focusRingProps, isFocusVisible } = useFocusRing();
const { pressProps, isPressed } = usePress({});
const { isHovered, hoverProps } = useHover();
const isFocused = state.selectionManager.focusedKey === item.key;
const _b = item.props, { children } = _b, rest = __rest(_b, ["children"]);
const { pressEvents } = usePressed(composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onPressIn, composeEventHandlers(restMenuProps.onPressIn, toggleSelection)), composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onPressOut, restMenuProps.onPressOut), composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onPress, restMenuProps.onPress), state.selectionManager.isDisabled(item.key));
return (<StyledMenuItem ref={ref} tabIndex={focusable === undefined ? -1 : focusable} {...restMenuProps} states={{
hover: isHovered,
focus: isFocused,
active: isPressed,
focusVisible: isFocusVisible,
selected: state.selectionManager.isSelected(item.key),
disabled: state.selectionManager.isDisabled(item.key),
}} dataSet={{
hover: isHovered ? 'true' : 'false',
focus: isFocused ? 'true' : 'false',
active: isPressed ? 'true' : 'false',
focusVisible: isFocusVisible ? 'true' : 'false',
selected: state.selectionManager.isSelected(item.key)
? 'true'
: 'false',
disabled: state.selectionManager.isDisabled(item.key)
? 'true'
: 'false',
}} {...rest} onHoverIn={composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onHoverIn, hoverProps.onHoverIn)} onHoverOut={composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onHoverOut, hoverProps.onHoverOut)} onFocus={composeEventHandlers(composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onFocus, focusRingProps.onFocus), restMenuProps === null || restMenuProps === void 0 ? void 0 : restMenuProps.onFocus)} onBlur={composeEventHandlers(composeEventHandlers(rest === null || rest === void 0 ? void 0 : rest.onBlur, focusRingProps.onBlur), restMenuProps === null || restMenuProps === void 0 ? void 0 : restMenuProps.onBlur)} onPressIn={composeEventHandlers(pressProps.onPressIn, pressEvents === null || pressEvents === void 0 ? void 0 : pressEvents.onPressIn)} onPress={composeEventHandlers(pressProps.onPress, pressEvents === null || pressEvents === void 0 ? void 0 : pressEvents.onPress)} onPressOut={composeEventHandlers(pressProps.onPressOut, pressEvents === null || pressEvents === void 0 ? void 0 : pressEvents.onPressOut)}>
{children}
</StyledMenuItem>);
}
//# sourceMappingURL=MenuItem.jsx.map