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.
@@ -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
- ?.getArray("excludedUris")?.toArrayList()?.mapNotNull { it.toString() } ?: emptyList()
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 = encodeFileToBase64(uri)
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
- putString("base64", base64)
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.RotateImage = RotateImage;
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":"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","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":[]}
@@ -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
  {
2
2
  "name": "react-native-my-uploader-android",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
4
4
  "description": "file uploader for android",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -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:any): Promise<string> => {
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;