react-native-my-uploader-android 1.0.44 → 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
@@ -207,6 +211,93 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
207
211
  }.start()
208
212
  }
209
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
+
210
301
  @ReactMethod
211
302
  fun getBase64FromUri(cropFileUri: String, promise: Promise) {
212
303
  Thread {
@@ -301,6 +392,141 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
301
392
  }.start()
302
393
  }
303
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
+
304
530
  override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) {
305
531
  if (requestCode != REQUEST_CODE || pickerPromise == null) { return }
306
532
 
@@ -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); }
@@ -51,6 +51,17 @@ const CropImageWithBase64 = async (base64, cropData) => {
51
51
  }
52
52
  };
53
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;
54
65
  const RotateImage = async ({
55
66
  base64,
56
67
  angle
@@ -58,6 +69,9 @@ const RotateImage = async ({
58
69
  if (!NativeUploadPicker) {
59
70
  throw new Error("UploadDocumentPicker modülü linklenmemiş.");
60
71
  }
72
+ if (!base64) {
73
+ throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
74
+ }
61
75
  try {
62
76
  // Native sadece saf base64 string'i döner
63
77
  const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
@@ -69,9 +83,19 @@ const RotateImage = async ({
69
83
  throw new Error(`RotateImage Hatası: ${error.message}`);
70
84
  }
71
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
+ };
72
96
 
73
97
  // 2. MyUploader Bileşeni
74
- exports.RotateImage = RotateImage;
98
+ exports.RotateImageWithUri = RotateImageWithUri;
75
99
  const MyUploader = ({
76
100
  onSelect,
77
101
  onError,
@@ -83,7 +107,8 @@ const MyUploader = ({
83
107
  fileTypes = ['*/*'],
84
108
  maxSize = 0,
85
109
  maxFiles = 0,
86
- excludedUris = []
110
+ excludedUris = [],
111
+ withBase64 = true
87
112
  }) => {
88
113
  const [isLoading, setIsLoading] = (0, _react.useState)(false);
89
114
  const handlePress = async () => {
@@ -95,7 +120,8 @@ const MyUploader = ({
95
120
  fileTypes,
96
121
  maxSize,
97
122
  maxFiles,
98
- excludedUris
123
+ excludedUris,
124
+ withBase64
99
125
  });
100
126
  onSelect(files);
101
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","_options$withBase","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","withBase64","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 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: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 withBase64?: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":[]}
@@ -41,6 +41,16 @@ export const CropImageWithBase64 = async (base64, cropData) => {
41
41
  throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);
42
42
  }
43
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
+ };
44
54
  export const RotateImage = async ({
45
55
  base64,
46
56
  angle
@@ -48,6 +58,9 @@ export const RotateImage = async ({
48
58
  if (!NativeUploadPicker) {
49
59
  throw new Error("UploadDocumentPicker modülü linklenmemiş.");
50
60
  }
61
+ if (!base64) {
62
+ throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
63
+ }
51
64
  try {
52
65
  // Native sadece saf base64 string'i döner
53
66
  const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
@@ -59,6 +72,15 @@ export const RotateImage = async ({
59
72
  throw new Error(`RotateImage Hatası: ${error.message}`);
60
73
  }
61
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
+ };
62
84
 
63
85
  // 2. MyUploader Bileşeni
64
86
  const MyUploader = ({
@@ -72,7 +94,8 @@ const MyUploader = ({
72
94
  fileTypes = ['*/*'],
73
95
  maxSize = 0,
74
96
  maxFiles = 0,
75
- excludedUris = []
97
+ excludedUris = [],
98
+ withBase64 = true
76
99
  }) => {
77
100
  const [isLoading, setIsLoading] = useState(false);
78
101
  const handlePress = async () => {
@@ -84,7 +107,8 @@ const MyUploader = ({
84
107
  fileTypes,
85
108
  maxSize,
86
109
  maxFiles,
87
- excludedUris
110
+ excludedUris,
111
+ withBase64
88
112
  });
89
113
  onSelect(files);
90
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","_options$withBase","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","isGallery","withBase64","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 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: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 withBase64?: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.44",
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,8 +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,
19
- withBase64:options.withBase64 ?? true,
18
+ isGallery: options.isGallery ?? false,
19
+ withBase64: options.withBase64 ?? true,
20
20
  };
21
21
 
22
22
  return await NativeUploadPicker.openDocument(nativeOptions);
@@ -36,26 +36,42 @@ export const getBase64FromUri = async (cropFileUri: string): Promise<string> =>
36
36
 
37
37
 
38
38
 
39
- export const CropImageWithBase64 = async (base64: string,cropData:any): Promise<string> => {
39
+ export const CropImageWithBase64 = async (base64: string, cropData: CropData): Promise<string> => {
40
40
  if (!NativeUploadPicker) {
41
41
  throw new Error("UploadDocumentPicker modülü linklenmemiş.");
42
42
  }
43
43
 
44
44
  try {
45
- return await NativeUploadPicker.CropImageWithBase64(base64,cropData);
45
+ return await NativeUploadPicker.CropImageWithBase64(base64, cropData);
46
46
  } catch (error: any) {
47
47
  throw new Error(`CropImageWithBase64 Hatası: ${error.message}`);
48
48
  }
49
49
  };
50
50
 
51
51
 
52
-
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
+
53
65
 
54
66
  export const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {
55
67
  if (!NativeUploadPicker) {
56
68
  throw new Error("UploadDocumentPicker modülü linklenmemiş.");
57
69
  }
58
70
 
71
+ if (!base64) {
72
+ throw new Error("RotateImage Hatası: Base64 verisi boş olamaz.");
73
+ }
74
+
59
75
  try {
60
76
  // Native sadece saf base64 string'i döner
61
77
  const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);
@@ -68,6 +84,18 @@ export const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<
68
84
  }
69
85
  };
70
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
+
71
99
  // 2. MyUploader Bileşeni
72
100
  const MyUploader: React.FC<MyUploaderProps> = ({
73
101
  onSelect,
@@ -81,6 +109,7 @@ const MyUploader: React.FC<MyUploaderProps> = ({
81
109
  maxSize = 0,
82
110
  maxFiles = 0,
83
111
  excludedUris = [],
112
+ withBase64 = true
84
113
  }) => {
85
114
  const [isLoading, setIsLoading] = useState(false);
86
115
 
@@ -94,7 +123,8 @@ const MyUploader: React.FC<MyUploaderProps> = ({
94
123
  fileTypes,
95
124
  maxSize,
96
125
  maxFiles,
97
- excludedUris
126
+ excludedUris,
127
+ withBase64
98
128
  });
99
129
 
100
130
  onSelect(files);
package/src/types.ts CHANGED
@@ -91,6 +91,14 @@ export interface DocumentPickerOptions {
91
91
  withBase64?:boolean;
92
92
  }
93
93
 
94
+ export interface CropData {
95
+ x?: number;
96
+ y?: number;
97
+ width?: number;
98
+ height?: number;
99
+ }
100
+
101
+
94
102
  export interface MyUploaderProps extends DocumentPickerOptions {
95
103
  onSelect: (files: FileInfo[]) => void;
96
104
  onError?: (error: Error) => void;