Skip to content

Commit 4f534cb

Browse files
committed
Merge branch 'master' into fix/analytics
* master: Ignored anroid/gradle Added OnDisconnect Updated snapshot to be returned on once Bug fix with event handlers Added check for eventhandler Recycle DB references Added startAt() and fixed endAt() on Android
2 parents 0ddee25 + 050c110 commit 4f534cb

File tree

6 files changed

+305
-111
lines changed

6 files changed

+305
-111
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,7 @@ android/*.iml
4949
.Spotlight-V100
5050
.Trashes
5151
ehthumbs.db
52-
Thumbs.db
52+
Thumbs.dbandroid/gradle
53+
android/gradlew
54+
android/gradlew.bat
55+
android/gradle/

android/src/main/java/io/fullstack/firestack/FirestackDatabase.java

Lines changed: 127 additions & 76 deletions
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;
@@ -370,9 +413,17 @@ private Query getDatabaseQueryAtPathAndModifiers(
370413
String value = strArr[1];
371414
String key = strArr[2];
372415
if (key == null) {
373-
query = query.equalTo(value);
416+
query = query.endAt(value);
374417
} else {
375-
query = query.equalTo(value, key);
418+
query = query.endAt(value, key);
419+
}
420+
} else if (methStr.contains("startAt")) {
421+
String value = strArr[1];
422+
String key = strArr[2];
423+
if (key == null) {
424+
query = query.startAt(value);
425+
} else {
426+
query = query.startAt(value, key);
376427
}
377428
}
378429
}
@@ -406,47 +457,47 @@ private WritableMap dataSnapshotToMap(String name, DataSnapshot dataSnapshot) {
406457
}
407458

408459
private <Any> Any castSnapshotValue(DataSnapshot snapshot) {
409-
if (snapshot.hasChildren()) {
410-
WritableMap data = Arguments.createMap();
411-
for (DataSnapshot child : snapshot.getChildren()) {
412-
Any castedChild = castSnapshotValue(child);
413-
switch (castedChild.getClass().getName()) {
414-
case "java.lang.Boolean":
415-
data.putBoolean(child.getKey(), (Boolean) castedChild);
416-
break;
417-
case "java.lang.Integer":
418-
data.putInt(child.getKey(), (Integer) castedChild);
419-
break;
420-
case "java.lang.Double":
421-
data.putDouble(child.getKey(), (Double) castedChild);
422-
break;
423-
case "java.lang.String":
424-
data.putString(child.getKey(), (String) castedChild);
425-
break;
426-
case "com.facebook.react.bridge.WritableNativeMap":
427-
data.putMap(child.getKey(), (WritableMap) castedChild);
428-
break;
429-
}
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;
430480
}
431-
return (Any) data;
481+
}
482+
return (Any) data;
432483
} else {
433484
if (snapshot.getValue() != null) {
434-
String type = snapshot.getValue().getClass().getName();
435-
switch (type) {
436-
case "java.lang.Boolean":
437-
return (Any)((Boolean) snapshot.getValue());
438-
case "java.lang.Long":
439-
return (Any)((Integer)(((Long) snapshot.getValue()).intValue()));
440-
case "java.lang.Double":
441-
return (Any)((Double) snapshot.getValue());
442-
case "java.lang.String":
443-
return (Any)((String) snapshot.getValue());
444-
default:
445-
return (Any) null;
446-
}
447-
} else {
448-
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;
449497
}
498+
} else {
499+
return (Any) null;
500+
}
450501
}
451502
}
452-
}
503+
}

0 commit comments

Comments
 (0)