import {RouteProp} from '@react-navigation/core'; import {StackNavigationProp} from '@react-navigation/stack'; import {default as React, useEffect, useState} from 'react'; import {Image, StyleSheet, TouchableOpacity} from 'react-native'; import {normalize} from 'react-native-elements'; import ImageZoom, {IOnMove} from 'react-native-image-pan-zoom'; import PhotoManipulator from 'react-native-photo-manipulator'; import CloseIcon from '../../assets/ionicons/close-outline.svg'; import {MainStackParams} from '../../routes'; import {HeaderHeight, SCREEN_HEIGHT, SCREEN_WIDTH} from '../../utils'; import {TaggSquareButton} from '../common'; type ZoomInCropperRouteProps = RouteProp; type ZoomInCropperNavigationProps = StackNavigationProp< MainStackParams, 'ZoomInCropper' >; interface ZoomInCropperProps { route: ZoomInCropperRouteProps; navigation: ZoomInCropperNavigationProps; } export const ZoomInCropper: React.FC = ({ route, navigation, }) => { const {screenType, title, image} = route.params; const [aspectRatio, setAspectRatio] = useState(1); useEffect(() => { navigation.dangerouslyGetParent()?.setOptions({ tabBarVisible: false, }); }, []); useEffect(() => { if (image.sourceURL) { Image.getSize( image.sourceURL, (w, h) => { setAspectRatio(w / h); }, (err) => console.log(err), ); } }, []); const handleNext = () => { console.log('x0: ', x0, 'x1: ', x1, 'y0: ', y0, 'y1: ', y1); if ( x0 !== undefined && x1 !== undefined && y0 !== undefined && y1 !== undefined && image.sourceURL ) { PhotoManipulator.crop(image.sourceURL, { x: x0, y: y1, width: Math.abs(x0 - x1), height: Math.abs(y0 - y1), }) .then((croppedURL) => { navigation.navigate('CaptionScreen', { screenType, title: title, image: {filename: croppedURL, path: croppedURL}, }); }) .catch((err) => console.log('err: ', err)); } else if ( x0 === undefined && x1 === undefined && y0 === undefined && y1 === undefined && image.sourceURL ) { navigation.navigate('CaptionScreen', { screenType, title: title, image: {filename: image.sourceURL, path: image.sourceURL}, }); } }; const [x0, setX0] = useState(); const [x1, setX1] = useState(); const [y0, setY0] = useState(); const [y1, setY1] = useState(); const onMove = (position: IOnMove) => { Image.getSize( image.path, (w, h) => { const x = position.positionX; const y = position.positionY; const scale = position.scale; const screen_ratio = SCREEN_HEIGHT / SCREEN_WIDTH; let tempx0 = w / 2 - x * (w / SCREEN_WIDTH) - w / 2 / scale; let tempx1 = w / 2 - x * (w / SCREEN_WIDTH) + w / 2 / scale; if (tempx0 < 0) { tempx0 = 0; } if (tempx1 > w) { tempx1 = w; } const x_distance = Math.abs(tempx1 - tempx0); const y_distance = screen_ratio * x_distance; let tempy0 = h / 2 - y * (h / SCREEN_HEIGHT) + y_distance / 2; let tempy1 = h / 2 - y * (h / SCREEN_HEIGHT) - y_distance / 2; if (tempy0 > h) { tempy0 = h; } if (tempy1 < 0) { tempy1 = 0; } setX0(tempx0); setX1(tempx1); setY0(tempy0); setY1(tempy1); }, (err) => console.log(err), ); }; return ( <> navigation.goBack()}> ); }; const styles = StyleSheet.create({ closeButton: { position: 'absolute', top: 0, paddingTop: HeaderHeight, zIndex: 1, marginLeft: '5%', }, button: { zIndex: 1, position: 'absolute', bottom: normalize(20), right: normalize(15), width: normalize(108), height: normalize(25), borderRadius: 10, }, buttonLabel: { fontWeight: '700', fontSize: normalize(15), lineHeight: normalize(17.8), letterSpacing: normalize(1.3), textAlign: 'center', }, });