forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {
2 type ImagePickerOptions,
3 launchImageLibraryAsync,
4 UIImagePickerPreferredAssetRepresentationMode,
5} from 'expo-image-picker'
6import {t} from '@lingui/core/macro'
7
8import {type ImageMeta} from '#/state/gallery'
9import * as Toast from '#/view/com/util/Toast'
10import {IS_IOS, IS_WEB} from '#/env'
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: IS_WEB,
57 selectionLimit: IS_IOS ? selectionCountRemaining : undefined,
58 preferredAssetRepresentationMode:
59 UIImagePickerPreferredAssetRepresentationMode.Automatic,
60 videoMaxDuration: VIDEO_MAX_DURATION_MS / 1000,
61 })
62}