Skip to content

Commit 2373e20

Browse files
committed
Added OnDisconnect
1 parent 8ba5abd commit 2373e20

File tree

5 files changed

+288
-124
lines changed

5 files changed

+288
-124
lines changed

Diff for: .gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,6 @@ android/*.iml
4949
.Spotlight-V100
5050
.Trashes
5151
ehthumbs.db
52-
Thumbs.db
52+
Thumbs.dbandroid/gradle
53+
android/gradlew
54+
android/gradlew.bat

Diff for: android/src/main/java/io/fullstack/firestack/FirestackDatabase.java

+116-73
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.google.firebase.database.FirebaseDatabase;
3232
import com.google.firebase.database.DatabaseReference;
3333
import com.google.firebase.database.ChildEventListener;
34+
import com.google.firebase.database.OnDisconnect;
3435
import com.google.firebase.database.Query;
3536
import com.google.firebase.database.ValueEventListener;
3637
import 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

Comments
 (0)