From 5449a11f4c404e505ba4369bbdbefd73eeda0be3 Mon Sep 17 00:00:00 2001 From: Shravya Ramesh Date: Fri, 18 Jun 2021 10:51:38 -0700 Subject: Add image manipulation for cropping --- src/components/comments/ZoomInCropper.tsx | 85 ++++++++++++++++++++++++++++--- src/components/moments/MomentPost.tsx | 2 +- src/components/profile/PublicProfile.tsx | 4 +- 3 files changed, 83 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/components/comments/ZoomInCropper.tsx b/src/components/comments/ZoomInCropper.tsx index 54acc26e..79047b41 100644 --- a/src/components/comments/ZoomInCropper.tsx +++ b/src/components/comments/ZoomInCropper.tsx @@ -2,13 +2,21 @@ import {RouteProp} from '@react-navigation/core'; import {useFocusEffect} from '@react-navigation/native'; import {StackNavigationProp} from '@react-navigation/stack'; import React, {useCallback, useEffect, useState} from 'react'; -import {Dimensions, Image, StyleSheet, TouchableOpacity} from 'react-native'; +import { + Dimensions, + Image, + StyleSheet, + TouchableOpacity, + View, +} from 'react-native'; import {normalize} from 'react-native-elements'; -import ImageZoom from 'react-native-image-pan-zoom'; +import ImageZoom, {IOnMove} from 'react-native-image-pan-zoom'; import CloseIcon from '../../assets/ionicons/close-outline.svg'; import {MainStackParams} from '../../routes'; -import {HeaderHeight, SCREEN_WIDTH} from '../../utils'; -import {TaggSquareButton} from '../common'; +import {HeaderHeight, SCREEN_HEIGHT, SCREEN_WIDTH} from '../../utils'; +import {LoadingIndicator, TaggSquareButton} from '../common'; +import PhotoManipulator from 'react-native-photo-manipulator'; +import {trackPromise} from 'react-promise-tracker'; type ZoomInCropperRouteProps = RouteProp; type ZoomInCropperNavigationProps = StackNavigationProp< @@ -51,6 +59,70 @@ export const ZoomInCropper: React.FC = ({ ); } }, []); + + const handleNext = () => { + console.log('x0: ', x0, 'x1: ', x1, 'y0: ', y0, 'y1: ', y1); + if ( + x0 !== undefined && + x1 !== undefined && + y0 !== undefined && + y1 !== undefined && + image.sourceURL + ) { + console.log('x0x1y0y1'); + PhotoManipulator.crop(image.sourceURL, { + x: x0, + y: y1, + width: Math.abs(x0 - x1), + height: Math.abs(y0 - y1), + }) + .then((croppedURL) => console.log('croppedURL: ', croppedURL)) + .catch((err) => console.log('err: ', err)); + } + console.log('crop photo and send to caption screen'); + }; + + 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 x0 = w / 2 - x * (w / SCREEN_WIDTH) - w / 2 / scale; + let x1 = w / 2 - x * (w / SCREEN_WIDTH) + w / 2 / scale; + if (x0 < 0) { + x0 = 0; + } + if (x1 > w) { + x1 = w; + } + const x_distance = Math.abs(x1 - x0); + const y_distance = screen_ratio * x_distance; + let y0 = h / 2 - y * (h / SCREEN_HEIGHT) + y_distance / 2; + let y1 = h / 2 - y * (h / SCREEN_HEIGHT) - y_distance / 2; + if (y0 > h) { + y0 = h; + } + if (y1 < 0) { + y1 = 0; + } + console.log('onMove x0: ', x0, 'x1: ', x1, 'y0: ', y0, 'y1: ', y1); + setX0(x0); + setX1(x1); + setY0(y0); + setY1(y1); + }, + (err) => console.log(err), + ); + }; + return ( <> = ({ cropWidth={Dimensions.get('window').width} cropHeight={Dimensions.get('window').height} imageWidth={SCREEN_WIDTH} - imageHeight={SCREEN_WIDTH / aspectRatio}> + imageHeight={SCREEN_WIDTH / aspectRatio} + onMove={onMove}> = ({ /> console.log('Navigate to caption screen')} + onPress={handleNext} title={'Next'} buttonStyle={'normal'} buttonColor={'blue'} diff --git a/src/components/moments/MomentPost.tsx b/src/components/moments/MomentPost.tsx index 3840cb08..0f105c0d 100644 --- a/src/components/moments/MomentPost.tsx +++ b/src/components/moments/MomentPost.tsx @@ -115,7 +115,7 @@ const MomentPost: React.FC = ({ ); const [commentPreview, setCommentPreview] = useState(moment.comment_preview); - const {keyboardVisible, scrollTo} = useContext(MomentContext); + const {keyboardVisible} = useContext(MomentContext); const [hideText, setHideText] = useState(false); const [isFullScreen, setIsFullScreen] = useState(false); diff --git a/src/components/profile/PublicProfile.tsx b/src/components/profile/PublicProfile.tsx index 8a80c56f..6b991d7c 100644 --- a/src/components/profile/PublicProfile.tsx +++ b/src/components/profile/PublicProfile.tsx @@ -87,7 +87,9 @@ const PublicProfile: React.FC = ({ scrollViewRef.current ) { setScrollEnabled(false); - scrollViewRef.current.scrollTo({y: 0}); + if (scrollViewRef && scrollViewRef.current) { + scrollViewRef.current.scrollTo({y: 0}); + } navigation.navigate('MomentUploadPrompt', { screenType, momentCategory: momentCategories[0], -- cgit v1.2.3-70-g09d2