about summary refs log tree commit diff
path: root/src/lib/media/manip.web.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/media/manip.web.ts')
-rw-r--r--src/lib/media/manip.web.ts41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/lib/media/manip.web.ts b/src/lib/media/manip.web.ts
index e617d01af..cd0bb3bc9 100644
--- a/src/lib/media/manip.web.ts
+++ b/src/lib/media/manip.web.ts
@@ -1,5 +1,6 @@
 // import {Share} from 'react-native'
 // import * as Toast from 'view/com/util/Toast'
+import {extractDataUriMime, getDataUriSize} from './util'
 
 export interface DownloadAndResizeOpts {
   uri: string
@@ -18,9 +19,15 @@ export interface Image {
   height: number
 }
 
-export async function downloadAndResize(_opts: DownloadAndResizeOpts) {
-  // TODO
-  throw new Error('TODO')
+export async function downloadAndResize(opts: DownloadAndResizeOpts) {
+  const controller = new AbortController()
+  const to = setTimeout(() => controller.abort(), opts.timeout || 5e3)
+  const res = await fetch(opts.uri)
+  const resBody = await res.blob()
+  clearTimeout(to)
+
+  const dataUri = await blobToDataUri(resBody)
+  return await resize(dataUri, opts)
 }
 
 export interface ResizeOpts {
@@ -31,11 +38,18 @@ export interface ResizeOpts {
 }
 
 export async function resize(
-  _localUri: string,
+  dataUri: string,
   _opts: ResizeOpts,
 ): Promise<Image> {
-  // TODO
-  throw new Error('TODO')
+  const dim = await getImageDim(dataUri)
+  // TODO -- need to resize
+  return {
+    path: dataUri,
+    mime: extractDataUriMime(dataUri),
+    size: getDataUriSize(dataUri),
+    width: dim.width,
+    height: dim.height,
+  }
 }
 
 export async function compressIfNeeded(
@@ -86,3 +100,18 @@ export async function getImageDim(path: string): Promise<Dim> {
   await promise
   return {width: img.width, height: img.height}
 }
+
+function blobToDataUri(blob: Blob): Promise<string> {
+  return new Promise((resolve, reject) => {
+    const reader = new FileReader()
+    reader.onloadend = () => {
+      if (typeof reader.result === 'string') {
+        resolve(reader.result)
+      } else {
+        reject(new Error('Failed to read blob'))
+      }
+    }
+    reader.onerror = reject
+    reader.readAsDataURL(blob)
+  })
+}