diff --git a/android/build.gradle b/android/build.gradle index a06d876..edd8c3b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -20,13 +20,13 @@ android { dependencies { compile 'com.facebook.react:react-native:0.20.+' - compile 'com.google.android.gms:play-services-base:9.8.0' + compile 'com.google.android.gms:play-services-base:9.6.0' - compile 'com.google.firebase:firebase-core:9.8.0' - compile 'com.google.firebase:firebase-auth:9.8.0' - compile 'com.google.firebase:firebase-analytics:9.8.0' - compile 'com.google.firebase:firebase-database:9.8.0' - compile 'com.google.firebase:firebase-storage:9.8.0' - compile 'com.google.firebase:firebase-messaging:9.8.0' + compile 'com.google.firebase:firebase-core:9.6.0' + compile 'com.google.firebase:firebase-auth:9.6.0' + compile 'com.google.firebase:firebase-analytics:9.6.0' + compile 'com.google.firebase:firebase-database:9.6.0' + compile 'com.google.firebase:firebase-storage:9.6.0' + compile 'com.google.firebase:firebase-messaging:9.6.0' } diff --git a/android/src/main/java/io/fullstack/firestack/FirestackAuth.java b/android/src/main/java/io/fullstack/firestack/FirestackAuth.java index e9ec2bf..e52186e 100644 --- a/android/src/main/java/io/fullstack/firestack/FirestackAuth.java +++ b/android/src/main/java/io/fullstack/firestack/FirestackAuth.java @@ -1,3 +1,4 @@ + package io.fullstack.firestack; import android.content.Context; @@ -99,21 +100,30 @@ public void unlistenForAuth(final Callback callback) { } @ReactMethod - public void createUserWithEmail(final String email, final String password, final Callback onComplete) { + public void createUserWithEmail(final String email, final String password, final Callback callback) { mAuth = FirebaseAuth.getInstance(); mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { + try { + if (task.isSuccessful()) { FirestackAuthModule.this.user = task.getResult().getUser(); - userCallback(FirestackAuthModule.this.user, onComplete); - }else{ - userErrorCallback(task, onComplete); + userCallback(FirestackAuthModule.this.user, callback); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -124,14 +134,23 @@ public void signInWithEmail(final String email, final String password, final Cal .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { + try { + if (task.isSuccessful()) { FirestackAuthModule.this.user = task.getResult().getUser(); userCallback(FirestackAuthModule.this.user, callback); - } else { + } else { userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); } - }); + }); } @ReactMethod @@ -155,15 +174,23 @@ public void signInAnonymously(final Callback callback) { public void onComplete(@NonNull Task task) { Log.d(TAG, "signInAnonymously:onComplete:" + task.isSuccessful()); - if (task.isSuccessful()) { + try { + if (task.isSuccessful()) { FirestackAuthModule.this.user = task.getResult().getUser(); anonymousUserCallback(FirestackAuthModule.this.user, callback); - }else{ + } else { userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } - } - }); - + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -175,14 +202,23 @@ public void signInWithCustomToken(final String customToken, final Callback callb @Override public void onComplete(@NonNull Task task) { Log.d(TAG, "signInWithCustomToken:onComplete:" + task.isSuccessful()); - if (task.isSuccessful()) { - FirestackAuthModule.this.user = task.getResult().getUser(); + try { + if (task.isSuccessful()) { + FirestackAuthModule.this.user = task.getResult().getUser(); userCallback(FirestackAuthModule.this.user, callback); - } else { - userErrorCallback(task, callback); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -233,15 +269,24 @@ public void updateUserEmail(final String email, final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Log.d(TAG, "User email address updated"); - FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); - userCallback(u, callback); - } else { - userErrorCallback(task, callback); + try { + if (task.isSuccessful()) { + Log.d(TAG, "User email address updated"); + FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); + userCallback(u, callback); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } else { WritableMap err = Arguments.createMap(); err.putInt("errorCode", NO_CURRENT_USER); @@ -259,16 +304,25 @@ public void updateUserPassword(final String newPassword, final Callback callback .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Log.d(TAG, "User password updated"); + try { + if (task.isSuccessful()) { + Log.d(TAG, "User password updated"); - FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); - userCallback(u, callback); - } else { - userErrorCallback(task, callback); + FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); + userCallback(u, callback); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } else { WritableMap err = Arguments.createMap(); err.putInt("errorCode", NO_CURRENT_USER); @@ -285,6 +339,7 @@ public void sendPasswordResetWithEmail(final String email, final Callback callba .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { + try { if(task.isSuccessful()){ WritableMap resp = Arguments.createMap(); resp.putString("status", "complete"); @@ -292,8 +347,16 @@ public void onComplete(@NonNull Task task) { }else{ callback.invoke(task.getException().toString()); } + } catch (Exception ex) { + userExceptionCallback(ex, callback); + } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -305,17 +368,26 @@ public void deleteUser(final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Log.d(TAG, "User account deleted"); - WritableMap resp = Arguments.createMap(); - resp.putString("status", "complete"); - resp.putString("msg", "User account deleted"); - callback.invoke(null, resp); - } else { - userErrorCallback(task, callback); + try { + if (task.isSuccessful()) { + Log.d(TAG, "User account deleted"); + WritableMap resp = Arguments.createMap(); + resp.putString("status", "complete"); + resp.putString("msg", "User account deleted"); + callback.invoke(null, resp); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } else { WritableMap err = Arguments.createMap(); err.putInt("errorCode", NO_CURRENT_USER); @@ -332,20 +404,29 @@ public void getToken(final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - String token = task.getResult().getToken(); - WritableMap resp = Arguments.createMap(); - resp.putString("status", "complete"); - resp.putString("token", token); - callback.invoke(null, resp); - } else { - WritableMap err = Arguments.createMap(); - err.putInt("errorCode", ERROR_FETCHING_TOKEN); - err.putString("errorMessage", task.getException().getMessage()); - callback.invoke(err); + try { + if (task.isSuccessful()) { + String token = task.getResult().getToken(); + WritableMap resp = Arguments.createMap(); + resp.putString("status", "complete"); + resp.putString("token", token); + callback.invoke(null, resp); + } else { + WritableMap err = Arguments.createMap(); + err.putInt("errorCode", ERROR_FETCHING_TOKEN); + err.putString("errorMessage", task.getException().getMessage()); + callback.invoke(err); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -373,15 +454,24 @@ public void updateUserProfile(ReadableMap props, final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Log.d(TAG, "User profile updated"); - FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); - userCallback(u, callback); - } else { - userErrorCallback(task, callback); + try { + if (task.isSuccessful()) { + Log.d(TAG, "User profile updated"); + FirebaseUser u = FirebaseAuth.getInstance().getCurrentUser(); + userCallback(u, callback); + } else { + userErrorCallback(task, callback); + } + } catch (Exception ex) { + userExceptionCallback(ex, callback); } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -417,14 +507,23 @@ public void googleLogin(String IdToken, final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { + try { if (task.isSuccessful()) { FirestackAuthModule.this.user = task.getResult().getUser(); userCallback(FirestackAuthModule.this.user, callback); }else{ userErrorCallback(task, callback); } + } catch (Exception ex) { + userExceptionCallback(ex, callback); + } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @ReactMethod @@ -436,18 +535,27 @@ public void facebookLogin(String Token, final Callback callback) { .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { + try { if (task.isSuccessful()) { FirestackAuthModule.this.user = task.getResult().getUser(); userCallback(FirestackAuthModule.this.user, callback); }else{ userErrorCallback(task, callback); } + } catch (Exception ex) { + userExceptionCallback(ex, callback); + } } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } // Internal helpers - public void userCallback(FirebaseUser passedUser, final Callback onComplete) { + public void userCallback(FirebaseUser passedUser, final Callback callback) { if (passedUser == null) { mAuth = FirebaseAuth.getInstance(); @@ -469,13 +577,18 @@ public void onComplete(@NonNull Task task) { msgMap.putMap("user", userMap); - onComplete.invoke(null, msgMap); + callback.invoke(null, msgMap); } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } // TODO: Reduce to one method - public void anonymousUserCallback(FirebaseUser passedUser, final Callback onComplete) { + public void anonymousUserCallback(FirebaseUser passedUser, final Callback callback) { if (passedUser == null) { mAuth = FirebaseAuth.getInstance(); @@ -484,7 +597,8 @@ public void anonymousUserCallback(FirebaseUser passedUser, final Callback onComp this.user = passedUser; } - this.user.getToken(true).addOnCompleteListener(new OnCompleteListener() { + this.user.getToken(true) + .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { WritableMap msgMap = Arguments.createMap(); @@ -499,9 +613,14 @@ public void onComplete(@NonNull Task task) { msgMap.putMap("user", userMap); - onComplete.invoke(null, msgMap); + callback.invoke(null, msgMap); } - }); + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception ex) { + userExceptionCallback(ex, callback); + } + }); } @@ -524,6 +643,15 @@ public void userErrorCallback(Task task, final Callback onFail) { onFail.invoke(error); } + public void userExceptionCallback(Exception ex, final Callback onFail) { + WritableMap error = Arguments.createMap(); + error.putInt("errorCode", ex.hashCode()); + error.putString("errorMessage", ex.getMessage()); + error.putString("allErrorMessage", ex.toString()); + + onFail.invoke(error); + } + private WritableMap getUserMap() { WritableMap userMap = Arguments.createMap(); diff --git a/lib/__tests__/firestack.spec.js b/lib/__tests__/firestack.spec.js new file mode 100644 index 0000000..39b1dd5 --- /dev/null +++ b/lib/__tests__/firestack.spec.js @@ -0,0 +1,12 @@ +// import 'React' +import Firestack from '../firestack.js' + +describe('Firestack', () => { + + it('does not blow up on instantiation', () => { + expect(function() { + new Firestack({}); + }).not.toThrow() + }) + +}) \ No newline at end of file diff --git a/lib/firestack.js b/lib/firestack.js index 8bcbbfa..9448a96 100644 --- a/lib/firestack.js +++ b/lib/firestack.js @@ -10,7 +10,7 @@ import Log from './utils/log' // const storage = require('firebase/storage'); // const db = require('firebase/database'); -import {NativeModules, NativeEventEmitter, AsyncStorage} from 'react-native'; +import RN, {NativeModules, NativeEventEmitter} from 'react-native'; // TODO: Break out modules into component pieces // i.e. auth component, storage component, etc. const FirestackModule = NativeModules.Firestack; diff --git a/lib/utils/__tests__/log-test.js b/lib/utils/__tests__/log-test.js index 2d49a0e..abf8842 100644 --- a/lib/utils/__tests__/log-test.js +++ b/lib/utils/__tests__/log-test.js @@ -1,5 +1,3 @@ -jest.unmock('../log'); -jest.unmock('../window-or-global') import Log from '../log'; import root from '../window-or-global'; @@ -15,18 +13,6 @@ describe('Log', () => { expect(log).toBeDefined(); }); - it('can be enabled', () => { - log = new Log('test', true); - expect(log.enabled).toBeTruthy(); - }); - - it('can be disabled', () => { - log = new Log('test', true); - expect(log.enabled).toBeTruthy(); - log.enable(false); - expect(log.enabled).toBeFalsy(); - }); - describe('levels', () => { beforeEach(() => { log = new Log('test', true); diff --git a/lib/utils/__tests__/promisify-test.js b/lib/utils/__tests__/promisify-test.js index b159c66..f9f3cc6 100644 --- a/lib/utils/__tests__/promisify-test.js +++ b/lib/utils/__tests__/promisify-test.js @@ -1,5 +1,3 @@ -jest.unmock('../promisify'); - import promisify from '../promisify'; import sinon from 'sinon' diff --git a/lib/utils/__tests__/singleton-test.js b/lib/utils/__tests__/singleton-test.js index fb7a35c..4209f5d 100644 --- a/lib/utils/__tests__/singleton-test.js +++ b/lib/utils/__tests__/singleton-test.js @@ -1,5 +1,3 @@ -jest.unmock('../singleton'); - import Singleton from '../singleton'; import sinon from 'sinon' diff --git a/package.json b/package.json index e611094..735c0b0 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,18 @@ "url": "https://github.com/fullstackreact/react-native-firestack.git" }, "jest": { - "preset": "jest-react-native", - "setupFiles": [], - "unmockedModulePathPatterns": [ - "./node_modules/react", - "./node_modules/react-native", - "./node_modules/react-native-mock", - "./node_modules/react-addons-test-utils" + "globals": { + "__DEV__": true + }, + "verbose": false, + "setupFiles": [ + "test/test-helper.js" + ], + "modulePaths": [ + "/node_modules/react-native" + ], + "modulePathIgnorePatterns": [ + "/node_modules/react" ] }, "license": "ISC", @@ -51,18 +56,19 @@ } }, "devDependencies": { - "babel-jest": "^14.1.0", + "babel-jest": "^16.0.0", "babel-preset-react-native": "^1.9.0", - "debug": "^2.2.0", - "enzyme": "^2.4.1", - "jest": "^14.1.0", - "jest-react-native": "^14.1.3", - "mocha": "^3.0.2", - "react": "^15.3.0", - "react-dom": "^15.3.0", - "react-native-mock": "^0.2.6", - "react-test-renderer": "^15.3.0", - "should": "^11.1.0", + "debug": "^2.3.0", + "enzyme": "^2.5.1", + "jest": "^16.0.2", + "jest-react-native": "^16.1.0", + "mocha": "^3.1.2", + "react": "^15.3.2", + "react-dom": "^15.3.2", + "react-native": "^0.36.1", + "react-native-mock": "^0.2.7", + "react-test-renderer": "^15.3.2", + "should": "^11.1.1", "sinon": "^2.0.0-pre.2" }, "dependencies": { diff --git a/test/firestack.test.js b/test/firestack.test.js deleted file mode 100644 index 0388a1a..0000000 --- a/test/firestack.test.js +++ /dev/null @@ -1,19 +0,0 @@ -const should = require('should'); -const { shallow } = require('enzyme'); -const Firestack = require('..'); -const React = require('react'); - -describe('Firestack', () => { - - let firestackInstance; - - before(() => { - firestackInstance = new Firestack({ - - }); - }); - - it('can be configured', () => { - true.should.be.false; - }); -}); \ No newline at end of file diff --git a/test/test-helper.js b/test/test-helper.js index 32d3926..ee8439b 100644 --- a/test/test-helper.js +++ b/test/test-helper.js @@ -1,7 +1,7 @@ -require('react-native-mock/mock'); +// require('react-native-mock'); -var { NativeEventEmitter, NativeModules } = require('react-native'); +// var { NativeEventEmitter, NativeModules } = require('react-native'); -NativeModules.Firestack = { +// NativeModules.Firestack = { -} \ No newline at end of file +// } \ No newline at end of file