3131import com .google .firebase .database .FirebaseDatabase ;
3232import com .google .firebase .database .DatabaseReference ;
3333import com .google .firebase .database .ChildEventListener ;
34+ import com .google .firebase .database .OnDisconnect ;
3435import com .google .firebase .database .Query ;
3536import com .google .firebase .database .ValueEventListener ;
3637import com .google .firebase .database .DataSnapshot ;
@@ -70,17 +71,7 @@ public void set(
7071 DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
7172 @ Override
7273 public void onComplete (DatabaseError error , DatabaseReference ref ) {
73- if (error != null ) {
74- WritableMap err = Arguments .createMap ();
75- err .putInt ("errorCode" , error .getCode ());
76- err .putString ("errorDetails" , error .getDetails ());
77- err .putString ("description" , error .getMessage ());
78- callback .invoke (err );
79- } else {
80- WritableMap res = Arguments .createMap ();
81- res .putString ("status" , "success" );
82- callback .invoke (null , res );
83- }
74+ handleCallback ("set" , callback , error , ref );
8475 }
8576 };
8677
@@ -98,17 +89,7 @@ public void update(final String path,
9889 DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
9990 @ Override
10091 public void onComplete (DatabaseError error , DatabaseReference ref ) {
101- if (error != null ) {
102- WritableMap err = Arguments .createMap ();
103- err .putInt ("errorCode" , error .getCode ());
104- err .putString ("errorDetails" , error .getDetails ());
105- err .putString ("description" , error .getMessage ());
106- callback .invoke (err );
107- } else {
108- WritableMap res = Arguments .createMap ();
109- res .putString ("status" , "success" );
110- callback .invoke (null , res );
111- }
92+ handleCallback ("update" , callback , error , ref );
11293 }
11394 };
11495
@@ -123,17 +104,7 @@ public void remove(final String path,
123104 DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
124105 @ Override
125106 public void onComplete (DatabaseError error , DatabaseReference ref ) {
126- if (error != null ) {
127- WritableMap err = Arguments .createMap ();
128- err .putInt ("errorCode" , error .getCode ());
129- err .putString ("errorDetails" , error .getDetails ());
130- err .putString ("description" , error .getMessage ());
131- callback .invoke (err );
132- } else {
133- WritableMap res = Arguments .createMap ();
134- res .putString ("status" , "success" );
135- callback .invoke (null , res );
136- }
107+ handleCallback ("remove" , callback , error , ref );
137108 }
138109 };
139110
@@ -200,13 +171,13 @@ public void on(final String path,
200171 ValueEventListener listener = new ValueEventListener () {
201172 @ Override
202173 public void onDataChange (DataSnapshot dataSnapshot ) {
203- WritableMap data = self .dataSnapshotToMap (name , dataSnapshot );
204- FirestackUtils .sendEvent (mReactContext , name , data );
174+ WritableMap data = self .dataSnapshotToMap (name , dataSnapshot );
175+ FirestackUtils .sendEvent (mReactContext , name , data );
205176 }
206177
207178 @ Override
208179 public void onCancelled (DatabaseError error ) {
209- // Failed to read value
180+ // Failed to read value
210181 Log .w (TAG , "Failed to read value." , error .toException ());
211182 WritableMap err = Arguments .createMap ();
212183 err .putInt ("errorCode" , error .getCode ());
@@ -316,7 +287,79 @@ public void removeListeners(final String path, final String name, final Callback
316287 FirestackUtils .todoNote (TAG , "on" , callback );
317288 }
318289
290+ // On Disconnect
291+ @ ReactMethod
292+ public void onDisconnectSetObject (final String path , final ReadableMap props , final Callback callback ) {
293+ DatabaseReference ref = this .getDatabaseReferenceAtPath (path );
294+ Map <String , Object > m = FirestackUtils .recursivelyDeconstructReadableMap (props );
295+
296+ OnDisconnect od = ref .onDisconnect ();
297+ od .setValue (m , new DatabaseReference .CompletionListener () {
298+ @ Override
299+ public void onComplete (DatabaseError databaseError , DatabaseReference databaseReference ) {
300+ handleCallback ("onDisconnectSetObject" , callback , databaseError , databaseReference );
301+ }
302+ });
303+ }
304+
305+ @ ReactMethod
306+ public void onDisconnectSetString (final String path , final String value , final Callback callback ) {
307+ DatabaseReference ref = this .getDatabaseReferenceAtPath (path );
308+
309+ OnDisconnect od = ref .onDisconnect ();
310+ od .setValue (value , new DatabaseReference .CompletionListener () {
311+ @ Override
312+ public void onComplete (DatabaseError databaseError , DatabaseReference databaseReference ) {
313+ handleCallback ("onDisconnectSetString" , callback , databaseError , databaseReference );
314+ }
315+ });
316+ }
317+
318+ @ ReactMethod
319+ public void onDisconnectRemove (final String path , final Callback callback ) {
320+ DatabaseReference ref = this .getDatabaseReferenceAtPath (path );
321+
322+ OnDisconnect od = ref .onDisconnect ();
323+ od .removeValue (new DatabaseReference .CompletionListener () {
324+ @ Override
325+ public void onComplete (DatabaseError databaseError , DatabaseReference databaseReference ) {
326+ handleCallback ("onDisconnectRemove" , callback , databaseError , databaseReference );
327+ }
328+ });
329+ }
330+ @ ReactMethod
331+ public void onDisconnectCancel (final String path , final Callback callback ) {
332+ DatabaseReference ref = this .getDatabaseReferenceAtPath (path );
333+
334+ OnDisconnect od = ref .onDisconnect ();
335+ od .cancel (new DatabaseReference .CompletionListener () {
336+ @ Override
337+ public void onComplete (DatabaseError databaseError , DatabaseReference databaseReference ) {
338+ handleCallback ("onDisconnectCancel" , callback , databaseError , databaseReference );
339+ }
340+ });
341+ }
342+
319343 // Private helpers
344+ private void handleCallback (
345+ final String methodName ,
346+ final Callback callback ,
347+ final DatabaseError databaseError ,
348+ final DatabaseReference databaseReference ) {
349+ if (databaseError != null ) {
350+ WritableMap err = Arguments .createMap ();
351+ err .putInt ("errorCode" , databaseError .getCode ());
352+ err .putString ("errorDetails" , databaseError .getDetails ());
353+ err .putString ("description" , databaseError .getMessage ());
354+ callback .invoke (err );
355+ } else {
356+ WritableMap res = Arguments .createMap ();
357+ res .putString ("status" , "success" );
358+ res .putString ("method" , methodName );
359+ callback .invoke (null , res );
360+ }
361+ }
362+
320363 private DatabaseReference getDatabaseReferenceAtPath (final String path ) {
321364 DatabaseReference mDatabase = FirebaseDatabase .getInstance ().getReference (path );
322365 return mDatabase ;
@@ -414,47 +457,47 @@ private WritableMap dataSnapshotToMap(String name, DataSnapshot dataSnapshot) {
414457 }
415458
416459 private <Any > Any castSnapshotValue (DataSnapshot snapshot ) {
417- if (snapshot .hasChildren ()) {
418- WritableMap data = Arguments .createMap ();
419- for (DataSnapshot child : snapshot .getChildren ()) {
420- Any castedChild = castSnapshotValue (child );
421- switch (castedChild .getClass ().getName ()) {
422- case "java.lang.Boolean" :
423- data .putBoolean (child .getKey (), (Boolean ) castedChild );
424- break ;
425- case "java.lang.Integer" :
426- data .putInt (child .getKey (), (Integer ) castedChild );
427- break ;
428- case "java.lang.Double" :
429- data .putDouble (child .getKey (), (Double ) castedChild );
430- break ;
431- case "java.lang.String" :
432- data .putString (child .getKey (), (String ) castedChild );
433- break ;
434- case "com.facebook.react.bridge.WritableNativeMap" :
435- data .putMap (child .getKey (), (WritableMap ) castedChild );
436- break ;
437- }
460+ if (snapshot .hasChildren ()) {
461+ WritableMap data = Arguments .createMap ();
462+ for (DataSnapshot child : snapshot .getChildren ()) {
463+ Any castedChild = castSnapshotValue (child );
464+ switch (castedChild .getClass ().getName ()) {
465+ case "java.lang.Boolean" :
466+ data .putBoolean (child .getKey (), (Boolean ) castedChild );
467+ break ;
468+ case "java.lang.Integer" :
469+ data .putInt (child .getKey (), (Integer ) castedChild );
470+ break ;
471+ case "java.lang.Double" :
472+ data .putDouble (child .getKey (), (Double ) castedChild );
473+ break ;
474+ case "java.lang.String" :
475+ data .putString (child .getKey (), (String ) castedChild );
476+ break ;
477+ case "com.facebook.react.bridge.WritableNativeMap" :
478+ data .putMap (child .getKey (), (WritableMap ) castedChild );
479+ break ;
438480 }
439- return (Any ) data ;
481+ }
482+ return (Any ) data ;
440483 } else {
441484 if (snapshot .getValue () != null ) {
442- String type = snapshot .getValue ().getClass ().getName ();
443- switch (type ) {
444- case "java.lang.Boolean" :
445- return (Any )((Boolean ) snapshot .getValue ());
446- case "java.lang.Long" :
447- return (Any )((Integer )(((Long ) snapshot .getValue ()).intValue ()));
448- case "java.lang.Double" :
449- return (Any )((Double ) snapshot .getValue ());
450- case "java.lang.String" :
451- return (Any )((String ) snapshot .getValue ());
452- default :
453- return (Any ) null ;
454- }
455- } else {
456- return (Any ) null ;
485+ String type = snapshot .getValue ().getClass ().getName ();
486+ switch (type ) {
487+ case "java.lang.Boolean" :
488+ return (Any )((Boolean ) snapshot .getValue ());
489+ case "java.lang.Long" :
490+ return (Any )((Integer )(((Long ) snapshot .getValue ()).intValue ()));
491+ case "java.lang.Double" :
492+ return (Any )((Double ) snapshot .getValue ());
493+ case "java.lang.String" :
494+ return (Any )((String ) snapshot .getValue ());
495+ default :
496+ return (Any ) null ;
457497 }
498+ } else {
499+ return (Any ) null ;
500+ }
458501 }
459502 }
460503}
0 commit comments