Skip to content

Commit 389cd75

Browse files
committed
response singleSelectedMode from array[] -> object{}
1 parent 28f143e commit 389cd75

File tree

7 files changed

+78
-20
lines changed

7 files changed

+78
-20
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ const response = await MultipleImagePicker.openPicker(options);
126126

127127
#### selectedAssets (Important)
128128

129-
Get an Array value only. If you want React Native Multiple Image Picker to re-select previously selected images / videos, you need to add “selectedAssets” in [options](#Options). Perhaps I say a little bit confusing. See [Example](https://github.com/baronha/react-native-multiple-image-picker/tree/main/example) for more details.
129+
Get an Array value only(Only works when ```singleSelectedMode === false```). If you want React Native Multiple Image Picker to re-select previously selected images / videos, you need to add “selectedAssets” in [options](#Options). Perhaps I say a little bit confusing. See [Example](https://github.com/baronha/react-native-multiple-image-picker/tree/main/example) for more details.
130130

131131
## Response Object
132132

android/src/main/java/com/reactnativemultipleimagepicker/MultipleImagePickerModule.kt

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import com.luck.picture.lib.engine.PictureSelectorEngine
1616
import com.luck.picture.lib.entity.LocalMedia
1717
import com.luck.picture.lib.entity.LocalMedia.parseLocalMedia
1818
import com.luck.picture.lib.listener.OnResultCallbackListener
19+
import com.luck.picture.lib.manager.UCropManager
1920
import com.luck.picture.lib.style.PictureParameterStyle
21+
import com.yalantis.ucrop.model.AspectRatio
22+
import com.yalantis.ucrop.view.CropImageView
2023
import java.io.File
2124
import java.io.FileOutputStream
2225
import java.io.IOException
@@ -43,18 +46,46 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
4346
private var isExportThumbnail: Boolean = false
4447
private var maxVideo: Int = 20
4548
private var isCamera: Boolean = true
49+
private var isCrop: Boolean = false
50+
private var isCropCircle: Boolean = false
4651

4752
@ReactMethod
4853
fun openPicker(options: ReadableMap?, promise: Promise): Unit {
4954
PictureAppMaster.getInstance().app = this
5055
val activity = currentActivity
5156
setConfiguration(options)
5257

58+
//set up configration ucrop
59+
val basicUCropConfig = UCropManager.basicOptions(appContext);
60+
basicUCropConfig.setShowCropFrame(true)
61+
basicUCropConfig.setShowCropGrid(true)
62+
basicUCropConfig.setCropDragSmoothToCenter(true)
63+
basicUCropConfig.setHideBottomControls(false)
64+
basicUCropConfig.setCircleDimmedLayer(isCropCircle)
65+
if(isCropCircle){
66+
basicUCropConfig.withAspectRatio(1F,1F)
67+
basicUCropConfig.setShowCropFrame(false)
68+
}else{
69+
basicUCropConfig.setAspectRatioOptions(
70+
1,
71+
AspectRatio("1:2", 1F, 2F),
72+
AspectRatio("3:4", 3F, 4F),
73+
// AspectRatio(
74+
// "RATIO",
75+
// CropImageView.DEFAULT_ASPECT_RATIO,
76+
// CropImageView.DEFAULT_ASPECT_RATIO
77+
// ),
78+
AspectRatio("16:9", 16F, 9F),
79+
AspectRatio("1:1", 1F, 1F)
80+
)
81+
}
82+
5383
PictureSelector.create(activity)
5484
.openGallery(if (mediaType == "video") PictureMimeType.ofVideo() else if (mediaType == "image") PictureMimeType.ofImage() else PictureMimeType.ofAll())
5585
.loadImageEngine(GlideEngine.createGlideEngine())
5686
.maxSelectNum(maxSelectedAssets)
5787
.imageSpanCount(numberOfColumn)
88+
.isSingleDirectReturn(true)
5889
.isZoomAnim(true)
5990
.isPageStrategy(true, 50)
6091
.isWithVideoImage(true)
@@ -65,20 +96,12 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
6596
.setPictureStyle(mPictureParameterStyle)
6697
.isPreviewImage(isPreview)
6798
.isPreviewVideo(isPreview)
99+
.isEnableCrop(isCrop)
100+
.basicUCropConfig(basicUCropConfig)
68101
.isCamera(isCamera)
69-
.isReturnEmpty(true)
70102
.selectionMode(if (singleSelectedMode) PictureConfig.SINGLE else PictureConfig.MULTIPLE)
71103
.forResult(object : OnResultCallbackListener<LocalMedia?> {
72104
override fun onResult(result: MutableList<LocalMedia?>?) {
73-
//check difference
74-
if (singleSelectedMode) {
75-
val singleLocalMedia: WritableArray = WritableNativeArray()
76-
val media: WritableMap =
77-
createAttachmentResponse(result?.get(0) as LocalMedia)
78-
singleLocalMedia.pushMap(media)
79-
promise.resolve(singleLocalMedia)
80-
return
81-
}
82105
val localMedia: WritableArray = WritableNativeArray()
83106
if (result?.size == 0) {
84107
promise.resolve(localMedia)
@@ -90,7 +113,6 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
90113
if (result != null) {
91114
for (i in 0 until result.size) {
92115
val item: LocalMedia = result[i] as LocalMedia
93-
println("item: $item")
94116
val media: WritableMap = createAttachmentResponse(item)
95117
localMedia.pushMap(media)
96118
}
@@ -107,6 +129,7 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
107129
private fun setConfiguration(options: ReadableMap?) {
108130
if (options != null) {
109131
handleSelectedAssets(options)
132+
val cropping = options.getBoolean("isCrop")
110133
singleSelectedMode = options.getBoolean("singleSelectedMode")
111134
maxVideoDuration = options.getInt("maxVideoDuration")
112135
numberOfColumn = options.getInt("numberOfColumn")
@@ -117,16 +140,18 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
117140
maxVideo = options.getInt("maxVideo")
118141
mPictureParameterStyle = getStyle(options)
119142
isCamera = options.getBoolean("usedCameraButton")
143+
isCropCircle = options.getBoolean("isCropCircle")
144+
isCrop = cropping == true && singleSelectedMode == true
120145
}
121146
}
122147

123148
private fun getStyle(options: ReadableMap): PictureParameterStyle? {
124149
val pictureStyle = PictureParameterStyle()
125-
pictureStyle.pictureCheckedStyle = R.drawable.picture_selector
150+
pictureStyle.pictureCheckedStyle = if(singleSelectedMode) R.drawable.checkbox_selector else R.drawable.picture_selector
126151

127152
//bottom style
128153
pictureStyle.pictureCompleteText = options.getString("doneTitle")
129-
pictureStyle.isOpenCheckNumStyle = true
154+
pictureStyle.isOpenCheckNumStyle = if(singleSelectedMode) false else true
130155
pictureStyle.isCompleteReplaceNum = true
131156
pictureStyle.pictureCompleteTextSize = 16
132157
pictureStyle.pictureCheckNumBgStyle = R.drawable.num_oval_orange
@@ -218,6 +243,13 @@ class MultipleImagePickerModule(reactContext: ReactApplicationContext) :
218243
media.putDouble("size", item.size.toDouble())
219244
media.putDouble("bucketId", item.bucketId.toDouble())
220245
media.putString("parentFolderName", item.parentFolderName)
246+
if(item.isCut){
247+
val crop = WritableNativeMap()
248+
crop.putString("cropPath", item.cutPath)
249+
crop.putDouble("width", item.cropImageWidth.toDouble())
250+
crop.putDouble("height", item.cropImageHeight.toDouble())
251+
media.putMap("crop", crop)
252+
}
221253
if (type === "video" && isExportThumbnail) {
222254
val thumbnail = createThumbnail(item.realPath)
223255
println("thumbnail: $thumbnail")
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3-
<item android:drawable="@drawable/picture_icon_def" android:state_selected="false" />
4-
<item android:drawable="@drawable/picture_icon_sel" android:state_selected="true" />
3+
<item android:drawable="@drawable/picture_not_selected" android:state_selected="false" />
4+
<item android:drawable="@drawable/ic_checkmark" android:state_selected="true" />
55
</selector>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:pathData="M12,12m-12,0a12,12 0,1 1,24 0a12,12 0,1 1,-24 0"
8+
android:fillColor="@color/app_color_pri"/>
9+
<path
10+
android:pathData="M15.7936,6.5936L10.1279,14.0879L7.6847,10.9253C7.4402,10.6113 7.081,10.4072 6.6861,10.358C6.2912,10.3088 5.8928,10.4185 5.5788,10.663C5.2648,10.9075 5.0607,11.2667 5.0115,11.6617C4.9623,12.0566 5.072,12.4549 5.3165,12.7689L8.9588,17.4304C9.0999,17.609 9.2799,17.7532 9.4851,17.8519C9.6902,17.9506 9.9152,18.0012 10.1429,18C10.3718,17.9994 10.5975,17.9465 10.8028,17.8451C11.008,17.7438 11.1873,17.5968 11.327,17.4154L18.1768,8.4222C18.4193,8.1042 18.5255,7.7029 18.4721,7.3065C18.4187,6.9102 18.21,6.5513 17.892,6.3088C17.574,6.0663 17.1727,5.9601 16.7763,6.0135C16.38,6.0669 16.0211,6.2756 15.7786,6.5936H15.7936Z"
11+
android:fillColor="#ffffff"/>
12+
</vector>

example/src/App.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ export default function App() {
1414
isExportThumbnail: true,
1515
maxVideo: 1,
1616
usedCameraButton: false,
17+
singleSelectedMode: true,
18+
isCrop: true,
19+
isCropCircle: true,
1720
// selectedColor: '#f9813a',
1821
});
1922
console.log('done: ', response);
20-
setImages(response);
23+
setImages([response]);
2124
} catch (e) {
2225
console.log(e.code, e.message);
2326
}
@@ -38,7 +41,10 @@ export default function App() {
3841
<Image
3942
width={IMAGE_WIDTH}
4043
source={{
41-
uri: item?.type === 'video' ? item?.thumbnail ?? '' : item?.path,
44+
uri:
45+
item?.type === 'video'
46+
? item?.thumbnail ?? ''
47+
: 'file://' + item?.crop?.cropPath,
4248
}}
4349
style={style.media}
4450
/>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@baronha/react-native-multiple-image-picker",
3-
"version": "0.4.7",
3+
"version": "0.4.8",
44
"description": "react-native-multiple-image-picker enables application to pick images and videos from multiple smart album in iOS/Android, similar to the current facebook app.",
55
"main": "lib/commonjs/index",
66
"module": "lib/module/index",

src/index.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ let defaultOptions = {
4040
maxVideoDuration: 60, //for camera : max video recording duration
4141
numberOfColumn: 3,
4242
maxSelectedAssets: 20,
43-
singleSelectedMode: false,
4443
doneTitle: 'Done',
4544
isPreview: true,
4645
mediaType: 'all',
4746
isExportThumbnail: false,
4847
maxVideo: 20,
4948
selectedAssets: [],
49+
singleSelectedMode: false,
50+
isCrop: false,
51+
isCropCircle: false,
5052
//****//
5153

5254
// fetchOption: Object,
@@ -61,11 +63,17 @@ exportObject = {
6163
...defaultOptions,
6264
...optionsPicker,
6365
};
66+
const isSingle = options?.singleSelectedMode ?? false;
67+
if (isSingle) options.selectedAssets = [];
68+
6469
return new Promise(async (resolve, reject) => {
6570
try {
6671
const response = await MultipleImagePicker.openPicker(options);
6772
// console.log('res', response);
6873
if (response?.length) {
74+
if (isSingle) {
75+
resolve(response[0]);
76+
}
6977
resolve(response);
7078
return;
7179
}

0 commit comments

Comments
 (0)