about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLogan Rosen <loganrosen@gmail.com>2023-06-06 10:38:58 -0400
committerGitHub <noreply@github.com>2023-06-06 09:38:58 -0500
commitbdcdb4e4dc9636834b54147d666e6f6024fcff7b (patch)
tree2dc0ea153581724fe8cce5e8524a32a79f677149
parenta67eaa6ace7b8b7a2158decf1d84c613b890f614 (diff)
downloadvoidsky-bdcdb4e4dc9636834b54147d666e6f6024fcff7b.tar.zst
Use expo-image-picker on Web (#847)
-rw-r--r--src/lib/media/picker.shared.ts23
-rw-r--r--src/lib/media/picker.tsx27
-rw-r--r--src/lib/media/picker.web.tsx70
-rw-r--r--src/state/models/media/gallery.ts2
-rw-r--r--src/view/com/util/UserAvatar.tsx2
-rw-r--r--src/view/com/util/UserBanner.tsx2
6 files changed, 29 insertions, 97 deletions
diff --git a/src/lib/media/picker.shared.ts b/src/lib/media/picker.shared.ts
new file mode 100644
index 000000000..00b09c6b8
--- /dev/null
+++ b/src/lib/media/picker.shared.ts
@@ -0,0 +1,23 @@
+import {
+  ImagePickerOptions,
+  launchImageLibraryAsync,
+  MediaTypeOptions,
+} from 'expo-image-picker'
+import {getDataUriSize} from './util'
+
+export async function openPicker(opts?: ImagePickerOptions) {
+  const response = await launchImageLibraryAsync({
+    exif: false,
+    mediaTypes: MediaTypeOptions.Images,
+    quality: 1,
+    ...opts,
+  })
+
+  return (response.assets ?? []).map(image => ({
+    mime: 'image/jpeg',
+    height: image.height,
+    width: image.width,
+    path: image.uri,
+    size: getDataUriSize(image.uri),
+  }))
+}
diff --git a/src/lib/media/picker.tsx b/src/lib/media/picker.tsx
index 7c6dfcc44..d0ee1ae22 100644
--- a/src/lib/media/picker.tsx
+++ b/src/lib/media/picker.tsx
@@ -5,12 +5,7 @@ import {
 } from 'react-native-image-crop-picker'
 import {RootStoreModel} from 'state/index'
 import {CameraOpts, CropperOptions} from './types'
-import {
-  ImagePickerOptions,
-  launchImageLibraryAsync,
-  MediaTypeOptions,
-} from 'expo-image-picker'
-import {getDataUriSize} from './util'
+export {openPicker} from './picker.shared'
 
 /**
  * NOTE
@@ -21,26 +16,6 @@ import {getDataUriSize} from './util'
  * -prf
  */
 
-export async function openPicker(
-  _store: RootStoreModel,
-  opts?: ImagePickerOptions,
-) {
-  const response = await launchImageLibraryAsync({
-    exif: false,
-    mediaTypes: MediaTypeOptions.Images,
-    quality: 1,
-    ...opts,
-  })
-
-  return (response.assets ?? []).map(image => ({
-    mime: 'image/jpeg',
-    height: image.height,
-    width: image.width,
-    path: image.uri,
-    size: getDataUriSize(image.uri),
-  }))
-}
-
 export async function openCamera(
   _store: RootStoreModel,
   opts: CameraOpts,
diff --git a/src/lib/media/picker.web.tsx b/src/lib/media/picker.web.tsx
index 583f78a30..d12685b0c 100644
--- a/src/lib/media/picker.web.tsx
+++ b/src/lib/media/picker.web.tsx
@@ -1,34 +1,9 @@
 /// <reference lib="dom" />
 
-import {PickerOpts, CameraOpts, CropperOptions} from './types'
+import {CameraOpts, CropperOptions} from './types'
 import {RootStoreModel} from 'state/index'
-import {getImageDim} from 'lib/media/manip'
-import {extractDataUriMime} from './util'
 import {Image as RNImage} from 'react-native-image-crop-picker'
-
-interface PickedFile {
-  uri: string
-  path: string
-  size: number
-}
-
-export async function openPicker(
-  _store: RootStoreModel,
-  opts?: PickerOpts,
-): Promise<RNImage[]> {
-  const res = await selectFile(opts)
-  const dim = await getImageDim(res.uri)
-  const mime = extractDataUriMime(res.uri)
-  return [
-    {
-      path: res.uri,
-      mime,
-      size: res.size,
-      width: dim.width,
-      height: dim.height,
-    },
-  ]
-}
+export {openPicker} from './picker.shared'
 
 export async function openCamera(
   _store: RootStoreModel,
@@ -57,44 +32,3 @@ export async function openCropper(
     })
   })
 }
-
-/**
- * Opens the select file dialog in the browser.
- * NOTE:
- * If in the future someone updates this method to use:
- * https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker
- * Check that the `showOpenFilePicker` API does not require any permissions
- * granted to use. As of this writing, it does not, but that could change
- * in the future. If the user does need to go through a permissions granting
- * flow, then checkout the usePhotoLibraryPermission() hook in
- *   src/lib/hooks/usePermissions.ts
- * so that it gets appropriately updated.
- */
-function selectFile(opts?: PickerOpts): Promise<PickedFile> {
-  return new Promise((resolve, reject) => {
-    var input = document.createElement('input')
-    input.type = 'file'
-    input.accept = opts?.mediaType === 'photo' ? 'image/*' : '*/*'
-    input.onchange = e => {
-      const target = e.target as HTMLInputElement
-      const file = target?.files?.[0]
-      if (!file) {
-        return reject(new Error('Canceled'))
-      }
-
-      var reader = new FileReader()
-      reader.readAsDataURL(file)
-      reader.onload = readerEvent => {
-        if (!readerEvent.target) {
-          return reject(new Error('Canceled'))
-        }
-        resolve({
-          uri: readerEvent.target.result as string,
-          path: file.name,
-          size: file.size,
-        })
-      }
-    }
-    input.click()
-  })
-}
diff --git a/src/state/models/media/gallery.ts b/src/state/models/media/gallery.ts
index 52ef8f375..e53e861e2 100644
--- a/src/state/models/media/gallery.ts
+++ b/src/state/models/media/gallery.ts
@@ -87,7 +87,7 @@ export class GalleryModel {
   }
 
   async pick() {
-    const images = await openPicker(this.rootStore, {
+    const images = await openPicker({
       selectionLimit: 4 - this.size,
       allowsMultipleSelection: true,
     })
diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx
index afe06e0c8..b94cf54e9 100644
--- a/src/view/com/util/UserAvatar.tsx
+++ b/src/view/com/util/UserAvatar.tsx
@@ -147,7 +147,7 @@ export function UserAvatar({
             return
           }
 
-          const items = await openPicker(store, {
+          const items = await openPicker({
             aspect: [1, 1],
           })
           const item = items[0]
diff --git a/src/view/com/util/UserBanner.tsx b/src/view/com/util/UserBanner.tsx
index e3dfdca81..cce0e839b 100644
--- a/src/view/com/util/UserBanner.tsx
+++ b/src/view/com/util/UserBanner.tsx
@@ -55,7 +55,7 @@ export function UserBanner({
         if (!(await requestPhotoAccessIfNeeded())) {
           return
         }
-        const items = await openPicker(store)
+        const items = await openPicker()
 
         onSelectNewBanner?.(
           await openCropper(store, {