@@ -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}
0 commit comments