1
1
import { CameraRoll } from "@react-native-camera-roll/camera-roll"
2
2
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'
4
10
import { successHandler , errorHandler } from '../utils'
11
+ import { showActionSheet } from "./showActionSheet"
5
12
6
- export const MEDIA_TYPE = {
7
- VIDEOS : 'Videos' ,
8
- IMAGES : 'Images'
9
- }
13
+ export const MEDIA_TYPE = MediaTypeOptions
10
14
11
15
export async function saveMedia ( opts : Taro . saveImageToPhotosAlbum . Option | Taro . saveVideoToPhotosAlbum . Option , type :string , API :string ) :Promise < TaroGeneral . CallbackResult > {
12
16
const { filePath, success, fail, complete } = opts
13
- const { granted } = await ImagePicker . requestMediaLibraryPermissionsAsync ( )
17
+ const { granted } = await requestMediaLibraryPermissionsAsync ( )
14
18
if ( ! granted ) {
15
19
const res = { errMsg : 'Permissions denied!' }
16
20
return errorHandler ( fail , complete ) ( res )
@@ -28,30 +32,70 @@ export async function saveMedia(opts: Taro.saveImageToPhotosAlbum.Option | Taro.
28
32
}
29
33
}
30
34
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 )
34
64
}
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
36
79
const options = {
37
80
mediaTypes,
38
- quality : sizeType [ 0 ] === 'compressed' ? 0.7 : 1 ,
81
+ quality : ( sizeType [ 0 ] === 'compressed' || compressed ) ? 0.7 : 1 ,
39
82
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 ,
42
85
}
86
+ const messString = mediaTypes === MediaTypeOptions . Images ? 'Image' : mediaTypes === MediaTypeOptions . Videos ? 'Video' : 'Media'
43
87
const isCamera = sourceType [ 0 ] === 'camera'
44
- const { granted } = isCamera ? await requestCameraPermissionsAsync ( ) : await ImagePicker . requestMediaLibraryPermissionsAsync ( )
88
+ const { granted } = isCamera ? await requestCameraPermissionsAsync ( ) : await requestMediaLibraryPermissionsAsync ( )
45
89
if ( ! granted ) {
46
90
const res = { errMsg : 'Permissions denied!' }
47
91
return errorHandler ( fail , complete ) ( res )
48
92
}
49
93
50
- let launchMediaAsync = isCamera ? ImagePicker . launchCameraAsync : ImagePicker . launchImageLibraryAsync
94
+ let launchMediaAsync = isCamera ? launchCameraAsync : launchImageLibraryAsync
51
95
try {
52
96
const resp = await launchMediaAsync ( options )
53
97
let res : any = { }
54
- if ( mediaTypes === MEDIA_TYPE . VIDEOS ) {
98
+ if ( mediaTypes === MEDIA_TYPE . Videos ) {
55
99
const asset = resp . assets ?. [ 0 ]
56
100
res = {
57
101
...asset ,
@@ -61,25 +105,26 @@ export async function chooseMedia(opts: Taro.chooseImage.Option | Taro.chooseVid
61
105
} else {
62
106
res = {
63
107
tempFilePaths : resp . assets ?. map ( ( item ) => item . uri ) ,
64
- tempFiles : resp . assets ?. map ( ( item ) => ( {
108
+ tempFiles : resp . assets ?. map ( ( item : ImagePickerAsset ) => ( {
65
109
...item ,
66
110
path : item . uri ,
67
111
size : item . fileSize ,
68
112
type : item . mimeType ,
113
+ fileType : item . mimeType ?. startsWith ( 'video' ) ? 'video' : 'image' ,
69
114
} ) )
70
115
}
71
116
}
72
117
if ( res . tempFilePath || ( ! ! res . tempFilePaths && res . tempFilePaths . length > 0 ) ) {
73
118
return successHandler ( success , complete ) ( res )
74
119
} else {
75
120
const res = {
76
- errMsg : mediaTypes === MEDIA_TYPE . VIDEOS ? 'chooseVideo :fail cancel' : 'chooseImage:fail cancel' ,
121
+ errMsg : `choose ${ messString } :fail cancel`
77
122
}
78
123
return errorHandler ( fail , complete ) ( res )
79
124
}
80
125
} catch ( err ) {
81
126
const res = {
82
- errMsg : mediaTypes === MEDIA_TYPE . VIDEOS ? 'chooseVideo fail' : 'chooseImage fail' ,
127
+ errMsg : `choose ${ messString } : fail` ,
83
128
err
84
129
}
85
130
return errorHandler ( fail , complete ) ( res )
0 commit comments