diff --git a/README.md b/README.md index 65c02081a..10a1539e2 100644 --- a/README.md +++ b/README.md @@ -236,4 +236,10 @@ If you are building a Kotlin multiplatform library which will be consumed from J } ``` - +## Contributing +If you'd like to contribute to this project then you can fork this repository. +You can build and test the project locally. +1. Open the project in IntelliJ IDEA. +2. Install cocoapods via `sudo gem install -n /usr/local/bin cocoapods` +3. Install the GitLive plugin into IntelliJ +4. After a gradle sync then run `publishToMavenLocal` \ No newline at end of file diff --git a/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt b/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt index 85b514f11..4f3e2fc30 100644 --- a/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt +++ b/firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/externals.kt @@ -518,6 +518,7 @@ external object firebase { fun setMaxOperationRetryTime(time: Double): Unit fun setMaxUploadRetryTime(time: Double): Unit fun useEmulator(host: String, port: Int) + fun ref(): Reference } open class Reference { diff --git a/firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt index a3c9ae20b..af32eea56 100644 --- a/firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt +++ b/firebase-storage/src/androidMain/kotlin/dev/gitlive/firebase/storage/storage.kt @@ -43,6 +43,7 @@ actual class FirebaseStorage(val android: com.google.firebase.storage.FirebaseSt android.useEmulator(host, port) } + actual val reference = StorageReference(android.reference) } actual class StorageReference(val android: com.google.firebase.storage.StorageReference) { @@ -59,6 +60,8 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe actual suspend fun getDownloadUrl(): String = android.downloadUrl.await().toString() + actual suspend fun listAll(): ListResult = ListResult(android.listAll().await()) + actual fun putFileResumable(file: File): ProgressFlow { val android = android.putFile(file.uri) @@ -88,6 +91,12 @@ actual class StorageReference(val android: com.google.firebase.storage.StorageRe } } +actual class ListResult(android: com.google.firebase.storage.ListResult) { + actual val prefixes: List = android.prefixes.map { StorageReference(it) } + actual val items: List = android.items.map { StorageReference(it) } + actual val pageToken: String? = android.pageToken +} + actual class File(val uri: Uri) actual typealias FirebaseStorageException = com.google.firebase.storage.StorageException diff --git a/firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt index 62d7e9a75..949d8d425 100644 --- a/firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt +++ b/firebase-storage/src/commonMain/kotlin/dev/gitlive/firebase/storage/storage.kt @@ -18,6 +18,8 @@ expect class FirebaseStorage { fun setMaxOperationRetryTimeMillis(maxOperationRetryTimeMillis: Long) fun setMaxUploadRetryTimeMillis(maxUploadRetryTimeMillis: Long) fun useEmulator(host: String, port: Int) + + val reference: StorageReference } expect class StorageReference { @@ -34,8 +36,15 @@ expect class StorageReference { suspend fun getDownloadUrl(): String + suspend fun listAll(): ListResult + fun putFileResumable(file: File): ProgressFlow +} +expect class ListResult { + val prefixes: List + val items: List + val pageToken: String? } expect class File diff --git a/firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt index c5ca27463..e554a574c 100644 --- a/firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt +++ b/firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt @@ -5,6 +5,7 @@ package dev.gitlive.firebase.storage import cocoapods.FirebaseStorage.FIRStorage +import cocoapods.FirebaseStorage.FIRStorageListResult import cocoapods.FirebaseStorage.FIRStorageReference import cocoapods.FirebaseStorage.FIRStorageTaskStatusFailure import cocoapods.FirebaseStorage.FIRStorageTaskStatusPause @@ -48,6 +49,7 @@ actual class FirebaseStorage(val ios: FIRStorage) { ios.useEmulatorWithHost(host, port.toLong()) } + actual val reference get() = StorageReference(ios.reference()) } actual class StorageReference(val ios: FIRStorageReference) { @@ -66,6 +68,12 @@ actual class StorageReference(val ios: FIRStorageReference) { downloadURLWithCompletion(completion = it) }.absoluteString()!! + actual suspend fun listAll(): ListResult = awaitResult { + ios.listAllWithCompletion { firStorageListResult, nsError -> + it.invoke(firStorageListResult?.let { ListResult(it) }, nsError) + } + } + actual fun putFileResumable(file: File): ProgressFlow { val ios = ios.putFile(file.url) @@ -102,6 +110,12 @@ actual class StorageReference(val ios: FIRStorageReference) { } +actual class ListResult(ios: FIRStorageListResult) { + actual val prefixes: List = ios.prefixes().map { StorageReference(it as FIRStorageReference) } + actual val items: List = ios.items().map { StorageReference(it as FIRStorageReference) } + actual val pageToken: String? = ios.pageToken() +} + actual class File(val url: NSURL) actual class FirebaseStorageException(message: String): FirebaseException(message) diff --git a/firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt index ca73ec37b..ea7e51bab 100644 --- a/firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt +++ b/firebase-storage/src/jsMain/kotlin/dev/gitlive/firebase/storage/storage.kt @@ -38,6 +38,7 @@ actual class FirebaseStorage(val js: firebase.storage.Storage) { js.useEmulator(host, port) } + actual val reference: StorageReference get() = StorageReference(js.ref()) } actual class StorageReference(val js: firebase.storage.Reference) { @@ -54,6 +55,8 @@ actual class StorageReference(val js: firebase.storage.Reference) { actual suspend fun getDownloadUrl(): String = rethrow { js.getDownloadURL().await().toString() } + actual suspend fun listAll(): ListResult = rethrow { ListResult(js.listAll().await()) } + actual fun putFileResumable(file: File): ProgressFlow = rethrow { val uploadTask = js.put(file) @@ -85,6 +88,12 @@ actual class StorageReference(val js: firebase.storage.Reference) { } +actual class ListResult(js: firebase.storage.ListResult) { + actual val prefixes: List = js.prefixes.map { StorageReference(it) } + actual val items: List = js.items.map { StorageReference(it) } + actual val pageToken: String? = js.nextPageToken +} + actual typealias File = org.w3c.files.File actual open class FirebaseStorageException(code: String, cause: Throwable) :