react-native-my-uploader-android 1.0.38 → 1.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/myuploaderandroid/MyUploaderModule.kt +50 -32
- package/lib/commonjs/components/MyUploader.js +5 -3
- package/lib/commonjs/components/MyUploader.js.map +1 -1
- package/lib/module/components/MyUploader.js +5 -3
- package/lib/module/components/MyUploader.js.map +1 -1
- package/package.json +1 -1
- package/src/components/MyUploader.tsx +6 -5
|
@@ -102,65 +102,83 @@ class MyUploaderModule(private val reactContext: ReactApplicationContext) :
|
|
|
102
102
|
fun rotateImage(base64String: String, angle: Double, promise: Promise) {
|
|
103
103
|
Thread {
|
|
104
104
|
try {
|
|
105
|
-
|
|
106
|
-
val cleanBase64 =
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
/* 1️⃣ Base64 Temizleme (Prefix, Boşluk ve Satır Başlarını yok eder) */
|
|
106
|
+
val cleanBase64 = base64String
|
|
107
|
+
.substringAfter(",")
|
|
108
|
+
.replace("\n", "")
|
|
109
|
+
.replace("\r", "")
|
|
110
|
+
.replace(" ", "")
|
|
111
|
+
.trim()
|
|
112
|
+
|
|
113
|
+
if (cleanBase64.isEmpty()) {
|
|
114
|
+
reactContext.runOnUiQueueThread {
|
|
115
|
+
promise.reject("E_EMPTY_BASE64", "Base64 verisi boş veya geçersiz.")
|
|
116
|
+
}
|
|
117
|
+
return@Thread
|
|
110
118
|
}
|
|
111
119
|
|
|
112
|
-
|
|
120
|
+
/* 2️⃣ Base64 Decode */
|
|
121
|
+
val decodedBytes = try {
|
|
122
|
+
Base64.decode(cleanBase64, Base64.DEFAULT)
|
|
123
|
+
} catch (e: IllegalArgumentException) {
|
|
124
|
+
reactContext.runOnUiQueueThread {
|
|
125
|
+
promise.reject("E_BASE64_ERROR", "Geçersiz Base64 formatı.")
|
|
126
|
+
}
|
|
127
|
+
return@Thread
|
|
128
|
+
}
|
|
113
129
|
|
|
114
|
-
|
|
130
|
+
/* 3️⃣ Bitmap Decode - Downscale Stratejisi */
|
|
115
131
|
val options = BitmapFactory.Options().apply {
|
|
116
132
|
inPreferredConfig = Bitmap.Config.ARGB_8888
|
|
117
133
|
}
|
|
118
134
|
|
|
119
|
-
|
|
120
|
-
|
|
135
|
+
var originalBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options)
|
|
136
|
+
|
|
137
|
+
// EĞER RESİM ÇOK BÜYÜKSE (null dönerse), 1/2 oranında küçülterek tekrar dene
|
|
138
|
+
if (originalBitmap == null) {
|
|
139
|
+
options.inSampleSize = 2
|
|
140
|
+
originalBitmap = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size, options)
|
|
141
|
+
}
|
|
121
142
|
|
|
122
143
|
if (originalBitmap == null) {
|
|
123
144
|
reactContext.runOnUiQueueThread {
|
|
124
|
-
promise.reject("E_DECODE_ERROR", "Görüntü çözümlenemedi.")
|
|
145
|
+
promise.reject("E_DECODE_ERROR", "Görüntü çözümlenemedi (Hafıza yetersiz veya veri bozuk).")
|
|
125
146
|
}
|
|
126
147
|
return@Thread
|
|
127
148
|
}
|
|
128
149
|
|
|
129
|
-
|
|
130
|
-
val matrix = Matrix()
|
|
131
|
-
|
|
150
|
+
/* 4️⃣ Döndürme (Rotate) İşlemi */
|
|
151
|
+
val matrix = Matrix().apply {
|
|
152
|
+
postRotate(angle.toFloat())
|
|
153
|
+
}
|
|
132
154
|
|
|
133
155
|
val rotatedBitmap = Bitmap.createBitmap(
|
|
134
|
-
originalBitmap,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
originalBitmap.height,
|
|
139
|
-
matrix,
|
|
140
|
-
true
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
// 4. Base64 encode
|
|
156
|
+
originalBitmap, 0, 0, originalBitmap.width, originalBitmap.height, matrix, true
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
/* 5️⃣ Tekrar Base64'e Encode Etme */
|
|
144
160
|
val outputStream = ByteArrayOutputStream()
|
|
145
161
|
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
|
|
162
|
+
val rotatedBytes = outputStream.toByteArray()
|
|
163
|
+
val encodedBase64 = Base64.encodeToString(rotatedBytes, Base64.NO_WRAP)
|
|
146
164
|
|
|
147
|
-
|
|
148
|
-
outputStream.toByteArray(),
|
|
149
|
-
Base64.NO_WRAP
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
// 5. Memory cleanup
|
|
165
|
+
/* 6️⃣ Bellek Temizliği (Cleanup) */
|
|
153
166
|
originalBitmap.recycle()
|
|
154
167
|
rotatedBitmap.recycle()
|
|
168
|
+
outputStream.close()
|
|
155
169
|
|
|
156
|
-
|
|
170
|
+
/* 7️⃣ Sonucu UI Thread üzerinden döndür */
|
|
157
171
|
reactContext.runOnUiQueueThread {
|
|
158
|
-
promise.resolve(
|
|
172
|
+
promise.resolve(encodedBase64)
|
|
159
173
|
}
|
|
160
174
|
|
|
175
|
+
} catch (e: OutOfMemoryError) {
|
|
176
|
+
reactContext.runOnUiQueueThread {
|
|
177
|
+
promise.reject("E_OOM", "Hafıza limitine ulaşıldı, resim çok büyük.")
|
|
178
|
+
}
|
|
161
179
|
} catch (e: Exception) {
|
|
162
180
|
reactContext.runOnUiQueueThread {
|
|
163
|
-
promise.reject("E_ROTATE_ERROR", "
|
|
181
|
+
promise.reject("E_ROTATE_ERROR", "Döndürme hatası: ${e.message}")
|
|
164
182
|
}
|
|
165
183
|
}
|
|
166
184
|
}.start()
|
|
@@ -32,15 +32,17 @@ const RotateImage = async ({
|
|
|
32
32
|
angle
|
|
33
33
|
}) => {
|
|
34
34
|
if (!NativeUploadPicker) {
|
|
35
|
-
throw new Error("UploadDocumentPicker
|
|
35
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
36
36
|
}
|
|
37
37
|
try {
|
|
38
|
+
// Native sadece saf base64 string'i döner
|
|
38
39
|
const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
|
|
39
40
|
|
|
40
|
-
//
|
|
41
|
+
// Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir
|
|
41
42
|
return `data:image/jpeg;base64,${rotatedBase64}`;
|
|
42
43
|
} catch (error) {
|
|
43
|
-
|
|
44
|
+
// Hata mesajını daha okunaklı fırlatıyoruz
|
|
45
|
+
throw new Error(`RotateImage Hatası: ${error.message}`);
|
|
44
46
|
}
|
|
45
47
|
};
|
|
46
48
|
|
|
@@ -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","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","openDocument","exports","RotateImage","base64","angle","rotatedBase64","rotateImage","error","message","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 };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker
|
|
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","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","openDocument","exports","RotateImage","base64","angle","rotatedBase64","rotateImage","error","message","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 };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\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":[]}
|
|
@@ -24,15 +24,17 @@ export const RotateImage = async ({
|
|
|
24
24
|
angle
|
|
25
25
|
}) => {
|
|
26
26
|
if (!NativeUploadPicker) {
|
|
27
|
-
throw new Error("UploadDocumentPicker
|
|
27
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
28
28
|
}
|
|
29
29
|
try {
|
|
30
|
+
// Native sadece saf base64 string'i döner
|
|
30
31
|
const rotatedBase64 = await NativeUploadPicker.rotateImage(base64, angle);
|
|
31
32
|
|
|
32
|
-
//
|
|
33
|
+
// Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir
|
|
33
34
|
return `data:image/jpeg;base64,${rotatedBase64}`;
|
|
34
35
|
} catch (error) {
|
|
35
|
-
|
|
36
|
+
// Hata mesajını daha okunaklı fırlatıyoruz
|
|
37
|
+
throw new Error(`RotateImage Hatası: ${error.message}`);
|
|
36
38
|
}
|
|
37
39
|
};
|
|
38
40
|
|
|
@@ -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","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","openDocument","RotateImage","base64","angle","rotatedBase64","rotateImage","error","message","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 };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker
|
|
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","Error","nativeOptions","multipleFiles","maxFiles","maxSize","fileTypes","excludedUris","openDocument","RotateImage","base64","angle","rotatedBase64","rotateImage","error","message","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 };\r\n\r\n return await NativeUploadPicker.openDocument(nativeOptions);\r\n};\r\n\r\nexport const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {\r\n if (!NativeUploadPicker) {\r\n throw new Error(\"UploadDocumentPicker modülü linklenmemiş.\");\r\n }\r\n\r\n try {\r\n // Native sadece saf base64 string'i döner\r\n const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);\r\n\r\n // Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir\r\n return `data:image/jpeg;base64,${rotatedBase64}`;\r\n } catch (error: any) {\r\n // Hata mesajını daha okunaklı fırlatıyoruz\r\n throw new Error(`RotateImage Hatası: ${error.message}`);\r\n }\r\n};\r\n\r\n// 2. MyUploader Bileşeni\r\nconst MyUploader: React.FC<MyUploaderProps> = ({\r\n onSelect,\r\n onError,\r\n buttonPlaceHolder = \"Dosya Seç\",\r\n ButtonStyle,\r\n ButtonTextStyle,\r\n disabled = false,\r\n multipleFiles = false,\r\n fileTypes = ['*/*'],\r\n maxSize = 0,\r\n maxFiles = 0,\r\n excludedUris = [],\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const handlePress = async () => {\r\n if (disabled || isLoading) return;\r\n setIsLoading(true);\r\n\r\n try {\r\n const files = await pickFile({\r\n multipleFiles,\r\n fileTypes,\r\n maxSize,\r\n maxFiles,\r\n excludedUris\r\n });\r\n\r\n onSelect(files);\r\n } catch (error: any) {\r\n if (onError) {\r\n onError(error);\r\n } else {\r\n console.error(\"MyUploader Error:\", error);\r\n }\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <TouchableOpacity\r\n style={[styles.button, ButtonStyle, (disabled || isLoading) && styles.disabled]}\r\n onPress={handlePress}\r\n disabled={disabled || isLoading}\r\n >\r\n {isLoading ? (\r\n <ActivityIndicator color=\"#FFF\" />\r\n ) : (\r\n <Text style={[styles.text, ButtonTextStyle]}>{buttonPlaceHolder}</Text>\r\n )}\r\n </TouchableOpacity>\r\n );\r\n};\r\n\r\nconst styles = StyleSheet.create({\r\n button: {\r\n backgroundColor: '#6200EE',\r\n padding: 12,\r\n borderRadius: 8,\r\n alignItems: 'center',\r\n justifyContent: 'center'\r\n },\r\n text: {\r\n color: '#FFF',\r\n fontWeight: '600',\r\n fontSize: 16\r\n },\r\n disabled: {\r\n backgroundColor: '#B0B0B0'\r\n }\r\n});\r\n\r\nexport default MyUploader;"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,QAAQ,QAAQ,OAAO;AACvC,SAASC,gBAAgB,EAAEC,IAAI,EAAEC,UAAU,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,cAAc;AAGnG,MAAM;EAAEC,oBAAoB,EAAEC;AAAmB,CAAC,GAAGF,aAAa;;AAElE;AACA,OAAO,MAAMG,QAAQ,GAAG,MAAAA,CAAOC,OAA8B,GAAG,CAAC,CAAC,KAA0B;EAAA,IAAAC,qBAAA,EAAAC,iBAAA,EAAAC,gBAAA,EAAAC,kBAAA,EAAAC,qBAAA;EAC1F,IAAI,CAACP,kBAAkB,EAAE,MAAM,IAAIQ,KAAK,CAAC,sCAAsC,CAAC;;EAEhF;EACA,MAAMC,aAAa,GAAG;IACpBC,aAAa,GAAAP,qBAAA,GAAED,OAAO,CAACQ,aAAa,cAAAP,qBAAA,cAAAA,qBAAA,GAAI,KAAK;IAC7CQ,QAAQ,GAAAP,iBAAA,GAAEF,OAAO,CAACS,QAAQ,cAAAP,iBAAA,cAAAA,iBAAA,GAAI,CAAC;IAC/BQ,OAAO,GAAAP,gBAAA,GAAEH,OAAO,CAACU,OAAO,cAAAP,gBAAA,cAAAA,gBAAA,GAAI,CAAC;IAC7BQ,SAAS,GAAAP,kBAAA,GAAEJ,OAAO,CAACW,SAAS,cAAAP,kBAAA,cAAAA,kBAAA,GAAI,CAAC,KAAK,CAAC;IACvCQ,YAAY,GAAAP,qBAAA,GAAEL,OAAO,CAACY,YAAY,cAAAP,qBAAA,cAAAA,qBAAA,GAAI;EACxC,CAAC;EAED,OAAO,MAAMP,kBAAkB,CAACe,YAAY,CAACN,aAAa,CAAC;AAC7D,CAAC;AAED,OAAO,MAAMO,WAAW,GAAG,MAAAA,CAAO;EAAEC,MAAM;EAAEC;AAAwB,CAAC,KAAsB;EACzF,IAAI,CAAClB,kBAAkB,EAAE;IACvB,MAAM,IAAIQ,KAAK,CAAC,2CAA2C,CAAC;EAC9D;EAEA,IAAI;IACF;IACA,MAAMW,aAAqB,GAAG,MAAMnB,kBAAkB,CAACoB,WAAW,CAACH,MAAM,EAAEC,KAAK,CAAC;;IAEjF;IACA,OAAO,0BAA0BC,aAAa,EAAE;EAClD,CAAC,CAAC,OAAOE,KAAU,EAAE;IACnB;IACA,MAAM,IAAIb,KAAK,CAAC,uBAAuBa,KAAK,CAACC,OAAO,EAAE,CAAC;EACzD;AACF,CAAC;;AAED;AACA,MAAMC,UAAqC,GAAGA,CAAC;EAC7CC,QAAQ;EACRC,OAAO;EACPC,iBAAiB,GAAG,WAAW;EAC/BC,WAAW;EACXC,eAAe;EACfC,QAAQ,GAAG,KAAK;EAChBnB,aAAa,GAAG,KAAK;EACrBG,SAAS,GAAG,CAAC,KAAK,CAAC;EACnBD,OAAO,GAAG,CAAC;EACXD,QAAQ,GAAG,CAAC;EACZG,YAAY,GAAG;AACjB,CAAC,KAAK;EACJ,MAAM,CAACgB,SAAS,EAAEC,YAAY,CAAC,GAAGtC,QAAQ,CAAC,KAAK,CAAC;EAEjD,MAAMuC,WAAW,GAAG,MAAAA,CAAA,KAAY;IAC9B,IAAIH,QAAQ,IAAIC,SAAS,EAAE;IAC3BC,YAAY,CAAC,IAAI,CAAC;IAElB,IAAI;MACF,MAAME,KAAK,GAAG,MAAMhC,QAAQ,CAAC;QAC3BS,aAAa;QACbG,SAAS;QACTD,OAAO;QACPD,QAAQ;QACRG;MACF,CAAC,CAAC;MAEFU,QAAQ,CAACS,KAAK,CAAC;IACjB,CAAC,CAAC,OAAOZ,KAAU,EAAE;MACnB,IAAII,OAAO,EAAE;QACXA,OAAO,CAACJ,KAAK,CAAC;MAChB,CAAC,MAAM;QACLa,OAAO,CAACb,KAAK,CAAC,mBAAmB,EAAEA,KAAK,CAAC;MAC3C;IACF,CAAC,SAAS;MACRU,YAAY,CAAC,KAAK,CAAC;IACrB;EACF,CAAC;EAED,oBACEvC,KAAA,CAAA2C,aAAA,CAACzC,gBAAgB;IACf0C,KAAK,EAAE,CAACC,MAAM,CAACC,MAAM,EAAEX,WAAW,EAAE,CAACE,QAAQ,IAAIC,SAAS,KAAKO,MAAM,CAACR,QAAQ,CAAE;IAChFU,OAAO,EAAEP,WAAY;IACrBH,QAAQ,EAAEA,QAAQ,IAAIC;EAAU,GAE/BA,SAAS,gBACRtC,KAAA,CAAA2C,aAAA,CAACtC,iBAAiB;IAAC2C,KAAK,EAAC;EAAM,CAAE,CAAC,gBAElChD,KAAA,CAAA2C,aAAA,CAACxC,IAAI;IAACyC,KAAK,EAAE,CAACC,MAAM,CAACI,IAAI,EAAEb,eAAe;EAAE,GAAEF,iBAAwB,CAExD,CAAC;AAEvB,CAAC;AAED,MAAMW,MAAM,GAAGzC,UAAU,CAAC8C,MAAM,CAAC;EAC/BJ,MAAM,EAAE;IACNK,eAAe,EAAE,SAAS;IAC1BC,OAAO,EAAE,EAAE;IACXC,YAAY,EAAE,CAAC;IACfC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE;EAClB,CAAC;EACDN,IAAI,EAAE;IACJD,KAAK,EAAE,MAAM;IACbQ,UAAU,EAAE,KAAK;IACjBC,QAAQ,EAAE;EACZ,CAAC;EACDpB,QAAQ,EAAE;IACRc,eAAe,EAAE;EACnB;AACF,CAAC,CAAC;AAEF,eAAepB,UAAU","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -22,17 +22,18 @@ export const pickFile = async (options: DocumentPickerOptions = {}): Promise<Fil
|
|
|
22
22
|
|
|
23
23
|
export const RotateImage = async ({ base64, angle }: RotateImageProps): Promise<string> => {
|
|
24
24
|
if (!NativeUploadPicker) {
|
|
25
|
-
throw new Error("UploadDocumentPicker
|
|
25
|
+
throw new Error("UploadDocumentPicker modülü linklenmemiş.");
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
// Native sadece saf base64 string'i döner
|
|
30
|
+
const rotatedBase64: string = await NativeUploadPicker.rotateImage(base64, angle);
|
|
31
31
|
|
|
32
|
-
//
|
|
32
|
+
// Uygulama tarafında doğrudan <Image /> içinde kullanılabilmesi için prefix eklenir
|
|
33
33
|
return `data:image/jpeg;base64,${rotatedBase64}`;
|
|
34
34
|
} catch (error: any) {
|
|
35
|
-
|
|
35
|
+
// Hata mesajını daha okunaklı fırlatıyoruz
|
|
36
|
+
throw new Error(`RotateImage Hatası: ${error.message}`);
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
|