From 31854bae5b8e1b45afccce549259a481c111cf83 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Mon, 16 Oct 2017 11:12:40 +0100 Subject: [PATCH 01/12] [auth] Update auth providers `providerId` to match official SDKs --- .../java/io/invertase/firebase/auth/RNFirebaseAuth.java | 8 ++++---- docs/modules/authentication.md | 4 ++-- ios/RNFirebase/auth/RNFirebaseAuth.m | 8 ++++---- lib/modules/auth/providers/FacebookAuthProvider.js | 2 +- lib/modules/auth/providers/GithubAuthProvider.js | 2 +- lib/modules/auth/providers/GoogleAuthProvider.js | 2 +- lib/modules/auth/providers/TwitterAuthProvider.js | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/auth/RNFirebaseAuth.java b/android/src/main/java/io/invertase/firebase/auth/RNFirebaseAuth.java index a6c3d31c..d4bc7a1f 100644 --- a/android/src/main/java/io/invertase/firebase/auth/RNFirebaseAuth.java +++ b/android/src/main/java/io/invertase/firebase/auth/RNFirebaseAuth.java @@ -1059,13 +1059,13 @@ class RNFirebaseAuth extends ReactContextBaseJavaModule { */ private AuthCredential getCredentialForProvider(String provider, String authToken, String authSecret) { switch (provider) { - case "facebook": + case "facebook.com": return FacebookAuthProvider.getCredential(authToken); - case "google": + case "google.com": return GoogleAuthProvider.getCredential(authToken, authSecret); - case "twitter": + case "twitter.com": return TwitterAuthProvider.getCredential(authToken, authSecret); - case "github": + case "github.com": return GithubAuthProvider.getCredential(authToken); case "phone": return PhoneAuthProvider.getCredential(authToken, authSecret); diff --git a/docs/modules/authentication.md b/docs/modules/authentication.md index ac6c0a73..8a070be7 100644 --- a/docs/modules/authentication.md +++ b/docs/modules/authentication.md @@ -100,7 +100,7 @@ Sign in the user with a 3rd party credential provider. `credential` requires the ```javascript const credential = { - provider: 'facebook', + provider: 'facebook.com', token: '12345', secret: '6789', }; @@ -210,7 +210,7 @@ Reauthenticate the current user with credentials: ```javascript const credentials = { - provider: 'facebook', + provider: 'facebook.com', token: '12345', secret: '6789', }; diff --git a/ios/RNFirebase/auth/RNFirebaseAuth.m b/ios/RNFirebase/auth/RNFirebaseAuth.m index ba6cd293..56f5ecee 100644 --- a/ios/RNFirebase/auth/RNFirebaseAuth.m +++ b/ios/RNFirebase/auth/RNFirebaseAuth.m @@ -889,15 +889,15 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail: - (FIRAuthCredential *)getCredentialForProvider:(NSString *)provider token:(NSString *)authToken secret:(NSString *)authTokenSecret { FIRAuthCredential *credential; - if ([provider compare:@"twitter" options:NSCaseInsensitiveSearch] == NSOrderedSame) { + if ([provider compare:@"twitter.com" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [FIRTwitterAuthProvider credentialWithToken:authToken secret:authTokenSecret]; - } else if ([provider compare:@"facebook" options:NSCaseInsensitiveSearch] == NSOrderedSame) { + } else if ([provider compare:@"facebook.com" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [FIRFacebookAuthProvider credentialWithAccessToken:authToken]; - } else if ([provider compare:@"google" options:NSCaseInsensitiveSearch] == NSOrderedSame) { + } else if ([provider compare:@"google.com" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [FIRGoogleAuthProvider credentialWithIDToken:authToken accessToken:authTokenSecret]; } else if ([provider compare:@"password" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [FIREmailAuthProvider credentialWithEmail:authToken password:authTokenSecret]; - } else if ([provider compare:@"github" options:NSCaseInsensitiveSearch] == NSOrderedSame) { + } else if ([provider compare:@"github.com" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [FIRGitHubAuthProvider credentialWithToken:authToken]; } else if ([provider compare:@"phone" options:NSCaseInsensitiveSearch] == NSOrderedSame) { credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:authToken verificationCode:authTokenSecret]; diff --git a/lib/modules/auth/providers/FacebookAuthProvider.js b/lib/modules/auth/providers/FacebookAuthProvider.js index d30c190f..c8abbc10 100644 --- a/lib/modules/auth/providers/FacebookAuthProvider.js +++ b/lib/modules/auth/providers/FacebookAuthProvider.js @@ -1,4 +1,4 @@ -const providerId = 'facebook'; +const providerId = 'facebook.com'; export default class FacebookAuthProvider { constructor() { diff --git a/lib/modules/auth/providers/GithubAuthProvider.js b/lib/modules/auth/providers/GithubAuthProvider.js index afbfa37b..fbd84272 100644 --- a/lib/modules/auth/providers/GithubAuthProvider.js +++ b/lib/modules/auth/providers/GithubAuthProvider.js @@ -1,4 +1,4 @@ -const providerId = 'github'; +const providerId = 'github.com'; export default class GithubAuthProvider { constructor() { diff --git a/lib/modules/auth/providers/GoogleAuthProvider.js b/lib/modules/auth/providers/GoogleAuthProvider.js index 4a9bac49..eda9f241 100644 --- a/lib/modules/auth/providers/GoogleAuthProvider.js +++ b/lib/modules/auth/providers/GoogleAuthProvider.js @@ -1,4 +1,4 @@ -const providerId = 'google'; +const providerId = 'google.com'; export default class GoogleAuthProvider { constructor() { diff --git a/lib/modules/auth/providers/TwitterAuthProvider.js b/lib/modules/auth/providers/TwitterAuthProvider.js index feddf6ab..15c0a2f6 100644 --- a/lib/modules/auth/providers/TwitterAuthProvider.js +++ b/lib/modules/auth/providers/TwitterAuthProvider.js @@ -1,4 +1,4 @@ -const providerId = 'twitter'; +const providerId = 'twitter.com'; export default class TwitterAuthProvider { constructor() { From 4f51b484301ee9eafd31303fe74efe252c8e35f8 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Wed, 18 Oct 2017 10:29:11 +0100 Subject: [PATCH 02/12] [ios][database] Protect against calling off on a non-existent ref --- ios/RNFirebase/database/RNFirebaseDatabase.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ios/RNFirebase/database/RNFirebaseDatabase.m b/ios/RNFirebase/database/RNFirebaseDatabase.m index 9422cba0..70efdf8d 100644 --- a/ios/RNFirebase/database/RNFirebaseDatabase.m +++ b/ios/RNFirebase/database/RNFirebaseDatabase.m @@ -246,10 +246,12 @@ RCT_EXPORT_METHOD(on:(NSString *) appName RCT_EXPORT_METHOD(off:(NSString *) key eventRegistrationKey:(NSString *) eventRegistrationKey) { RNFirebaseDatabaseReference *ref = _dbReferences[key]; - [ref removeEventListener:eventRegistrationKey]; + if (ref) { + [ref removeEventListener:eventRegistrationKey]; - if (![ref hasListeners]) { - [_dbReferences removeObjectForKey:key]; + if (![ref hasListeners]) { + [_dbReferences removeObjectForKey:key]; + } } } From 2d35514287c6ea4f784c253688f321a85b9dc467 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Wed, 18 Oct 2017 10:29:46 +0100 Subject: [PATCH 03/12] [firestore] Cleanup unused methods --- .../firebase/firestore/RNFirebaseFirestore.java | 12 ------------ .../RNFirebaseFirestoreDocumentReference.java | 8 -------- ios/RNFirebase/firestore/RNFirebaseFirestore.m | 15 --------------- .../RNFirebaseFirestoreDocumentReference.h | 2 -- .../RNFirebaseFirestoreDocumentReference.m | 17 +++-------------- 5 files changed, 3 insertions(+), 51 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestore.java b/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestore.java index cf01f262..d89c3093 100644 --- a/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestore.java +++ b/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestore.java @@ -111,18 +111,6 @@ public class RNFirebaseFirestore extends ReactContextBaseJavaModule { }); } - @ReactMethod - public void documentCollections(String appName, String path, final Promise promise) { - RNFirebaseFirestoreDocumentReference ref = getDocumentForAppPath(appName, path); - ref.collections(promise); - } - - @ReactMethod - public void documentCreate(String appName, String path, ReadableMap data, final Promise promise) { - RNFirebaseFirestoreDocumentReference ref = getDocumentForAppPath(appName, path); - ref.create(data, promise); - } - @ReactMethod public void documentDelete(String appName, String path, final Promise promise) { RNFirebaseFirestoreDocumentReference ref = getDocumentForAppPath(appName, path); diff --git a/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestoreDocumentReference.java b/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestoreDocumentReference.java index 156d08e2..93862c99 100644 --- a/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestoreDocumentReference.java +++ b/android/src/main/java/io/invertase/firebase/firestore/RNFirebaseFirestoreDocumentReference.java @@ -40,14 +40,6 @@ public class RNFirebaseFirestoreDocumentReference { this.ref = RNFirebaseFirestore.getFirestoreForApp(appName).document(path); } - public void collections(Promise promise) { - // Not supported on Android - } - - public void create(ReadableMap data, Promise promise) { - // Not supported on Android out of the box - } - public void delete(final Promise promise) { this.ref.delete().addOnCompleteListener(new OnCompleteListener() { @Override diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestore.m b/ios/RNFirebase/firestore/RNFirebaseFirestore.m index 14de1efb..c9510f47 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestore.m +++ b/ios/RNFirebase/firestore/RNFirebaseFirestore.m @@ -85,21 +85,6 @@ RCT_EXPORT_METHOD(documentBatch:(NSString *) appName }]; } -RCT_EXPORT_METHOD(documentCollections:(NSString *) appName - path:(NSString *) path - resolver:(RCTPromiseResolveBlock) resolve - rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] get:resolve rejecter:reject]; -} - -RCT_EXPORT_METHOD(documentCreate:(NSString *) appName - path:(NSString *) path - data:(NSDictionary *) data - resolver:(RCTPromiseResolveBlock) resolve - rejecter:(RCTPromiseRejectBlock) reject) { - [[self getDocumentForAppPath:appName path:path] create:data resolver:resolve rejecter:reject]; -} - RCT_EXPORT_METHOD(documentDelete:(NSString *) appName path:(NSString *) path resolver:(RCTPromiseResolveBlock) resolve diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h index 98f70b3f..f3178e8c 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.h @@ -17,8 +17,6 @@ @property FIRDocumentReference *ref; - (id)initWithPath:(RCTEventEmitter *)emitter app:(NSString *)app path:(NSString *)path; -- (void)collections:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; -- (void)create:(NSDictionary *)data resolver:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; - (void)delete:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; - (void)get:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject; + (void)offSnapshot:(NSString *)listenerId; diff --git a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m index 4b1635f2..caa5495f 100644 --- a/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m +++ b/ios/RNFirebase/firestore/RNFirebaseFirestoreDocumentReference.m @@ -23,17 +23,6 @@ static NSMutableDictionary *_listeners; return self; } -- (void)collections:(RCTPromiseResolveBlock) resolve - rejecter:(RCTPromiseRejectBlock) reject { - // Not supported on iOS -} - -- (void)create:(NSDictionary *) data - resolver:(RCTPromiseResolveBlock) resolve - rejecter:(RCTPromiseRejectBlock) reject { - // Not supported on iOS out of the box -} - - (void)delete:(RCTPromiseResolveBlock) resolve rejecter:(RCTPromiseRejectBlock) reject { [_ref deleteDocumentWithCompletion:^(NSError * _Nullable error) { @@ -176,7 +165,7 @@ static NSMutableDictionary *_listeners; NSDictionary *typeMap = [RNFirebaseFirestoreDocumentReference buildTypeMap:obj]; map[key] = typeMap; }]; - + return map; } @@ -186,7 +175,7 @@ static NSMutableDictionary *_listeners; NSDictionary *typeMap = [RNFirebaseFirestoreDocumentReference buildTypeMap:obj]; [array addObject:typeMap]; }]; - + return array; } @@ -231,7 +220,7 @@ static NSMutableDictionary *_listeners; // TODO: Log an error typeMap[@"type"] = @"null"; } - + return typeMap; } From aa36487ec1e227a762509a1500632d588ebad6db Mon Sep 17 00:00:00 2001 From: Omer Levy Date: Wed, 18 Oct 2017 11:27:55 +0300 Subject: [PATCH 04/12] temporary fix to the reference off bug --- .../invertase/firebase/database/RNFirebaseDatabase.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java index 6612f491..3c957759 100644 --- a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java +++ b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java @@ -416,10 +416,12 @@ public class RNFirebaseDatabase extends ReactContextBaseJavaModule { @ReactMethod public void off(String key, String eventRegistrationKey) { RNFirebaseDatabaseReference nativeRef = references.get(key); - nativeRef.removeEventListener(eventRegistrationKey); + if (nativeRef) { + nativeRef.removeEventListener(eventRegistrationKey); - if (!nativeRef.hasListeners()) { - references.remove(key); + if (!nativeRef.hasListeners()) { + references.remove(key); + } } } From 252b879ef4d25df8cab4c6a510124d7f4f594603 Mon Sep 17 00:00:00 2001 From: Omer Levy Date: Wed, 18 Oct 2017 11:36:16 +0300 Subject: [PATCH 05/12] fix reference compare to null --- .../java/io/invertase/firebase/database/RNFirebaseDatabase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java index 3c957759..93ce73f4 100644 --- a/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java +++ b/android/src/main/java/io/invertase/firebase/database/RNFirebaseDatabase.java @@ -416,7 +416,7 @@ public class RNFirebaseDatabase extends ReactContextBaseJavaModule { @ReactMethod public void off(String key, String eventRegistrationKey) { RNFirebaseDatabaseReference nativeRef = references.get(key); - if (nativeRef) { + if (nativeRef != null) { nativeRef.removeEventListener(eventRegistrationKey); if (!nativeRef.hasListeners()) { From bc1e8272738c40729f795325052778897e377a5d Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Wed, 18 Oct 2017 10:40:18 +0100 Subject: [PATCH 06/12] [database][js] Fix strict mode issue --- lib/modules/database/reference.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/modules/database/reference.js b/lib/modules/database/reference.js index 735eca99..ab3a1da9 100644 --- a/lib/modules/database/reference.js +++ b/lib/modules/database/reference.js @@ -74,7 +74,6 @@ export default class Reference extends ReferenceBase { this._refListeners = {}; this._database = database; this._query = new Query(this, path, existingModifiers); - this.log = this._database.log; this.log.debug('Created new Reference', this._getRefKey()); } From fc3fc6d0d2fce8eccd265ecce1fcf8fdb3e6754d Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Wed, 18 Oct 2017 14:29:37 +0100 Subject: [PATCH 07/12] [firestore][android] Correctly process date time zones --- .../io/invertase/firebase/firestore/FirestoreSerialize.java | 2 +- tests/src/tests/firestore/documentReferenceTests.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java b/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java index 3cb96896..dd4e3626 100644 --- a/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java +++ b/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java @@ -30,7 +30,7 @@ import io.invertase.firebase.Utils; public class FirestoreSerialize { private static final String TAG = "FirestoreSerialize"; - private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); private static final String KEY_CHANGES = "changes"; private static final String KEY_DATA = "data"; private static final String KEY_DOC_CHANGE_DOCUMENT = "document"; diff --git a/tests/src/tests/firestore/documentReferenceTests.js b/tests/src/tests/firestore/documentReferenceTests.js index bc4a39e0..968cb28b 100644 --- a/tests/src/tests/firestore/documentReferenceTests.js +++ b/tests/src/tests/firestore/documentReferenceTests.js @@ -426,13 +426,15 @@ function documentReferenceTests({ describe, it, context, firebase }) { context('types', () => { it('should handle Date field', async () => { + const date = new Date(); const docRef = firebase.native.firestore().doc('document-tests/reference'); await docRef.set({ - field: new Date(), + field: date, }); const doc = await docRef.get(); doc.data().field.should.be.instanceof(Date); + should.equal(doc.data().field.toISOString(), date.toISOString()); }); }); From fec365f05966203218e43106a68775190fbab557 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Wed, 18 Oct 2017 14:31:49 +0100 Subject: [PATCH 08/12] 3.0.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c439794a..d699d662 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "react-native-firebase", - "version": "3.0.3", + "version": "3.0.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ffbc04f5..c3a38996 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-firebase", - "version": "3.0.3", + "version": "3.0.4", "author": "Invertase (http://invertase.io)", "description": "A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Messaging (FCM), Remote Config, Storage and Performance.", "main": "index", From 4e66443c711f71328f22de64ffe54442bc3fb860 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Fri, 20 Oct 2017 17:37:59 +0100 Subject: [PATCH 09/12] =?UTF-8?q?[auth][ios]=20Reload=20the=20user=20when?= =?UTF-8?q?=20unlinking=20an=20account=20to=20ensure=20that=20it=E2=80=99s?= =?UTF-8?q?=20up=20to=20date?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/RNFirebase/auth/RNFirebaseAuth.m | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ios/RNFirebase/auth/RNFirebaseAuth.m b/ios/RNFirebase/auth/RNFirebaseAuth.m index 56f5ecee..66a60dfb 100644 --- a/ios/RNFirebase/auth/RNFirebaseAuth.m +++ b/ios/RNFirebase/auth/RNFirebaseAuth.m @@ -794,7 +794,15 @@ RCT_EXPORT_METHOD(unlink: if (error) { [self promiseRejectAuthException:reject error:error]; } else { - [self promiseWithUser:resolve rejecter:reject user:_user]; + // This is here to protect against bugs in the iOS SDK which don't + // correctly refresh the user object when unlinking certain accounts + [user reloadWithCompletion:^(NSError * _Nullable error) { + if (error) { + [self promiseRejectAuthException:reject error:error]; + } else { + [self promiseWithUser:resolve rejecter:reject user:user]; + } + }]; } }]; } else { From 2c7c768522683927c17687d5632212f485be863f Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Mon, 23 Oct 2017 09:15:51 +0100 Subject: [PATCH 10/12] [firestore][android] A further fix for date / timezone handling --- .../firebase/firestore/FirestoreSerialize.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java b/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java index dd4e3626..8139e527 100644 --- a/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java +++ b/android/src/main/java/io/invertase/firebase/firestore/FirestoreSerialize.java @@ -25,12 +25,14 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; import io.invertase.firebase.Utils; public class FirestoreSerialize { private static final String TAG = "FirestoreSerialize"; - private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); + private static final DateFormat READ_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); + private static final DateFormat WRITE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); private static final String KEY_CHANGES = "changes"; private static final String KEY_DATA = "data"; private static final String KEY_DOC_CHANGE_DOCUMENT = "document"; @@ -41,6 +43,12 @@ public class FirestoreSerialize { private static final String KEY_METADATA = "metadata"; private static final String KEY_PATH = "path"; + static { + // Javascript Date.toISOString is always formatted to UTC + // We set the read TimeZone to UTC to account for this + READ_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); + } + /** * Convert a DocumentSnapshot instance into a React Native WritableMap * @@ -212,7 +220,7 @@ public class FirestoreSerialize { typeMap.putMap("value", geoPoint); } else if (value instanceof Date) { typeMap.putString("type", "date"); - typeMap.putString("value", DATE_FORMAT.format((Date) value)); + typeMap.putString("value", WRITE_DATE_FORMAT.format((Date) value)); } else { // TODO: Changed to log an error rather than crash - is this correct? Log.e(TAG, "buildTypeMap: Cannot convert object of type " + value.getClass()); @@ -269,7 +277,7 @@ public class FirestoreSerialize { } else if ("date".equals(type)) { try { String date = typeMap.getString("value"); - return DATE_FORMAT.parse(date); + return READ_DATE_FORMAT.parse(date); } catch (ParseException exception) { Log.e(TAG, "parseTypeMap", exception); return null; From 6d9ffb16a0d6e7cec1e6fb577d8062e18c61d039 Mon Sep 17 00:00:00 2001 From: Salakar Date: Thu, 19 Oct 2017 14:46:02 +0100 Subject: [PATCH 11/12] fix for #529 --- jsconfig.json | 9 ++ lib/firebase-app.js | 2 +- scratch.js | 240 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 jsconfig.json create mode 100644 scratch.js diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..c98b6e08 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/lib/firebase-app.js b/lib/firebase-app.js index d93985b9..e7640ca2 100644 --- a/lib/firebase-app.js +++ b/lib/firebase-app.js @@ -158,7 +158,7 @@ export default class FirebaseApp { } if (!this._namespaces[_name]) { - this._namespaces[_name] = new InstanceClass(this); + this._namespaces[_name] = new InstanceClass(this, this._options); } return this._namespaces[_name]; diff --git a/scratch.js b/scratch.js new file mode 100644 index 00000000..32177a2c --- /dev/null +++ b/scratch.js @@ -0,0 +1,240 @@ +// global.fps = 0; +// global.fpsTarget = 60; +// global.delay = 0; +// global.fillSize = 100; +// +// setInterval(() => { +// const _fps = fps; +// fps = 0; +// console.log(`${_fps} - ${delay}`); +// }, 1000); +// +// function someWork() {w +// new Array(Math.floor(Math.random() * 1000000) + 100).fill(1); +// } +// +// global.tick = function tick() { +// fps++; +// const start = Date.now(); +// someWork(); +// delay = Math.floor((1000 / (fpsTarget + 5)) - (Date.now() - start)); +// +// if (delay < 1) { +// process.nextTick(() => tick()); +// } else { +// setTimeout(() => tick(), delay); +// } +// }; +// +// tick(); + +// // --------------------- +// // SAMPLE DATA +// // --------------------- +// +// const loadedData = [ +// { +// 0: { +// Ticket: '123', +// Mid: '987654321', +// }, +// }, +// { +// 0: { +// Ticket: '567', +// Mid: '12345678', +// }, +// }, +// ]; +// +// const newData = [ +// { +// Ticket: '123', +// Mid: '987654321', +// }, +// { +// Ticket: '345', +// Mid: '54568656', +// }, +// ]; +// +// +// // ----------- +// // UTILS +// // ------------ +// /** +// * +// * @param obj +// * @param keys +// * @return {string} +// */ +// function objectToMapKey(obj, keys) { +// let mapKey = ''; +// +// for (let j = 0, klen = keys.length; j < klen; j++) { +// const key = keys[j]; +// if (obj[key]) { +// if (j > 0) mapKey += '-' + obj[key]; +// else mapKey += obj[key]; +// } +// } +// +// return mapKey; +// } +// +// /** +// * +// * @param array +// * @param keys +// * @return {{}} +// */ +// function arrayToLookupMap(array, keys) { +// const map = {}; +// +// for (let i = 0, len = array.length; i < len; i++) { +// const item = array[i]; +// const mapKey = objectToMapKey(item, keys); +// map[mapKey] = Object.assign({}, item); +// } +// +// return map; +// } +// +// // ----------------- +// // actual code +// // ----------------- +// +// const lookupFields = ['Ticket', 'Mid']; +// const lookupMap = arrayToLookupMap(loadedData, lookupFields); +// +// for (let i = 0, len = newData.length; i < len; i++) { +// const newObj = newData[i]; +// const lookupKey = objectToMapKey(newObj, lookupFields); +// const exists = lookupMap[lookupKey]; +// +// if (exists) { +// // exists in loaded and loaded data is: console.log(exists); +// console.log('Item ' + lookupKey + ' exists!'); +// // TODO ignore as exists? +// } else { +// // doesn't exist in loaded data +// console.log('Item ' + lookupKey + ' does NOT exist!'); +// // TODO do something as doesn't exist? +// } +// } + +// // top of file - in your imports +// const vm = require('vm'); // part of node api - don't npm install it +// // also top of your file +// const start = "$(document).find('#flot-chart'),"; // where the js code to extract starts after +// const end = '$.plot('; // where the js code to extract end +// +// // your actual code: + +// const html = "
\n
\n
\n
\n