import { useFocusRing, useFocus } from '@react-native-aria/focus'; import React, { forwardRef, useMemo } from 'react'; import { composeEventHandlers } from '@gluestack-ui/utils'; import { useHover, usePress } from '@react-native-aria/interactions'; import { ButtonContext } from './Context'; import type { IButtonProps } from './types'; export const Button = (StyledButton: React.ComponentType) => forwardRef( ( { children, isDisabled, isHovered: isHoveredProp, isPressed: isPressedProp, isFocused: isFocusedProp, isFocusVisible: isFocusVisibleProp, ...props }: Omit & { children?: | (({ hovered, pressed, focused, focusVisible, disabled, }: { hovered?: boolean; pressed?: boolean; focused?: boolean; focusVisible?: boolean; disabled?: boolean; }) => React.ReactNode) | React.ReactNode; }, ref?: any ) => { const { isFocusVisible, focusProps: focusRingProps }: any = useFocusRing(); const { pressProps: pressableProps, isPressed } = usePress({ isDisabled, }); const { isFocused, focusProps } = useFocus(); const { isHovered, hoverProps }: any = useHover(); const contextValue = useMemo(() => { return { hover: isHoveredProp || isHovered, focus: isFocusedProp || isFocused, active: isPressedProp || isPressed, disabled: isDisabled, focusVisible: isFocusVisibleProp || isFocusVisible, }; }, [ isHovered, isHoveredProp, isFocused, isFocusedProp, isPressed, isPressedProp, isDisabled, isFocusVisible, isFocusVisibleProp, ]); return ( {typeof children === 'function' ? children({ hovered: isHovered, focused: isFocused, pressed: isPressed, disabled: props.disabled ?? undefined, focusVisible: isFocusVisible, }) : children} ); } );