diff options
Diffstat (limited to 'src/lib/media')
-rw-r--r-- | src/lib/media/manip.web.ts | 41 | ||||
-rw-r--r-- | src/lib/media/picker.web.tsx | 5 | ||||
-rw-r--r-- | src/lib/media/util.ts | 7 |
3 files changed, 43 insertions, 10 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) + }) +} diff --git a/src/lib/media/picker.web.tsx b/src/lib/media/picker.web.tsx index 746feaedd..43675074e 100644 --- a/src/lib/media/picker.web.tsx +++ b/src/lib/media/picker.web.tsx @@ -10,6 +10,7 @@ import { compressIfNeeded, moveToPremanantPath, } from 'lib/media/manip' +import {extractDataUriMime} from './util' interface PickedFile { uri: string @@ -138,7 +139,3 @@ function selectFile(opts: PickerOpts): Promise<PickedFile> { input.click() }) } - -function extractDataUriMime(uri: string): string { - return uri.substring(uri.indexOf(':') + 1, uri.indexOf(';')) -} diff --git a/src/lib/media/util.ts b/src/lib/media/util.ts new file mode 100644 index 000000000..a27c71d82 --- /dev/null +++ b/src/lib/media/util.ts @@ -0,0 +1,7 @@ +export function extractDataUriMime(uri: string): string { + return uri.substring(uri.indexOf(':') + 1, uri.indexOf(';')) +} + +export function getDataUriSize(uri: string): number { + return Math.round((uri.length * 3) / 4) // very rough estimate +} |