diff options
Diffstat (limited to 'src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx')
-rw-r--r-- | src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx b/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx index b9f3ae510..598b18ed2 100644 --- a/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx +++ b/src/view/com/lightbox/ImageViewing/components/ImageItem/ImageItem.ios.tsx @@ -6,7 +6,7 @@ * */ -import React, {useCallback, useRef, useState} from 'react' +import React, {MutableRefObject, useCallback, useRef, useState} from 'react' import { Animated, @@ -20,11 +20,11 @@ import { TouchableWithoutFeedback, } from 'react-native' import {Image} from 'expo-image' +import {GestureType} from 'react-native-gesture-handler' import useImageDimensions from '../../hooks/useImageDimensions' -import {getImageTransform} from '../../utils' -import {ImageSource} from '../../@types' +import {ImageSource, Dimensions as ImageDimensions} from '../../@types' import {ImageLoading} from './ImageLoading' const DOUBLE_TAP_DELAY = 300 @@ -40,6 +40,8 @@ type Props = { imageSrc: ImageSource onRequestClose: () => void onZoom: (scaled: boolean) => void + pinchGestureRef: MutableRefObject<GestureType> + isScrollViewBeingDragged: boolean } const AnimatedImage = Animated.createAnimatedComponent(Image) @@ -164,7 +166,7 @@ const styles = StyleSheet.create({ }) const getZoomRectAfterDoubleTap = ( - imageDimensions: {width: number; height: number} | null, + imageDimensions: ImageDimensions | null, touchX: number, touchY: number, ): { @@ -252,7 +254,7 @@ const getZoomRectAfterDoubleTap = ( } const getImageStyles = ( - image: {width: number; height: number} | null, + image: ImageDimensions | null, translate: {readonly x: number; readonly y: number} | undefined, scale?: number, ) => { @@ -275,4 +277,37 @@ const getImageStyles = ( } } +const getImageTransform = ( + image: ImageDimensions | null, + screen: ImageDimensions, +) => { + if (!image?.width || !image?.height) { + return [] as const + } + + const wScale = screen.width / image.width + const hScale = screen.height / image.height + const scale = Math.min(wScale, hScale) + const {x, y} = getImageTranslate(image, screen) + + return [{x, y}, scale] as const +} + +const getImageTranslate = ( + image: ImageDimensions, + screen: ImageDimensions, +): {x: number; y: number} => { + const getTranslateForAxis = (axis: 'x' | 'y'): number => { + const imageSize = axis === 'x' ? image.width : image.height + const screenSize = axis === 'x' ? screen.width : screen.height + + return (screenSize - imageSize) / 2 + } + + return { + x: getTranslateForAxis('x'), + y: getTranslateForAxis('y'), + } +} + export default React.memo(ImageItem) |