31
31
import com .google .firebase .database .FirebaseDatabase ;
32
32
import com .google .firebase .database .DatabaseReference ;
33
33
import com .google .firebase .database .ChildEventListener ;
34
+ import com .google .firebase .database .OnDisconnect ;
34
35
import com .google .firebase .database .Query ;
35
36
import com .google .firebase .database .ValueEventListener ;
36
37
import com .google .firebase .database .DataSnapshot ;
@@ -70,17 +71,7 @@ public void set(
70
71
DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
71
72
@ Override
72
73
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 );
84
75
}
85
76
};
86
77
@@ -98,17 +89,7 @@ public void update(final String path,
98
89
DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
99
90
@ Override
100
91
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 );
112
93
}
113
94
};
114
95
@@ -123,17 +104,7 @@ public void remove(final String path,
123
104
DatabaseReference .CompletionListener listener = new DatabaseReference .CompletionListener () {
124
105
@ Override
125
106
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 );
137
108
}
138
109
};
139
110
@@ -200,13 +171,13 @@ public void on(final String path,
200
171
ValueEventListener listener = new ValueEventListener () {
201
172
@ Override
202
173
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 );
205
176
}
206
177
207
178
@ Override
208
179
public void onCancelled (DatabaseError error ) {
209
- // Failed to read value
180
+ // Failed to read value
210
181
Log .w (TAG , "Failed to read value." , error .toException ());
211
182
WritableMap err = Arguments .createMap ();
212
183
err .putInt ("errorCode" , error .getCode ());
@@ -316,7 +287,79 @@ public void removeListeners(final String path, final String name, final Callback
316
287
FirestackUtils .todoNote (TAG , "on" , callback );
317
288
}
318
289
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
+
319
343
// 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
+
320
363
private DatabaseReference getDatabaseReferenceAtPath (final String path ) {
321
364
DatabaseReference mDatabase = FirebaseDatabase .getInstance ().getReference (path );
322
365
return mDatabase ;
@@ -414,47 +457,47 @@ private WritableMap dataSnapshotToMap(String name, DataSnapshot dataSnapshot) {
414
457
}
415
458
416
459
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 ;
438
480
}
439
- return (Any ) data ;
481
+ }
482
+ return (Any ) data ;
440
483
} else {
441
484
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 ;
457
497
}
498
+ } else {
499
+ return (Any ) null ;
500
+ }
458
501
}
459
502
}
460
503
}
0 commit comments