From 2f67e8b35b41f7790115eeaade2b5729c46eb41b Mon Sep 17 00:00:00 2001 From: Salakar Date: Tue, 4 Jul 2017 16:17:42 +0100 Subject: [PATCH] [both][database] all 'once' event types now supported - not just 'value' --- .../firebase/database/RNFirebaseDatabase.java | 7 ++- .../database/RNFirebaseDatabaseReference.java | 56 +++++++++++++++++++ ios/RNFirebase/database/RNFirebaseDatabase.m | 14 +---- 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java index 70ffb308..ba2dcca6 100644 --- a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java +++ b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java @@ -299,7 +299,12 @@ public class RNFirebaseDatabase extends ReactContextBaseJavaModule { @ReactMethod public void once(final int refId, final String path, final ReadableArray modifiers, final String eventName, final Callback callback) { RNFirebaseDatabaseReference ref = this.getDBHandle(refId, path, modifiers); - ref.addOnceValueEventListener(callback); + + if (eventName.equals("value")) { + ref.addOnceValueEventListener(callback); + } else { + ref.addChildOnceEventListener(eventName, callback); + } } /** diff --git a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabaseReference.java b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabaseReference.java index d52e864e..8262c818 100644 --- a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabaseReference.java +++ b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabaseReference.java @@ -5,6 +5,7 @@ import java.util.HashSet; import java.util.List; import android.support.annotation.Nullable; +import android.telecom.Call; import android.util.Log; import java.util.Map; @@ -132,10 +133,65 @@ public class RNFirebaseDatabaseReference { callback.invoke(err); } }; + mQuery.addListenerForSingleValueEvent(onceValueEventListener); Log.d(TAG, "Added OnceValueEventListener for refId: " + mRefId); } + void addChildOnceEventListener(final String eventName, final Callback callback) { + ChildEventListener childEventListener = new ChildEventListener() { + @Override + public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { + if ("child_added".equals(eventName)) { + mQuery.removeEventListener(this); + WritableMap data = Utils.snapshotToMap("child_added", mRefId, null, mPath, dataSnapshot, previousChildName); + callback.invoke(null, data); + } + } + + @Override + public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { + if ("child_changed".equals(eventName)) { + mQuery.removeEventListener(this); + WritableMap data = Utils.snapshotToMap("child_changed", mRefId, null, mPath, dataSnapshot, previousChildName); + callback.invoke(null, data); + } + } + + @Override + public void onChildRemoved(DataSnapshot dataSnapshot) { + if ("child_removed".equals(eventName)) { + mQuery.removeEventListener(this); + WritableMap data = Utils.snapshotToMap("child_removed", mRefId, null, mPath, dataSnapshot, null); + callback.invoke(null, data); + } + } + + @Override + public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { + if ("child_moved".equals(eventName)) { + mQuery.removeEventListener(this); + WritableMap data = Utils.snapshotToMap("child_moved", mRefId, null, mPath, dataSnapshot, previousChildName); + callback.invoke(null, data); + } + } + + @Override + public void onCancelled(DatabaseError error) { + mQuery.removeEventListener(this); + WritableMap err = Arguments.createMap(); + err.putInt("refId", mRefId); + err.putString("path", mPath); + err.putInt("code", error.getCode()); + err.putString("details", error.getDetails()); + err.putString("message", error.getMessage()); + callback.invoke(err); + } + }; + + mQuery.addChildEventListener(childEventListener); + } + void removeEventListener(int listenerId, String eventName) { if ("value".equals(eventName)) { this.removeValueEventListener(listenerId); diff --git a/ios/RNFirebase/database/RNFirebaseDatabase.m b/ios/RNFirebase/database/RNFirebaseDatabase.m index cd802fb5..a83ecf66 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabase.m +++ b/ios/RNFirebase/database/RNFirebaseDatabase.m @@ -49,19 +49,7 @@ } - (void)addSingleEventHandler:(NSString *)eventName callback:(RCTResponseSenderBlock)callback { - FIRDataEventType *firDataEventType; - - if ([eventName isEqualToString:@"value"]) { - firDataEventType = (FIRDataEventType *) FIRDataEventTypeValue; - } else if ([eventName isEqualToString:@"child_added"]) { - firDataEventType = (FIRDataEventType *) FIRDataEventTypeChildAdded; - } else if ([eventName isEqualToString:@"child_removed"]) { - firDataEventType = (FIRDataEventType *) FIRDataEventTypeChildRemoved; - } else if ([eventName isEqualToString:@"child_changed"]) { - firDataEventType = (FIRDataEventType *) FIRDataEventTypeChildChanged; - } else if ([eventName isEqualToString:@"child_moved"]) { - firDataEventType = (FIRDataEventType *) FIRDataEventTypeChildMoved; - } + FIRDataEventType firDataEventType = (FIRDataEventType)[self eventTypeFromName:eventName]; [_query observeSingleEventOfType:firDataEventType andPreviousSiblingKeyWithBlock:^(FIRDataSnapshot *_Nonnull snapshot, NSString *_Nullable previousChildName) { NSDictionary *props = [RNFirebaseDBReference snapshotToDict:snapshot];