diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/media/picker.e2e.tsx | 17 | ||||
-rw-r--r-- | src/lib/media/picker.shared.ts | 22 | ||||
-rw-r--r-- | src/lib/media/picker.tsx | 6 | ||||
-rw-r--r-- | src/lib/media/picker.web.tsx | 2 |
4 files changed, 45 insertions, 2 deletions
diff --git a/src/lib/media/picker.e2e.tsx b/src/lib/media/picker.e2e.tsx index a2a9357ec..92e1495e5 100644 --- a/src/lib/media/picker.e2e.tsx +++ b/src/lib/media/picker.e2e.tsx @@ -7,6 +7,7 @@ import ExpoImageCropTool, {type OpenCropperOptions} from 'expo-image-crop-tool' import {compressIfNeeded} from './manip' import {type PickerImage} from './picker.shared' +import {ImagePickerResult} from 'expo-image-picker' async function getFile() { const imagesDir = documentDirectory! @@ -38,6 +39,22 @@ export async function openPicker(): Promise<PickerImage[]> { return [await getFile()] } +export async function openUnifiedPicker(): Promise<ImagePickerResult> { + const file = await getFile() + + return { + assets: [ + { + type: 'image', + uri: file.path, + mimeType: file.mime, + ...file, + }, + ], + canceled: false, + } +} + export async function openCamera(): Promise<PickerImage> { return await getFile() } diff --git a/src/lib/media/picker.shared.ts b/src/lib/media/picker.shared.ts index 8ec1154c8..6df712e9a 100644 --- a/src/lib/media/picker.shared.ts +++ b/src/lib/media/picker.shared.ts @@ -1,11 +1,14 @@ import { type ImagePickerOptions, launchImageLibraryAsync, + UIImagePickerPreferredAssetRepresentationMode, } from 'expo-image-picker' import {t} from '@lingui/macro' +import {isIOS, isWeb} from '#/platform/detection' import {type ImageMeta} from '#/state/gallery' import * as Toast from '#/view/com/util/Toast' +import {VIDEO_MAX_DURATION_MS} from '../constants' import {getDataUriSize} from './util' export type PickerImage = ImageMeta & { @@ -36,3 +39,22 @@ export async function openPicker(opts?: ImagePickerOptions) { size: getDataUriSize(image.uri), })) } + +export async function openUnifiedPicker({ + selectionCountRemaining, +}: { + selectionCountRemaining: number +}) { + return await launchImageLibraryAsync({ + exif: false, + mediaTypes: ['images', 'videos'], + quality: 1, + allowsMultipleSelection: true, + legacy: true, + base64: isWeb, + selectionLimit: isIOS ? selectionCountRemaining : undefined, + preferredAssetRepresentationMode: + UIImagePickerPreferredAssetRepresentationMode.Current, + videoMaxDuration: VIDEO_MAX_DURATION_MS / 1000, + }) +} diff --git a/src/lib/media/picker.tsx b/src/lib/media/picker.tsx index 6095730d5..2526da3c8 100644 --- a/src/lib/media/picker.tsx +++ b/src/lib/media/picker.tsx @@ -1,7 +1,11 @@ import ExpoImageCropTool, {type OpenCropperOptions} from 'expo-image-crop-tool' import {type ImagePickerOptions, launchCameraAsync} from 'expo-image-picker' -export {openPicker, type PickerImage as RNImage} from './picker.shared' +export { + openPicker, + openUnifiedPicker, + type PickerImage as RNImage, +} from './picker.shared' export async function openCamera(customOpts: ImagePickerOptions) { const opts: ImagePickerOptions = { diff --git a/src/lib/media/picker.web.tsx b/src/lib/media/picker.web.tsx index c1e4e4ab7..233600583 100644 --- a/src/lib/media/picker.web.tsx +++ b/src/lib/media/picker.web.tsx @@ -3,7 +3,7 @@ import {type OpenCropperOptions} from 'expo-image-crop-tool' import {type PickerImage} from './picker.shared' import {type CameraOpts} from './types' -export {openPicker} from './picker.shared' +export {openPicker, openUnifiedPicker} from './picker.shared' export async function openCamera(_opts: CameraOpts): Promise<PickerImage> { throw new Error('openCamera is not supported on web') |