/// import {PickerOpts, 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 { 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 async function openCamera( _store: RootStoreModel, _opts: CameraOpts, ): Promise { // const mediaType = opts.mediaType || 'photo' TODO throw new Error('TODO') } export async function openCropper( store: RootStoreModel, opts: CropperOptions, ): Promise { // TODO handle more opts return new Promise((resolve, reject) => { store.shell.openModal({ name: 'crop-image', uri: opts.path, onSelect: (img?: RNImage) => { if (img) { resolve(img) } else { reject(new Error('Canceled')) } }, }) }) } /** * 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 { 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() }) }