Bluesky app fork with some witchin' additions 馃挮
at post-text-option 62 lines 1.7 kB view raw
1import { 2 type ImagePickerOptions, 3 launchImageLibraryAsync, 4 UIImagePickerPreferredAssetRepresentationMode, 5} from 'expo-image-picker' 6import {t} from '@lingui/macro' 7 8import {isIOS, isWeb} from '#/platform/detection' 9import {type ImageMeta} from '#/state/gallery' 10import * as Toast from '#/view/com/util/Toast' 11import {VIDEO_MAX_DURATION_MS} from '../constants' 12import {getDataUriSize} from './util' 13 14export type PickerImage = ImageMeta & { 15 size: number 16} 17 18export async function openPicker(opts?: ImagePickerOptions) { 19 const response = await launchImageLibraryAsync({ 20 exif: false, 21 mediaTypes: ['images'], 22 quality: 1, 23 selectionLimit: 1, 24 ...opts, 25 legacy: true, 26 preferredAssetRepresentationMode: 27 UIImagePickerPreferredAssetRepresentationMode.Automatic, 28 }) 29 30 return (response.assets ?? []) 31 .filter(asset => { 32 if (asset.mimeType?.startsWith('image/')) return true 33 Toast.show(t`Only image files are supported`, 'exclamation-circle') 34 return false 35 }) 36 .map(image => ({ 37 mime: image.mimeType || 'image/jpeg', 38 height: image.height, 39 width: image.width, 40 path: image.uri, 41 size: getDataUriSize(image.uri), 42 })) 43} 44 45export async function openUnifiedPicker({ 46 selectionCountRemaining, 47}: { 48 selectionCountRemaining: number 49}) { 50 return await launchImageLibraryAsync({ 51 exif: false, 52 mediaTypes: ['images', 'videos'], 53 quality: 1, 54 allowsMultipleSelection: true, 55 legacy: true, 56 base64: isWeb, 57 selectionLimit: isIOS ? selectionCountRemaining : undefined, 58 preferredAssetRepresentationMode: 59 UIImagePickerPreferredAssetRepresentationMode.Automatic, 60 videoMaxDuration: VIDEO_MAX_DURATION_MS / 1000, 61 }) 62}