Skip to content

Commit 2e8fbe9

Browse files
committed
feat: add chooseMedia
1 parent 7cf015d commit 2e8fbe9

File tree

6 files changed

+83
-80
lines changed

6 files changed

+83
-80
lines changed
+1-29
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,5 @@
11
import { chooseMedia, MEDIA_TYPE } from '../media'
2-
import { showActionSheet } from '../showActionSheet'
32

43
export function chooseImage(opts: Taro.chooseImage.Option): Promise<any> {
5-
const {
6-
sourceType = ['album', 'camera'],
7-
} = opts
8-
if(sourceType?.includes('camera') && sourceType?.includes('album')) {
9-
return showImagePicker(opts)
10-
} else if (sourceType?.includes('camera')) {
11-
return chooseMedia({...opts, sourceType: ['camera']}, MEDIA_TYPE.IMAGES)
12-
}
13-
return chooseMedia({...opts, sourceType: ['album']}, MEDIA_TYPE.IMAGES)
14-
}
15-
16-
async function showImagePicker(options: Taro.chooseImage.Option):Promise<any> {
17-
const { fail, complete } = options
18-
try {
19-
const res = await showActionSheet({
20-
itemList: ['拍照', '从手机相册选择'],
21-
})
22-
if (res.tapIndex === 0) {
23-
return chooseMedia({...options, sourceType: ['camera']}, MEDIA_TYPE.IMAGES)
24-
}
25-
if (res.tapIndex === 1) {
26-
return chooseMedia({...options, sourceType: ['album']}, MEDIA_TYPE.IMAGES)
27-
}
28-
} catch (err) {
29-
const res = { errMsg: 'chooseImage: fail' }
30-
fail?.(res)
31-
complete?.(res)
32-
}
4+
return chooseMedia(opts, MEDIA_TYPE.Images)
335
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { chooseMedia as _chooseMedia, MEDIA_TYPE } from '../media'
2+
3+
export function chooseMedia (opts: Taro.chooseMedia.Option): Promise<any> {
4+
if (opts.mediaType?.length === 1) {
5+
if (opts.mediaType[0] === 'video') {
6+
return _chooseMedia(opts, MEDIA_TYPE.Videos)
7+
} else if (opts.mediaType[0] === 'image') {
8+
return _chooseMedia(opts, MEDIA_TYPE.Images)
9+
} else {
10+
return _chooseMedia(opts, MEDIA_TYPE.All)
11+
}
12+
} else {
13+
return _chooseMedia(opts, MEDIA_TYPE.All)
14+
}
15+
}
+1-31
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,5 @@
11
import { chooseMedia, MEDIA_TYPE } from '../media'
2-
import { showActionSheet } from '../showActionSheet'
32

43
export function chooseVideo(opts: Taro.chooseVideo.Option): Promise<any> {
5-
const {
6-
sourceType = ['album', 'camera'],
7-
compressed
8-
} = opts
9-
opts = Object.assign(opts, { sizeType: compressed ? ['compressed'] : [] })
10-
if(sourceType?.includes('camera') && sourceType?.includes('album')) {
11-
return showVideoPicker(opts)
12-
} else if (sourceType?.includes('camera')) {
13-
return chooseMedia({...opts, sourceType: ['camera']}, MEDIA_TYPE.VIDEOS)
14-
}
15-
return chooseMedia({...opts, sourceType: ['album']}, MEDIA_TYPE.VIDEOS)
16-
}
17-
18-
async function showVideoPicker(options: Taro.chooseVideo.Option):Promise<any> {
19-
const { fail, complete } = options
20-
try {
21-
const res = await showActionSheet({
22-
itemList: ['拍摄', '从手机相册选择'],
23-
})
24-
if (res.tapIndex === 0) {
25-
return chooseMedia({...options, sourceType: ['camera']}, MEDIA_TYPE.VIDEOS)
26-
}
27-
if (res.tapIndex === 1) {
28-
return chooseMedia({...options, sourceType: ['album']}, MEDIA_TYPE.VIDEOS)
29-
}
30-
} catch (err) {
31-
const res = { errMsg: 'chooseVideo: fail' }
32-
fail?.(res)
33-
complete?.(res)
34-
}
4+
return chooseMedia(opts, MEDIA_TYPE.Videos)
355
}

packages/taro-rn/src/lib/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export * from './authorize'
55
export * from './base64ToArrayBuffer'
66
export * from './canIUse'
77
export * from './chooseImage'
8+
export * from './chooseMedia'
89
export * from './chooseVideo'
910
export * from './clearStorage'
1011
export * from './clearStorageSync'

packages/taro-rn/src/lib/media.ts

+64-19
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
import { CameraRoll } from "@react-native-camera-roll/camera-roll"
22
import { requestCameraPermissionsAsync } from 'expo-camera'
3-
import * as ImagePicker from 'expo-image-picker'
3+
import {
4+
requestMediaLibraryPermissionsAsync,
5+
launchImageLibraryAsync,
6+
launchCameraAsync,
7+
MediaTypeOptions,
8+
ImagePickerAsset,
9+
} from 'expo-image-picker'
410
import { successHandler, errorHandler } from '../utils'
11+
import { showActionSheet } from "./showActionSheet"
512

6-
export const MEDIA_TYPE = {
7-
VIDEOS: 'Videos',
8-
IMAGES: 'Images'
9-
}
13+
export const MEDIA_TYPE = MediaTypeOptions
1014

1115
export async function saveMedia(opts: Taro.saveImageToPhotosAlbum.Option | Taro.saveVideoToPhotosAlbum.Option, type:string, API:string):Promise<TaroGeneral.CallbackResult> {
1216
const { filePath, success, fail, complete } = opts
13-
const { granted } = await ImagePicker.requestMediaLibraryPermissionsAsync()
17+
const { granted } = await requestMediaLibraryPermissionsAsync()
1418
if (!granted) {
1519
const res = { errMsg: 'Permissions denied!' }
1620
return errorHandler(fail, complete)(res)
@@ -28,30 +32,70 @@ export async function saveMedia(opts: Taro.saveImageToPhotosAlbum.Option | Taro.
2832
}
2933
}
3034

31-
export async function chooseMedia(opts: Taro.chooseImage.Option | Taro.chooseVideo.Option, mediaTypes: any): Promise<TaroGeneral.CallbackResult> {
32-
if (!opts || typeof opts !== 'object') {
33-
opts = {}
35+
async function showPicker(opts: Taro.chooseImage.Option | Taro.chooseVideo.Option | Taro.chooseMedia.Option, mediaTypes: MediaTypeOptions):Promise<any> {
36+
const { fail, complete } = opts
37+
try {
38+
const res = await showActionSheet({
39+
itemList: ['拍摄', '从手机相册选择'],
40+
})
41+
if (res.tapIndex === 0) {
42+
return _chooseMedia({...opts, sourceType: ['camera']}, mediaTypes)
43+
}
44+
if (res.tapIndex === 1) {
45+
return _chooseMedia({...opts, sourceType: ['album']}, mediaTypes)
46+
}
47+
} catch (err) {
48+
const res = { errMsg: `choose${
49+
mediaTypes === MediaTypeOptions.Images ? 'Image' : mediaTypes === MediaTypeOptions.Videos ? 'Video' : 'Media'
50+
} fail` }
51+
fail?.(res)
52+
complete?.(res)
53+
}
54+
}
55+
56+
export async function chooseMedia(opts: Taro.chooseImage.Option | Taro.chooseVideo.Option | Taro.chooseMedia.Option = {}, mediaTypes: MediaTypeOptions): Promise<TaroGeneral.CallbackResult> {
57+
const {
58+
sourceType = ['album', 'camera'],
59+
} = opts
60+
if(sourceType?.includes('camera') && sourceType?.includes('album')) {
61+
return showPicker(opts, mediaTypes)
62+
} else if (sourceType?.includes('camera')) {
63+
return _chooseMedia({...opts, sourceType: ['camera']}, mediaTypes)
3464
}
35-
const { sizeType = [], sourceType = [], success, fail, complete, maxDuration, count } = opts as any
65+
return _chooseMedia({...opts, sourceType: ['album']}, mediaTypes)
66+
}
67+
68+
export async function _chooseMedia(opts: Taro.chooseImage.Option | Taro.chooseVideo.Option | Taro.chooseMedia.Option = {}, mediaTypes: MediaTypeOptions): Promise<TaroGeneral.CallbackResult> {
69+
const {
70+
sizeType = [],
71+
sourceType = [],
72+
success,
73+
fail,
74+
complete,
75+
maxDuration,
76+
count = (mediaTypes === MEDIA_TYPE.Videos ? 1 : 9),
77+
compressed
78+
} = opts as any
3679
const options = {
3780
mediaTypes,
38-
quality: sizeType[0] === 'compressed' ? 0.7 : 1,
81+
quality: (sizeType[0] === 'compressed' || compressed) ? 0.7 : 1,
3982
videoMaxDuration: maxDuration,
40-
allowsMultipleSelection: (mediaTypes === MEDIA_TYPE.IMAGES && count > 1) ? true : false,
41-
selectionLimit: mediaTypes === MEDIA_TYPE.VIDEOS ? 1 : (count || 9),
83+
allowsMultipleSelection: count > 1,
84+
selectionLimit: count,
4285
}
86+
const messString = mediaTypes === MediaTypeOptions.Images ? 'Image' : mediaTypes === MediaTypeOptions.Videos ? 'Video' : 'Media'
4387
const isCamera = sourceType[0] === 'camera'
44-
const { granted } = isCamera ? await requestCameraPermissionsAsync() : await ImagePicker.requestMediaLibraryPermissionsAsync()
88+
const { granted } = isCamera ? await requestCameraPermissionsAsync() : await requestMediaLibraryPermissionsAsync()
4589
if (!granted) {
4690
const res = { errMsg: 'Permissions denied!' }
4791
return errorHandler(fail, complete)(res)
4892
}
4993

50-
let launchMediaAsync = isCamera ? ImagePicker.launchCameraAsync : ImagePicker.launchImageLibraryAsync
94+
let launchMediaAsync = isCamera ? launchCameraAsync : launchImageLibraryAsync
5195
try {
5296
const resp = await launchMediaAsync(options)
5397
let res: any = {}
54-
if (mediaTypes === MEDIA_TYPE.VIDEOS) {
98+
if (mediaTypes === MEDIA_TYPE.Videos) {
5599
const asset = resp.assets?.[0]
56100
res = {
57101
...asset,
@@ -61,25 +105,26 @@ export async function chooseMedia(opts: Taro.chooseImage.Option | Taro.chooseVid
61105
} else {
62106
res = {
63107
tempFilePaths: resp.assets?.map((item) => item.uri),
64-
tempFiles: resp.assets?.map((item) => ({
108+
tempFiles: resp.assets?.map((item: ImagePickerAsset) => ({
65109
...item,
66110
path: item.uri,
67111
size: item.fileSize,
68112
type: item.mimeType,
113+
fileType: item.mimeType?.startsWith('video') ? 'video' : 'image',
69114
}))
70115
}
71116
}
72117
if (res.tempFilePath || (!!res.tempFilePaths && res.tempFilePaths.length > 0)) {
73118
return successHandler(success, complete)(res)
74119
} else {
75120
const res = {
76-
errMsg: mediaTypes === MEDIA_TYPE.VIDEOS ? 'chooseVideo:fail cancel' : 'chooseImage:fail cancel',
121+
errMsg: `choose${messString}:fail cancel`
77122
}
78123
return errorHandler(fail, complete)(res)
79124
}
80125
} catch (err) {
81126
const res = {
82-
errMsg: mediaTypes === MEDIA_TYPE.VIDEOS ? 'chooseVideo fail' : 'chooseImage fail',
127+
errMsg: `choose${messString}:fail`,
83128
err
84129
}
85130
return errorHandler(fail, complete)(res)

packages/taro-rn/src/lib/scanCode/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function scanFromPhoto(callback, errorCallBack) {
143143
})
144144
}
145145
}
146-
}, MEDIA_TYPE.IMAGES).catch(errorCallBack)
146+
}, MEDIA_TYPE.Images).catch(errorCallBack)
147147
}
148148

149149
export async function scanCode(option: Taro.scanCode.Option = {}): Promise<Taro.scanCode.SuccessCallbackResult> {

0 commit comments

Comments
 (0)