about summary refs log tree commit diff
path: root/src/lib/media
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/media')
-rw-r--r--src/lib/media/picker.e2e.tsx116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/lib/media/picker.e2e.tsx b/src/lib/media/picker.e2e.tsx
new file mode 100644
index 000000000..9f4765ac2
--- /dev/null
+++ b/src/lib/media/picker.e2e.tsx
@@ -0,0 +1,116 @@
+import {RootStoreModel} from 'state/index'
+import {PickerOpts, CameraOpts, CropperOpts, PickedMedia} from './types'
+import {
+  scaleDownDimensions,
+  Dim,
+  compressIfNeeded,
+  moveToPremanantPath,
+} from 'lib/media/manip'
+export type {PickedMedia} from './types'
+import RNFS from 'react-native-fs'
+
+let _imageCounter = 0
+async function getFile() {
+  const files = await RNFS.readDir(
+    RNFS.LibraryDirectoryPath.split('/')
+      .slice(0, -5)
+      .concat(['Media', 'DCIM', '100APPLE'])
+      .join('/'),
+  )
+  return files[_imageCounter++ % files.length]
+}
+
+export async function openPicker(
+  _store: RootStoreModel,
+  opts: PickerOpts,
+): Promise<PickedMedia[]> {
+  const mediaType = opts.mediaType || 'photo'
+  const items = await getFile()
+  const toMedia = (item: RNFS.ReadDirItem) => ({
+    mediaType,
+    path: item.path,
+    mime: 'image/jpeg',
+    size: item.size,
+    width: 4288,
+    height: 2848,
+  })
+  if (Array.isArray(items)) {
+    return items.map(toMedia)
+  }
+  return [toMedia(items)]
+}
+
+export async function openCamera(
+  _store: RootStoreModel,
+  opts: CameraOpts,
+): Promise<PickedMedia> {
+  const mediaType = opts.mediaType || 'photo'
+  const item = await getFile()
+  return {
+    mediaType,
+    path: item.path,
+    mime: 'image/jpeg',
+    size: item.size,
+    width: 4288,
+    height: 2848,
+  }
+}
+
+export async function openCropper(
+  _store: RootStoreModel,
+  opts: CropperOpts,
+): Promise<PickedMedia> {
+  const mediaType = opts.mediaType || 'photo'
+  const item = await getFile()
+  return {
+    mediaType,
+    path: item.path,
+    mime: 'image/jpeg',
+    size: item.size,
+    width: 4288,
+    height: 2848,
+  }
+}
+
+export async function pickImagesFlow(
+  store: RootStoreModel,
+  maxFiles: number,
+  maxDim: Dim,
+  maxSize: number,
+) {
+  const items = await openPicker(store, {
+    multiple: true,
+    maxFiles,
+    mediaType: 'photo',
+  })
+  const result = []
+  for (const image of items) {
+    result.push(
+      await cropAndCompressFlow(store, image.path, image, maxDim, maxSize),
+    )
+  }
+  return result
+}
+
+export async function cropAndCompressFlow(
+  store: RootStoreModel,
+  path: string,
+  imgDim: Dim,
+  maxDim: Dim,
+  maxSize: number,
+) {
+  // choose target dimensions based on the original
+  // this causes the photo cropper to start with the full image "selected"
+  const {width, height} = scaleDownDimensions(imgDim, maxDim)
+  const cropperRes = await openCropper(store, {
+    mediaType: 'photo',
+    path,
+    freeStyleCropEnabled: true,
+    width,
+    height,
+  })
+
+  const img = await compressIfNeeded(cropperRes, maxSize)
+  const permanentPath = await moveToPremanantPath(img.path)
+  return permanentPath
+}