about summary refs log tree commit diff
path: root/src/view/com/util/PressableWithHover.tsx
blob: 77276f18435febd89267fe8202a962c52ce7b239 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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(function PressableWithHoverImpl(
  {
    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>
  )
})