diff options
Diffstat (limited to 'src/view/com/util/PressableWithHover.tsx')
-rw-r--r-- | src/view/com/util/PressableWithHover.tsx | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/view/com/util/PressableWithHover.tsx b/src/view/com/util/PressableWithHover.tsx new file mode 100644 index 000000000..09ccb6a2d --- /dev/null +++ b/src/view/com/util/PressableWithHover.tsx @@ -0,0 +1,45 @@ +import React, { + useState, + useCallback, + PropsWithChildren, + forwardRef, + Ref, +} from 'react' +import {Pressable, PressableProps, StyleProp, ViewStyle} from 'react-native' +import {addStyle} from 'lib/styles' + +interface PressableWithHover extends PressableProps { + hoverStyle: StyleProp<ViewStyle> +} + +export const PressableWithHover = forwardRef( + ( + { + children, + style, + hoverStyle, + ...props + }: PropsWithChildren<PressableWithHover>, + ref: Ref<any>, + ) => { + const [isHovering, setIsHovering] = useState(false) + + const onHoverIn = useCallback(() => setIsHovering(true), [setIsHovering]) + const onHoverOut = useCallback(() => setIsHovering(false), [setIsHovering]) + style = + typeof style !== 'function' && isHovering + ? addStyle(style, hoverStyle) + : style + + return ( + <Pressable + {...props} + style={style} + onHoverIn={onHoverIn} + onHoverOut={onHoverOut} + ref={ref}> + {children} + </Pressable> + ) + }, +) |