Merge branch 'master' of https://github.com/invertase/react-native-firebase into v3
# Conflicts: # ios/RNFirebase/admob/RNFirebaseAdMob.m # ios/RNFirebase/database/RNFirebaseDatabase.h # ios/RNFirebase/database/RNFirebaseDatabaseReference.m # lib/modules/admob/index.js # tests/ios/Podfile.lock
This commit is contained in:
parent
ac258681bc
commit
0675aa076d
|
@ -6,6 +6,7 @@ import android.support.annotation.NonNull;
|
|||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
@ -25,11 +26,14 @@ import com.google.android.gms.tasks.OnSuccessListener;
|
|||
import com.google.android.gms.tasks.Task;
|
||||
|
||||
import com.google.firebase.FirebaseApp;
|
||||
import com.google.firebase.FirebaseException;
|
||||
import com.google.firebase.auth.ActionCodeResult;
|
||||
import com.google.firebase.auth.AuthCredential;
|
||||
import com.google.firebase.auth.AuthResult;
|
||||
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException;
|
||||
import com.google.firebase.auth.GithubAuthProvider;
|
||||
import com.google.firebase.auth.PhoneAuthCredential;
|
||||
import com.google.firebase.auth.PhoneAuthProvider;
|
||||
import com.google.firebase.auth.ProviderQueryResult;
|
||||
import com.google.firebase.auth.TwitterAuthProvider;
|
||||
import com.google.firebase.auth.UserInfo;
|
||||
|
@ -47,6 +51,7 @@ import io.invertase.firebase.Utils;
|
|||
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
|
||||
class RNFirebaseAuth extends ReactContextBaseJavaModule {
|
||||
private static final String TAG = "RNFirebaseAuth";
|
||||
private String mVerificationId;
|
||||
private ReactContext mReactContext;
|
||||
private HashMap<String, FirebaseAuth.AuthStateListener> mAuthListeners = new HashMap<>();
|
||||
|
||||
|
@ -560,6 +565,92 @@ class RNFirebaseAuth extends ReactContextBaseJavaModule {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* signInWithPhoneNumber
|
||||
*
|
||||
* @param phoneNumber
|
||||
* @param promise
|
||||
*/
|
||||
@ReactMethod
|
||||
public void signInWithPhoneNumber(String appName, final String phoneNumber, final Promise promise) {
|
||||
Log.d(TAG, "signInWithPhoneNumber");
|
||||
FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
|
||||
final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
|
||||
|
||||
// Reset the verification Id
|
||||
mVerificationId = null;
|
||||
|
||||
PhoneAuthProvider.getInstance(firebaseAuth).verifyPhoneNumber(phoneNumber, 60, TimeUnit.SECONDS,
|
||||
getCurrentActivity(), new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
|
||||
@Override
|
||||
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
|
||||
// User has been automatically verified, log them in
|
||||
firebaseAuth.signInWithCredential(phoneAuthCredential)
|
||||
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
|
||||
@Override
|
||||
public void onSuccess(AuthResult authResult) {
|
||||
// onAuthStateChanged will pick up the user change
|
||||
Log.d(TAG, "signInWithPhoneNumber:autoVerified:success");
|
||||
}
|
||||
})
|
||||
.addOnFailureListener(new OnFailureListener() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Exception exception) {
|
||||
Log.e(TAG, "signInWithPhoneNumber:autoVerified:failure", exception);
|
||||
// TODO: Will this ever error? How do we get it back to the JS side?
|
||||
// promiseRejectAuthException(promise, exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVerificationFailed(FirebaseException e) {
|
||||
// TODO: Will this ever get sent after we've received an onCodeSent?
|
||||
// If so, then this will cause an exception as the promise has already been used
|
||||
promiseRejectAuthException(promise, e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
|
||||
// TODO: This isn't being saved anywhere if the activity gets restarted when going to the SMS app
|
||||
mVerificationId = verificationId;
|
||||
WritableMap verificationMap = Arguments.createMap();
|
||||
verificationMap.putString("verificationId", verificationId);
|
||||
|
||||
promise.resolve(verificationMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCodeAutoRetrievalTimeOut (String verificationId) {
|
||||
super.onCodeAutoRetrievalTimeOut(verificationId);
|
||||
// Purposefully not doing anything with this at the moment
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void _confirmVerificationCode(String appName, final String verificationCode, final Promise promise) {
|
||||
FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
|
||||
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance(firebaseApp);
|
||||
|
||||
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(mVerificationId, verificationCode);
|
||||
|
||||
firebaseAuth.signInWithCredential(credential)
|
||||
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
|
||||
@Override
|
||||
public void onComplete(@NonNull Task<AuthResult> task) {
|
||||
if (task.isSuccessful()) {
|
||||
Log.d(TAG, "signInWithCredential:onComplete:success");
|
||||
promiseWithUser(task.getResult().getUser(), promise);
|
||||
} else {
|
||||
Exception exception = task.getException();
|
||||
Log.e(TAG, "signInWithCredential:onComplete:failure", exception);
|
||||
promiseRejectAuthException(promise, exception);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* confirmPasswordReset
|
||||
*
|
||||
|
@ -1026,6 +1117,13 @@ class RNFirebaseAuth extends ReactContextBaseJavaModule {
|
|||
userInfoMap.putNull("photoURL");
|
||||
}
|
||||
|
||||
final String phoneNumber = userInfo.getPhoneNumber();
|
||||
if (phoneNumber != null) {
|
||||
userInfoMap.putString("phoneNumber", phoneNumber);
|
||||
} else {
|
||||
userInfoMap.putNull("phoneNumber");
|
||||
}
|
||||
|
||||
userInfoMap.putString("email", userInfo.getEmail());
|
||||
|
||||
output.pushMap(userInfoMap);
|
||||
|
@ -1044,12 +1142,13 @@ class RNFirebaseAuth extends ReactContextBaseJavaModule {
|
|||
private WritableMap firebaseUserToMap(FirebaseUser user) {
|
||||
WritableMap userMap = Arguments.createMap();
|
||||
|
||||
final String email = user.getEmail();
|
||||
final String uid = user.getUid();
|
||||
final String provider = user.getProviderId();
|
||||
final String name = user.getDisplayName();
|
||||
final Boolean verified = user.isEmailVerified();
|
||||
final String email = user.getEmail();
|
||||
final Uri photoUrl = user.getPhotoUrl();
|
||||
final String name = user.getDisplayName();
|
||||
final String provider = user.getProviderId();
|
||||
final Boolean verified = user.isEmailVerified();
|
||||
final String phoneNumber = user.getPhoneNumber();
|
||||
|
||||
userMap.putString("uid", uid);
|
||||
userMap.putString("providerId", provider);
|
||||
|
@ -1074,6 +1173,12 @@ class RNFirebaseAuth extends ReactContextBaseJavaModule {
|
|||
userMap.putNull("photoURL");
|
||||
}
|
||||
|
||||
if (phoneNumber != null) {
|
||||
userMap.putString("phoneNumber", phoneNumber);
|
||||
} else {
|
||||
userMap.putNull("phoneNumber");
|
||||
}
|
||||
|
||||
userMap.putArray("providerData", convertProviderData(user.getProviderData()));
|
||||
|
||||
return userMap;
|
||||
|
|
|
@ -604,6 +604,51 @@ RCT_EXPORT_METHOD(signInWithCustomToken:
|
|||
}];
|
||||
}
|
||||
|
||||
/**
|
||||
signInWithPhoneNumber
|
||||
|
||||
@param string phoneNumber
|
||||
@param RCTPromiseResolveBlock resolve
|
||||
@param RCTPromiseRejectBlock reject
|
||||
@return
|
||||
*/
|
||||
RCT_EXPORT_METHOD(signInWithPhoneNumber:(NSString *) appName
|
||||
phoneNumber:(NSString *) phoneNumber
|
||||
resolver:(RCTPromiseResolveBlock) resolve
|
||||
rejecter:(RCTPromiseRejectBlock) reject) {
|
||||
FIRApp *firApp = [FIRApp appNamed:appName];
|
||||
|
||||
[[FIRPhoneAuthProvider providerWithAuth:[FIRAuth authWithApp:firApp]] verifyPhoneNumber:phoneNumber completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
|
||||
if (error) {
|
||||
[self promiseRejectAuthException:reject error:error];
|
||||
} else {
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject:verificationID forKey:@"authVerificationID"];
|
||||
resolve(@{
|
||||
@"verificationId": verificationID
|
||||
});
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(_confirmVerificationCode:(NSString *) appName
|
||||
verificationCode:(NSString *) verificationCode
|
||||
resolver:(RCTPromiseResolveBlock) resolve
|
||||
rejecter:(RCTPromiseRejectBlock) reject) {
|
||||
FIRApp *firApp = [FIRApp appNamed:appName];
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString *verificationId = [defaults stringForKey:@"authVerificationID"];
|
||||
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationId verificationCode:verificationCode];
|
||||
|
||||
[[FIRAuth authWithApp:firApp] signInWithCredential:credential completion:^(FIRUser *user, NSError *error) {
|
||||
if (error) {
|
||||
[self promiseRejectAuthException:reject error:error];
|
||||
} else {
|
||||
[self promiseWithUser:resolve rejecter:reject user:user];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
/**
|
||||
link - *insert zelda joke here*
|
||||
|
||||
|
@ -999,6 +1044,10 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail:
|
|||
[pData setValue:userInfo.email forKey:@"email"];
|
||||
}
|
||||
|
||||
if (userInfo.phoneNumber != nil) {
|
||||
[pData setValue:userInfo.phoneNumber forKey:@"phoneNumber"];
|
||||
}
|
||||
|
||||
[output addObject:pData];
|
||||
}
|
||||
|
||||
|
@ -1012,7 +1061,7 @@ RCT_EXPORT_METHOD(fetchProvidersForEmail:
|
|||
@return NSDictionary
|
||||
*/
|
||||
- (NSMutableDictionary *)firebaseUserToDict:(FIRUser *)user {
|
||||
NSMutableDictionary *userDict = [@{@"uid": user.uid, @"email": user.email ? user.email : [NSNull null], @"emailVerified": @(user.emailVerified), @"isAnonymous": @(user.anonymous), @"displayName": user.displayName ? user.displayName : [NSNull null], @"refreshToken": user.refreshToken, @"providerId": [user.providerID lowercaseString], @"providerData": [self convertProviderData:user.providerData]} mutableCopy];
|
||||
NSMutableDictionary *userDict = [@{@"uid": user.uid, @"email": user.email ? user.email : [NSNull null], @"emailVerified": @(user.emailVerified), @"isAnonymous": @(user.anonymous), @"displayName": user.displayName ? user.displayName : [NSNull null], @"refreshToken": user.refreshToken, @"providerId": [user.providerID lowercaseString], @"phoneNumber": user.phoneNumber ? user.phoneNumber : [NSNull null], @"providerData": [self convertProviderData:user.providerData]} mutableCopy];
|
||||
|
||||
if ([user valueForKey:@"photoURL"] != nil) {
|
||||
[userDict setValue:[user.photoURL absoluteString] forKey:@"photoURL"];
|
||||
|
|
|
@ -1,20 +1,26 @@
|
|||
#ifndef RNFirebaseDatabase_h
|
||||
#define RNFirebaseDatabase_h
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<FirebaseDatabase/FIRDatabase.h>)
|
||||
|
||||
#import <FirebaseDatabase/FIRDatabase.h>
|
||||
#import <React/RCTBridgeModule.h>
|
||||
#import <React/RCTEventEmitter.h>
|
||||
|
||||
@interface RNFirebaseDatabase : RCTEventEmitter<RCTBridgeModule> {}
|
||||
@interface RNFirebaseDatabase : RCTEventEmitter <RCTBridgeModule> {}
|
||||
@property NSMutableDictionary *dbReferences;
|
||||
@property NSMutableDictionary *transactions;
|
||||
@property dispatch_queue_t transactionQueue;
|
||||
|
||||
+ (void)handlePromise:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock) reject databaseError:(NSError *)databaseError;
|
||||
+ (FIRDatabase *)getDatabaseForApp:(NSString*)appName;
|
||||
+ (NSString *) getMessageWithService:(NSString *) message service:(NSString *) service fullCode:(NSString *) fullCode;
|
||||
+ (NSString *) getCodeWithService:(NSString *) service code:(NSString *) code;
|
||||
+ (void)handlePromise:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject databaseError:(NSError *)databaseError;
|
||||
|
||||
+ (FIRDatabase *)getDatabaseForApp:(NSString *)appName;
|
||||
|
||||
+ (NSString *)getMessageWithService:(NSString *)message service:(NSString *)service fullCode:(NSString *)fullCode;
|
||||
|
||||
+ (NSString *)getCodeWithService:(NSString *)service code:(NSString *)code;
|
||||
|
||||
@end
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if __has_include(<FirebaseDatabase/FIRDatabase.h>)
|
||||
#import <FirebaseDatabase/FIRDatabase.h>
|
||||
#import "RNFirebaseDatabase.h"
|
||||
#import "RNFirebaseEvents.h"
|
||||
#import <React/RCTEventEmitter.h>
|
||||
#import "Firebase.h"
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/**
|
||||
* @url https://firebase.google.com/docs/reference/js/firebase.User
|
||||
*/
|
||||
export default class ConfirmationResult {
|
||||
_auth: Object;
|
||||
_verificationId: string;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param verificationId The phone number authentication operation's verification ID.
|
||||
*/
|
||||
constructor(auth: Object, verificationId: string) {
|
||||
this._auth = auth;
|
||||
this._verificationId = verificationId;
|
||||
}
|
||||
|
||||
confirm(verificationCode: string): Promise<Object> {
|
||||
// verificationId is stored server side in case the app is shut when opening the SMS app
|
||||
return this._auth._native.confirmVerificationCode(verificationCode);
|
||||
}
|
||||
|
||||
get verificationId(): String | null {
|
||||
return _verificationId;
|
||||
}
|
||||
}
|
|
@ -1,13 +1,15 @@
|
|||
// @flow
|
||||
import User from './user';
|
||||
import ModuleBase from './../../utils/ModuleBase';
|
||||
import ConfirmationResult from './ConfirmationResult';
|
||||
|
||||
// providers
|
||||
import EmailAuthProvider from './providers/Email';
|
||||
import PhoneAuthProvider from './providers/Phone';
|
||||
import GoogleAuthProvider from './providers/Google';
|
||||
import FacebookAuthProvider from './providers/Facebook';
|
||||
import TwitterAuthProvider from './providers/Twitter';
|
||||
import GithubAuthProvider from './providers/Github';
|
||||
import TwitterAuthProvider from './providers/Twitter';
|
||||
import FacebookAuthProvider from './providers/Facebook';
|
||||
|
||||
export default class Auth extends ModuleBase {
|
||||
_user: User | null;
|
||||
|
@ -139,6 +141,17 @@ export default class Auth extends ModuleBase {
|
|||
return this._interceptUserValue(this._native.signInWithCredential(credential.provider, credential.token, credential.secret));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param phoneNumber
|
||||
* @return {Promise.<TResult>}
|
||||
*/
|
||||
signInWithPhoneNumber(phoneNumber: string): Promise<Object> {
|
||||
return this._native.signInWithPhoneNumber(phoneNumber).then((result) => {
|
||||
return new ConfirmationResult(this, result.verificationId);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Send reset password instructions via email
|
||||
* @param {string} email The email to send password reset instructions
|
||||
|
@ -211,9 +224,10 @@ export default class Auth extends ModuleBase {
|
|||
}
|
||||
|
||||
export const statics = {
|
||||
GoogleAuthProvider,
|
||||
EmailAuthProvider,
|
||||
FacebookAuthProvider,
|
||||
TwitterAuthProvider,
|
||||
PhoneAuthProvider,
|
||||
GoogleAuthProvider,
|
||||
GithubAuthProvider,
|
||||
TwitterAuthProvider,
|
||||
FacebookAuthProvider,
|
||||
};
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
export default {
|
||||
credential(verificationId, code) {
|
||||
return {
|
||||
token: verificationId,
|
||||
secret: code,
|
||||
provider: 'phone',
|
||||
providerId: 'phone',
|
||||
};
|
||||
},
|
||||
};
|
|
@ -104,7 +104,7 @@ PODS:
|
|||
- React/cxxreact (0.44.3):
|
||||
- React/jschelpers
|
||||
- React/jschelpers (0.44.3)
|
||||
- RNFirebase (2.1.0):
|
||||
- RNFirebase (2.1.2):
|
||||
- React
|
||||
- Yoga (0.44.3.React)
|
||||
|
||||
|
@ -126,11 +126,11 @@ DEPENDENCIES:
|
|||
|
||||
EXTERNAL SOURCES:
|
||||
React:
|
||||
:path: ../node_modules/react-native
|
||||
:path: "../node_modules/react-native"
|
||||
RNFirebase:
|
||||
:path: ./../../
|
||||
:path: "./../../"
|
||||
Yoga:
|
||||
:path: ../node_modules/react-native/ReactCommon/yoga
|
||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Firebase: 1492bf04e1b73a7353b4fb2cf5a20bac9692f341
|
||||
|
@ -151,9 +151,9 @@ SPEC CHECKSUMS:
|
|||
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
|
||||
Protobuf: d582fecf68201eac3d79ed61369ef45734394b9c
|
||||
React: 6361345ebeb769a929e10a06baf0c868d6d03ad5
|
||||
RNFirebase: aef6fb5e509449546aa65cef2efae02d903c5fce
|
||||
RNFirebase: f796cb5ff9c09f72f181f72a8b9fd972fccc9c49
|
||||
Yoga: c90474ca3ec1edba44c97b6c381f03e222a9e287
|
||||
|
||||
PODFILE CHECKSUM: 45666f734ebfc8b3b0f2be0a83bc2680caeb502f
|
||||
|
||||
COCOAPODS: 1.3.1
|
||||
COCOAPODS: 1.2.1
|
||||
|
|
|
@ -1062,7 +1062,7 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
|
||||
|
|
|
@ -3,8 +3,8 @@ import sinon from 'sinon';
|
|||
|
||||
import DatabaseContents from '../../support/DatabaseContents';
|
||||
|
||||
function offTests({ describe, it, xcontext, context, firebase }) {
|
||||
describe('ref().off()', () => {
|
||||
function offTests({ fdescribe, it, xcontext, context, firebase }) {
|
||||
fdescribe('ref().off()', () => {
|
||||
it('doesn\'t unbind children callbacks', async () => {
|
||||
// Setup
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import 'should-sinon';
|
||||
import Promise from 'bluebird';
|
||||
|
||||
export default function onChildAddedTests({ describe, beforeEach, afterEach, it, firebase }) {
|
||||
describe('ref().on(\'child_added\')', () => {
|
||||
describe('the snapshot', () => {
|
||||
export default function onChildAddedTests({ fdescribe, beforeEach, afterEach, it, firebase }) {
|
||||
fdescribe('ref().on(\'child_added\')', () => {
|
||||
fdescribe('the snapshot', () => {
|
||||
let ref;
|
||||
let childRef;
|
||||
let childVal;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'should-sinon';
|
||||
|
||||
function onTests({ describe, it, firebase, context }) {
|
||||
describe('ref().on()', () => {
|
||||
function onTests({ fdescribe, it, firebase, context }) {
|
||||
fdescribe('ref().on()', () => {
|
||||
// Observed Web API Behaviour
|
||||
context('when no eventName is provided', () => {
|
||||
it('then raises an error', () => {
|
||||
|
|
|
@ -4,8 +4,8 @@ import Promise from 'bluebird';
|
|||
|
||||
import DatabaseContents from '../../../support/DatabaseContents';
|
||||
|
||||
function onTests({ describe, context, it, firebase, tryCatch }) {
|
||||
describe('ref().on(\'value\')', () => {
|
||||
function onTests({ fdescribe, context, it, firebase, tryCatch }) {
|
||||
fdescribe('ref().on(\'value\')', () => {
|
||||
// Documented Web API Behaviour
|
||||
it('returns the success callback', () => {
|
||||
// Setup
|
||||
|
|
Loading…
Reference in New Issue