@hotta/react-native-imagepicker 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/android/src/main/java/com/htreactnative/imagepicker/NativeImagePickerModule.kt +47 -0
- package/ios/NativeImagePicker.mm +108 -31
- package/lib/module/NativeImagePicker.js +9 -0
- package/lib/module/NativeImagePicker.js.map +1 -1
- package/lib/typescript/src/NativeImagePicker.d.ts +29 -1
- package/lib/typescript/src/NativeImagePicker.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeImagePicker.ts +33 -2
- package/src/index.tsx +10 -0
package/README.md
CHANGED
|
@@ -11,13 +11,13 @@ This is a fork of [react-native-syan-image-picker](https://github.com/syanbo/re
|
|
|
11
11
|
### 安装
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
yarn add @hotta/react-native-imagepicker
|
|
14
|
+
yarn add @hotta/react-native-imagepicker
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
### 使用方法
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
import HTImagePicker from '@
|
|
20
|
+
import HTImagePicker from '@hotta/react-native-imagepicker';
|
|
21
21
|
const options: any = {
|
|
22
22
|
mediaType: 'photo',
|
|
23
23
|
sortOrder: 'asc',
|
|
@@ -50,6 +50,53 @@ class NativeImagePickerModule(reactContext: ReactApplicationContext) :
|
|
|
50
50
|
})
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
override fun asyncShowVideoPicker(
|
|
54
|
+
options: ReadableMap?,
|
|
55
|
+
promise: Promise?
|
|
56
|
+
) {
|
|
57
|
+
pickerOptions = options;
|
|
58
|
+
val videoCount = options?.getInt("videoCount") ?: 1
|
|
59
|
+
PictureSelector.create(reactApplicationContext.currentActivity)
|
|
60
|
+
.openGallery(SelectMimeType.ofVideo())
|
|
61
|
+
.setMaxSelectNum(videoCount)
|
|
62
|
+
.setImageEngine(imageEngine)
|
|
63
|
+
.forResult(object : OnResultCallbackListener<LocalMedia> {
|
|
64
|
+
override fun onResult(localMediaList: ArrayList<LocalMedia?>?) {
|
|
65
|
+
var data = WritableNativeArray()
|
|
66
|
+
localMediaList?.forEach { media -> media?.let {
|
|
67
|
+
data.pushMap(getVideoResult(media))
|
|
68
|
+
} }
|
|
69
|
+
promise?.resolve(data)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
override fun onCancel() {
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
private fun getVideoResult(media: LocalMedia): WritableMap {
|
|
80
|
+
val videoMap: WritableMap = WritableNativeMap()
|
|
81
|
+
var path: String = media.path
|
|
82
|
+
val isAndroidQ = SdkVersionUtils.isQ()
|
|
83
|
+
val isAndroidR = SdkVersionUtils.isR()
|
|
84
|
+
if (isAndroidQ) {
|
|
85
|
+
path = media.availablePath
|
|
86
|
+
}
|
|
87
|
+
if (isAndroidR) {
|
|
88
|
+
path = media.realPath;
|
|
89
|
+
}
|
|
90
|
+
videoMap.putString("path", "file://$path")
|
|
91
|
+
videoMap.putString("mime", media.mimeType ?: "video/mp4")
|
|
92
|
+
videoMap.putDouble("width", media.width.toDouble())
|
|
93
|
+
videoMap.putDouble("height", media.height.toDouble())
|
|
94
|
+
videoMap.putDouble("duration", media.duration * 1000.0)
|
|
95
|
+
videoMap.putInt("size", media.size)
|
|
96
|
+
videoMap.putString("filename", media.fileName)
|
|
97
|
+
return videoMap
|
|
98
|
+
}
|
|
99
|
+
|
|
53
100
|
private fun getImageResult(media: LocalMedia): WritableMap {
|
|
54
101
|
val imageMap: WritableMap = WritableNativeMap()
|
|
55
102
|
var path: String = media.path
|
package/ios/NativeImagePicker.mm
CHANGED
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
@interface NativeImagePicker ()
|
|
8
8
|
|
|
9
9
|
@property (nonatomic, strong) UIImagePickerController *imagePickerVc;
|
|
10
|
-
@property (nonatomic, strong) NSDictionary *pickOptions;
|
|
11
|
-
|
|
12
10
|
/**
|
|
13
11
|
保存Promise的resolve block
|
|
14
12
|
*/
|
|
@@ -27,7 +25,9 @@
|
|
|
27
25
|
@property (nonatomic, strong) NSMutableArray *selectedAssets;
|
|
28
26
|
@end
|
|
29
27
|
@implementation NativeImagePicker
|
|
30
|
-
|
|
28
|
+
{
|
|
29
|
+
std::optional<JS::NativeImagePicker::ImagePickerOption> _cameraOptions;
|
|
30
|
+
}
|
|
31
31
|
|
|
32
32
|
- (instancetype)init {
|
|
33
33
|
self = [super init];
|
|
@@ -52,31 +52,88 @@
|
|
|
52
52
|
_selectedAssets = nil;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
- (void)asyncShowImagePicker:(
|
|
56
|
-
|
|
55
|
+
- (void)asyncShowImagePicker:(JS::NativeImagePicker::ImagePickerOption &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
|
|
56
|
+
_cameraOptions = options;
|
|
57
57
|
self.resolveBlock = resolve;
|
|
58
58
|
self.rejectBlock = reject;
|
|
59
59
|
self.callback = nil;
|
|
60
60
|
[self openImagePicker];
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
- (void)asyncShowVideoPicker:(JS::NativeImagePicker::VideoPickerOption &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
|
|
64
|
+
self.resolveBlock = resolve;
|
|
65
|
+
self.rejectBlock = reject;
|
|
66
|
+
self.callback = nil;
|
|
67
|
+
[self openVideoPickerWithOptions:options];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
- (void)openVideoPickerWithOptions:(JS::NativeImagePicker::VideoPickerOption &)options {
|
|
71
|
+
NSInteger videoCount = options.videoCount();
|
|
72
|
+
BOOL isCamera = options.isCamera();
|
|
73
|
+
BOOL sortAscendingByModificationDate = options.sortAscendingByModificationDate();
|
|
74
|
+
BOOL showSelectedIndex = options.showSelectedIndex();
|
|
75
|
+
|
|
76
|
+
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:videoCount delegate:self];
|
|
77
|
+
imagePickerVc.iconThemeColor = [UIColor colorWithRed:255.0/255.0 green:177.0/255.0 blue:82.0/255.0 alpha:1.0];
|
|
78
|
+
imagePickerVc.maxImagesCount = videoCount;
|
|
79
|
+
imagePickerVc.allowPickingImage = NO;
|
|
80
|
+
imagePickerVc.allowPickingVideo = YES;
|
|
81
|
+
imagePickerVc.allowTakeVideo = isCamera;
|
|
82
|
+
imagePickerVc.allowTakePicture = NO;
|
|
83
|
+
imagePickerVc.allowPickingGif = NO;
|
|
84
|
+
imagePickerVc.allowCrop = NO;
|
|
85
|
+
imagePickerVc.showSelectedIndex = showSelectedIndex;
|
|
86
|
+
imagePickerVc.sortAscendingByModificationDate = sortAscendingByModificationDate;
|
|
87
|
+
imagePickerVc.modalPresentationStyle = UIModalPresentationFullScreen;
|
|
88
|
+
|
|
89
|
+
if (videoCount == 1) {
|
|
90
|
+
imagePickerVc.showSelectBtn = NO;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
__weak TZImagePickerController *weakPickerVc = imagePickerVc;
|
|
94
|
+
[imagePickerVc setDidFinishPickingPhotosWithInfosHandle:^(NSArray<UIImage *> *photos, NSArray *assets, BOOL isSelectOriginalPhoto, NSArray<NSDictionary *> *infos) {
|
|
95
|
+
[weakPickerVc showProgressHUD];
|
|
96
|
+
NSMutableArray *videoResults = [NSMutableArray array];
|
|
97
|
+
[assets enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
98
|
+
if (asset.mediaType == PHAssetMediaTypeVideo) {
|
|
99
|
+
[[TZImageManager manager] getVideoOutputPathWithAsset:asset presetName:AVAssetExportPresetHighestQuality success:^(NSString *outputPath) {
|
|
100
|
+
[videoResults addObject:[self handleVideoPickerData:outputPath asset:asset]];
|
|
101
|
+
if ([videoResults count] == [assets count]) {
|
|
102
|
+
[self invokeSuccessWithResult:videoResults];
|
|
103
|
+
}
|
|
104
|
+
} failure:^(NSString *errorMessage, NSError *error) {
|
|
105
|
+
[self invokeError];
|
|
106
|
+
}];
|
|
107
|
+
}
|
|
108
|
+
}];
|
|
109
|
+
[weakPickerVc hideProgressHUD];
|
|
110
|
+
}];
|
|
111
|
+
|
|
112
|
+
[imagePickerVc setImagePickerControllerDidCancelHandle:^{
|
|
113
|
+
[self invokeError];
|
|
114
|
+
[weakPickerVc hideProgressHUD];
|
|
115
|
+
}];
|
|
116
|
+
|
|
117
|
+
[[self topViewController] presentViewController:imagePickerVc animated:YES completion:nil];
|
|
118
|
+
}
|
|
119
|
+
|
|
63
120
|
- (void)openImagePicker {
|
|
64
121
|
// 照片最大可选张数
|
|
65
|
-
NSInteger imageCount =
|
|
122
|
+
NSInteger imageCount = _cameraOptions->imageCount();
|
|
66
123
|
// 显示内部拍照按钮
|
|
67
|
-
BOOL isCamera =
|
|
68
|
-
BOOL isCrop =
|
|
69
|
-
BOOL isGif =
|
|
70
|
-
BOOL showCropCircle =
|
|
71
|
-
BOOL isRecordSelected =
|
|
72
|
-
BOOL allowPickingOriginalPhoto =
|
|
73
|
-
BOOL allowPickingMultipleVideo =
|
|
74
|
-
BOOL sortAscendingByModificationDate =
|
|
75
|
-
BOOL showSelectedIndex =
|
|
76
|
-
NSInteger CropW =
|
|
77
|
-
NSInteger CropH =
|
|
78
|
-
NSInteger circleCropRadius =
|
|
79
|
-
NSInteger quality =
|
|
124
|
+
BOOL isCamera = _cameraOptions->isCamera();
|
|
125
|
+
BOOL isCrop = _cameraOptions->isCrop();
|
|
126
|
+
BOOL isGif = _cameraOptions->isGif();
|
|
127
|
+
BOOL showCropCircle = _cameraOptions->showCropCircle();
|
|
128
|
+
BOOL isRecordSelected = _cameraOptions->isRecordSelected();
|
|
129
|
+
BOOL allowPickingOriginalPhoto = _cameraOptions->allowPickingOriginalPhoto();
|
|
130
|
+
BOOL allowPickingMultipleVideo = _cameraOptions->allowPickingMultipleVideo();
|
|
131
|
+
BOOL sortAscendingByModificationDate = _cameraOptions->sortAscendingByModificationDate();
|
|
132
|
+
BOOL showSelectedIndex = _cameraOptions->showSelectedIndex();
|
|
133
|
+
NSInteger CropW = _cameraOptions->CropW();
|
|
134
|
+
NSInteger CropH = _cameraOptions->CropH();
|
|
135
|
+
NSInteger circleCropRadius = _cameraOptions->circleCropRadius();
|
|
136
|
+
NSInteger quality = _cameraOptions->quality();
|
|
80
137
|
|
|
81
138
|
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:imageCount delegate:self];
|
|
82
139
|
imagePickerVc.iconThemeColor = [UIColor colorWithRed:255.0/255.0 green:177.0/255.0 blue:82.0/255.0 alpha:1.0];
|
|
@@ -208,12 +265,12 @@
|
|
|
208
265
|
[tzImagePickerVc hideProgressHUD];
|
|
209
266
|
|
|
210
267
|
TZAssetModel *assetModel = [[TZImageManager manager] createModelWithAsset:asset];
|
|
211
|
-
BOOL isCrop =
|
|
212
|
-
BOOL showCropCircle =
|
|
213
|
-
NSInteger CropW =
|
|
214
|
-
NSInteger CropH =
|
|
215
|
-
NSInteger circleCropRadius =
|
|
216
|
-
NSInteger
|
|
268
|
+
BOOL isCrop = self->_cameraOptions->isCrop();
|
|
269
|
+
BOOL showCropCircle = self->_cameraOptions->showCropCircle();
|
|
270
|
+
NSInteger CropW = self->_cameraOptions->CropW();
|
|
271
|
+
NSInteger CropH = self->_cameraOptions->CropH();
|
|
272
|
+
NSInteger circleCropRadius = self->_cameraOptions->circleCropRadius();
|
|
273
|
+
NSInteger quality = self->_cameraOptions->quality();
|
|
217
274
|
|
|
218
275
|
if (isCrop) {
|
|
219
276
|
TZImagePickerController *imagePicker = [[TZImagePickerController alloc] initCropTypeWithAsset:assetModel.asset photo:image completion:^(UIImage *cropImage, id asset) {
|
|
@@ -253,7 +310,7 @@
|
|
|
253
310
|
}
|
|
254
311
|
|
|
255
312
|
- (BOOL)isAssetCanSelect:(PHAsset *)asset {
|
|
256
|
-
BOOL allowPickingGif =
|
|
313
|
+
BOOL allowPickingGif = _cameraOptions->isGif();
|
|
257
314
|
BOOL isGIF = [[TZImageManager manager] getAssetType:asset] == TZAssetModelMediaTypePhotoGif;
|
|
258
315
|
if (!allowPickingGif && isGIF) {
|
|
259
316
|
return NO;
|
|
@@ -311,7 +368,7 @@
|
|
|
311
368
|
NSString *fileExtension = [filename pathExtension];
|
|
312
369
|
NSMutableString *filePath = [NSMutableString string];
|
|
313
370
|
BOOL isPNG = [fileExtension hasSuffix:@"PNG"] || [fileExtension hasSuffix:@"png"];
|
|
314
|
-
BOOL compressFocusAlpha =
|
|
371
|
+
BOOL compressFocusAlpha = _cameraOptions->compressFocusAlpha();
|
|
315
372
|
|
|
316
373
|
if (isPNG) {
|
|
317
374
|
[filePath appendString:[NSString stringWithFormat:@"%@SyanImageCaches/%@", NSTemporaryDirectory(), filename]];
|
|
@@ -328,7 +385,7 @@
|
|
|
328
385
|
NSInteger size = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil].fileSize;
|
|
329
386
|
photo[@"size"] = @(size);
|
|
330
387
|
photo[@"mediaType"] = @(phAsset.mediaType);
|
|
331
|
-
if (
|
|
388
|
+
if (_cameraOptions->enableBase64()) {
|
|
332
389
|
if(isPNG){
|
|
333
390
|
photo[@"base64"] = [NSString stringWithFormat:@"data:image/png;base64,%@", [writeData base64EncodedStringWithOptions:0]];
|
|
334
391
|
}else{
|
|
@@ -350,7 +407,7 @@
|
|
|
350
407
|
NSData *writeData = nil;
|
|
351
408
|
NSMutableString *filePath = [NSMutableString string];
|
|
352
409
|
BOOL isPNG = [fileExtension hasSuffix:@"PNG"] || [fileExtension hasSuffix:@"png"];
|
|
353
|
-
BOOL compressFocusAlpha =
|
|
410
|
+
BOOL compressFocusAlpha = _cameraOptions->compressFocusAlpha();
|
|
354
411
|
|
|
355
412
|
if (isGIF) {
|
|
356
413
|
image = [UIImage sd_tz_animatedGIFWithData:data];
|
|
@@ -374,7 +431,7 @@
|
|
|
374
431
|
NSInteger size = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil].fileSize;
|
|
375
432
|
photo[@"size"] = @(size);
|
|
376
433
|
photo[@"mediaType"] = @(phAsset.mediaType);
|
|
377
|
-
if (
|
|
434
|
+
if (_cameraOptions->enableBase64() && !isGIF) {
|
|
378
435
|
if(isPNG){
|
|
379
436
|
photo[@"base64"] = [NSString stringWithFormat:@"data:image/png;base64,%@", [writeData base64EncodedStringWithOptions:0]];
|
|
380
437
|
}else{
|
|
@@ -385,7 +442,7 @@
|
|
|
385
442
|
return photo;
|
|
386
443
|
}
|
|
387
444
|
|
|
388
|
-
/// 处理视频数据
|
|
445
|
+
/// 处理视频数据 (混合选择模式)
|
|
389
446
|
- (NSDictionary *)handleVideoData:(NSString *)outputPath asset:(PHAsset *)asset coverImage:(UIImage *)coverImage quality:(CGFloat)quality {
|
|
390
447
|
NSMutableDictionary *video = [NSMutableDictionary dictionary];
|
|
391
448
|
video[@"uri"] = outputPath;
|
|
@@ -405,6 +462,26 @@
|
|
|
405
462
|
return video;
|
|
406
463
|
}
|
|
407
464
|
|
|
465
|
+
/// 处理视频数据 (纯视频选择模式,返回格式兼容 react-native-image-crop-picker)
|
|
466
|
+
- (NSDictionary *)handleVideoPickerData:(NSString *)outputPath asset:(PHAsset *)asset {
|
|
467
|
+
NSMutableDictionary *video = [NSMutableDictionary dictionary];
|
|
468
|
+
video[@"path"] = [NSString stringWithFormat:@"file://%@", outputPath];
|
|
469
|
+
video[@"size"] = @([[[NSFileManager defaultManager] attributesOfItemAtPath:outputPath error:nil] fileSize]);
|
|
470
|
+
video[@"width"] = @(asset.pixelWidth);
|
|
471
|
+
video[@"height"] = @(asset.pixelHeight);
|
|
472
|
+
video[@"duration"] = @((long long)(asset.duration * 1000));
|
|
473
|
+
video[@"mime"] = @"video/mp4";
|
|
474
|
+
video[@"filename"] = [asset valueForKey:@"filename"];
|
|
475
|
+
video[@"localIdentifier"] = asset.localIdentifier;
|
|
476
|
+
video[@"sourceURL"] = [NSString stringWithFormat:@"assets-library://asset/asset.mov?id=%@&ext=mov", asset.localIdentifier];
|
|
477
|
+
// modificationDate
|
|
478
|
+
if (asset.modificationDate) {
|
|
479
|
+
video[@"modificationDate"] = [NSString stringWithFormat:@"%.0f", [asset.modificationDate timeIntervalSince1970]];
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
return video;
|
|
483
|
+
}
|
|
484
|
+
|
|
408
485
|
/// 创建SyanImageCaches缓存目录
|
|
409
486
|
- (BOOL)createDir {
|
|
410
487
|
NSString * path = [NSString stringWithFormat:@"%@SyanImageCaches", NSTemporaryDirectory()];;
|
|
@@ -58,5 +58,14 @@ export const defaultOptions = {
|
|
|
58
58
|
// 对照片排序,按修改时间升序,默认是YES。如果设置为NO,最新的照片会显示在最前面,内部的拍照按钮会排在第一个
|
|
59
59
|
showSelectedIndex: false // 是否显示序号, 默认不显示
|
|
60
60
|
};
|
|
61
|
+
export const defaultVideoOptions = {
|
|
62
|
+
videoCount: 1,
|
|
63
|
+
isCamera: true,
|
|
64
|
+
MaxSecond: 180,
|
|
65
|
+
MinSecond: 1,
|
|
66
|
+
videoMaximumDuration: 600,
|
|
67
|
+
sortAscendingByModificationDate: true,
|
|
68
|
+
showSelectedIndex: false
|
|
69
|
+
};
|
|
61
70
|
export default TurboModuleRegistry.getEnforcing('NativeImagePicker');
|
|
62
71
|
//# sourceMappingURL=NativeImagePicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","Dimensions","width","get","defaultOptions","imageCount","isRecordSelected","isCamera","isCrop","CropW","CropH","isGif","showCropCircle","circleCropRadius","showCropFrame","showCropGrid","freeStyleCropEnabled","rotateEnabled","scaleEnabled","compress","compressFocusAlpha","minimumCompressSize","quality","enableBase64","allowPickingOriginalPhoto","allowPickingMultipleVideo","videoMaximumDuration","isWeChatStyle","sortAscendingByModificationDate","showSelectedIndex","getEnforcing"],"sourceRoot":"../../src","sources":["NativeImagePicker.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AACpE,SAASC,UAAU,QAAQ,cAAc;AAyCzC,MAAM;EAAEC;AAAM,CAAC,GAAGD,UAAU,CAACE,GAAG,CAAC,QAAQ,CAAC;;AAE1C;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAG;EAC1BC,UAAU,EAAE,CAAC;EAAc;EAC3BC,gBAAgB,EAAE,KAAK;EAAI;EAC3BC,QAAQ,EAAE,IAAI;EAAa;EAC3BC,MAAM,EAAE,KAAK;EAAc;EAC3BC,KAAK,EAAE,CAAC,EAAEP,KAAK,GAAG,GAAG,CAAC;EAAK;EAC3BQ,KAAK,EAAE,CAAC,EAAER,KAAK,GAAG,GAAG,CAAC;EAAK;EAC3BS,KAAK,EAAE,KAAK;EAAe;EAC3BC,cAAc,EAAE,KAAK;EAAM;EAC3BC,gBAAgB,EAAE,CAAC,EAAEX,KAAK,GAAG,CAAC,CAAC;EAAE;EACjCY,aAAa,EAAE,IAAI;EAAQ;EAC3BC,YAAY,EAAE,KAAK;EAAQ;EAC3BC,oBAAoB,EAAE,KAAK;EAAE;EAC7BC,aAAa,EAAE,IAAI;EAAQ;EAC3BC,YAAY,EAAE,IAAI;EAAS;EAC3BC,QAAQ,EAAE,IAAI;EACdC,kBAAkB,EAAC,KAAK;EAAI;EAC5BC,mBAAmB,EAAE,GAAG;EAAG;EAC3BC,OAAO,EAAE,EAAE;EAAgB;EAC3BC,YAAY,EAAE,KAAK;EAAQ;EAC3BC,yBAAyB,EAAE,KAAK;EAChCC,yBAAyB,EAAE,KAAK;EAAE;EAClCC,oBAAoB,EAAE,EAAE,GAAG,EAAE;EAAE;EAC/BC,aAAa,EAAE,KAAK;EAAO;EAC3BC,+BAA+B,EAAE,IAAI;EAAE;EACvCC,iBAAiB,EAAE,KAAK,CAAE;AAC9B,CAAC;
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","Dimensions","width","get","defaultOptions","imageCount","isRecordSelected","isCamera","isCrop","CropW","CropH","isGif","showCropCircle","circleCropRadius","showCropFrame","showCropGrid","freeStyleCropEnabled","rotateEnabled","scaleEnabled","compress","compressFocusAlpha","minimumCompressSize","quality","enableBase64","allowPickingOriginalPhoto","allowPickingMultipleVideo","videoMaximumDuration","isWeChatStyle","sortAscendingByModificationDate","showSelectedIndex","defaultVideoOptions","videoCount","MaxSecond","MinSecond","getEnforcing"],"sourceRoot":"../../src","sources":["NativeImagePicker.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AACpE,SAASC,UAAU,QAAQ,cAAc;AAyCzC,MAAM;EAAEC;AAAM,CAAC,GAAGD,UAAU,CAACE,GAAG,CAAC,QAAQ,CAAC;;AAE1C;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAG;EAC1BC,UAAU,EAAE,CAAC;EAAc;EAC3BC,gBAAgB,EAAE,KAAK;EAAI;EAC3BC,QAAQ,EAAE,IAAI;EAAa;EAC3BC,MAAM,EAAE,KAAK;EAAc;EAC3BC,KAAK,EAAE,CAAC,EAAEP,KAAK,GAAG,GAAG,CAAC;EAAK;EAC3BQ,KAAK,EAAE,CAAC,EAAER,KAAK,GAAG,GAAG,CAAC;EAAK;EAC3BS,KAAK,EAAE,KAAK;EAAe;EAC3BC,cAAc,EAAE,KAAK;EAAM;EAC3BC,gBAAgB,EAAE,CAAC,EAAEX,KAAK,GAAG,CAAC,CAAC;EAAE;EACjCY,aAAa,EAAE,IAAI;EAAQ;EAC3BC,YAAY,EAAE,KAAK;EAAQ;EAC3BC,oBAAoB,EAAE,KAAK;EAAE;EAC7BC,aAAa,EAAE,IAAI;EAAQ;EAC3BC,YAAY,EAAE,IAAI;EAAS;EAC3BC,QAAQ,EAAE,IAAI;EACdC,kBAAkB,EAAC,KAAK;EAAI;EAC5BC,mBAAmB,EAAE,GAAG;EAAG;EAC3BC,OAAO,EAAE,EAAE;EAAgB;EAC3BC,YAAY,EAAE,KAAK;EAAQ;EAC3BC,yBAAyB,EAAE,KAAK;EAChCC,yBAAyB,EAAE,KAAK;EAAE;EAClCC,oBAAoB,EAAE,EAAE,GAAG,EAAE;EAAE;EAC/BC,aAAa,EAAE,KAAK;EAAO;EAC3BC,+BAA+B,EAAE,IAAI;EAAE;EACvCC,iBAAiB,EAAE,KAAK,CAAE;AAC9B,CAAC;AAqBD,OAAO,MAAMC,mBAAmB,GAAG;EAC/BC,UAAU,EAAE,CAAC;EACbxB,QAAQ,EAAE,IAAI;EACdyB,SAAS,EAAE,GAAG;EACdC,SAAS,EAAE,CAAC;EACZP,oBAAoB,EAAE,GAAG;EACzBE,+BAA+B,EAAE,IAAI;EACrCC,iBAAiB,EAAE;AACvB,CAAC;AAOD,eAAe7B,mBAAmB,CAACkC,YAAY,CAAO,mBAAmB,CAAC","ignoreList":[]}
|
|
@@ -68,8 +68,36 @@ export declare const defaultOptions: {
|
|
|
68
68
|
sortAscendingByModificationDate: boolean;
|
|
69
69
|
showSelectedIndex: boolean;
|
|
70
70
|
};
|
|
71
|
+
export type VideoPickerOption = {
|
|
72
|
+
videoCount: number;
|
|
73
|
+
isCamera: boolean;
|
|
74
|
+
MaxSecond: number;
|
|
75
|
+
MinSecond: number;
|
|
76
|
+
videoMaximumDuration: number;
|
|
77
|
+
sortAscendingByModificationDate: boolean;
|
|
78
|
+
showSelectedIndex: boolean;
|
|
79
|
+
};
|
|
80
|
+
interface SelectedVideo {
|
|
81
|
+
path: string;
|
|
82
|
+
size: number;
|
|
83
|
+
width: number;
|
|
84
|
+
height: number;
|
|
85
|
+
duration: number | null;
|
|
86
|
+
mime: string;
|
|
87
|
+
filename?: string;
|
|
88
|
+
}
|
|
89
|
+
export declare const defaultVideoOptions: {
|
|
90
|
+
videoCount: number;
|
|
91
|
+
isCamera: boolean;
|
|
92
|
+
MaxSecond: number;
|
|
93
|
+
MinSecond: number;
|
|
94
|
+
videoMaximumDuration: number;
|
|
95
|
+
sortAscendingByModificationDate: boolean;
|
|
96
|
+
showSelectedIndex: boolean;
|
|
97
|
+
};
|
|
71
98
|
export interface Spec extends TurboModule {
|
|
72
|
-
asyncShowImagePicker(options:
|
|
99
|
+
asyncShowImagePicker(options: ImagePickerOption): Promise<Array<SelectedPhoto>>;
|
|
100
|
+
asyncShowVideoPicker(options: VideoPickerOption): Promise<Array<SelectedVideo>>;
|
|
73
101
|
}
|
|
74
102
|
declare const _default: Spec;
|
|
75
103
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeImagePicker.d.ts","sourceRoot":"","sources":["../../../src/NativeImagePicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAC,OAAO,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B,EAAE,OAAO,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAA;
|
|
1
|
+
{"version":3,"file":"NativeImagePicker.d.ts","sourceRoot":"","sources":["../../../src/NativeImagePicker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAC,OAAO,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B,EAAE,OAAO,CAAA;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAA;AAEH,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAC,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAC,MAAM,CAAC;IACZ,MAAM,EAAC,MAAM,CAAA;CACd;AAGH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B1B,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+BAA+B,EAAE,OAAO,CAAC;IACzC,iBAAiB,EAAE,OAAO,CAAC;CAC9B,CAAA;AAED,UAAU,aAAa;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,mBAAmB;;;;;;;;CAQ/B,CAAA;AAED,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,oBAAoB,CAAC,OAAO,EAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/E,oBAAoB,CAAC,OAAO,EAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;CAChF;;AAED,wBAA2E"}
|
package/package.json
CHANGED
package/src/NativeImagePicker.ts
CHANGED
|
@@ -31,7 +31,7 @@ export type ImagePickerOption = {
|
|
|
31
31
|
showSelectedIndex: boolean, // 是否显示序号, 默认不显示
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
export interface SelectedPhoto {
|
|
35
35
|
width: number, //图片宽度
|
|
36
36
|
height: number, //图片高度
|
|
37
37
|
uri: string, //图片路径
|
|
@@ -72,8 +72,39 @@ export const defaultOptions = {
|
|
|
72
72
|
sortAscendingByModificationDate: true, // 对照片排序,按修改时间升序,默认是YES。如果设置为NO,最新的照片会显示在最前面,内部的拍照按钮会排在第一个
|
|
73
73
|
showSelectedIndex: false, // 是否显示序号, 默认不显示
|
|
74
74
|
};
|
|
75
|
+
export type VideoPickerOption = {
|
|
76
|
+
videoCount: number, // 最大选择视频数目,默认1
|
|
77
|
+
isCamera: boolean, // 是否允许录制视频,默认true
|
|
78
|
+
MaxSecond: number, // 选择视频最大时长,默认是180秒
|
|
79
|
+
MinSecond: number, // 选择视频最小时长,默认是1秒
|
|
80
|
+
videoMaximumDuration: number, // 视频最大录制时长,默认是600秒
|
|
81
|
+
sortAscendingByModificationDate: boolean, // 按修改时间升序,默认是YES
|
|
82
|
+
showSelectedIndex: boolean, // 是否显示序号,默认不显示
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
interface SelectedVideo {
|
|
86
|
+
path: string, // 视频路径
|
|
87
|
+
size: number, // 文件大小,单位为字节
|
|
88
|
+
width: number, // 视频宽度
|
|
89
|
+
height: number, // 视频高度
|
|
90
|
+
duration: number | null, // 视频时长,单位毫秒
|
|
91
|
+
mime: string, // 视频mime类型,如 "video/mp4"
|
|
92
|
+
filename?: string, // 视频文件名
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export const defaultVideoOptions = {
|
|
96
|
+
videoCount: 1,
|
|
97
|
+
isCamera: true,
|
|
98
|
+
MaxSecond: 180,
|
|
99
|
+
MinSecond: 1,
|
|
100
|
+
videoMaximumDuration: 600,
|
|
101
|
+
sortAscendingByModificationDate: true,
|
|
102
|
+
showSelectedIndex: false,
|
|
103
|
+
}
|
|
104
|
+
|
|
75
105
|
export interface Spec extends TurboModule {
|
|
76
|
-
asyncShowImagePicker(options:
|
|
106
|
+
asyncShowImagePicker(options:ImagePickerOption): Promise<Array<SelectedPhoto>>;
|
|
107
|
+
asyncShowVideoPicker(options:VideoPickerOption): Promise<Array<SelectedVideo>>;
|
|
77
108
|
}
|
|
78
109
|
|
|
79
110
|
export default TurboModuleRegistry.getEnforcing<Spec>('NativeImagePicker');
|
package/src/index.tsx
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import NativeImagePicker from './NativeImagePicker';
|
|
2
|
+
|
|
3
|
+
const HTNativeImagePicker = (() => {
|
|
4
|
+
return {
|
|
5
|
+
asyncShowImagePicker: NativeImagePicker.asyncShowImagePicker,
|
|
6
|
+
asyncShowVideoPicker: NativeImagePicker.asyncShowVideoPicker,
|
|
7
|
+
};
|
|
8
|
+
})()
|
|
9
|
+
|
|
10
|
+
export default HTNativeImagePicker
|