import React, { memo, forwardRef } from 'react'; import { Pressable } from '../../primitives/Pressable'; import { Icon } from '../../primitives/Icon'; import { usePropsResolution } from '../../../hooks/useThemeProps'; import { useHasResponsiveProps } from '../../../hooks/useHasResponsiveProps'; import { composeEventHandlers } from '../../../utils'; import type { IIconButtonProps } from './types'; import { useHover, useFocus, useIsPressed, } from '../../primitives/Pressable/Pressable'; import { useFocusRing } from '@react-native-aria/focus'; import merge from 'lodash.merge'; const IconButton = ( { icon, _icon: pseudoIconProp, children, isHovered: isHoveredProp, isPressed: isPressedProp, isFocused: isFocusedProp, isFocusVisible: isFocusVisibleProp, isDisabled, ...props }: IIconButtonProps, ref: any ) => { const { hoverProps, isHovered } = useHover(); const { pressableProps, isPressed } = useIsPressed(); const { focusProps, isFocused } = useFocus(); const { isFocusVisible, focusProps: focusRingProps }: any = useFocusRing(); const { _icon, onPressIn, onPressOut, onHoverIn, onHoverOut, onFocus, onBlur, ...resolvedProps } = usePropsResolution( 'IconButton', { ...props, _icon: merge({}, pseudoIconProp, icon?.props) }, { isHovered: isHoveredProp || isHovered, isPressed: isPressedProp || isPressed, isFocused: isFocusedProp || isFocused, isFocusVisible: isFocusVisibleProp || isFocusVisible, isDisabled, } ); let clonedIcon; if (icon) { clonedIcon = React.cloneElement(icon, { ..._icon, }); } //TODO: refactor for responsive prop if (useHasResponsiveProps(props)) { return null; } return ( {clonedIcon || {children}} ); }; export default memo(forwardRef(IconButton)); export type { IIconButtonProps };