Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9c3130c

Browse files
committed
Merge remote-tracking branch 'origin/master' into fix-android-listeners
2 parents 7c8c0b9 + c82d9be commit 9c3130c

File tree

9 files changed

+215
-120
lines changed

9 files changed

+215
-120
lines changed

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,42 @@ And we also export the filetype constants as well:
640640

641641
The native Firebase JavaScript library provides a featureful realtime database that works out of the box. Firestack provides an attribute to interact with the database without needing to configure the JS library.
642642

643+
Ranking strategy
644+
645+
Add a new record with timestamp using this solution:
646+
647+
firebaseApp.database.ref('posts').push().then((res) => {
648+
let newPostKey = res.key;
649+
firebaseApp.ServerValue.then(map => {
650+
const postData = {
651+
name: name,
652+
timestamp: map.TIMESTAMP,
653+
text: this.state.postText,
654+
title: this.state.postTitle,
655+
puid: newPostKey
656+
}
657+
let updates = {}
658+
updates['/posts/' + newPostKey] = postData
659+
firebaseApp.database.ref().update(updates).then(() => {
660+
this.setState({
661+
postStatus: 'Posted! Thank You.',
662+
postText: '',
663+
});
664+
}).catch(() => {
665+
this.setState({ postStatus: 'Something went wrong!!!' });
666+
})
667+
})
668+
})
669+
670+
Then retrieve the feed using this:
671+
672+
firebaseApp.database.ref('posts').orderByChild('timestamp').limitToLast(30).once('value')
673+
.then((snapshot) => {
674+
this.props.savePosts(snapshot.val())
675+
const val = snapshot.val();
676+
console.log(val);
677+
})
678+
643679
#### DatabaseRef
644680

645681
Firestack attempts to provide the same API as the JS Firebase library for both Android and iOS platforms. [Check out the firebase guide](https://firebase.google.com/docs/database/web/read-and-write) for more information on how to use the JS library.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Iterator;
77
import java.util.List;
88
import java.util.ListIterator;
9+
import java.util.ArrayList;
910
import java.util.Map;
1011
import android.net.Uri;
1112

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

Lines changed: 95 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import java.io.FileNotFoundException;
1313

1414
import android.net.Uri;
15+
import android.provider.MediaStore;
16+
import android.database.Cursor;
1517
import android.support.annotation.NonNull;
1618
import android.support.annotation.Nullable;
1719

@@ -80,18 +82,49 @@ public void downloadUrl(final String javascriptStorageBucket,
8082
FirebaseStorage storage = FirebaseStorage.getInstance();
8183
String storageBucket = storage.getApp().getOptions().getStorageBucket();
8284
String storageUrl = "gs://"+storageBucket;
83-
StorageReference storageRef = storage.getReferenceFromUrl(storageUrl);
84-
StorageReference fileRef = storageRef.child(path);
85+
Log.d(TAG, "Storage url " + storageUrl + path);
86+
final StorageReference storageRef = storage.getReferenceFromUrl(storageUrl);
87+
final StorageReference fileRef = storageRef.child(path);
8588

8689
Task<Uri> downloadTask = fileRef.getDownloadUrl();
8790
downloadTask.addOnSuccessListener(new OnSuccessListener<Uri>() {
8891
@Override
8992
public void onSuccess(Uri uri) {
90-
WritableMap res = Arguments.createMap();
93+
final WritableMap res = Arguments.createMap();
94+
9195
res.putString("status", "success");
96+
res.putString("bucket", storageRef.getBucket());
97+
res.putString("fullPath", uri.toString());
9298
res.putString("path", uri.getPath());
93-
res.putString("url", uri.toString());
94-
callback.invoke(null, res);
99+
100+
storageRef.getMetadata()
101+
.addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
102+
@Override
103+
public void onSuccess(final StorageMetadata storageMetadata) {
104+
Log.d(TAG, "getMetadata success " + storageMetadata);
105+
res.putString("name", storageMetadata.getName());
106+
107+
WritableMap metadata = Arguments.createMap();
108+
metadata.putString("getBucket", storageMetadata.getBucket());
109+
metadata.putString("getName", storageMetadata.getName());
110+
metadata.putDouble("sizeBytes", storageMetadata.getSizeBytes());
111+
metadata.putDouble("created_at", storageMetadata.getCreationTimeMillis());
112+
metadata.putDouble("updated_at", storageMetadata.getUpdatedTimeMillis());
113+
metadata.putString("md5hash", storageMetadata.getMd5Hash());
114+
metadata.putString("encoding", storageMetadata.getContentEncoding());
115+
metadata.putString("downloadUrl", storageMetadata.getDownloadUrl().toString());
116+
117+
res.putMap("metadata", metadata);
118+
callback.invoke(null, res);
119+
}
120+
}).addOnFailureListener(new OnFailureListener() {
121+
@Override
122+
public void onFailure(@NonNull Exception exception) {
123+
Log.e(TAG, "Failure in download " + exception);
124+
callback.invoke(makeErrorPayload(1, exception));
125+
}
126+
});
127+
95128
}
96129
}).addOnFailureListener(new OnFailureListener() {
97130
@Override
@@ -144,20 +177,7 @@ public void onFailure(@NonNull Exception exception) {
144177
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
145178
Log.d(TAG, "Successfully uploaded file " + taskSnapshot);
146179
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
147-
Uri downloadUrl = taskSnapshot.getDownloadUrl();
148-
StorageMetadata d = taskSnapshot.getMetadata();
149-
150-
WritableMap resp = Arguments.createMap();
151-
resp.putString("downloadUrl", downloadUrl.toString());
152-
resp.putString("fullPath", d.getPath());
153-
resp.putString("bucket", d.getBucket());
154-
resp.putString("name", d.getName());
155-
156-
WritableMap metadataObj = Arguments.createMap();
157-
metadataObj.putString("cacheControl", d.getCacheControl());
158-
metadataObj.putString("contentDisposition", d.getContentDisposition());
159-
metadataObj.putString("contentType", d.getContentType());
160-
resp.putMap("metadata", metadataObj);
180+
WritableMap resp = getDownloadData(taskSnapshot);
161181
// NSDictionary *props = @{
162182
// @"fullPath": ref.fullPath,
163183
// @"bucket": ref.bucket,
@@ -171,13 +191,18 @@ public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
171191
.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
172192
@Override
173193
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
174-
double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
175-
System.out.println("Upload is " + progress + "% done");
176-
177-
WritableMap data = Arguments.createMap();
178-
data.putString("eventName", "upload_progress");
179-
data.putDouble("progress", progress);
180-
FirestackUtils.sendEvent(mReactContext, "upload_progress", data);
194+
double totalBytes = taskSnapshot.getTotalByteCount();
195+
double bytesTransferred = taskSnapshot.getBytesTransferred();
196+
double progress = (100.0 * bytesTransferred) / totalBytes;
197+
198+
System.out.println("Transferred " + bytesTransferred + "/" + totalBytes + "("+progress + "% complete)");
199+
200+
if (progress >= 0) {
201+
WritableMap data = Arguments.createMap();
202+
data.putString("eventName", "upload_progress");
203+
data.putDouble("progress", progress);
204+
FirestackUtils.sendEvent(mReactContext, "upload_progress", data);
205+
}
181206
}
182207
}).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
183208
@Override
@@ -193,14 +218,54 @@ public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
193218
});
194219
}
195220
catch (Exception ex) {
196-
WritableMap err = Arguments.createMap();
197-
198-
err.putString("error", "FileNotFoundException");
221+
callback.invoke(makeErrorPayload(2, ex));
222+
}
223+
}
199224

200-
callback.invoke(err);
225+
@ReactMethod
226+
public void getRealPathFromURI(final String uri, final Callback callback) {
227+
try {
228+
Context context = getReactApplicationContext();
229+
String [] proj = {MediaStore.Images.Media.DATA};
230+
Cursor cursor = context.getContentResolver().query(Uri.parse(uri), proj, null, null, null);
231+
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
232+
cursor.moveToFirst();
233+
String path = cursor.getString(column_index);
234+
cursor.close();
235+
236+
callback.invoke(null, path);
237+
} catch (Exception ex) {
238+
ex.printStackTrace();
239+
callback.invoke(makeErrorPayload(1, ex));
201240
}
202241
}
203242

243+
private WritableMap getDownloadData(final UploadTask.TaskSnapshot taskSnapshot) {
244+
Uri downloadUrl = taskSnapshot.getDownloadUrl();
245+
StorageMetadata d = taskSnapshot.getMetadata();
246+
247+
WritableMap resp = Arguments.createMap();
248+
resp.putString("downloadUrl", downloadUrl.toString());
249+
resp.putString("fullPath", d.getPath());
250+
resp.putString("bucket", d.getBucket());
251+
resp.putString("name", d.getName());
252+
253+
WritableMap metadataObj = Arguments.createMap();
254+
metadataObj.putString("cacheControl", d.getCacheControl());
255+
metadataObj.putString("contentDisposition", d.getContentDisposition());
256+
metadataObj.putString("contentType", d.getContentType());
257+
resp.putMap("metadata", metadataObj);
258+
259+
return resp;
260+
}
261+
262+
private WritableMap makeErrorPayload(double code, Exception ex) {
263+
WritableMap error = Arguments.createMap();
264+
error.putDouble("code", code);
265+
error.putString("message", ex.getMessage());
266+
return error;
267+
}
268+
204269
// Comes almost directory from react-native-fs
205270
@Override
206271
public Map<String, Object> getConstants() {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.facebook.react.bridge.Arguments;
1313
import com.facebook.react.bridge.Callback;
1414
import com.facebook.react.bridge.WritableMap;
15+
import com.facebook.react.bridge.WritableArray;
1516
import com.facebook.react.bridge.ReadableMap;
1617

1718
import com.facebook.react.bridge.ReadableArray;
@@ -83,6 +84,10 @@ public static WritableMap dataSnapshotToMap(String name,
8384
data.putMap("value", valueMap);
8485
}
8586

87+
// Child keys
88+
WritableArray childKeys = FirestackUtils.getChildKeys(dataSnapshot);
89+
data.putArray("childKeys", childKeys);
90+
8691
Object priority = dataSnapshot.getPriority();
8792
if (priority == null) {
8893
data.putString("priority", null);
@@ -146,6 +151,18 @@ public static <Any> Any castSnapshotValue(DataSnapshot snapshot) {
146151
}
147152
}
148153

154+
public static WritableArray getChildKeys(DataSnapshot snapshot) {
155+
WritableArray childKeys = Arguments.createArray();
156+
157+
if (snapshot.hasChildren()) {
158+
for (DataSnapshot child : snapshot.getChildren()) {
159+
childKeys.pushString(child.getKey());
160+
}
161+
}
162+
163+
return childKeys;
164+
}
165+
149166
public static Map<String, Object> recursivelyDeconstructReadableMap(ReadableMap readableMap) {
150167
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
151168
Map<String, Object> deconstructedMap = new HashMap<>();

0 commit comments

Comments
 (0)