about summary refs log tree commit diff
path: root/src/view/com/lightbox/ImageViewing/hooks/useDoubleTapToZoom.ts
blob: 92746e951a307aca5920076e2f10202a7873ffe8 (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
 * Copyright (c) JOB TODAY S.A. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 */

import React, {useCallback} from 'react'
import {ScrollView, NativeTouchEvent, NativeSyntheticEvent} from 'react-native'

import {Dimensions} from '../@types'

const DOUBLE_TAP_DELAY = 300
let lastTapTS: number | null = null

/**
 * This is iOS only.
 * Same functionality for Android implemented inside usePanResponder hook.
 */
function useDoubleTapToZoom(
  scrollViewRef: React.RefObject<ScrollView>,
  scaled: boolean,
  screen: Dimensions,
) {
  const handleDoubleTap = useCallback(
    (event: NativeSyntheticEvent<NativeTouchEvent>) => {
      const nowTS = new Date().getTime()
      const scrollResponderRef = scrollViewRef?.current?.getScrollResponder()

      if (lastTapTS && nowTS - lastTapTS < DOUBLE_TAP_DELAY) {
        const {pageX, pageY} = event.nativeEvent
        let targetX = 0
        let targetY = 0
        let targetWidth = screen.width
        let targetHeight = screen.height

        // Zooming in
        // TODO: Add more precise calculation of targetX, targetY based on touch
        if (!scaled) {
          targetX = pageX / 2
          targetY = pageY / 2
          targetWidth = screen.width / 2
          targetHeight = screen.height / 2
        }

        // @ts-ignore
        scrollResponderRef?.scrollResponderZoomTo({
          x: targetX,
          y: targetY,
          width: targetWidth,
          height: targetHeight,
          animated: true,
        })
      } else {
        lastTapTS = nowTS
      }
    },
    [scaled, screen.height, screen.width, scrollViewRef],
  )

  return handleDoubleTap
}

export default useDoubleTapToZoom