From 6ba5d15cb68b4edd657667a9d487eeceb05891e5 Mon Sep 17 00:00:00 2001 From: João Ferreiro Date: Tue, 29 Nov 2022 18:26:16 +0000 Subject: crop every photo; make use of useCallback --- src/view/com/composer/PhotoCarouselPicker.tsx | 84 +++++++++++++++++++-------- src/view/com/composer/SelectedPhoto.tsx | 17 ++++-- 2 files changed, 72 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/view/com/composer/PhotoCarouselPicker.tsx b/src/view/com/composer/PhotoCarouselPicker.tsx index e6b308dcb..208e8070b 100644 --- a/src/view/com/composer/PhotoCarouselPicker.tsx +++ b/src/view/com/composer/PhotoCarouselPicker.tsx @@ -1,8 +1,12 @@ -import React from 'react' +import React, {useCallback} from 'react' import {Image, StyleSheet, TouchableOpacity, ScrollView} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {colors} from '../../lib/styles' -import {openPicker, openCamera} from 'react-native-image-crop-picker' +import { + openPicker, + openCamera, + openCropper, +} from 'react-native-image-crop-picker' export const PhotoCarouselPicker = ({ selectedPhotos, @@ -13,6 +17,58 @@ export const PhotoCarouselPicker = ({ setSelectedPhotos: React.Dispatch> localPhotos: any }) => { + const handleOpenCamera = useCallback(() => { + openCamera({ + mediaType: 'photo', + cropping: true, + width: 1000, + height: 1000, + }).then(item => { + setSelectedPhotos([item.path, ...selectedPhotos]) + }) + }, [selectedPhotos, setSelectedPhotos]) + + const handleSelectPhoto = useCallback( + async (uri: string) => { + const img = await openCropper({ + mediaType: 'photo', + path: uri, + width: 1000, + height: 1000, + }) + setSelectedPhotos([img.path, ...selectedPhotos]) + }, + [selectedPhotos, setSelectedPhotos], + ) + + const handleOpenGallery = useCallback(() => { + openPicker({ + multiple: true, + maxFiles: 4, + mediaType: 'photo', + }).then(async items => { + const result = [] + + for await (const image of items) { + const img = await openCropper({ + mediaType: 'photo', + path: image.path, + width: 1000, + height: 1000, + }) + result.push(img.path) + } + setSelectedPhotos([ + // ...items.reduce( + // (accum, cur) => accum.concat(cur.sourceURL!), + // [] as string[], + // ), + ...result, + ...selectedPhotos, + ]) + }) + }, [selectedPhotos, setSelectedPhotos]) + return ( { - openCamera({mediaType: 'photo'}).then(item => { - setSelectedPhotos([item.path, ...selectedPhotos]) - }) - }}> + onPress={handleOpenCamera}> { - setSelectedPhotos([item.node.image.uri, ...selectedPhotos]) - }}> + onPress={() => handleSelectPhoto(item.node.image.uri)}> ))} { - openPicker({multiple: true, maxFiles: 4, mediaType: 'photo'}).then( - items => { - setSelectedPhotos([ - ...items.reduce( - (accum, cur) => accum.concat(cur.sourceURL!), - [] as string[], - ), - ...selectedPhotos, - ]) - }, - ) - }}> + onPress={handleOpenGallery}> diff --git a/src/view/com/composer/SelectedPhoto.tsx b/src/view/com/composer/SelectedPhoto.tsx index 87f7fbb8c..88209b3df 100644 --- a/src/view/com/composer/SelectedPhoto.tsx +++ b/src/view/com/composer/SelectedPhoto.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, {useCallback} from 'react' import {Image, StyleSheet, TouchableOpacity, View} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {colors} from '../../lib/styles' @@ -17,6 +17,15 @@ export const SelectedPhoto = ({ ? styles.image175 : styles.image85 + const handleRemovePhoto = useCallback( + item => { + setSelectedPhotos( + selectedPhotos.filter(filterItem => filterItem !== item), + ) + }, + [selectedPhotos, setSelectedPhotos], + ) + return selectedPhotos.length !== 0 ? ( {selectedPhotos.length !== 0 && @@ -25,11 +34,7 @@ export const SelectedPhoto = ({ key={`selected-image-${index}`} style={[styles.image, imageStyle]}> { - setSelectedPhotos( - selectedPhotos.filter(filterItem => filterItem !== item), - ) - }} + onPress={() => handleRemovePhoto(item)} style={styles.removePhotoButton}>