about summary refs log tree commit diff
path: root/src/view/com/composer/PhotoCarouselPicker.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/com/composer/PhotoCarouselPicker.tsx')
-rw-r--r--src/view/com/composer/PhotoCarouselPicker.tsx84
1 files changed, 61 insertions, 23 deletions
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<React.SetStateAction<string[]>>
   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 (
     <ScrollView
       horizontal
@@ -20,11 +76,7 @@ export const PhotoCarouselPicker = ({
       showsHorizontalScrollIndicator={false}>
       <TouchableOpacity
         style={[styles.galleryButton, styles.photo]}
-        onPress={() => {
-          openCamera({mediaType: 'photo'}).then(item => {
-            setSelectedPhotos([item.path, ...selectedPhotos])
-          })
-        }}>
+        onPress={handleOpenCamera}>
         <FontAwesomeIcon
           icon="camera"
           size={24}
@@ -35,27 +87,13 @@ export const PhotoCarouselPicker = ({
         <TouchableOpacity
           key={`local-image-${index}`}
           style={styles.photoButton}
-          onPress={() => {
-            setSelectedPhotos([item.node.image.uri, ...selectedPhotos])
-          }}>
+          onPress={() => handleSelectPhoto(item.node.image.uri)}>
           <Image style={styles.photo} source={{uri: item.node.image.uri}} />
         </TouchableOpacity>
       ))}
       <TouchableOpacity
         style={[styles.galleryButton, styles.photo]}
-        onPress={() => {
-          openPicker({multiple: true, maxFiles: 4, mediaType: 'photo'}).then(
-            items => {
-              setSelectedPhotos([
-                ...items.reduce(
-                  (accum, cur) => accum.concat(cur.sourceURL!),
-                  [] as string[],
-                ),
-                ...selectedPhotos,
-              ])
-            },
-          )
-        }}>
+        onPress={handleOpenGallery}>
         <FontAwesomeIcon icon="image" style={{color: colors.blue3}} size={24} />
       </TouchableOpacity>
     </ScrollView>