diff --git a/firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt b/firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt index cf0023d0e..8ea9fe7d2 100644 --- a/firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt +++ b/firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt @@ -229,7 +229,7 @@ internal actual class NativeOnDisconnect internal constructor( rethrow { js.set(encodedValue).awaitWhileOnline(database) } actual suspend fun updateEncodedChildren(encodedUpdate: Map) = - rethrow { js.update(encodedUpdate).awaitWhileOnline(database) } + rethrow { js.update(encodedUpdate.mapValues { (_, value) -> value ?: undefined }).awaitWhileOnline(database) } } diff --git a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt index 0a381c8f4..434b88cd3 100644 --- a/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt +++ b/firebase-firestore/src/jsMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt @@ -134,7 +134,7 @@ internal actual class NativeWriteBatch(val js: JsWriteBatch) { documentRef: DocumentReference, encodedFieldsAndValues: List> ): NativeWriteBatch = rethrow { - encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues -> + encodedFieldsAndValues.performUpdateWithUndefined { field, value, moreFieldsAndValues -> js.update(documentRef.js, field, value, *moreFieldsAndValues) } }.let { this } @@ -143,7 +143,7 @@ internal actual class NativeWriteBatch(val js: JsWriteBatch) { documentRef: DocumentReference, encodedFieldsAndValues: List> ): NativeWriteBatch = rethrow { - encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues -> + encodedFieldsAndValues.performUpdateWithUndefined { field, value, moreFieldsAndValues -> js.update(documentRef.js, field, value, *moreFieldsAndValues) } }.let { this } @@ -176,7 +176,7 @@ internal actual class NativeTransaction(val js: JsTransaction) { documentRef: DocumentReference, encodedFieldsAndValues: List> ): NativeTransaction = rethrow { - encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues -> + encodedFieldsAndValues.performUpdateWithUndefined { field, value, moreFieldsAndValues -> js.update(documentRef.js, field, value, *moreFieldsAndValues) } }.let { this } @@ -185,7 +185,7 @@ internal actual class NativeTransaction(val js: JsTransaction) { documentRef: DocumentReference, encodedFieldsAndValues: List> ): NativeTransaction = rethrow { - encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues -> + encodedFieldsAndValues.performUpdateWithUndefined { field, value, moreFieldsAndValues -> js.update(documentRef.js, field, value, *moreFieldsAndValues) } }.let { this } @@ -241,7 +241,7 @@ internal actual class NativeDocumentReference actual constructor(actual val nati actual suspend fun updateEncodedFieldsAndValues(encodedFieldsAndValues: List>) { rethrow { encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() } - ?.performUpdate { field, value, moreFieldsAndValues -> + ?.performUpdateWithUndefined { field, value, moreFieldsAndValues -> jsUpdate(js, field, value, *moreFieldsAndValues) } ?.await() @@ -251,7 +251,7 @@ internal actual class NativeDocumentReference actual constructor(actual val nati actual suspend fun updateEncodedFieldPathsAndValues(encodedFieldsAndValues: List>) { rethrow { encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() } - ?.performUpdate { field, value, moreFieldsAndValues -> + ?.performUpdateWithUndefined { field, value, moreFieldsAndValues -> jsUpdate(js, field, value, *moreFieldsAndValues) }?.await() } @@ -543,3 +543,7 @@ fun entriesOf(jsObject: dynamic): List> = // from: https://discuss.kotlinlang.org/t/how-to-access-native-js-object-as-a-map-string-any/509/8 fun mapOf(jsObject: dynamic): Map = entriesOf(jsObject).toMap() + +internal fun List>.performUpdateWithUndefined( + update: (K, Any?, Array) -> R +) = map { (key, value) -> key to (value ?: undefined) }.performUpdate(update)