2017-11-17 11:07:52 +00:00
/ * *
* @ flow
* /
2017-08-15 20:29:50 +00:00
import { Platform , NativeModules } from 'react-native' ;
2017-06-29 16:24:34 +00:00
2017-11-17 16:17:27 +00:00
import EventEmitter from './emitter/EventEmitter' ;
import ModuleBase from './ModuleBase' ;
import SyncTree from './SyncTree' ;
2017-08-16 20:43:24 +00:00
2017-11-23 17:29:40 +00:00
import type FirebaseApp from '../modules/core/firebase-app' ;
2017-07-12 14:49:33 +00:00
const DEFAULT _APP _NAME = Platform . OS === 'ios' ? '__FIRAPP_DEFAULT' : '[DEFAULT]' ;
2017-06-29 16:24:34 +00:00
2017-08-18 20:05:47 +00:00
const NAMESPACE _PODS = {
admob : 'Firebase/AdMob' ,
analytics : 'Firebase/Analytics' ,
auth : 'Firebase/Auth' ,
config : 'Firebase/RemoteConfig' ,
crash : 'Firebase/Crash' ,
database : 'Firebase/Database' ,
links : 'Firebase/DynamicLinks' ,
messaging : 'Firebase/Messaging' ,
perf : 'Firebase/Performance' ,
storage : 'Firebase/Storage' ,
} ;
const GRADLE _DEPS = {
admob : 'ads' ,
} ;
2017-10-07 02:06:29 +00:00
const PLAY _SERVICES _CODES = {
1 : {
code : 'SERVICE_MISSING' ,
message : 'Google Play services is missing on this device.' ,
} ,
2 : {
code : 'SERVICE_VERSION_UPDATE_REQUIRED' ,
message : 'The installed version of Google Play services on this device is out of date.' ,
} ,
3 : {
code : 'SERVICE_DISABLED' ,
message : 'The installed version of Google Play services has been disabled on this device.' ,
} ,
9 : {
code : 'SERVICE_INVALID' ,
message : 'The version of the Google Play services installed on this device is not authentic.' ,
} ,
18 : {
code : 'SERVICE_UPDATING' ,
message : 'Google Play services is currently being updated on this device.' ,
} ,
19 : {
code : 'SERVICE_MISSING_PERMISSION' ,
message : 'Google Play service doesn\'t have one or more required permissions.' ,
} ,
} ;
2017-11-23 17:29:40 +00:00
const APPS : { [ string ] : FirebaseApp } = { } ;
2017-06-29 16:24:34 +00:00
export default {
// default options
OPTIONS : {
logLevel : 'warn' ,
2017-10-07 02:06:29 +00:00
errorOnMissingPlayServices : true ,
promptOnMissingPlayServices : true ,
} ,
FLAGS : {
checkedPlayServices : false ,
2017-06-29 16:24:34 +00:00
} ,
// track all initialized firebase apps
2017-11-23 17:29:40 +00:00
APPS ,
2017-06-29 16:24:34 +00:00
STRINGS : {
2017-08-18 20:05:47 +00:00
WARN _INITIALIZE _DEPRECATION : 'Deprecation: Calling \'initializeApp()\' for apps that are already initialised natively ' +
'is unnecessary, use \'firebase.app()\' instead to access the already initialized default app instance.' ,
/ * *
* @ return { string }
* /
get ERROR _MISSING _CORE ( ) {
if ( Platform . OS === 'ios' ) {
return 'RNFirebase core module was not found natively on iOS, ensure you have ' +
'correctly included the RNFirebase pod in your projects `Podfile` and have run `pod install`.' +
'\r\n\r\n See http://invertase.link/ios for the ios setup guide.' ;
}
return 'RNFirebase core module was not found natively on Android, ensure you have ' +
'correctly added the RNFirebase and Firebase gradle dependencies to your `android/app/build.gradle` file.' +
'\r\n\r\n See http://invertase.link/android for the android setup guide.' ;
} ,
2017-06-29 16:24:34 +00:00
ERROR _INIT _OBJECT : 'Firebase.initializeApp(options <-- requires a valid configuration object.' ,
ERROR _INIT _STRING _NAME : 'Firebase.initializeApp(options, name <-- requires a valid string value.' ,
2017-08-19 04:22:07 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _MISSING _CB ( method : string ) {
2017-08-19 04:22:07 +00:00
return ` Missing required callback for method ${ method } (). ` ;
} ,
2017-08-26 22:41:59 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _MISSING _ARG ( type : string , method : string ) {
2017-08-26 22:41:59 +00:00
return ` Missing required argument of type ' ${ type } ' for method ' ${ method } ()'. ` ;
} ,
2017-09-24 12:18:39 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _MISSING _ARG _NAMED ( name : string , type : string , method : string ) {
2017-09-24 12:18:39 +00:00
return ` Missing required argument ' ${ name } ' of type ' ${ type } ' for method ' ${ method } ()'. ` ;
} ,
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _ARG _INVALID _VALUE ( name : string , expected : string , got : string ) {
2017-09-24 12:18:39 +00:00
return ` Invalid value for argument ' ${ name } ' expected value ' ${ expected } ' but got ' ${ got } '. ` ;
} ,
2017-08-26 22:41:59 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _PROTECTED _PROP ( name : string ) {
2017-08-26 22:41:59 +00:00
return ` Property ' ${ name } ' is protected and can not be overridden by extendApp. ` ;
} ,
2017-06-29 16:24:34 +00:00
/ * *
* @ return { string }
2017-08-18 20:05:47 +00:00
* @ param namespace
* @ param nativeModule
2017-06-29 16:24:34 +00:00
* /
2017-11-17 11:07:52 +00:00
ERROR _MISSING _MODULE ( namespace : string , nativeModule : string ) {
2017-08-18 20:05:47 +00:00
const snippet = ` firebase. ${ namespace } () ` ;
if ( Platform . OS === 'ios' ) {
return ` You attempted to use a firebase module that's not installed natively on your iOS project by calling ${ snippet } . ` +
'\r\n\r\nEnsure you have the required Firebase iOS SDK pod for this module included in your Podfile, in this instance ' +
` confirm you've added "pod ' ${ NAMESPACE _PODS [ namespace ] } '" to your Podfile ` +
'\r\n\r\nSee http://invertase.link/ios for full setup instructions.' ;
}
const fbSDKDep = ` 'com.google.firebase:firebase- ${ GRADLE _DEPS [ namespace ] || namespace } ' ` ;
const rnFirebasePackage = ` 'io.invertase.firebase. ${ namespace } . ${ nativeModule } Package' ` ;
const newInstance = ` 'new ${ nativeModule } Package()' ` ;
return ` You attempted to use a firebase module that's not installed on your Android project by calling ${ snippet } . ` +
` \r \n \r \n Ensure you have: \r \n \r \n 1) Installed the required Firebase Android SDK dependency ${ fbSDKDep } in your 'android/app/build.gradle' ` +
` file. \r \n \r \n 2) Imported the ${ rnFirebasePackage } module in your 'MainApplication.java' file. \r \n \r \n 3) Added the ` +
` ${ newInstance } line inside of the RN 'getPackages()' method list. ` +
'\r\n\r\nSee http://invertase.link/android for full setup instructions.' ;
2017-06-29 16:24:34 +00:00
} ,
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _APP _NOT _INIT ( appName : string ) {
2017-07-17 17:20:27 +00:00
return ` The [ ${ appName } ] firebase app has not been initialized! ` ;
2017-06-29 16:24:34 +00:00
} ,
2017-07-18 05:04:12 +00:00
/ * *
* @ param optName
* @ return { string }
* @ constructor
* /
2017-11-17 11:07:52 +00:00
ERROR _MISSING _OPT ( optName : string ) {
2017-07-18 05:04:12 +00:00
return ` Failed to initialize app. FirebaseOptions missing or invalid ' ${ optName } ' property. ` ;
} ,
2017-06-29 16:24:34 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _NOT _APP ( namespace : string ) {
2017-06-29 16:24:34 +00:00
return ` Invalid FirebaseApp instance passed to firebase. ${ namespace } (app <--). ` ;
} ,
2017-09-23 15:14:35 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _UNSUPPORTED _CLASS _METHOD ( className : string , method : string ) {
2017-10-07 02:06:29 +00:00
return ` ${ className } . ${ method } () is unsupported by the native Firebase SDKs. ` ;
2017-09-23 15:14:35 +00:00
} ,
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _UNSUPPORTED _CLASS _PROPERTY ( className : string , property : string ) {
2017-10-07 02:06:29 +00:00
return ` ${ className } . ${ property } is unsupported by the native Firebase SDKs. ` ;
2017-09-23 15:14:35 +00:00
} ,
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _UNSUPPORTED _MODULE _METHOD ( module : Class < ModuleBase > , method : string ) {
2017-09-23 15:14:35 +00:00
return ` firebase. ${ module . _NAMESPACE } (). ${ method } () is unsupported by the native Firebase SDKs. ` ;
} ,
2017-10-07 02:06:29 +00:00
/ * *
* @ return { string }
* /
2017-11-17 11:07:52 +00:00
ERROR _PLAY _SERVICES ( statusCode : number ) {
2017-10-07 02:06:29 +00:00
const knownError = PLAY _SERVICES _CODES [ statusCode ] ;
let start = 'Google Play Services is required to run firebase services on android but a valid installation was not found on this device.' ;
if ( statusCode === 2 ) {
start = 'Google Play Services is out of date and may cause some firebase services like authentication to hang when used. It is recommended that you update it.' ;
}
// eslint-disable-next-line prefer-template
return ` ${ start } \r \n \r \n ` +
'-------------------------\r\n' +
( knownError ?
2017-11-17 11:07:52 +00:00
` ${ knownError . code } : ${ knownError . message } (code ${ statusCode } ) ` :
` A specific play store availability reason reason was not available (unknown code: ${ statusCode } ) `
2017-10-07 02:06:29 +00:00
) +
'\r\n-------------------------' +
'\r\n\r\n' +
'For more information on how to resolve this issue, configure Play Services checks or for guides on how to validate Play Services on your users devices see the link below:' +
'\r\n\r\nhttp://invertase.link/play-services' ;
} ,
2017-06-29 16:24:34 +00:00
DEFAULT _APP _NAME ,
} ,
SharedEventEmitter : new EventEmitter ( ) ,
2017-08-15 20:29:50 +00:00
SyncTree : NativeModules . RNFirebaseDatabase ? new SyncTree ( NativeModules . RNFirebaseDatabase ) : null ,
2017-06-29 16:24:34 +00:00
// internal utils
2017-11-17 11:07:52 +00:00
deleteApp ( name : String ) : Promise < boolean > {
2017-06-29 16:24:34 +00:00
const app = this . APPS [ name ] ;
2017-11-17 11:07:52 +00:00
if ( ! app ) return Promise . resolve ( true ) ;
2017-06-29 16:24:34 +00:00
// https://firebase.google.com/docs/reference/js/firebase.app.App#delete
return app . delete ( ) . then ( ( ) => {
delete this . APPS [ name ] ;
return true ;
} ) ;
} ,
} ;