1
1
package dev.teamhub.firebase.database
2
2
3
3
import com.google.android.gms.tasks.Task
4
+ import com.google.firebase.database.ChildEventListener
4
5
import com.google.firebase.database.Logger
5
6
import com.google.firebase.database.ServerValue
6
7
import com.google.firebase.database.ValueEventListener
7
8
import dev.teamhub.firebase.Firebase
8
9
import dev.teamhub.firebase.FirebaseApp
10
+ import dev.teamhub.firebase.database.ChildEvent.Type
9
11
import dev.teamhub.firebase.decode
10
12
import dev.teamhub.firebase.encode
11
13
import kotlinx.coroutines.channels.awaitClose
@@ -23,7 +25,7 @@ suspend fun <T> Task<T>.awaitWhileOnline(): T = coroutineScope {
23
25
24
26
val notConnected = Firebase .database
25
27
.reference(" .info/connected" )
26
- .snapshots
28
+ .valueEvents
27
29
.filter { ! it.value<Boolean >() }
28
30
.produceIn(this )
29
31
@@ -59,15 +61,13 @@ actual class FirebaseDatabase internal constructor(val android: com.google.fireb
59
61
android.setLogLevel(Logger .Level .DEBUG .takeIf { enabled } ? : Logger .Level .NONE )
60
62
}
61
63
62
- actual class DatabaseReference internal constructor(
63
- val android : com.google.firebase.database.DatabaseReference ,
64
+ actual open class Query internal constructor(
65
+ open val android : com.google.firebase.database.Query ,
64
66
val persistenceEnabled : Boolean
65
67
) {
68
+ actual fun orderByChild (path : String ) = android.orderByChild(path).let { this }
66
69
67
- actual fun push () = DatabaseReference (android.push(), persistenceEnabled)
68
- actual fun onDisconnect () = OnDisconnect (android.onDisconnect(), persistenceEnabled)
69
-
70
- actual val snapshots get() = callbackFlow {
70
+ actual val valueEvents get() = callbackFlow {
71
71
val listener = object : ValueEventListener {
72
72
override fun onDataChange (snapshot : com.google.firebase.database.DataSnapshot ) {
73
73
offer(DataSnapshot (snapshot))
@@ -81,6 +81,46 @@ actual class DatabaseReference internal constructor(
81
81
awaitClose { android.removeEventListener(listener) }
82
82
}
83
83
84
+ actual fun childEvents (vararg types : Type ) = callbackFlow {
85
+ val listener = object : ChildEventListener {
86
+
87
+ val moved by lazy { types.contains(Type .MOVED ) }
88
+ override fun onChildMoved (snapshot : com.google.firebase.database.DataSnapshot , previousChildName : String? ) {
89
+ if (moved) offer(ChildEvent (Type .MOVED , DataSnapshot (snapshot), previousChildName))
90
+ }
91
+
92
+ val changed by lazy { types.contains(Type .CHANGED ) }
93
+ override fun onChildChanged (snapshot : com.google.firebase.database.DataSnapshot , previousChildName : String? ) {
94
+ if (changed) offer(ChildEvent (Type .CHANGED , DataSnapshot (snapshot), previousChildName))
95
+ }
96
+
97
+ val added by lazy { types.contains(Type .ADDED ) }
98
+ override fun onChildAdded (snapshot : com.google.firebase.database.DataSnapshot , previousChildName : String? ) {
99
+ if (added) offer(ChildEvent (Type .ADDED , DataSnapshot (snapshot), previousChildName))
100
+ }
101
+
102
+ val removed by lazy { types.contains(Type .REMOVED ) }
103
+ override fun onChildRemoved (snapshot : com.google.firebase.database.DataSnapshot ) {
104
+ if (removed) offer(ChildEvent (Type .REMOVED , DataSnapshot (snapshot), null ))
105
+ }
106
+
107
+ override fun onCancelled (error : com.google.firebase.database.DatabaseError ) {
108
+ close(error.toException())
109
+ }
110
+ }
111
+ android.addChildEventListener(listener)
112
+ awaitClose { android.removeEventListener(listener) }
113
+ }
114
+ }
115
+
116
+ actual class DatabaseReference internal constructor(
117
+ override val android : com.google.firebase.database.DatabaseReference ,
118
+ persistenceEnabled : Boolean
119
+ ): Query(android, persistenceEnabled) {
120
+
121
+ actual fun push () = DatabaseReference (android.push(), persistenceEnabled)
122
+ actual fun onDisconnect () = OnDisconnect (android.onDisconnect(), persistenceEnabled)
123
+
84
124
actual suspend fun setValue (value : Any? ) = android.setValue(encode(value))
85
125
.run { if (persistenceEnabled) await() else awaitWhileOnline() }
86
126
.run { Unit }
0 commit comments