react-native-my-uploader-android 1.0.43 → 1.0.45
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/android/src/main/java/com/myuploaderandroid/MyUploaderModule.kt +237 -4
- package/lib/commonjs/components/MyUploader.js +33 -6
- package/lib/commonjs/components/MyUploader.js.map +1 -1
- package/lib/commonjs/types.js.map +1 -1
- package/lib/module/components/MyUploader.js +29 -4
- package/lib/module/components/MyUploader.js.map +1 -1
- package/lib/module/types.js.map +1 -1
- package/package.json +1 -1
- package/src/components/MyUploader.tsx +37 -6
- package/src/types.ts +9 -0
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
package com.myuploaderandroid
|
|
2
2
|
|
|
3
|
+
import androidx.exifinterface.media.ExifInterface
|
|
4
|
+
import java.io.File
|
|
5
|
+
import java.io.FileOutputStream
|
|
6
|
+
import java.io.InputStream
|
|
3
7
|
import android.app.Activity
|
|
4
8
|
import android.content.Intent
|
|
5
9
|
import android.net.Uri
|
|
@@ -22,6 +26,7 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
22
26
|
private var maxSize: Double = 0.0
|
|
23
27
|
private var maxFiles: Int = 0
|
|
24
28
|
private var excludedUris: List<String> = emptyList()
|
|
29
|
+
private var withBase64: Boolean = true
|
|
25
30
|
|
|
26
31
|
init {
|
|
27
32
|
reactContext.addActivityEventListener(this)
|
|
@@ -67,8 +72,8 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
67
72
|
// Değerleri sınıf değişkenlerine ata
|
|
68
73
|
this.maxFiles = effectiveMaxFiles
|
|
69
74
|
this.maxSize = options.takeIf { it.hasKey("maxSize") }?.getDouble("maxSize") ?: 0.0
|
|
70
|
-
this.excludedUris = options.takeIf { it.hasKey("excludedUris") }
|
|
71
|
-
|
|
75
|
+
this.excludedUris = options.takeIf { it.hasKey("excludedUris") }?.getArray("excludedUris")?.toArrayList()?.mapNotNull { it.toString() } ?: emptyList()
|
|
76
|
+
this.withBase64 = options.takeIf { it.hasKey("withBase64") }?.getBoolean("withBase64") ?: true
|
|
72
77
|
|
|
73
78
|
val currentActivity = reactContext.currentActivity
|
|
74
79
|
if (currentActivity == null) {
|
|
@@ -206,6 +211,93 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
206
211
|
}.start()
|
|
207
212
|
}
|
|
208
213
|
|
|
214
|
+
@ReactMethod
|
|
215
|
+
fun RotateImageWithUri(fileUri: String, angle: Double, promise: Promise) {
|
|
216
|
+
Thread {
|
|
217
|
+
try {
|
|
218
|
+
val sourceUri = Uri.parse(fileUri)
|
|
219
|
+
val contentResolver = reactContext.contentResolver
|
|
220
|
+
|
|
221
|
+
// 1. ADIM: OOM Riskini Azaltmak için Bitmap'i verimli bir şekilde oku
|
|
222
|
+
// (Bu kısım, cropImageWithUri'deki ile aynı mantığı kullanır)
|
|
223
|
+
val boundsOptions = BitmapFactory.Options().apply { inJustDecodeBounds = true }
|
|
224
|
+
contentResolver.openInputStream(sourceUri)?.use {
|
|
225
|
+
BitmapFactory.decodeStream(it, null, boundsOptions)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
val decodeOptions = BitmapFactory.Options()
|
|
229
|
+
var inSampleSize = 1
|
|
230
|
+
val maxDimension = 2048 // Uygulamanızın ihtiyacına göre ayarlayın
|
|
231
|
+
if (boundsOptions.outHeight > maxDimension || boundsOptions.outWidth > maxDimension) {
|
|
232
|
+
val halfHeight = boundsOptions.outHeight / 2
|
|
233
|
+
val halfWidth = boundsOptions.outWidth / 2
|
|
234
|
+
while ((halfHeight / inSampleSize) >= maxDimension && (halfWidth / inSampleSize) >= maxDimension) {
|
|
235
|
+
inSampleSize *= 2
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
decodeOptions.inSampleSize = inSampleSize
|
|
239
|
+
|
|
240
|
+
// Resmi optimize edilmiş boyutta belleğe yükle
|
|
241
|
+
val originalBitmap = contentResolver.openInputStream(sourceUri)?.use {
|
|
242
|
+
BitmapFactory.decodeStream(it, null, decodeOptions)
|
|
243
|
+
} ?: throw Exception("Bitmap oluşturulamadı (decodeStream).")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
// 2. ADIM: Döndürme Matrisini Oluştur
|
|
247
|
+
// NOT: Bu fonksiyonda, JS'den gelen 'angle' değerini doğrudan kullanıyoruz.
|
|
248
|
+
// EXIF döndürmesi zaten orijinal resimde mevcuttur ve burada tekrar uygulanmamalıdır,
|
|
249
|
+
// çünkü amacımız kullanıcının isteği doğrultusunda ek bir döndürme yapmaktır.
|
|
250
|
+
val matrix = Matrix().apply {
|
|
251
|
+
postRotate(angle.toFloat())
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Döndürme işlemini uygula
|
|
255
|
+
val rotatedBitmap = Bitmap.createBitmap(
|
|
256
|
+
originalBitmap, 0, 0, originalBitmap.width, originalBitmap.height, matrix, true
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
// 3. ADIM: Döndürülmüş Bitmap'i geçici bir dosyaya kaydet
|
|
261
|
+
// (Bu kısım, cropImageWithUri'deki ile tamamen aynı)
|
|
262
|
+
val mimeType = contentResolver.getType(sourceUri) ?: "image/jpeg"
|
|
263
|
+
val fileExtension = when {
|
|
264
|
+
mimeType.contains("png") -> "png"
|
|
265
|
+
mimeType.contains("webp") -> "webp"
|
|
266
|
+
else -> "jpg"
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
val cacheDir = reactContext.cacheDir
|
|
270
|
+
val outputFile = createTempFile("rotated_", ".$fileExtension", cacheDir)
|
|
271
|
+
val fileOutputStream = outputFile.outputStream()
|
|
272
|
+
|
|
273
|
+
val compressFormat = when (fileExtension) {
|
|
274
|
+
"png" -> Bitmap.CompressFormat.PNG
|
|
275
|
+
"webp" -> if (android.os.Build.VERSION.SDK_INT >= 30) Bitmap.CompressFormat.WEBP_LOSSLESS else Bitmap.CompressFormat.WEBP
|
|
276
|
+
else -> Bitmap.CompressFormat.JPEG
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
fileOutputStream.use { stream ->
|
|
280
|
+
rotatedBitmap.compress(compressFormat, 95, stream)
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
// 4. ADIM: Belleği temizle
|
|
285
|
+
originalBitmap.recycle()
|
|
286
|
+
rotatedBitmap.recycle()
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
// 5. ADIM: Yeni oluşturulan dosyanın URI'sini döndür
|
|
290
|
+
promise.resolve(Uri.fromFile(outputFile).toString())
|
|
291
|
+
|
|
292
|
+
} catch (e: OutOfMemoryError) {
|
|
293
|
+
promise.reject("E_OOM_ROTATE", "Resim döndürülürken hafıza yetersiz kaldı.")
|
|
294
|
+
} catch (e: Exception) {
|
|
295
|
+
promise.reject("E_ROTATE_URI", "Döndürme hatası: ${e.message}")
|
|
296
|
+
}
|
|
297
|
+
}.start()
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
209
301
|
@ReactMethod
|
|
210
302
|
fun getBase64FromUri(cropFileUri: String, promise: Promise) {
|
|
211
303
|
Thread {
|
|
@@ -300,6 +392,141 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
300
392
|
}.start()
|
|
301
393
|
}
|
|
302
394
|
|
|
395
|
+
@ReactMethod
|
|
396
|
+
fun cropImageWithUri(fileUri: String, crop: ReadableMap, promise: Promise) {
|
|
397
|
+
Thread {
|
|
398
|
+
var originalBitmap: Bitmap? = null
|
|
399
|
+
var rotatedBitmap: Bitmap? = null
|
|
400
|
+
var croppedBitmap: Bitmap? = null
|
|
401
|
+
|
|
402
|
+
try {
|
|
403
|
+
val sourceUri = Uri.parse(fileUri)
|
|
404
|
+
val contentResolver = reactContext.contentResolver
|
|
405
|
+
|
|
406
|
+
// --- 1. İYİLEŞTİRME: EXIF Döndürme Bilgisini Oku ---
|
|
407
|
+
var orientation = 0
|
|
408
|
+
try {
|
|
409
|
+
// InputStream'i EXIF okumak için bir kere açıyoruz
|
|
410
|
+
contentResolver.openInputStream(sourceUri)?.use { inputStream ->
|
|
411
|
+
val exif = ExifInterface(inputStream)
|
|
412
|
+
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
|
|
413
|
+
}
|
|
414
|
+
} catch (e: Exception) {
|
|
415
|
+
// EXIF okunamıyorsa (örn: PNG), görmezden gel.
|
|
416
|
+
println("EXIF bilgisi okunamadı: ${e.message}")
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
// --- 2. İYİLEŞTİRME: OOM Riskini Azaltmak için BitmapFactory.Options ---
|
|
420
|
+
// Önce, sadece resmin boyutlarını almak için `inJustDecodeBounds` kullanıyoruz.
|
|
421
|
+
// Bu, resmi belleğe yüklemeden boyutlarını okumamızı sağlar.
|
|
422
|
+
val boundsOptions = BitmapFactory.Options()
|
|
423
|
+
boundsOptions.inJustDecodeBounds = true
|
|
424
|
+
contentResolver.openInputStream(sourceUri)?.use { inputStream ->
|
|
425
|
+
BitmapFactory.decodeStream(inputStream, null, boundsOptions)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
val originalWidth = boundsOptions.outWidth
|
|
429
|
+
val originalHeight = boundsOptions.outHeight
|
|
430
|
+
|
|
431
|
+
// Bellek optimizasyonu için bir `inSampleSize` hesaplayalım.
|
|
432
|
+
// Örneğin, resim 2048 pikselden büyükse, onu küçülterek oku.
|
|
433
|
+
val decodeOptions = BitmapFactory.Options()
|
|
434
|
+
var inSampleSize = 1
|
|
435
|
+
val maxDimension = 2048 // Uygulamanızın ihtiyacına göre bu değeri ayarlayın
|
|
436
|
+
if (originalHeight > maxDimension || originalWidth > maxDimension) {
|
|
437
|
+
val halfHeight: Int = originalHeight / 2
|
|
438
|
+
val halfWidth: Int = originalWidth / 2
|
|
439
|
+
while (halfHeight / inSampleSize >= maxDimension && halfWidth / inSampleSize >= maxDimension) {
|
|
440
|
+
inSampleSize *= 2
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
decodeOptions.inSampleSize = inSampleSize
|
|
444
|
+
|
|
445
|
+
// Şimdi resmi, hesaplanan `inSampleSize` ile belleğe yüklüyoruz.
|
|
446
|
+
val originalBitmap = contentResolver.openInputStream(sourceUri)?.use { inputStream ->
|
|
447
|
+
BitmapFactory.decodeStream(inputStream, null, decodeOptions)
|
|
448
|
+
} ?: throw Exception("Bitmap oluşturulamadı (decodeStream).")
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
// --- 3. İYİLEŞTİRME: Döndürme Matrisini Oluştur ---
|
|
452
|
+
val matrix = Matrix()
|
|
453
|
+
// EXIF bilgisine göre döndürme matrisini ayarla
|
|
454
|
+
when (orientation) {
|
|
455
|
+
ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f)
|
|
456
|
+
ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f)
|
|
457
|
+
ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f)
|
|
458
|
+
ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.preScale(-1.0f, 1.0f)
|
|
459
|
+
ExifInterface.ORIENTATION_FLIP_VERTICAL -> matrix.preScale(1.0f, -1.0f)
|
|
460
|
+
// Diğer karmaşık oryantasyonlar da eklenebilir...
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Döndürme işlemini uygula
|
|
464
|
+
val rotatedBitmap =
|
|
465
|
+
if (!matrix.isIdentity) {
|
|
466
|
+
Bitmap.createBitmap(
|
|
467
|
+
originalBitmap,0, 0, originalBitmap.width, originalBitmap.height, matrix, true
|
|
468
|
+
).also {
|
|
469
|
+
originalBitmap.recycle()
|
|
470
|
+
}
|
|
471
|
+
} else {
|
|
472
|
+
originalBitmap
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
// 4. ADIM: Kırpma koordinatlarını hesapla (Artık DÖNDÜRÜLMÜŞ bitmap üzerinden)
|
|
477
|
+
val rx = crop.getDouble("x")
|
|
478
|
+
val ry = crop.getDouble("y")
|
|
479
|
+
val rw = crop.getDouble("width")
|
|
480
|
+
val rh = crop.getDouble("height")
|
|
481
|
+
|
|
482
|
+
// NOT: Artık rotatedBitmap'in boyutlarını kullanıyoruz!
|
|
483
|
+
val px = (rx * rotatedBitmap.width).toInt().coerceIn(0, rotatedBitmap.width - 1)
|
|
484
|
+
val py = (ry * rotatedBitmap.height).toInt().coerceIn(0, rotatedBitmap.height - 1)
|
|
485
|
+
val pw = (rw * rotatedBitmap.width).toInt().coerceAtMost(rotatedBitmap.width - px).coerceAtLeast(1)
|
|
486
|
+
val ph = (rh * rotatedBitmap.height).toInt().coerceAtMost(rotatedBitmap.height - py).coerceAtLeast(1)
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
// 5. ADIM: Bitmap'i kırp
|
|
490
|
+
val croppedBitmap = Bitmap.createBitmap(rotatedBitmap, px, py, pw, ph)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
// 6. ADIM: Kırpılmış Bitmap'i geçici bir dosyaya kaydet
|
|
494
|
+
// ... (Bu kısım önceki kodla aynı, değişmedi) ...
|
|
495
|
+
val mimeType = contentResolver.getType(sourceUri) ?: "image/jpeg"
|
|
496
|
+
val fileExtension = when {
|
|
497
|
+
mimeType.contains("png") -> "png"
|
|
498
|
+
mimeType.contains("webp") -> "webp"
|
|
499
|
+
else -> "jpg"
|
|
500
|
+
}
|
|
501
|
+
val cacheDir = reactContext.cacheDir
|
|
502
|
+
val outputFile = createTempFile("cropped_", ".$fileExtension", cacheDir)
|
|
503
|
+
val fileOutputStream = outputFile.outputStream()
|
|
504
|
+
val compressFormat = when (fileExtension) {
|
|
505
|
+
"png" -> Bitmap.CompressFormat.PNG
|
|
506
|
+
"webp" -> if (android.os.Build.VERSION.SDK_INT >= 30) Bitmap.CompressFormat.WEBP_LOSSLESS else Bitmap.CompressFormat.WEBP
|
|
507
|
+
else -> Bitmap.CompressFormat.JPEG
|
|
508
|
+
}
|
|
509
|
+
fileOutputStream.use { stream ->
|
|
510
|
+
croppedBitmap.compress(compressFormat, 95, stream)
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
if (originalBitmap != rotatedBitmap) originalBitmap?.recycle()
|
|
515
|
+
rotatedBitmap?.recycle()
|
|
516
|
+
croppedBitmap?.recycle()
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
// 8. ADIM: Yeni oluşturulan dosyanın URI'sini döndür
|
|
520
|
+
promise.resolve(Uri.fromFile(outputFile).toString())
|
|
521
|
+
|
|
522
|
+
} catch (e: OutOfMemoryError) {
|
|
523
|
+
promise.reject("E_OOM_CROP", "Resim işlenirken hafıza yetersiz kaldı.")
|
|
524
|
+
} catch (e: Exception) {
|
|
525
|
+
promise.reject("E_CROP_URI", "Kırpma hatası: ${e.message}")
|
|
526
|
+
}
|
|
527
|
+
}.start()
|
|
528
|
+
}
|
|
529
|
+
|
|
303
530
|
override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
|
|
304
531
|
if (requestCode != REQUEST_CODE || pickerPromise == null) { return }
|
|
305
532
|
|
|
@@ -378,14 +605,20 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
378
605
|
}
|
|
379
606
|
|
|
380
607
|
val mimeType = reactContext.contentResolver.getType(uri) ?: URLConnection.guessContentTypeFromName(fileName) ?: "application/octet-stream"
|
|
381
|
-
val base64 =
|
|
608
|
+
val base64 = if (this.withBase64) {
|
|
609
|
+
encodeFileToBase64(uri)
|
|
610
|
+
} else {
|
|
611
|
+
null
|
|
612
|
+
}
|
|
382
613
|
|
|
383
614
|
val fileMap = WritableNativeMap().apply {
|
|
384
615
|
putString("fileName", fileName)
|
|
385
616
|
putDouble("fileSize", if (trueSize > 0) trueSize.toDouble() else fileSize.toDouble())
|
|
386
617
|
putString("fileType", mimeType)
|
|
387
618
|
putString("fileUri", uri.toString())
|
|
388
|
-
|
|
619
|
+
if (withBase64 && base64 != null) {
|
|
620
|
+
putString("base64", base64)
|
|
621
|
+
}
|
|
389
622
|
}
|
|
390
623
|
fileObjects.pushMap(fileMap)
|
|
391
624
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.pickFile = exports.getBase64FromUri = exports.default = exports.RotateImage = exports.CropImageWithBase64 = void 0;
|
|
6
|
+
exports.pickFile = exports.getBase64FromUri = exports.default = exports.cropImageWithUri = exports.RotateImageWithUri = exports.RotateImage = exports.CropImageWithBase64 = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
@@ -13,7 +13,7 @@ const {
|
|
|
13
13
|
|
|
14
14
|
// 1. Standalone pickFile Fonksiyonu
|
|
15
15
|
const pickFile = async (options = {}) => {
|
|
16
|
-
var _options$multipleFile, _options$maxFiles, _options$maxSize, _options$fileTypes, _options$excludedUris, _options$isGallery;
|
|
16
|
+
var _options$multipleFile, _options$maxFiles, _options$maxSize, _options$fileTypes, _options$excludedUris, _options$isGallery, _options$withBase;
|
|
17
17
|
if (!NativeUploadPicker) throw new Error("DocumentPicker module is not linked.");
|
|
18
18
|
|
|
19
19
|
// Native tarafa gönderilecek options
|
|
@@ -23,7 +23,8 @@ const pickFile = async (options = {}) => {
|
|
|
23
23
|
maxSize: (_options$maxSize = options.maxSize) !== null && _options$maxSize !== void 0 ? _options$maxSize : 0,
|
|
24
24
|
fileTypes: (_options$fileTypes = options.fileTypes) !== null && _options$fileTypes !== void 0 ? _options$fileTypes : ['*/*'],
|
|
25
25
|
excludedUris: (_options$excludedUris = options.excludedUris) !== null && _options$excludedUris !== void 0 ? _options$excludedUris : [],
|
|
26
|
-
isGallery: (_options$isGallery = options.isGallery) !== null && _options$isGallery !== void 0 ? _options$isGallery : false
|
|
26
|
+
isGallery: (_options$isGallery = options.isGallery) !== null && _options$isGallery !== void 0 ? _options$isGallery : false,
|
|
27
|
+
withBase64: (_options$withBase = options.withBase64) !== null && _options$withBase !== void 0 ? _options$withBase : true
|
|
27
28
|
};
|
|
28
29
|
return await NativeUploadPicker.openDocument(nativeOptions);
|
|
29
30
|
};
|
|
@@ -50,6 +51,17 @@ const CropImageWithBase64 = async (base64, cropData) => {
|
|
|
50
51
|
}
|
|
51
52
|
};
|
|
52
53
|
exports.CropImageWithBase64 = CropImageWithBase64;
|
|
54
|
+
const cropImageWithUri = async (fileUri, crop) => {
|
|
55
|
+
if (!NativeUploadPicker) {
|
|
56
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
return await NativeUploadPicker.cropImageWithUri(fileUri, crop);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
throw new Error(`CropImageWithUri Hatası: ${error.message}`);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
exports.cropImageWithUri = cropImageWithUri;
|
|
53
65
|
const RotateImage = async ({
|
|
54
66
|
base64,
|
|
55
67
|
angle
|
|
@@ -57,6 +69,9 @@ const RotateImage = async ({
|
|
|
57
69
|
if (!NativeUploadPicker) {
|
|
58
70
|
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
59
71
|
}
|
|
72
|
+
if (!base64) {
|
|
73
|
+
throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
|
|
74
|
+
}
|
|
60
75
|
try {
|
|
61
76
|
// Native sadece saf base64 string'i döner
|
|
62
77
|
const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
|
|
@@ -68,9 +83,19 @@ const RotateImage = async ({
|
|
|
68
83
|
throw new Error(`RotateImage Hatası: ${error.message}`);
|
|
69
84
|
}
|
|
70
85
|
};
|
|
86
|
+
exports.RotateImage = RotateImage;
|
|
87
|
+
const RotateImageWithUri = async (currentImageUri, angle) => {
|
|
88
|
+
try {
|
|
89
|
+
const rotatedImageUri = await NativeUploadPicker.RotateImageWithUri(currentImageUri, angle);
|
|
90
|
+
return rotatedImageUri;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error('Resim döndürme hatası:', error);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
71
96
|
|
|
72
97
|
// 2. MyUploader Bileşeni
|
|
73
|
-
exports.
|
|
98
|
+
exports.RotateImageWithUri = RotateImageWithUri;
|
|
74
99
|
const MyUploader = ({
|
|
75
100
|
onSelect,
|
|
76
101
|
onError,
|
|
@@ -82,7 +107,8 @@ const MyUploader = ({
|
|
|
82
107
|
fileTypes = ['*/*'],
|
|
83
108
|
maxSize = 0,
|
|
84
109
|
maxFiles = 0,
|
|
85
|
-
excludedUris = []
|
|
110
|
+
excludedUris = [],
|
|
111
|
+
withBase64 = true
|
|
86
112
|
}) => {
|
|
87
113
|
const [isLoading, setIsLoading] = (0, _react.useState)(false);
|
|
88
114
|
const handlePress = async () => {
|
|
@@ -94,7 +120,8 @@ const MyUploader = ({
|
|
|
94
120
|
fileTypes,
|
|
95
121
|
maxSize,
|
|
96
122
|
maxFiles,
|
|
97
|
-
excludedUris
|
|
123
|
+
excludedUris,
|
|
124
|
+
withBase64
|
|
98
125
|
});
|
|
99
126
|
onSelect(files);
|
|
100
127
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","UploadDocumentPicker","NativeUploadPicker","NativeModules","pickFile","options","_options$multipleFile","_options$maxFiles","_options$maxSize","_options$fileTypes","_options$excludedUris","_options$isGallery","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","openDocument","exports","getBase64FromUri","cropFileUri","error","message","CropImageWithBase64","base64","cropData","RotateImage","angle","rotatedBase64","rotateImage","MyUploader","onSelect","onError","buttonPlaceHolder","ButtonStyle","ButtonTextStyle","disabled","isLoading","setIsLoading","useState","handlePress","files","console","createElement","TouchableOpacity","style","styles","button","onPress","ActivityIndicator","color","Text","text","StyleSheet","create","backgroundColor","padding","borderRadius","alignItems","justifyContent","fontWeight","fontSize","_default"],"sources":["MyUploader.tsx"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { TouchableOpacity, Text, StyleSheet, ActivityIndicator, NativeModules } from 'react-native';\r\nimport type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps } from '../types';\r\n\r\nconst { UploadDocumentPicker: NativeUploadPicker } = NativeModules;\r\n\r\n// 1. Standalone pickFile Fonksiyonu\r\nexport const pickFile = async (options: DocumentPickerOptions = {}): Promise<FileInfo[]> => {\r\n if (!NativeUploadPicker) throw new Error(\"DocumentPicker module is not linked.\");\r\n\r\n // Native tarafa gönderilecek options\r\n const nativeOptions = {\r\n multipleFiles: options.multipleFiles ?? false,\r\n maxFiles: options.maxFiles ?? 0,\r\n maxSize: options.maxSize ?? 0,\r\n fileTypes: options.fileTypes ?? ['*/*'],\r\n excludedUris: options.excludedUris ?? [],\r\n isGallery:options.isGallery ?? false,\r\n };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const getBase64FromUri = async (cropFileUri: string): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.getBase64FromUri(cropFileUri);\r\n } catch (error: any) {\r\n throw new Error(`getBase64FromUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const CropImageWithBase64 = async (base64: string,cropData:any): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.CropImageWithBase64(base64,cropData);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n \r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n // Native sadece saf base64 string'i döner\r\n const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);\r\n\r\n // Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir\r\n return `data:image/jpeg;base64,${rotatedBase64}`;\r\n } catch (error: any) {\r\n // Hata mesajını daha okunaklı fırlatıyoruz\r\n throw new Error(`RotateImage Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n// 2. MyUploader Bileşeni\r\nconst MyUploader: React.FC<MyUploaderProps> = ({\r\n onSelect,\r\n onError,\r\n buttonPlaceHolder = \"Dosya Seç\",\r\n ButtonStyle,\r\n ButtonTextStyle,\r\n disabled = false,\r\n multipleFiles = false,\r\n fileTypes = ['*/*'],\r\n maxSize = 0,\r\n maxFiles = 0,\r\n excludedUris = [],\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handlePress = async () => {\r\n if (disabled || isLoading) return;\r\n setIsLoading(true);\r\n\r\n try {\r\n const files = await pickFile({\r\n multipleFiles,\r\n fileTypes,\r\n maxSize,\r\n maxFiles,\r\n excludedUris\r\n });\r\n\r\n onSelect(files);\r\n } catch (error: any) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n console.error(\"MyUploader Error:\", error);\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <TouchableOpacity\r\n style={[styles.button, ButtonStyle, (disabled || isLoading) && styles.disabled]}\r\n onPress={handlePress}\r\n disabled={disabled || isLoading}\r\n >\r\n {isLoading ? (\r\n <ActivityIndicator color=\"#FFF\" />\r\n ) : (\r\n <Text style={[styles.text, ButtonTextStyle]}>{buttonPlaceHolder}</Text>\r\n )}\r\n </TouchableOpacity>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n button: {\r\n backgroundColor: '#6200EE',\r\n padding: 12,\r\n borderRadius: 8,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#FFF',\r\n fontWeight: '600',\r\n fontSize: 16\r\n },\r\n disabled: {\r\n backgroundColor: '#B0B0B0'\r\n }\r\n});\r\n\r\nexport default MyUploader;"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAAoG,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAL,uBAAA,YAAAA,CAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAGpG,MAAM;EAAEkB,oBAAoB,EAAEC;AAAmB,CAAC,GAAGC,0BAAa;;AAElE;AACO,MAAMC,QAAQ,GAAG,MAAAA,CAAOC,OAA8B,GAAG,CAAC,CAAC,KAA0B;EAAA,IAAAC,qBAAA,EAAAC,iBAAA,EAAAC,gBAAA,EAAAC,kBAAA,EAAAC,qBAAA,EAAAC,kBAAA;EAC1F,IAAI,CAACT,kBAAkB,EAAE,MAAM,IAAIU,KAAK,CAAC,sCAAsC,CAAC;;EAEhF;EACA,MAAMC,aAAa,GAAG;IACpBC,aAAa,GAAAR,qBAAA,GAAED,OAAO,CAACS,aAAa,cAAAR,qBAAA,cAAAA,qBAAA,GAAI,KAAK;IAC7CS,QAAQ,GAAAR,iBAAA,GAAEF,OAAO,CAACU,QAAQ,cAAAR,iBAAA,cAAAA,iBAAA,GAAI,CAAC;IAC/BS,OAAO,GAAAR,gBAAA,GAAEH,OAAO,CAACW,OAAO,cAAAR,gBAAA,cAAAA,gBAAA,GAAI,CAAC;IAC7BS,SAAS,GAAAR,kBAAA,GAAEJ,OAAO,CAACY,SAAS,cAAAR,kBAAA,cAAAA,kBAAA,GAAI,CAAC,KAAK,CAAC;IACvCS,YAAY,GAAAR,qBAAA,GAAEL,OAAO,CAACa,YAAY,cAAAR,qBAAA,cAAAA,qBAAA,GAAI,EAAE;IACxCS,SAAS,GAAAR,kBAAA,GAACN,OAAO,CAACc,SAAS,cAAAR,kBAAA,cAAAA,kBAAA,GAAI;EACjC,CAAC;EAED,OAAO,MAAMT,kBAAkB,CAACkB,YAAY,CAACP,aAAa,CAAC;AAC7D,CAAC;AAACQ,OAAA,CAAAjB,QAAA,GAAAA,QAAA;AAEK,MAAMkB,gBAAgB,GAAG,MAAOC,WAAmB,IAAsB;EAC9E,IAAI,CAACrB,kBAAkB,EAAE;IACvB,MAAM,IAAIU,KAAK,CAAC,2CAA2C,CAAC;EAC9D;EAEA,IAAI;IACF,OAAO,MAAMV,kBAAkB,CAACoB,gBAAgB,CAACC,WAAW,CAAC;EAC/D,CAAC,CAAC,OAAOC,KAAU,EAAE;IACnB,MAAM,IAAIZ,KAAK,CAAC,4BAA4BY,KAAK,CAACC,OAAO,EAAE,CAAC;EAC9D;AACF,CAAC;AAACJ,OAAA,CAAAC,gBAAA,GAAAA,gBAAA;AAIK,MAAMI,mBAAmB,GAAG,MAAAA,CAAOC,MAAc,EAACC,QAAY,KAAsB;EACzF,IAAI,CAAC1B,kBAAkB,EAAE;IACvB,MAAM,IAAIU,KAAK,CAAC,2CAA2C,CAAC;EAC9D;EAEA,IAAI;IACF,OAAO,MAAMV,kBAAkB,CAACwB,mBAAmB,CAACC,MAAM,EAACC,QAAQ,CAAC;EACtE,CAAC,CAAC,OAAOJ,KAAU,EAAE;IACnB,MAAM,IAAIZ,KAAK,CAAC,+BAA+BY,KAAK,CAACC,OAAO,EAAE,CAAC;EACjE;AACF,CAAC;AAACJ,OAAA,CAAAK,mBAAA,GAAAA,mBAAA;AAKK,MAAMG,WAAW,GAAG,MAAAA,CAAO;EAAEF,MAAM;EAAEG;AAAwB,CAAC,KAAsB;EACzF,IAAI,CAAC5B,kBAAkB,EAAE;IACvB,MAAM,IAAIU,KAAK,CAAC,2CAA2C,CAAC;EAC9D;EAEA,IAAI;IACF;IACA,MAAMmB,aAAqB,GAAG,MAAM7B,kBAAkB,CAAC8B,WAAW,CAACL,MAAM,EAAEG,KAAK,CAAC;;IAEjF;IACA,OAAO,0BAA0BC,aAAa,EAAE;EAClD,CAAC,CAAC,OAAOP,KAAU,EAAE;IACnB;IACA,MAAM,IAAIZ,KAAK,CAAC,uBAAuBY,KAAK,CAACC,OAAO,EAAE,CAAC;EACzD;AACF,CAAC;;AAED;AAAAJ,OAAA,CAAAQ,WAAA,GAAAA,WAAA;AACA,MAAMI,UAAqC,GAAGA,CAAC;EAC7CC,QAAQ;EACRC,OAAO;EACPC,iBAAiB,GAAG,WAAW;EAC/BC,WAAW;EACXC,eAAe;EACfC,QAAQ,GAAG,KAAK;EAChBzB,aAAa,GAAG,KAAK;EACrBG,SAAS,GAAG,CAAC,KAAK,CAAC;EACnBD,OAAO,GAAG,CAAC;EACXD,QAAQ,GAAG,CAAC;EACZG,YAAY,GAAG;AACjB,CAAC,KAAK;EACJ,MAAM,CAACsB,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAEjD,MAAMC,WAAW,GAAG,MAAAA,CAAA,KAAY;IAC9B,IAAIJ,QAAQ,IAAIC,SAAS,EAAE;IAC3BC,YAAY,CAAC,IAAI,CAAC;IAElB,IAAI;MACF,MAAMG,KAAK,GAAG,MAAMxC,QAAQ,CAAC;QAC3BU,aAAa;QACbG,SAAS;QACTD,OAAO;QACPD,QAAQ;QACRG;MACF,CAAC,CAAC;MAEFgB,QAAQ,CAACU,KAAK,CAAC;IACjB,CAAC,CAAC,OAAOpB,KAAU,EAAE;MACnB,IAAIW,OAAO,EAAE;QACXA,OAAO,CAACX,KAAK,CAAC;MAChB,CAAC,MAAM;QACLqB,OAAO,CAACrB,KAAK,CAAC,mBAAmB,EAAEA,KAAK,CAAC;MAC3C;IACF,CAAC,SAAS;MACRiB,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC;EAED,oBACE/D,MAAA,CAAAc,OAAA,CAAAsD,aAAA,CAACjE,YAAA,CAAAkE,gBAAgB;IACfC,KAAK,EAAE,CAACC,MAAM,CAACC,MAAM,EAAEb,WAAW,EAAE,CAACE,QAAQ,IAAIC,SAAS,KAAKS,MAAM,CAACV,QAAQ,CAAE;IAChFY,OAAO,EAAER,WAAY;IACrBJ,QAAQ,EAAEA,QAAQ,IAAIC;EAAU,GAE/BA,SAAS,gBACR9D,MAAA,CAAAc,OAAA,CAAAsD,aAAA,CAACjE,YAAA,CAAAuE,iBAAiB;IAACC,KAAK,EAAC;EAAM,CAAE,CAAC,gBAElC3E,MAAA,CAAAc,OAAA,CAAAsD,aAAA,CAACjE,YAAA,CAAAyE,IAAI;IAACN,KAAK,EAAE,CAACC,MAAM,CAACM,IAAI,EAAEjB,eAAe;EAAE,GAAEF,iBAAwB,CAExD,CAAC;AAEvB,CAAC;AAED,MAAMa,MAAM,GAAGO,uBAAU,CAACC,MAAM,CAAC;EAC/BP,MAAM,EAAE;IACNQ,eAAe,EAAE,SAAS;IAC1BC,OAAO,EAAE,EAAE;IACXC,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE;EAClB,CAAC;EACDP,IAAI,EAAE;IACJF,KAAK,EAAE,MAAM;IACbU,UAAU,EAAE,KAAK;IACjBC,QAAQ,EAAE;EACZ,CAAC;EACDzB,QAAQ,EAAE;IACRmB,eAAe,EAAE;EACnB;AACF,CAAC,CAAC;AAAC,IAAAO,QAAA,GAAA5C,OAAA,CAAA7B,OAAA,GAEYyC,UAAU","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","UploadDocumentPicker","NativeUploadPicker","NativeModules","pickFile","options","_options$multipleFile","_options$maxFiles","_options$maxSize","_options$fileTypes","_options$excludedUris","_options$isGallery","_options$withBase","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","withBase64","openDocument","exports","getBase64FromUri","cropFileUri","error","message","CropImageWithBase64","base64","cropData","cropImageWithUri","fileUri","crop","RotateImage","angle","rotatedBase64","rotateImage","RotateImageWithUri","currentImageUri","rotatedImageUri","console","MyUploader","onSelect","onError","buttonPlaceHolder","ButtonStyle","ButtonTextStyle","disabled","isLoading","setIsLoading","useState","handlePress","files","createElement","TouchableOpacity","style","styles","button","onPress","ActivityIndicator","color","Text","text","StyleSheet","create","backgroundColor","padding","borderRadius","alignItems","justifyContent","fontWeight","fontSize","_default"],"sources":["MyUploader.tsx"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { TouchableOpacity, Text, StyleSheet, ActivityIndicator, NativeModules } from 'react-native';\r\nimport type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps, CropData } from '../types';\r\n\r\nconst { UploadDocumentPicker: NativeUploadPicker } = NativeModules;\r\n\r\n// 1. Standalone pickFile Fonksiyonu\r\nexport const pickFile = async (options: DocumentPickerOptions = {}): Promise<FileInfo[]> => {\r\n if (!NativeUploadPicker) throw new Error(\"DocumentPicker module is not linked.\");\r\n\r\n // Native tarafa gönderilecek options\r\n const nativeOptions = {\r\n multipleFiles: options.multipleFiles ?? false,\r\n maxFiles: options.maxFiles ?? 0,\r\n maxSize: options.maxSize ?? 0,\r\n fileTypes: options.fileTypes ?? ['*/*'],\r\n excludedUris: options.excludedUris ?? [],\r\n isGallery: options.isGallery ?? false,\r\n withBase64: options.withBase64 ?? true,\r\n };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const getBase64FromUri = async (cropFileUri: string): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.getBase64FromUri(cropFileUri);\r\n } catch (error: any) {\r\n throw new Error(`getBase64FromUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const CropImageWithBase64 = async (base64: string, cropData: CropData): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.CropImageWithBase64(base64, cropData);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\nexport const cropImageWithUri = async (fileUri: string, crop: CropData): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.cropImageWithUri(fileUri, crop);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n if (!base64) {\r\n throw new Error(\"RotateImage Hatası: Base64 verisi boş olamaz.\");\r\n }\r\n\r\n try {\r\n // Native sadece saf base64 string'i döner\r\n const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);\r\n\r\n // Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir\r\n return `data:image/jpeg;base64,${rotatedBase64}`;\r\n } catch (error: any) {\r\n // Hata mesajını daha okunaklı fırlatıyoruz\r\n throw new Error(`RotateImage Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\nexport const RotateImageWithUri = async (currentImageUri: string, angle: number): Promise<string> => {\r\n try {\r\n const rotatedImageUri: string = await NativeUploadPicker.RotateImageWithUri(currentImageUri, angle);\r\n return rotatedImageUri;\r\n\r\n } catch (error) {\r\n console.error('Resim döndürme hatası:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n// 2. MyUploader Bileşeni\r\nconst MyUploader: React.FC<MyUploaderProps> = ({\r\n onSelect,\r\n onError,\r\n buttonPlaceHolder = \"Dosya Seç\",\r\n ButtonStyle,\r\n ButtonTextStyle,\r\n disabled = false,\r\n multipleFiles = false,\r\n fileTypes = ['*/*'],\r\n maxSize = 0,\r\n maxFiles = 0,\r\n excludedUris = [],\r\n withBase64 = true\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handlePress = async () => {\r\n if (disabled || isLoading) return;\r\n setIsLoading(true);\r\n\r\n try {\r\n const files = await pickFile({\r\n multipleFiles,\r\n fileTypes,\r\n maxSize,\r\n maxFiles,\r\n excludedUris,\r\n withBase64\r\n });\r\n\r\n onSelect(files);\r\n } catch (error: any) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n console.error(\"MyUploader Error:\", error);\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <TouchableOpacity\r\n style={[styles.button, ButtonStyle, (disabled || isLoading) && styles.disabled]}\r\n onPress={handlePress}\r\n disabled={disabled || isLoading}\r\n >\r\n {isLoading ? (\r\n <ActivityIndicator color=\"#FFF\" />\r\n ) : (\r\n <Text style={[styles.text, ButtonTextStyle]}>{buttonPlaceHolder}</Text>\r\n )}\r\n </TouchableOpacity>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n button: {\r\n backgroundColor: '#6200EE',\r\n padding: 12,\r\n borderRadius: 8,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#FFF',\r\n fontWeight: '600',\r\n fontSize: 16\r\n },\r\n disabled: {\r\n backgroundColor: '#B0B0B0'\r\n }\r\n});\r\n\r\nexport default MyUploader;"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// import type { StyleProp, TextStyle, ViewStyle } from 'react-native';\r\n\r\n// export interface FileInfo {\r\n// fileName: string;\r\n// fileSize: number; \r\n// fileType: string | null;\r\n// fileUri: string;\r\n// base64: string;\r\n// }\r\n\r\n// export interface MyUploaderProps{\r\n// onSelect: (files: FileInfo[]) => void;\r\n// onError?: (error: Error) => void;\r\n// buttonPlaceHolder?: string;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// disabled?: boolean; \r\n// multipleFiles?: boolean;\r\n// fileTypes?: string[];\r\n// maxSize?: number;\r\n// maxFiles?: number;\r\n// excludedUris?: string[];\r\n// }\r\n\r\n// export interface DownloadedFileInfo {\r\n// originalUrl: string;\r\n// localUri: string;\r\n// }\r\n\r\n// export interface SkippedFileInfo {\r\n// originalUrl: string;\r\n// reason: string; \r\n// }\r\n\r\n\r\n\r\n// export interface UploadFileProps {\r\n// files: string[];\r\n// multipleLoad?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean; \r\n// maxSize?: number;\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: Error) => void;\r\n// }\r\n\r\n// export interface DownloadFileProps {\r\n// files: string[];\r\n// multipleDownload?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean;\r\n// maxSize?: number; // MB\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: ViewStyle;\r\n// ButtonTextStyle?: TextStyle;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: any) => void;\r\n// }\r\n// export interface DownloadResult {\r\n// successful: { originalUrl: string; localUri: string | null }[];\r\n// skipped: { originalUrl: string; reason: string }[];\r\n// }\r\n\r\n\r\nimport type { ViewStyle, TextStyle } from 'react-native';\r\n\r\nexport interface FileInfo {\r\n fileUri: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n base64?: string | null;\r\n}\r\n\r\n\r\n// ----- MyUploader & pickFile Props -----\r\nexport interface DocumentPickerOptions {\r\n multipleFiles?: boolean;\r\n fileTypes?: string[]; // örn: ['image/*', 'application/pdf']\r\n maxSize?: number; // MB cinsinden\r\n maxFiles?: number;\r\n excludedUris?: string[];\r\n isGallery?:boolean;\r\n}\r\n\r\nexport interface MyUploaderProps extends DocumentPickerOptions {\r\n onSelect: (files: FileInfo[]) => void;\r\n onError?: (error: Error) => void;\r\n buttonPlaceHolder?: string;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n disabled?: boolean;\r\n}\r\n\r\n// ----- DownloadFile Props -----\r\nexport interface DownloadFileProps {\r\n files: string[];\r\n multipleDownload?: boolean; // multipleFiles yerine multipleDownload (İsim karışmaması için)\r\n disabled?: boolean;\r\n debug?: boolean;\r\n maxSize?: number; // MB\r\n fileTypes?: string[]; // İndirilecek dosyanın Content-Type kontrolü\r\n buttonPlaceHolder?: string;\r\n buttonIcon?: React.ReactNode;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n onSuccess?: (result: DownloadResult) => void;\r\n onError?: (error: any) => void;\r\n}\r\n\r\n\r\nexport interface DownloadResult {\r\n successful: { originalUrl: string; localUri: string | null }[];\r\n skipped: { originalUrl: string; reason: string }[];\r\n}\r\n\r\n\r\n///rotateImage\r\n\r\nexport interface RotateImageProps{\r\n base64: string, angle: number\r\n}"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// import type { StyleProp, TextStyle, ViewStyle } from 'react-native';\r\n\r\n// export interface FileInfo {\r\n// fileName: string;\r\n// fileSize: number; \r\n// fileType: string | null;\r\n// fileUri: string;\r\n// base64: string;\r\n// }\r\n\r\n// export interface MyUploaderProps{\r\n// onSelect: (files: FileInfo[]) => void;\r\n// onError?: (error: Error) => void;\r\n// buttonPlaceHolder?: string;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// disabled?: boolean; \r\n// multipleFiles?: boolean;\r\n// fileTypes?: string[];\r\n// maxSize?: number;\r\n// maxFiles?: number;\r\n// excludedUris?: string[];\r\n// }\r\n\r\n// export interface DownloadedFileInfo {\r\n// originalUrl: string;\r\n// localUri: string;\r\n// }\r\n\r\n// export interface SkippedFileInfo {\r\n// originalUrl: string;\r\n// reason: string; \r\n// }\r\n\r\n\r\n\r\n// export interface UploadFileProps {\r\n// files: string[];\r\n// multipleLoad?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean; \r\n// maxSize?: number;\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: Error) => void;\r\n// }\r\n\r\n// export interface DownloadFileProps {\r\n// files: string[];\r\n// multipleDownload?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean;\r\n// maxSize?: number; // MB\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: ViewStyle;\r\n// ButtonTextStyle?: TextStyle;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: any) => void;\r\n// }\r\n// export interface DownloadResult {\r\n// successful: { originalUrl: string; localUri: string | null }[];\r\n// skipped: { originalUrl: string; reason: string }[];\r\n// }\r\n\r\n\r\nimport type { ViewStyle, TextStyle } from 'react-native';\r\n\r\nexport interface FileInfo {\r\n fileUri: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n base64?: string | null;\r\n}\r\n\r\n\r\n// ----- MyUploader & pickFile Props -----\r\nexport interface DocumentPickerOptions {\r\n multipleFiles?: boolean;\r\n fileTypes?: string[]; // örn: ['image/*', 'application/pdf']\r\n maxSize?: number; // MB cinsinden\r\n maxFiles?: number;\r\n excludedUris?: string[];\r\n isGallery?:boolean;\r\n withBase64?:boolean;\r\n}\r\n\r\nexport interface CropData {\r\n x?: number;\r\n y?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\n\r\nexport interface MyUploaderProps extends DocumentPickerOptions {\r\n onSelect: (files: FileInfo[]) => void;\r\n onError?: (error: Error) => void;\r\n buttonPlaceHolder?: string;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n disabled?: boolean;\r\n}\r\n\r\n// ----- DownloadFile Props -----\r\nexport interface DownloadFileProps {\r\n files: string[];\r\n multipleDownload?: boolean; // multipleFiles yerine multipleDownload (İsim karışmaması için)\r\n disabled?: boolean;\r\n debug?: boolean;\r\n maxSize?: number; // MB\r\n fileTypes?: string[]; // İndirilecek dosyanın Content-Type kontrolü\r\n buttonPlaceHolder?: string;\r\n buttonIcon?: React.ReactNode;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n onSuccess?: (result: DownloadResult) => void;\r\n onError?: (error: any) => void;\r\n}\r\n\r\n\r\nexport interface DownloadResult {\r\n successful: { originalUrl: string; localUri: string | null }[];\r\n skipped: { originalUrl: string; reason: string }[];\r\n}\r\n\r\n\r\n///rotateImage\r\n\r\nexport interface RotateImageProps{\r\n base64: string, angle: number\r\n}"],"mappings":"","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@ const {
|
|
|
6
6
|
|
|
7
7
|
// 1. Standalone pickFile Fonksiyonu
|
|
8
8
|
export const pickFile = async (options = {}) => {
|
|
9
|
-
var _options$multipleFile, _options$maxFiles, _options$maxSize, _options$fileTypes, _options$excludedUris, _options$isGallery;
|
|
9
|
+
var _options$multipleFile, _options$maxFiles, _options$maxSize, _options$fileTypes, _options$excludedUris, _options$isGallery, _options$withBase;
|
|
10
10
|
if (!NativeUploadPicker) throw new Error("DocumentPicker module is not linked.");
|
|
11
11
|
|
|
12
12
|
// Native tarafa gönderilecek options
|
|
@@ -16,7 +16,8 @@ export const pickFile = async (options = {}) => {
|
|
|
16
16
|
maxSize: (_options$maxSize = options.maxSize) !== null && _options$maxSize !== void 0 ? _options$maxSize : 0,
|
|
17
17
|
fileTypes: (_options$fileTypes = options.fileTypes) !== null && _options$fileTypes !== void 0 ? _options$fileTypes : ['*/*'],
|
|
18
18
|
excludedUris: (_options$excludedUris = options.excludedUris) !== null && _options$excludedUris !== void 0 ? _options$excludedUris : [],
|
|
19
|
-
isGallery: (_options$isGallery = options.isGallery) !== null && _options$isGallery !== void 0 ? _options$isGallery : false
|
|
19
|
+
isGallery: (_options$isGallery = options.isGallery) !== null && _options$isGallery !== void 0 ? _options$isGallery : false,
|
|
20
|
+
withBase64: (_options$withBase = options.withBase64) !== null && _options$withBase !== void 0 ? _options$withBase : true
|
|
20
21
|
};
|
|
21
22
|
return await NativeUploadPicker.openDocument(nativeOptions);
|
|
22
23
|
};
|
|
@@ -40,6 +41,16 @@ export const CropImageWithBase64 = async (base64, cropData) => {
|
|
|
40
41
|
throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);
|
|
41
42
|
}
|
|
42
43
|
};
|
|
44
|
+
export const cropImageWithUri = async (fileUri, crop) => {
|
|
45
|
+
if (!NativeUploadPicker) {
|
|
46
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
return await NativeUploadPicker.cropImageWithUri(fileUri, crop);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
throw new Error(`CropImageWithUri Hatası: ${error.message}`);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
43
54
|
export const RotateImage = async ({
|
|
44
55
|
base64,
|
|
45
56
|
angle
|
|
@@ -47,6 +58,9 @@ export const RotateImage = async ({
|
|
|
47
58
|
if (!NativeUploadPicker) {
|
|
48
59
|
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
49
60
|
}
|
|
61
|
+
if (!base64) {
|
|
62
|
+
throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
|
|
63
|
+
}
|
|
50
64
|
try {
|
|
51
65
|
// Native sadece saf base64 string'i döner
|
|
52
66
|
const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
|
|
@@ -58,6 +72,15 @@ export const RotateImage = async ({
|
|
|
58
72
|
throw new Error(`RotateImage Hatası: ${error.message}`);
|
|
59
73
|
}
|
|
60
74
|
};
|
|
75
|
+
export const RotateImageWithUri = async (currentImageUri, angle) => {
|
|
76
|
+
try {
|
|
77
|
+
const rotatedImageUri = await NativeUploadPicker.RotateImageWithUri(currentImageUri, angle);
|
|
78
|
+
return rotatedImageUri;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
console.error('Resim döndürme hatası:', error);
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
61
84
|
|
|
62
85
|
// 2. MyUploader Bileşeni
|
|
63
86
|
const MyUploader = ({
|
|
@@ -71,7 +94,8 @@ const MyUploader = ({
|
|
|
71
94
|
fileTypes = ['*/*'],
|
|
72
95
|
maxSize = 0,
|
|
73
96
|
maxFiles = 0,
|
|
74
|
-
excludedUris = []
|
|
97
|
+
excludedUris = [],
|
|
98
|
+
withBase64 = true
|
|
75
99
|
}) => {
|
|
76
100
|
const [isLoading, setIsLoading] = useState(false);
|
|
77
101
|
const handlePress = async () => {
|
|
@@ -83,7 +107,8 @@ const MyUploader = ({
|
|
|
83
107
|
fileTypes,
|
|
84
108
|
maxSize,
|
|
85
109
|
maxFiles,
|
|
86
|
-
excludedUris
|
|
110
|
+
excludedUris,
|
|
111
|
+
withBase64
|
|
87
112
|
});
|
|
88
113
|
onSelect(files);
|
|
89
114
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","TouchableOpacity","Text","StyleSheet","ActivityIndicator","NativeModules","UploadDocumentPicker","NativeUploadPicker","pickFile","options","_options$multipleFile","_options$maxFiles","_options$maxSize","_options$fileTypes","_options$excludedUris","_options$isGallery","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","openDocument","getBase64FromUri","cropFileUri","error","message","CropImageWithBase64","base64","cropData","RotateImage","angle","rotatedBase64","rotateImage","MyUploader","onSelect","onError","buttonPlaceHolder","ButtonStyle","ButtonTextStyle","disabled","isLoading","setIsLoading","handlePress","files","console","createElement","style","styles","button","onPress","color","text","create","backgroundColor","padding","borderRadius","alignItems","justifyContent","fontWeight","fontSize"],"sources":["MyUploader.tsx"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { TouchableOpacity, Text, StyleSheet, ActivityIndicator, NativeModules } from 'react-native';\r\nimport type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps } from '../types';\r\n\r\nconst { UploadDocumentPicker: NativeUploadPicker } = NativeModules;\r\n\r\n// 1. Standalone pickFile Fonksiyonu\r\nexport const pickFile = async (options: DocumentPickerOptions = {}): Promise<FileInfo[]> => {\r\n if (!NativeUploadPicker) throw new Error(\"DocumentPicker module is not linked.\");\r\n\r\n // Native tarafa gönderilecek options\r\n const nativeOptions = {\r\n multipleFiles: options.multipleFiles ?? false,\r\n maxFiles: options.maxFiles ?? 0,\r\n maxSize: options.maxSize ?? 0,\r\n fileTypes: options.fileTypes ?? ['*/*'],\r\n excludedUris: options.excludedUris ?? [],\r\n isGallery:options.isGallery ?? false,\r\n };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const getBase64FromUri = async (cropFileUri: string): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.getBase64FromUri(cropFileUri);\r\n } catch (error: any) {\r\n throw new Error(`getBase64FromUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const CropImageWithBase64 = async (base64: string,cropData:any): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.CropImageWithBase64(base64,cropData);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n \r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n // Native sadece saf base64 string'i döner\r\n const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);\r\n\r\n // Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir\r\n return `data:image/jpeg;base64,${rotatedBase64}`;\r\n } catch (error: any) {\r\n // Hata mesajını daha okunaklı fırlatıyoruz\r\n throw new Error(`RotateImage Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n// 2. MyUploader Bileşeni\r\nconst MyUploader: React.FC<MyUploaderProps> = ({\r\n onSelect,\r\n onError,\r\n buttonPlaceHolder = \"Dosya Seç\",\r\n ButtonStyle,\r\n ButtonTextStyle,\r\n disabled = false,\r\n multipleFiles = false,\r\n fileTypes = ['*/*'],\r\n maxSize = 0,\r\n maxFiles = 0,\r\n excludedUris = [],\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handlePress = async () => {\r\n if (disabled || isLoading) return;\r\n setIsLoading(true);\r\n\r\n try {\r\n const files = await pickFile({\r\n multipleFiles,\r\n fileTypes,\r\n maxSize,\r\n maxFiles,\r\n excludedUris\r\n });\r\n\r\n onSelect(files);\r\n } catch (error: any) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n console.error(\"MyUploader Error:\", error);\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <TouchableOpacity\r\n style={[styles.button, ButtonStyle, (disabled || isLoading) && styles.disabled]}\r\n onPress={handlePress}\r\n disabled={disabled || isLoading}\r\n >\r\n {isLoading ? (\r\n <ActivityIndicator color=\"#FFF\" />\r\n ) : (\r\n <Text style={[styles.text, ButtonTextStyle]}>{buttonPlaceHolder}</Text>\r\n )}\r\n </TouchableOpacity>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n button: {\r\n backgroundColor: '#6200EE',\r\n padding: 12,\r\n borderRadius: 8,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#FFF',\r\n fontWeight: '600',\r\n fontSize: 16\r\n },\r\n disabled: {\r\n backgroundColor: '#B0B0B0'\r\n }\r\n});\r\n\r\nexport default MyUploader;"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","useState","TouchableOpacity","Text","StyleSheet","ActivityIndicator","NativeModules","UploadDocumentPicker","NativeUploadPicker","pickFile","options","_options$multipleFile","_options$maxFiles","_options$maxSize","_options$fileTypes","_options$excludedUris","_options$isGallery","_options$withBase","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","withBase64","openDocument","getBase64FromUri","cropFileUri","error","message","CropImageWithBase64","base64","cropData","cropImageWithUri","fileUri","crop","RotateImage","angle","rotatedBase64","rotateImage","RotateImageWithUri","currentImageUri","rotatedImageUri","console","MyUploader","onSelect","onError","buttonPlaceHolder","ButtonStyle","ButtonTextStyle","disabled","isLoading","setIsLoading","handlePress","files","createElement","style","styles","button","onPress","color","text","create","backgroundColor","padding","borderRadius","alignItems","justifyContent","fontWeight","fontSize"],"sources":["MyUploader.tsx"],"sourcesContent":["import React, { useState } from 'react';\r\nimport { TouchableOpacity, Text, StyleSheet, ActivityIndicator, NativeModules } from 'react-native';\r\nimport type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps, CropData } from '../types';\r\n\r\nconst { UploadDocumentPicker: NativeUploadPicker } = NativeModules;\r\n\r\n// 1. Standalone pickFile Fonksiyonu\r\nexport const pickFile = async (options: DocumentPickerOptions = {}): Promise<FileInfo[]> => {\r\n if (!NativeUploadPicker) throw new Error(\"DocumentPicker module is not linked.\");\r\n\r\n // Native tarafa gönderilecek options\r\n const nativeOptions = {\r\n multipleFiles: options.multipleFiles ?? false,\r\n maxFiles: options.maxFiles ?? 0,\r\n maxSize: options.maxSize ?? 0,\r\n fileTypes: options.fileTypes ?? ['*/*'],\r\n excludedUris: options.excludedUris ?? [],\r\n isGallery: options.isGallery ?? false,\r\n withBase64: options.withBase64 ?? true,\r\n };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const getBase64FromUri = async (cropFileUri: string): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.getBase64FromUri(cropFileUri);\r\n } catch (error: any) {\r\n throw new Error(`getBase64FromUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const CropImageWithBase64 = async (base64: string, cropData: CropData): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.CropImageWithBase64(base64, cropData);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\nexport const cropImageWithUri = async (fileUri: string, crop: CropData): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n return await NativeUploadPicker.cropImageWithUri(fileUri, crop);\r\n } catch (error: any) {\r\n throw new Error(`CropImageWithUri Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n if (!base64) {\r\n throw new Error(\"RotateImage Hatası: Base64 verisi boş olamaz.\");\r\n }\r\n\r\n try {\r\n // Native sadece saf base64 string'i döner\r\n const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);\r\n\r\n // Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir\r\n return `data:image/jpeg;base64,${rotatedBase64}`;\r\n } catch (error: any) {\r\n // Hata mesajını daha okunaklı fırlatıyoruz\r\n throw new Error(`RotateImage Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n\r\nexport const RotateImageWithUri = async (currentImageUri: string, angle: number): Promise<string> => {\r\n try {\r\n const rotatedImageUri: string = await NativeUploadPicker.RotateImageWithUri(currentImageUri, angle);\r\n return rotatedImageUri;\r\n\r\n } catch (error) {\r\n console.error('Resim döndürme hatası:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n// 2. MyUploader Bileşeni\r\nconst MyUploader: React.FC<MyUploaderProps> = ({\r\n onSelect,\r\n onError,\r\n buttonPlaceHolder = \"Dosya Seç\",\r\n ButtonStyle,\r\n ButtonTextStyle,\r\n disabled = false,\r\n multipleFiles = false,\r\n fileTypes = ['*/*'],\r\n maxSize = 0,\r\n maxFiles = 0,\r\n excludedUris = [],\r\n withBase64 = true\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handlePress = async () => {\r\n if (disabled || isLoading) return;\r\n setIsLoading(true);\r\n\r\n try {\r\n const files = await pickFile({\r\n multipleFiles,\r\n fileTypes,\r\n maxSize,\r\n maxFiles,\r\n excludedUris,\r\n withBase64\r\n });\r\n\r\n onSelect(files);\r\n } catch (error: any) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n console.error(\"MyUploader Error:\", error);\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <TouchableOpacity\r\n style={[styles.button, ButtonStyle, (disabled || isLoading) && styles.disabled]}\r\n onPress={handlePress}\r\n disabled={disabled || isLoading}\r\n >\r\n {isLoading ? (\r\n <ActivityIndicator color=\"#FFF\" />\r\n ) : (\r\n <Text style={[styles.text, ButtonTextStyle]}>{buttonPlaceHolder}</Text>\r\n )}\r\n </TouchableOpacity>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n button: {\r\n backgroundColor: '#6200EE',\r\n padding: 12,\r\n borderRadius: 8,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#FFF',\r\n fontWeight: '600',\r\n fontSize: 16\r\n },\r\n disabled: {\r\n backgroundColor: '#B0B0B0'\r\n }\r\n});\r\n\r\nexport default MyUploader;"],"mappings":"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","ignoreList":[]}
|
package/lib/module/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// import type { StyleProp, TextStyle, ViewStyle } from 'react-native';\r\n\r\n// export interface FileInfo {\r\n// fileName: string;\r\n// fileSize: number; \r\n// fileType: string | null;\r\n// fileUri: string;\r\n// base64: string;\r\n// }\r\n\r\n// export interface MyUploaderProps{\r\n// onSelect: (files: FileInfo[]) => void;\r\n// onError?: (error: Error) => void;\r\n// buttonPlaceHolder?: string;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// disabled?: boolean; \r\n// multipleFiles?: boolean;\r\n// fileTypes?: string[];\r\n// maxSize?: number;\r\n// maxFiles?: number;\r\n// excludedUris?: string[];\r\n// }\r\n\r\n// export interface DownloadedFileInfo {\r\n// originalUrl: string;\r\n// localUri: string;\r\n// }\r\n\r\n// export interface SkippedFileInfo {\r\n// originalUrl: string;\r\n// reason: string; \r\n// }\r\n\r\n\r\n\r\n// export interface UploadFileProps {\r\n// files: string[];\r\n// multipleLoad?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean; \r\n// maxSize?: number;\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: Error) => void;\r\n// }\r\n\r\n// export interface DownloadFileProps {\r\n// files: string[];\r\n// multipleDownload?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean;\r\n// maxSize?: number; // MB\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: ViewStyle;\r\n// ButtonTextStyle?: TextStyle;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: any) => void;\r\n// }\r\n// export interface DownloadResult {\r\n// successful: { originalUrl: string; localUri: string | null }[];\r\n// skipped: { originalUrl: string; reason: string }[];\r\n// }\r\n\r\n\r\nimport type { ViewStyle, TextStyle } from 'react-native';\r\n\r\nexport interface FileInfo {\r\n fileUri: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n base64?: string | null;\r\n}\r\n\r\n\r\n// ----- MyUploader & pickFile Props -----\r\nexport interface DocumentPickerOptions {\r\n multipleFiles?: boolean;\r\n fileTypes?: string[]; // örn: ['image/*', 'application/pdf']\r\n maxSize?: number; // MB cinsinden\r\n maxFiles?: number;\r\n excludedUris?: string[];\r\n isGallery?:boolean;\r\n}\r\n\r\nexport interface MyUploaderProps extends DocumentPickerOptions {\r\n onSelect: (files: FileInfo[]) => void;\r\n onError?: (error: Error) => void;\r\n buttonPlaceHolder?: string;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n disabled?: boolean;\r\n}\r\n\r\n// ----- DownloadFile Props -----\r\nexport interface DownloadFileProps {\r\n files: string[];\r\n multipleDownload?: boolean; // multipleFiles yerine multipleDownload (İsim karışmaması için)\r\n disabled?: boolean;\r\n debug?: boolean;\r\n maxSize?: number; // MB\r\n fileTypes?: string[]; // İndirilecek dosyanın Content-Type kontrolü\r\n buttonPlaceHolder?: string;\r\n buttonIcon?: React.ReactNode;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n onSuccess?: (result: DownloadResult) => void;\r\n onError?: (error: any) => void;\r\n}\r\n\r\n\r\nexport interface DownloadResult {\r\n successful: { originalUrl: string; localUri: string | null }[];\r\n skipped: { originalUrl: string; reason: string }[];\r\n}\r\n\r\n\r\n///rotateImage\r\n\r\nexport interface RotateImageProps{\r\n base64: string, angle: number\r\n}"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["// import type { StyleProp, TextStyle, ViewStyle } from 'react-native';\r\n\r\n// export interface FileInfo {\r\n// fileName: string;\r\n// fileSize: number; \r\n// fileType: string | null;\r\n// fileUri: string;\r\n// base64: string;\r\n// }\r\n\r\n// export interface MyUploaderProps{\r\n// onSelect: (files: FileInfo[]) => void;\r\n// onError?: (error: Error) => void;\r\n// buttonPlaceHolder?: string;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// disabled?: boolean; \r\n// multipleFiles?: boolean;\r\n// fileTypes?: string[];\r\n// maxSize?: number;\r\n// maxFiles?: number;\r\n// excludedUris?: string[];\r\n// }\r\n\r\n// export interface DownloadedFileInfo {\r\n// originalUrl: string;\r\n// localUri: string;\r\n// }\r\n\r\n// export interface SkippedFileInfo {\r\n// originalUrl: string;\r\n// reason: string; \r\n// }\r\n\r\n\r\n\r\n// export interface UploadFileProps {\r\n// files: string[];\r\n// multipleLoad?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean; \r\n// maxSize?: number;\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: StyleProp<ViewStyle>;\r\n// ButtonTextStyle?: StyleProp<TextStyle>;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: Error) => void;\r\n// }\r\n\r\n// export interface DownloadFileProps {\r\n// files: string[];\r\n// multipleDownload?: boolean;\r\n// disabled?: boolean;\r\n// debug?: boolean;\r\n// maxSize?: number; // MB\r\n// fileTypes?: string[];\r\n// buttonPlaceHolder?: string;\r\n// buttonIcon?: React.ReactNode;\r\n// ButtonStyle?: ViewStyle;\r\n// ButtonTextStyle?: TextStyle;\r\n// onSuccess?: (result: DownloadResult) => void;\r\n// onError?: (error: any) => void;\r\n// }\r\n// export interface DownloadResult {\r\n// successful: { originalUrl: string; localUri: string | null }[];\r\n// skipped: { originalUrl: string; reason: string }[];\r\n// }\r\n\r\n\r\nimport type { ViewStyle, TextStyle } from 'react-native';\r\n\r\nexport interface FileInfo {\r\n fileUri: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n base64?: string | null;\r\n}\r\n\r\n\r\n// ----- MyUploader & pickFile Props -----\r\nexport interface DocumentPickerOptions {\r\n multipleFiles?: boolean;\r\n fileTypes?: string[]; // örn: ['image/*', 'application/pdf']\r\n maxSize?: number; // MB cinsinden\r\n maxFiles?: number;\r\n excludedUris?: string[];\r\n isGallery?:boolean;\r\n withBase64?:boolean;\r\n}\r\n\r\nexport interface CropData {\r\n x?: number;\r\n y?: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\n\r\nexport interface MyUploaderProps extends DocumentPickerOptions {\r\n onSelect: (files: FileInfo[]) => void;\r\n onError?: (error: Error) => void;\r\n buttonPlaceHolder?: string;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n disabled?: boolean;\r\n}\r\n\r\n// ----- DownloadFile Props -----\r\nexport interface DownloadFileProps {\r\n files: string[];\r\n multipleDownload?: boolean; // multipleFiles yerine multipleDownload (İsim karışmaması için)\r\n disabled?: boolean;\r\n debug?: boolean;\r\n maxSize?: number; // MB\r\n fileTypes?: string[]; // İndirilecek dosyanın Content-Type kontrolü\r\n buttonPlaceHolder?: string;\r\n buttonIcon?: React.ReactNode;\r\n ButtonStyle?: ViewStyle;\r\n ButtonTextStyle?: TextStyle;\r\n onSuccess?: (result: DownloadResult) => void;\r\n onError?: (error: any) => void;\r\n}\r\n\r\n\r\nexport interface DownloadResult {\r\n successful: { originalUrl: string; localUri: string | null }[];\r\n skipped: { originalUrl: string; reason: string }[];\r\n}\r\n\r\n\r\n///rotateImage\r\n\r\nexport interface RotateImageProps{\r\n base64: string, angle: number\r\n}"],"mappings":"","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import { TouchableOpacity, Text, StyleSheet, ActivityIndicator, NativeModules } from 'react-native';
|
|
3
|
-
import type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps } from '../types';
|
|
3
|
+
import type { MyUploaderProps, DocumentPickerOptions, FileInfo, RotateImageProps, CropData } from '../types';
|
|
4
4
|
|
|
5
5
|
const { UploadDocumentPicker: NativeUploadPicker } = NativeModules;
|
|
6
6
|
|
|
@@ -15,7 +15,8 @@ export const pickFile = async (options: DocumentPickerOptions = {}): Promise<Fil
|
|
|
15
15
|
maxSize: options.maxSize ?? 0,
|
|
16
16
|
fileTypes: options.fileTypes ?? ['*/*'],
|
|
17
17
|
excludedUris: options.excludedUris ?? [],
|
|
18
|
-
isGallery:options.isGallery ?? false,
|
|
18
|
+
isGallery: options.isGallery ?? false,
|
|
19
|
+
withBase64: options.withBase64 ?? true,
|
|
19
20
|
};
|
|
20
21
|
|
|
21
22
|
return await NativeUploadPicker.openDocument(nativeOptions);
|
|
@@ -35,26 +36,42 @@ export const getBase64FromUri = async (cropFileUri: string): Promise<string> =>
|
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
|
|
38
|
-
export const CropImageWithBase64 = async (base64: string,cropData:
|
|
39
|
+
export const CropImageWithBase64 = async (base64: string, cropData: CropData): Promise<string> => {
|
|
39
40
|
if (!NativeUploadPicker) {
|
|
40
41
|
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
try {
|
|
44
|
-
return await NativeUploadPicker.CropImageWithBase64(base64,cropData);
|
|
45
|
+
return await NativeUploadPicker.CropImageWithBase64(base64, cropData);
|
|
45
46
|
} catch (error: any) {
|
|
46
47
|
throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);
|
|
47
48
|
}
|
|
48
49
|
};
|
|
49
50
|
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
export const cropImageWithUri = async (fileUri: string, crop: CropData): Promise<string> => {
|
|
53
|
+
if (!NativeUploadPicker) {
|
|
54
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
return await NativeUploadPicker.cropImageWithUri(fileUri, crop);
|
|
59
|
+
} catch (error: any) {
|
|
60
|
+
throw new Error(`CropImageWithUri Hatası: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
|
|
52
65
|
|
|
53
66
|
export const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {
|
|
54
67
|
if (!NativeUploadPicker) {
|
|
55
68
|
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
56
69
|
}
|
|
57
70
|
|
|
71
|
+
if (!base64) {
|
|
72
|
+
throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
|
|
73
|
+
}
|
|
74
|
+
|
|
58
75
|
try {
|
|
59
76
|
// Native sadece saf base64 string'i döner
|
|
60
77
|
const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);
|
|
@@ -67,6 +84,18 @@ export const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<
|
|
|
67
84
|
}
|
|
68
85
|
};
|
|
69
86
|
|
|
87
|
+
|
|
88
|
+
export const RotateImageWithUri = async (currentImageUri: string, angle: number): Promise<string> => {
|
|
89
|
+
try {
|
|
90
|
+
const rotatedImageUri: string = await NativeUploadPicker.RotateImageWithUri(currentImageUri, angle);
|
|
91
|
+
return rotatedImageUri;
|
|
92
|
+
|
|
93
|
+
} catch (error) {
|
|
94
|
+
console.error('Resim döndürme hatası:', error);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
70
99
|
// 2. MyUploader Bileşeni
|
|
71
100
|
const MyUploader: React.FC<MyUploaderProps> = ({
|
|
72
101
|
onSelect,
|
|
@@ -80,6 +109,7 @@ const MyUploader: React.FC<MyUploaderProps> = ({
|
|
|
80
109
|
maxSize = 0,
|
|
81
110
|
maxFiles = 0,
|
|
82
111
|
excludedUris = [],
|
|
112
|
+
withBase64 = true
|
|
83
113
|
}) => {
|
|
84
114
|
const [isLoading, setIsLoading] = useState(false);
|
|
85
115
|
|
|
@@ -93,7 +123,8 @@ const MyUploader: React.FC<MyUploaderProps> = ({
|
|
|
93
123
|
fileTypes,
|
|
94
124
|
maxSize,
|
|
95
125
|
maxFiles,
|
|
96
|
-
excludedUris
|
|
126
|
+
excludedUris,
|
|
127
|
+
withBase64
|
|
97
128
|
});
|
|
98
129
|
|
|
99
130
|
onSelect(files);
|
package/src/types.ts
CHANGED
|
@@ -88,8 +88,17 @@ export interface DocumentPickerOptions {
|
|
|
88
88
|
maxFiles?: number;
|
|
89
89
|
excludedUris?: string[];
|
|
90
90
|
isGallery?:boolean;
|
|
91
|
+
withBase64?:boolean;
|
|
91
92
|
}
|
|
92
93
|
|
|
94
|
+
export interface CropData {
|
|
95
|
+
x?: number;
|
|
96
|
+
y?: number;
|
|
97
|
+
width?: number;
|
|
98
|
+
height?: number;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
93
102
|
export interface MyUploaderProps extends DocumentPickerOptions {
|
|
94
103
|
onSelect: (files: FileInfo[]) => void;
|
|
95
104
|
onError?: (error: Error) => void;
|