Skip to content

Commit 76257f2

Browse files
committed
Updated android database version
1 parent a88b486 commit 76257f2

File tree

3 files changed

+91
-11
lines changed

3 files changed

+91
-11
lines changed

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

Lines changed: 88 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,14 @@ public void on(final String path, final String name, final Callback callback) {
7575
// FirestackUtils.todoNote(TAG, "on", callback);
7676
Log.d(TAG, "Setting a listener on event: " + name + " for path " + path);
7777
DatabaseReference ref = this.getDatabaseReferenceAtPath(path);
78+
final FirestackDatabaseModule self = this;
7879

79-
if (name == "value") {
80+
if (name.equals("value")) {
8081
ValueEventListener listener = new ValueEventListener() {
8182
@Override
8283
public void onDataChange(DataSnapshot dataSnapshot) {
83-
// This method is called once with the initial value and again
84-
// whenever data at this location is updated.
85-
String value = dataSnapshot.getValue(String.class);
86-
Log.d(TAG, "Value is: " + value);
84+
WritableMap data = self.dataSnapshotToMap(name, dataSnapshot);
85+
FirestackUtils.sendEvent(mReactContext, name, data);
8786
}
8887

8988
@Override
@@ -97,22 +96,34 @@ public void onCancelled(DatabaseError error) {
9796
ChildEventListener listener = new ChildEventListener() {
9897
@Override
9998
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
100-
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
99+
if (name.equals("child_added")) {
100+
WritableMap data = self.dataSnapshotToMap(name, dataSnapshot);
101+
FirestackUtils.sendEvent(mReactContext, name, data);
102+
}
101103
}
102104

103105
@Override
104106
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
105-
Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());
107+
if (name.equals("child_changed")) {
108+
WritableMap data = self.dataSnapshotToMap(name, dataSnapshot);
109+
FirestackUtils.sendEvent(mReactContext, name, data);
110+
}
106111
}
107112

108113
@Override
109114
public void onChildRemoved(DataSnapshot dataSnapshot) {
110-
Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());
115+
if (name.equals("child_removed")) {
116+
WritableMap data = self.dataSnapshotToMap(name, dataSnapshot);
117+
FirestackUtils.sendEvent(mReactContext, name, data);
118+
}
111119
}
112120

113121
@Override
114122
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
115-
Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());
123+
if (name.equals("child_moved")) {
124+
WritableMap data = self.dataSnapshotToMap(name, dataSnapshot);
125+
FirestackUtils.sendEvent(mReactContext, name, data);
126+
}
116127
}
117128

118129
@Override
@@ -130,6 +141,7 @@ public void onCancelled(DatabaseError databaseError) {
130141

131142
// mDBListeners.put(key, code);
132143

144+
Log.d(TAG, "Added listener " + key);
133145
WritableMap resp = Arguments.createMap();
134146
resp.putString("handle", key);
135147
callback.invoke(null, resp);
@@ -157,4 +169,71 @@ private DatabaseReference getDatabaseReferenceAtPath(final String path) {
157169
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(path);
158170
return mDatabase;
159171
}
172+
173+
private WritableMap dataSnapshotToMap(String name, DataSnapshot dataSnapshot) {
174+
WritableMap data = Arguments.createMap();
175+
176+
data.putString("key", dataSnapshot.getKey());
177+
data.putBoolean("exists", dataSnapshot.exists());
178+
data.putBoolean("hasChildren", dataSnapshot.hasChildren());
179+
180+
data.putDouble("childrenCount", dataSnapshot.getChildrenCount());
181+
182+
WritableMap valueMap = this.castSnapshotValue(dataSnapshot);
183+
data.putMap("value", valueMap);
184+
185+
Object priority = dataSnapshot.getPriority();
186+
if (priority == null) {
187+
data.putString("priority", "null");
188+
} else {
189+
data.putString("priority", priority.toString());
190+
}
191+
192+
WritableMap eventMap = Arguments.createMap();
193+
eventMap.putString("eventName", name);
194+
eventMap.putMap("snapshot", data);
195+
return eventMap;
196+
}
197+
198+
private <Any> Any castSnapshotValue(DataSnapshot snapshot) {
199+
if (snapshot.hasChildren()) {
200+
WritableMap data = Arguments.createMap();
201+
for (DataSnapshot child : snapshot.getChildren()) {
202+
Any castedChild = castSnapshotValue(child);
203+
switch (castedChild.getClass().getName()) {
204+
case "java.lang.Boolean":
205+
data.putBoolean(child.getKey(), (Boolean) castedChild);
206+
break;
207+
case "java.lang.Integer":
208+
data.putInt(child.getKey(), (Integer) castedChild);
209+
break;
210+
case "java.lang.Double":
211+
data.putDouble(child.getKey(), (Double) castedChild);
212+
break;
213+
case "java.lang.String":
214+
data.putString(child.getKey(), (String) castedChild);
215+
break;
216+
case "com.facebook.react.bridge.WritableNativeMap":
217+
data.putMap(child.getKey(), (WritableMap) castedChild);
218+
break;
219+
}
220+
}
221+
return (Any) data;
222+
} else {
223+
String type = snapshot.getValue().getClass().getName();
224+
switch (type) {
225+
case "java.lang.Boolean":
226+
return (Any)((Boolean) snapshot.getValue());
227+
case "java.lang.Long":
228+
// TODO check range errors
229+
return (Any)((Integer)(((Long) snapshot.getValue()).intValue()));
230+
case "java.lang.Double":
231+
return (Any)((Double) snapshot.getValue());
232+
case "java.lang.String":
233+
return (Any)((String) snapshot.getValue());
234+
default:
235+
return (Any) null;
236+
}
237+
}
238+
}
160239
}

lib/firestackModule.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export class FirestackModule {
8686
const toObject = this._toObject;
8787

8888
const _itemAdded = (snapshot, prevKey) => {
89+
console.log('_itemAdded ->', snapshot);
8990
const state = this._getState(); // local state
9091
const newItem = toObject(snapshot, state);
9192
let list = state.items || [];

lib/modules/database.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class DatabaseRef {
8181

8282
on(evt, cb) {
8383
this.db.on(evt, (data) => {
84-
this.db.log.debug('Got a snapshot', data.eventName, 'at', this.path);
84+
this.db.log.debug('Got a snapshot', data, 'at', this.path);
8585
const snap = new DataSnapshot(data.snapshot);
8686
if (cb && typeof(cb) === 'function') {
8787
cb(snap);
@@ -92,7 +92,7 @@ class DatabaseRef {
9292
.then(handle => {
9393
this.handles.push(handle.handle);
9494
return handle;
95-
});
95+
})
9696
}
9797

9898
once(evt, cb) {

0 commit comments

Comments
 (0)