1717import com .facebook .react .bridge .ReadableArray ;
1818import com .facebook .react .bridge .ReadableMapKeySetIterator ;
1919import com .facebook .react .bridge .ReadableType ;
20+ import com .google .firebase .database .DataSnapshot ;
2021
2122public class FirestackUtils {
2223 private static final String TAG = "FirestackUtils" ;
@@ -42,6 +43,77 @@ public static void sendEvent(final ReactContext context,
4243 .emit (eventName , params );
4344 }
4445
46+ // snapshot
47+ public static WritableMap dataSnapshotToMap (String name , DataSnapshot dataSnapshot ) {
48+ WritableMap data = Arguments .createMap ();
49+
50+ data .putString ("key" , dataSnapshot .getKey ());
51+ data .putBoolean ("exists" , dataSnapshot .exists ());
52+ data .putBoolean ("hasChildren" , dataSnapshot .hasChildren ());
53+
54+ data .putDouble ("childrenCount" , dataSnapshot .getChildrenCount ());
55+
56+ WritableMap valueMap = FirestackUtils .castSnapshotValue (dataSnapshot );
57+ data .putMap ("value" , valueMap );
58+
59+ Object priority = dataSnapshot .getPriority ();
60+ if (priority == null ) {
61+ data .putString ("priority" , null );
62+ } else {
63+ data .putString ("priority" , priority .toString ());
64+ }
65+
66+ WritableMap eventMap = Arguments .createMap ();
67+ eventMap .putString ("eventName" , name );
68+ eventMap .putMap ("snapshot" , data );
69+ return eventMap ;
70+ }
71+
72+ public static <Any > Any castSnapshotValue (DataSnapshot snapshot ) {
73+ if (snapshot .hasChildren ()) {
74+ WritableMap data = Arguments .createMap ();
75+ for (DataSnapshot child : snapshot .getChildren ()) {
76+ Any castedChild = castSnapshotValue (child );
77+ switch (castedChild .getClass ().getName ()) {
78+ case "java.lang.Boolean" :
79+ data .putBoolean (child .getKey (), (Boolean ) castedChild );
80+ break ;
81+ case "java.lang.Integer" :
82+ data .putInt (child .getKey (), (Integer ) castedChild );
83+ break ;
84+ case "java.lang.Double" :
85+ data .putDouble (child .getKey (), (Double ) castedChild );
86+ break ;
87+ case "java.lang.String" :
88+ data .putString (child .getKey (), (String ) castedChild );
89+ break ;
90+ case "com.facebook.react.bridge.WritableNativeMap" :
91+ data .putMap (child .getKey (), (WritableMap ) castedChild );
92+ break ;
93+ }
94+ }
95+ return (Any ) data ;
96+ } else {
97+ if (snapshot .getValue () != null ) {
98+ String type = snapshot .getValue ().getClass ().getName ();
99+ switch (type ) {
100+ case "java.lang.Boolean" :
101+ return (Any )((Boolean ) snapshot .getValue ());
102+ case "java.lang.Long" :
103+ return (Any )((Integer )(((Long ) snapshot .getValue ()).intValue ()));
104+ case "java.lang.Double" :
105+ return (Any )((Double ) snapshot .getValue ());
106+ case "java.lang.String" :
107+ return (Any )((String ) snapshot .getValue ());
108+ default :
109+ return (Any ) null ;
110+ }
111+ } else {
112+ return (Any ) null ;
113+ }
114+ }
115+ }
116+
45117 public static Map <String , Object > recursivelyDeconstructReadableMap (ReadableMap readableMap ) {
46118 ReadableMapKeySetIterator iterator = readableMap .keySetIterator ();
47119 Map <String , Object > deconstructedMap = new HashMap <>();
0 commit comments