react-native-cloud-storage 2.2.1 → 2.3.0

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.
Files changed (188) hide show
  1. package/LICENSE +1 -1
  2. package/android/build.gradle +101 -0
  3. package/android/gradle.properties +5 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/AndroidManifestNew.xml +2 -0
  6. package/android/src/main/java/com/voicekit/CloudStorageError.kt +86 -0
  7. package/android/src/main/java/com/voicekit/CloudStorageLocalFileSystemModule.kt +236 -0
  8. package/android/src/main/java/com/voicekit/CloudStoragePackage.kt +17 -0
  9. package/android/src/main/java/com/voicekit/FileUtils.kt +41 -0
  10. package/android/src/main/java/com/voicekit/Types.kt +6 -0
  11. package/app.plugin.js +1 -1
  12. package/{lib/commonjs/RNCloudStorage.js → dist/commonjs/cloud-storage.js} +130 -80
  13. package/dist/commonjs/cloud-storage.js.map +1 -0
  14. package/dist/commonjs/expo-plugin/index.js +13 -0
  15. package/dist/commonjs/expo-plugin/index.js.map +1 -0
  16. package/{lib/commonjs/expo-plugin/withRNCloudStorageIos.js → dist/commonjs/expo-plugin/ios.js} +1 -1
  17. package/dist/commonjs/expo-plugin/ios.js.map +1 -0
  18. package/{lib/commonjs/hooks/useCloudFile.js → dist/commonjs/hooks/use-cloud-file.js} +26 -8
  19. package/dist/commonjs/hooks/use-cloud-file.js.map +1 -0
  20. package/{lib/commonjs/hooks/useIsCloudAvailable.js → dist/commonjs/hooks/use-is-cloud-available.js} +3 -3
  21. package/dist/commonjs/hooks/use-is-cloud-available.js.map +1 -0
  22. package/{lib → dist}/commonjs/index.js +10 -10
  23. package/dist/commonjs/index.js.map +1 -0
  24. package/dist/commonjs/storages/cloudkit.js +10 -0
  25. package/dist/commonjs/storages/cloudkit.js.map +1 -0
  26. package/{lib/commonjs → dist/commonjs/storages}/google-drive/client.js +82 -39
  27. package/dist/commonjs/storages/google-drive/client.js.map +1 -0
  28. package/{lib/commonjs → dist/commonjs/storages}/google-drive/index.js +120 -64
  29. package/dist/commonjs/storages/google-drive/index.js.map +1 -0
  30. package/dist/commonjs/storages/google-drive/types.js.map +1 -0
  31. package/dist/commonjs/types/native.js +28 -0
  32. package/dist/commonjs/types/native.js.map +1 -0
  33. package/{lib/commonjs/utils/CloudStorageError.js → dist/commonjs/utils/cloud-storage-error.js} +3 -1
  34. package/dist/commonjs/utils/cloud-storage-error.js.map +1 -0
  35. package/dist/commonjs/utils/constants.js +24 -0
  36. package/dist/commonjs/utils/constants.js.map +1 -0
  37. package/dist/commonjs/utils/local-fs.js +16 -0
  38. package/dist/commonjs/utils/local-fs.js.map +1 -0
  39. package/dist/commonjs/utils/native.js +35 -0
  40. package/dist/commonjs/utils/native.js.map +1 -0
  41. package/{lib/module/RNCloudStorage.js → dist/module/cloud-storage.js} +130 -80
  42. package/dist/module/cloud-storage.js.map +1 -0
  43. package/dist/module/expo-plugin/index.js +8 -0
  44. package/dist/module/expo-plugin/index.js.map +1 -0
  45. package/{lib/module/expo-plugin/withRNCloudStorageIos.js → dist/module/expo-plugin/ios.js} +1 -1
  46. package/dist/module/expo-plugin/ios.js.map +1 -0
  47. package/{lib/module/hooks/useCloudFile.js → dist/module/hooks/use-cloud-file.js} +25 -7
  48. package/dist/module/hooks/use-cloud-file.js.map +1 -0
  49. package/{lib/module/hooks/useIsCloudAvailable.js → dist/module/hooks/use-is-cloud-available.js} +2 -2
  50. package/dist/module/hooks/use-is-cloud-available.js.map +1 -0
  51. package/dist/module/index.js +9 -0
  52. package/dist/module/index.js.map +1 -0
  53. package/dist/module/storages/cloudkit.js +6 -0
  54. package/dist/module/storages/cloudkit.js.map +1 -0
  55. package/{lib/module → dist/module/storages}/google-drive/client.js +82 -39
  56. package/dist/module/storages/google-drive/client.js.map +1 -0
  57. package/{lib/module → dist/module/storages}/google-drive/index.js +119 -62
  58. package/dist/module/storages/google-drive/index.js.map +1 -0
  59. package/dist/module/storages/google-drive/types.js.map +1 -0
  60. package/dist/module/types/native.js +24 -0
  61. package/dist/module/types/native.js.map +1 -0
  62. package/{lib/module/utils/CloudStorageError.js → dist/module/utils/cloud-storage-error.js} +3 -1
  63. package/dist/module/utils/cloud-storage-error.js.map +1 -0
  64. package/dist/module/utils/constants.js +20 -0
  65. package/dist/module/utils/constants.js.map +1 -0
  66. package/dist/module/utils/local-fs.js +12 -0
  67. package/dist/module/utils/local-fs.js.map +1 -0
  68. package/dist/module/utils/native.js +30 -0
  69. package/dist/module/utils/native.js.map +1 -0
  70. package/{lib/typescript/RNCloudStorage.d.ts → dist/typescript/cloud-storage.d.ts} +60 -8
  71. package/dist/typescript/cloud-storage.d.ts.map +1 -0
  72. package/{lib/typescript/expo-plugin/withRNCloudStorage.d.ts → dist/typescript/expo-plugin/index.d.ts} +1 -1
  73. package/dist/typescript/expo-plugin/index.d.ts.map +1 -0
  74. package/{lib/typescript/expo-plugin/withRNCloudStorageIos.d.ts → dist/typescript/expo-plugin/ios.d.ts} +1 -1
  75. package/dist/typescript/expo-plugin/ios.d.ts.map +1 -0
  76. package/{lib/typescript/hooks/useCloudFile.d.ts → dist/typescript/hooks/use-cloud-file.d.ts} +22 -4
  77. package/dist/typescript/hooks/use-cloud-file.d.ts.map +1 -0
  78. package/{lib/typescript/hooks/useIsCloudAvailable.d.ts → dist/typescript/hooks/use-is-cloud-available.d.ts} +2 -2
  79. package/dist/typescript/hooks/use-is-cloud-available.d.ts.map +1 -0
  80. package/dist/typescript/index.d.ts +7 -0
  81. package/dist/typescript/index.d.ts.map +1 -0
  82. package/dist/typescript/storages/cloudkit.d.ts +3 -0
  83. package/dist/typescript/storages/cloudkit.d.ts.map +1 -0
  84. package/{lib/typescript → dist/typescript/storages}/google-drive/client.d.ts +9 -2
  85. package/dist/typescript/storages/google-drive/client.d.ts.map +1 -0
  86. package/dist/typescript/storages/google-drive/index.d.ts +35 -0
  87. package/dist/typescript/storages/google-drive/index.d.ts.map +1 -0
  88. package/dist/typescript/storages/google-drive/types.d.ts.map +1 -0
  89. package/dist/typescript/types/native.d.ts +64 -0
  90. package/dist/typescript/types/native.d.ts.map +1 -0
  91. package/dist/typescript/utils/cloud-storage-error.d.ts +8 -0
  92. package/dist/typescript/utils/cloud-storage-error.d.ts.map +1 -0
  93. package/dist/typescript/utils/constants.d.ts +4 -0
  94. package/dist/typescript/utils/constants.d.ts.map +1 -0
  95. package/{lib → dist}/typescript/utils/helpers.d.ts.map +1 -1
  96. package/dist/typescript/utils/local-fs.d.ts +3 -0
  97. package/dist/typescript/utils/local-fs.d.ts.map +1 -0
  98. package/dist/typescript/utils/native.d.ts +7 -0
  99. package/dist/typescript/utils/native.d.ts.map +1 -0
  100. package/ios/CloudStorage.xcodeproj/project.pbxproj +12 -6
  101. package/ios/{CloudStorage.m → CloudStorageCloudKit.m} +4 -2
  102. package/ios/{CloudStorage.swift → CloudStorageCloudKit.swift} +60 -5
  103. package/ios/CloudStorageLocalFileSystem.m +15 -0
  104. package/ios/CloudStorageLocalFileSystem.swift +215 -0
  105. package/ios/Utils/CloudKitUtils.swift +4 -4
  106. package/ios/Utils/CloudStorageError.swift +8 -0
  107. package/ios/Utils/FileUtils.swift +19 -0
  108. package/ios/Utils/Types.swift +7 -1
  109. package/package.json +44 -103
  110. package/src/{RNCloudStorage.ts → cloud-storage.ts} +147 -85
  111. package/src/expo-plugin/{withRNCloudStorage.ts → index.ts} +2 -2
  112. package/src/hooks/{useCloudFile.ts → use-cloud-file.ts} +24 -6
  113. package/src/hooks/{useIsCloudAvailable.ts → use-is-cloud-available.ts} +1 -1
  114. package/src/index.ts +5 -6
  115. package/src/storages/cloudkit.ts +5 -0
  116. package/src/{google-drive → storages/google-drive}/client.ts +99 -40
  117. package/src/{google-drive → storages/google-drive}/index.ts +172 -89
  118. package/src/types/native.ts +50 -14
  119. package/src/utils/cloud-storage-error.ts +15 -0
  120. package/src/utils/constants.ts +20 -0
  121. package/src/utils/local-fs.ts +19 -0
  122. package/src/utils/native.ts +40 -0
  123. package/lib/commonjs/RNCloudStorage.js.map +0 -1
  124. package/lib/commonjs/expo-plugin/withRNCloudStorage.js +0 -13
  125. package/lib/commonjs/expo-plugin/withRNCloudStorage.js.map +0 -1
  126. package/lib/commonjs/expo-plugin/withRNCloudStorageIos.js.map +0 -1
  127. package/lib/commonjs/google-drive/client.js.map +0 -1
  128. package/lib/commonjs/google-drive/index.js.map +0 -1
  129. package/lib/commonjs/google-drive/types.js.map +0 -1
  130. package/lib/commonjs/hooks/useCloudFile.js.map +0 -1
  131. package/lib/commonjs/hooks/useIsCloudAvailable.js.map +0 -1
  132. package/lib/commonjs/index.js.map +0 -1
  133. package/lib/commonjs/types/native.js +0 -26
  134. package/lib/commonjs/types/native.js.map +0 -1
  135. package/lib/commonjs/utils/CloudStorageError.js.map +0 -1
  136. package/lib/module/RNCloudStorage.js.map +0 -1
  137. package/lib/module/expo-plugin/withRNCloudStorage.js +0 -8
  138. package/lib/module/expo-plugin/withRNCloudStorage.js.map +0 -1
  139. package/lib/module/expo-plugin/withRNCloudStorageIos.js.map +0 -1
  140. package/lib/module/google-drive/client.js.map +0 -1
  141. package/lib/module/google-drive/index.js.map +0 -1
  142. package/lib/module/google-drive/types.js.map +0 -1
  143. package/lib/module/hooks/useCloudFile.js.map +0 -1
  144. package/lib/module/hooks/useIsCloudAvailable.js.map +0 -1
  145. package/lib/module/index.js +0 -10
  146. package/lib/module/index.js.map +0 -1
  147. package/lib/module/types/native.js +0 -22
  148. package/lib/module/types/native.js.map +0 -1
  149. package/lib/module/utils/CloudStorageError.js.map +0 -1
  150. package/lib/typescript/RNCloudStorage.d.ts.map +0 -1
  151. package/lib/typescript/expo-plugin/withRNCloudStorage.d.ts.map +0 -1
  152. package/lib/typescript/expo-plugin/withRNCloudStorageIos.d.ts.map +0 -1
  153. package/lib/typescript/google-drive/client.d.ts.map +0 -1
  154. package/lib/typescript/google-drive/index.d.ts +0 -34
  155. package/lib/typescript/google-drive/index.d.ts.map +0 -1
  156. package/lib/typescript/google-drive/types.d.ts.map +0 -1
  157. package/lib/typescript/hooks/useCloudFile.d.ts.map +0 -1
  158. package/lib/typescript/hooks/useIsCloudAvailable.d.ts.map +0 -1
  159. package/lib/typescript/index.d.ts +0 -8
  160. package/lib/typescript/index.d.ts.map +0 -1
  161. package/lib/typescript/types/native.d.ts +0 -40
  162. package/lib/typescript/types/native.d.ts.map +0 -1
  163. package/lib/typescript/utils/CloudStorageError.d.ts +0 -8
  164. package/lib/typescript/utils/CloudStorageError.d.ts.map +0 -1
  165. package/src/utils/CloudStorageError.ts +0 -14
  166. /package/{lib → dist}/commonjs/expo-plugin/types/index.js +0 -0
  167. /package/{lib → dist}/commonjs/expo-plugin/types/index.js.map +0 -0
  168. /package/{lib/commonjs → dist/commonjs/storages}/google-drive/types.js +0 -0
  169. /package/{lib → dist}/commonjs/types/main.js +0 -0
  170. /package/{lib → dist}/commonjs/types/main.js.map +0 -0
  171. /package/{lib → dist}/commonjs/utils/helpers.js +0 -0
  172. /package/{lib → dist}/commonjs/utils/helpers.js.map +0 -0
  173. /package/{lib → dist}/module/expo-plugin/types/index.js +0 -0
  174. /package/{lib → dist}/module/expo-plugin/types/index.js.map +0 -0
  175. /package/{lib → dist}/module/package.json +0 -0
  176. /package/{lib/module → dist/module/storages}/google-drive/types.js +0 -0
  177. /package/{lib → dist}/module/types/main.js +0 -0
  178. /package/{lib → dist}/module/types/main.js.map +0 -0
  179. /package/{lib → dist}/module/utils/helpers.js +0 -0
  180. /package/{lib → dist}/module/utils/helpers.js.map +0 -0
  181. /package/{lib → dist}/typescript/expo-plugin/types/index.d.ts +0 -0
  182. /package/{lib → dist}/typescript/expo-plugin/types/index.d.ts.map +0 -0
  183. /package/{lib/typescript → dist/typescript/storages}/google-drive/types.d.ts +0 -0
  184. /package/{lib → dist}/typescript/types/main.d.ts +0 -0
  185. /package/{lib → dist}/typescript/types/main.d.ts.map +0 -0
  186. /package/{lib → dist}/typescript/utils/helpers.d.ts +0 -0
  187. /package/src/expo-plugin/{withRNCloudStorageIos.ts → ios.ts} +0 -0
  188. /package/src/{google-drive → storages/google-drive}/types.ts +0 -0
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023-2024 Kuatsu Digital Agency
3
+ Copyright (c) Kuatsu App Agency
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
6
6
  in the Software without restriction, including without limitation the rights
@@ -0,0 +1,101 @@
1
+ buildscript {
2
+ // Buildscript is evaluated before everything else so we can't use getExtOrDefault
3
+ def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["CloudStorage_kotlinVersion"]
4
+
5
+ repositories {
6
+ google()
7
+ mavenCentral()
8
+ }
9
+
10
+ dependencies {
11
+ classpath "com.android.tools.build:gradle:7.2.1"
12
+ // noinspection DifferentKotlinGradleVersion
13
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
+ }
15
+ }
16
+
17
+ def reactNativeArchitectures() {
18
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
19
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
20
+ }
21
+
22
+ def isNewArchitectureEnabled() {
23
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
24
+ }
25
+
26
+ apply plugin: "com.android.library"
27
+ apply plugin: "kotlin-android"
28
+
29
+ if (isNewArchitectureEnabled()) {
30
+ apply plugin: "com.facebook.react"
31
+ }
32
+
33
+ def getExtOrDefault(name) {
34
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["CloudStorage_" + name]
35
+ }
36
+
37
+ def getExtOrIntegerDefault(name) {
38
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["CloudStorage_" + name]).toInteger()
39
+ }
40
+
41
+ def supportsNamespace() {
42
+ def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
43
+ def major = parsed[0].toInteger()
44
+ def minor = parsed[1].toInteger()
45
+
46
+ // Namespace support was added in 7.3.0
47
+ return (major == 7 && minor >= 3) || major >= 8
48
+ }
49
+
50
+ android {
51
+ if (supportsNamespace()) {
52
+ namespace "com.cloudstorage"
53
+
54
+ sourceSets {
55
+ main {
56
+ manifest.srcFile "src/main/AndroidManifestNew.xml"
57
+ }
58
+ }
59
+ }
60
+
61
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
62
+
63
+ defaultConfig {
64
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
65
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
66
+
67
+ }
68
+
69
+ buildTypes {
70
+ release {
71
+ minifyEnabled false
72
+ }
73
+ }
74
+
75
+ lintOptions {
76
+ disable "GradleCompatible"
77
+ }
78
+
79
+ compileOptions {
80
+ sourceCompatibility JavaVersion.VERSION_1_8
81
+ targetCompatibility JavaVersion.VERSION_1_8
82
+ }
83
+ }
84
+
85
+ repositories {
86
+ mavenCentral()
87
+ google()
88
+ }
89
+
90
+ def kotlin_version = getExtOrDefault("kotlinVersion")
91
+
92
+ dependencies {
93
+ // For < 0.71, this will be from the local maven repo
94
+ // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
95
+ //noinspection GradleDynamicVersion
96
+ implementation "com.facebook.react:react-native:+"
97
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
98
+ implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0"))
99
+ implementation("com.squareup.okhttp3:okhttp")
100
+ }
101
+
@@ -0,0 +1,5 @@
1
+ CloudStorage_kotlinVersion=1.7.0
2
+ CloudStorage_minSdkVersion=21
3
+ CloudStorage_targetSdkVersion=31
4
+ CloudStorage_compileSdkVersion=31
5
+ CloudStorage_ndkversion=21.4.7075529
@@ -0,0 +1,3 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="com.cloudstorage">
3
+ </manifest>
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -0,0 +1,86 @@
1
+ package com.cloudstorage
2
+
3
+ sealed class CloudStorageError(
4
+ val code: String,
5
+ override val message: String
6
+ ) : Exception(message) {
7
+ data class InvalidScope(val scope: String) : CloudStorageError(
8
+ code = "ERR_INVALID_SCOPE",
9
+ message = "Invalid scope $scope provided"
10
+ )
11
+
12
+ data class FileNotFound(val path: String) : CloudStorageError(
13
+ code = "ERR_FILE_NOT_FOUND",
14
+ message = "File not found at path $path"
15
+ )
16
+
17
+ data class PathIsDirectory(val path: String) : CloudStorageError(
18
+ code = "ERR_PATH_IS_DIRECTORY",
19
+ message = "Path is a directory at path $path"
20
+ )
21
+
22
+ data class PathIsFile(val path: String) : CloudStorageError(
23
+ code = "ERR_PATH_IS_FILE",
24
+ message = "Path is a file at path $path"
25
+ )
26
+
27
+ data class DirectoryNotFound(val path: String) : CloudStorageError(
28
+ code = "ERR_DIRECTORY_NOT_FOUND",
29
+ message = "Directory not found at path $path"
30
+ )
31
+
32
+ data class DirectoryNotEmpty(val path: String) : CloudStorageError(
33
+ code = "ERR_DIRECTORY_NOT_EMPTY",
34
+ message = "Directory not empty at path $path"
35
+ )
36
+
37
+ data class FileAlreadyExists(val path: String) : CloudStorageError(
38
+ code = "ERR_FILE_EXISTS",
39
+ message = "File already exists at path $path"
40
+ )
41
+
42
+ object AuthenticationFailed : CloudStorageError(
43
+ code = "ERR_AUTHENTICATION_FAILED",
44
+ message = "Authentication failed"
45
+ )
46
+
47
+ data class WriteError(val path: String) : CloudStorageError(
48
+ code = "ERR_WRITE_ERROR",
49
+ message = "Write error for path $path"
50
+ )
51
+
52
+ data class ReadError(val path: String) : CloudStorageError(
53
+ code = "ERR_READ_ERROR",
54
+ message = "Read error for path $path"
55
+ )
56
+
57
+ data class DeleteError(val path: String) : CloudStorageError(
58
+ code = "ERR_DELETE_ERROR",
59
+ message = "Delete error for path $path"
60
+ )
61
+
62
+ data class StatError(val path: String) : CloudStorageError(
63
+ code = "ERR_STAT_ERROR",
64
+ message = "Stat error for path $path"
65
+ )
66
+
67
+ data class FileNotDownloadable(val path: String) : CloudStorageError(
68
+ code = "ERR_FILE_NOT_DOWNLOADABLE",
69
+ message = "File not downloadable at path $path"
70
+ )
71
+
72
+ data class InvalidUrl(val url: String) : CloudStorageError(
73
+ code = "ERR_INVALID_URL",
74
+ message = "Invalid URL provided: $url"
75
+ )
76
+
77
+ data class NetworkError(val errorMessage: String) : CloudStorageError(
78
+ code = "ERR_NETWORK_ERROR",
79
+ message = errorMessage
80
+ )
81
+
82
+ data class Unknown(val errorMessage: String = "An unknown error occurred") : CloudStorageError(
83
+ code = "ERR_UNKNOWN",
84
+ message = errorMessage
85
+ )
86
+ }
@@ -0,0 +1,236 @@
1
+ package com.cloudstorage
2
+
3
+ import com.facebook.react.bridge.*
4
+ import java.io.File
5
+ import java.io.IOException
6
+ import okhttp3.Call
7
+ import okhttp3.Callback
8
+ import okhttp3.MediaType.Companion.toMediaTypeOrNull
9
+ import okhttp3.MultipartBody
10
+ import okhttp3.OkHttpClient
11
+ import okhttp3.Request
12
+ import okhttp3.RequestBody.Companion.asRequestBody
13
+ import okhttp3.Response
14
+ import okio.buffer
15
+ import okio.sink
16
+ import java.net.URLConnection
17
+
18
+ class CloudStorageLocalFileSystemModule(private val reactContext: ReactApplicationContext) :
19
+ ReactContextBaseJavaModule(reactContext) {
20
+
21
+ override fun getName(): String {
22
+ return NAME
23
+ }
24
+
25
+ override fun getConstants(): Map<String, Any> {
26
+ return mapOf("temporaryDirectory" to FileUtils.getTemporaryDirectory(reactContext).path)
27
+ }
28
+
29
+ @ReactMethod
30
+ fun createFile(path: String, data: String, promise: Promise) {
31
+ try {
32
+ val sanitizedPath = FileUtils.sanitizePath(path)
33
+ val file = File(sanitizedPath)
34
+ val parentDir = file.parentFile
35
+ if (parentDir != null && !parentDir.exists()) {
36
+ val error = CloudStorageError.DirectoryNotFound(parentDir.path)
37
+ promise.reject(error.code, error.message, error)
38
+ return
39
+ }
40
+ FileUtils.writeFile(file, data)
41
+ promise.resolve(file.path)
42
+ } catch (e: CloudStorageError) {
43
+ promise.reject(e.code, e.message, e)
44
+ } catch (e: Exception) {
45
+ val unknownError = CloudStorageError.Unknown(e.message ?: "An unknown error occurred")
46
+ promise.reject(unknownError.code, unknownError.message, e)
47
+ }
48
+ }
49
+
50
+ @ReactMethod
51
+ fun readFile(path: String, promise: Promise) {
52
+ try {
53
+ val sanitizedPath = FileUtils.sanitizePath(path)
54
+ val file = File(sanitizedPath)
55
+ val content = FileUtils.readFile(file)
56
+ promise.resolve(content)
57
+ } catch (e: CloudStorageError) {
58
+ promise.reject(e.code, e.message, e)
59
+ } catch (e: Exception) {
60
+ val unknownError = CloudStorageError.Unknown(e.message ?: "An unknown error occurred")
61
+ promise.reject(unknownError.code, unknownError.message, e)
62
+ }
63
+ }
64
+
65
+ @ReactMethod
66
+ fun downloadFile(remoteUri: String, localPath: String, options: ReadableMap?, promise: Promise) {
67
+ val client = OkHttpClient()
68
+ val requestBuilder = Request.Builder()
69
+
70
+ try {
71
+ requestBuilder.url(remoteUri)
72
+ } catch (e: IllegalArgumentException) {
73
+ val error = CloudStorageError.InvalidUrl(remoteUri)
74
+ promise.reject(error.code, error.message, e)
75
+ return
76
+ }
77
+
78
+ if (options?.hasKey("headers") == true) {
79
+ val headers = options.getMap("headers")
80
+ val iterator = headers?.keySetIterator()
81
+ while (iterator?.hasNextKey() == true) {
82
+ val key = iterator.nextKey()
83
+ requestBuilder.addHeader(key, headers.getString(key)!!)
84
+ }
85
+ }
86
+
87
+ val request = requestBuilder.build()
88
+
89
+ client.newCall(request).enqueue(object : Callback {
90
+ override fun onFailure(call: Call, e: IOException) {
91
+ val errorMessage = "Download error for path $remoteUri: ${e.message ?: "Unknown download error"}"
92
+ val error = CloudStorageError.NetworkError(errorMessage)
93
+ promise.reject(error.code, error.message, e)
94
+ }
95
+
96
+ override fun onResponse(call: Call, response: Response) {
97
+ if (!response.isSuccessful) {
98
+ val errorMessage = "Download error for path $remoteUri: HTTP ${response.code}: ${response.message}"
99
+ val error = CloudStorageError.NetworkError(errorMessage)
100
+ promise.reject(error.code, error.message)
101
+ return
102
+ }
103
+
104
+ try {
105
+ val sanitizedPath = FileUtils.sanitizePath(localPath)
106
+ val localFile = File(sanitizedPath)
107
+ val parentDir = localFile.parentFile
108
+ if (parentDir != null && !parentDir.exists()) {
109
+ parentDir.mkdirs()
110
+ }
111
+
112
+ val sink = localFile.sink().buffer()
113
+ sink.writeAll(response.body!!.source())
114
+ sink.close()
115
+ promise.resolve(null)
116
+ } catch (e: Exception) {
117
+ val sanitizedPath = FileUtils.sanitizePath(localPath)
118
+ val error = CloudStorageError.WriteError(sanitizedPath)
119
+ promise.reject(error.code, error.message, e)
120
+ } finally {
121
+ response.body?.close()
122
+ }
123
+ }
124
+ })
125
+ }
126
+
127
+ @ReactMethod
128
+ fun uploadFile(localPath: String, remoteUri: String, options: ReadableMap, promise: Promise) {
129
+ val sanitizedPath = try {
130
+ FileUtils.sanitizePath(localPath)
131
+ } catch (e: CloudStorageError) {
132
+ promise.reject(e.code, e.message, e)
133
+ return
134
+ }
135
+ val localFile = File(sanitizedPath)
136
+ if (!localFile.exists()) {
137
+ promise.reject(CloudStorageError.FileNotFound(sanitizedPath).code, CloudStorageError.FileNotFound(sanitizedPath).message)
138
+ return
139
+ }
140
+
141
+ val uploadTypeString = options.getString("uploadType")
142
+ if (uploadTypeString == null) {
143
+ promise.reject(CloudStorageError.Unknown("uploadType is required").code, CloudStorageError.Unknown("uploadType is required").message)
144
+ return
145
+ }
146
+
147
+ val uploadType = try {
148
+ UploadType.valueOf(uploadTypeString.uppercase())
149
+ } catch (e: IllegalArgumentException) {
150
+ promise.reject(CloudStorageError.Unknown("Invalid uploadType: $uploadTypeString").code, CloudStorageError.Unknown("Invalid uploadType: $uploadTypeString").message)
151
+ return
152
+ }
153
+
154
+ val client = OkHttpClient()
155
+ val requestBuilder = Request.Builder()
156
+
157
+ try {
158
+ requestBuilder.url(remoteUri)
159
+ } catch (e: IllegalArgumentException) {
160
+ val error = CloudStorageError.InvalidUrl(remoteUri)
161
+ promise.reject(error.code, error.message, e)
162
+ return
163
+ }
164
+
165
+ if (options.hasKey("headers")) {
166
+ options.getMap("headers")?.let { headers ->
167
+ val iterator = headers.keySetIterator()
168
+ while (iterator.hasNextKey()) {
169
+ val key = iterator.nextKey()
170
+ requestBuilder.addHeader(key, headers.getString(key)!!)
171
+ }
172
+ }
173
+ }
174
+
175
+ val httpMethod = options.getString("method")?.uppercase() ?: "POST"
176
+
177
+ val requestBody = when (uploadType) {
178
+ UploadType.BINARY -> {
179
+ val mediaType = URLConnection.guessContentTypeFromName(localFile.name)?.toMediaTypeOrNull()
180
+ ?: "application/octet-stream".toMediaTypeOrNull()
181
+ localFile.asRequestBody(mediaType)
182
+ }
183
+ UploadType.MULTIPART -> {
184
+ val fieldName = options.getString("fieldName")
185
+ if (fieldName == null) {
186
+ promise.reject(CloudStorageError.Unknown("fieldName is required for multipart uploads").code, CloudStorageError.Unknown("fieldName is required for multipart uploads").message)
187
+ return
188
+ }
189
+
190
+ val mediaType = URLConnection.guessContentTypeFromName(localFile.name)?.toMediaTypeOrNull()
191
+ ?: "application/octet-stream".toMediaTypeOrNull()
192
+
193
+ val multipartBodyBuilder = MultipartBody.Builder()
194
+ .setType(MultipartBody.FORM)
195
+ .addFormDataPart(fieldName, localFile.name, localFile.asRequestBody(mediaType))
196
+
197
+ if (options.hasKey("parameters")) {
198
+ options.getMap("parameters")?.let { parameters ->
199
+ val paramIterator = parameters.keySetIterator()
200
+ while (paramIterator.hasNextKey()) {
201
+ val key = paramIterator.nextKey()
202
+ multipartBodyBuilder.addFormDataPart(key, parameters.getString(key)!!)
203
+ }
204
+ }
205
+ }
206
+ multipartBodyBuilder.build()
207
+ }
208
+ }
209
+
210
+ requestBuilder.method(httpMethod, requestBody)
211
+ val request = requestBuilder.build()
212
+
213
+ client.newCall(request).enqueue(object : Callback {
214
+ override fun onFailure(call: Call, e: IOException) {
215
+ val errorMessage = "Upload error for path $sanitizedPath: ${e.message ?: "Unknown upload error"}"
216
+ val error = CloudStorageError.NetworkError(errorMessage)
217
+ promise.reject(error.code, error.message, e)
218
+ }
219
+
220
+ override fun onResponse(call: Call, response: Response) {
221
+ if (!response.isSuccessful) {
222
+ val errorMessage = "Upload error for path $sanitizedPath: HTTP ${response.code}: ${response.message}"
223
+ val error = CloudStorageError.NetworkError(errorMessage)
224
+ promise.reject(error.code, error.message)
225
+ } else {
226
+ promise.resolve(null)
227
+ }
228
+ response.body?.close()
229
+ }
230
+ })
231
+ }
232
+
233
+ companion object {
234
+ const val NAME = "CloudStorageLocalFileSystem"
235
+ }
236
+ }
@@ -0,0 +1,17 @@
1
+ package com.cloudstorage
2
+
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
7
+
8
+
9
+ class CloudStoragePackage : ReactPackage {
10
+ override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
11
+ return listOf(CloudStorageLocalFileSystemModule(reactContext))
12
+ }
13
+
14
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
15
+ return emptyList()
16
+ }
17
+ }
@@ -0,0 +1,41 @@
1
+ package com.cloudstorage
2
+
3
+ import android.content.Context
4
+ import java.io.File
5
+ import java.io.IOException
6
+
7
+ object FileUtils {
8
+ fun getTemporaryDirectory(context: Context): File {
9
+ return context.cacheDir
10
+ }
11
+
12
+ fun writeFile(file: File, content: String) {
13
+ try {
14
+ file.writeText(content, Charsets.UTF_8)
15
+ } catch (e: IOException) {
16
+ throw CloudStorageError.WriteError(file.path)
17
+ }
18
+ }
19
+
20
+ fun readFile(file: File): String {
21
+ if (!file.exists()) {
22
+ throw CloudStorageError.FileNotFound(file.path)
23
+ }
24
+ try {
25
+ return file.readText(Charsets.UTF_8)
26
+ } catch (e: IOException) {
27
+ throw CloudStorageError.ReadError(file.path)
28
+ }
29
+ }
30
+
31
+ fun sanitizePath(path: String): String {
32
+ // Remove the "file://" prefix
33
+ val sanitizedPath = path.removePrefix("file://")
34
+
35
+ return try {
36
+ File(sanitizedPath).canonicalPath
37
+ } catch (e: IOException) {
38
+ throw CloudStorageError.InvalidUrl(path)
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,6 @@
1
+ package com.cloudstorage
2
+
3
+ enum class UploadType {
4
+ MULTIPART,
5
+ BINARY
6
+ }
package/app.plugin.js CHANGED
@@ -1 +1 @@
1
- module.exports = require('./lib/commonjs/expo-plugin/withRNCloudStorage.js');
1
+ module.exports = require('./dist/commonjs/expo-plugin/index.js');