2017-03-02 13:10:10 +00:00
/ * *
* @ providesModule Firebase
* @ flow
* /
2017-03-22 20:45:53 +00:00
import { NativeModules } from 'react-native' ;
2017-03-02 13:10:10 +00:00
import Log from './utils/log' ;
2017-03-10 18:12:46 +00:00
import { isObject } from './utils' ;
2017-03-02 13:10:10 +00:00
// modules
2017-03-27 18:11:26 +00:00
import Auth , { statics as AuthStatics } from './modules/auth' ;
2017-03-22 20:15:02 +00:00
import Storage , { statics as StorageStatics } from './modules/storage' ;
import Database , { statics as DatabaseStatics } from './modules/database' ;
2017-03-30 15:25:27 +00:00
import Messaging , { statics as MessagingStatics } from './modules/messaging' ;
2017-03-02 13:10:10 +00:00
import Analytics from './modules/analytics' ;
2017-03-10 14:17:37 +00:00
import Crash from './modules/crash' ;
2017-03-02 13:10:10 +00:00
2017-04-04 16:58:20 +00:00
const instances : Object = { default : null } ;
2017-03-02 13:10:10 +00:00
const FirebaseModule = NativeModules . RNFirebase ;
/ * *
* @ class Firebase
* /
2017-03-10 18:12:46 +00:00
export default class Firebase {
2017-03-22 20:15:02 +00:00
_log : ? Object ;
_auth : ? Object ;
_store : ? Object ;
_storage : ? Object ;
_database : ? Object ;
_presence : ? Object ;
_analytics : ? Object ;
_constants : ? Object ;
_messaging : ? Object ;
_remoteConfig : ? Object ;
_crash : ? Object ;
2017-03-02 13:10:10 +00:00
2017-04-04 16:58:20 +00:00
auth : Function ;
storage : Function ;
database : Function ;
messaging : Function ;
eventHandlers : Object ;
debug : boolean ;
options : {
errorOnMissingPlayServices : boolean ,
debug ? : boolean ,
persistence ? : boolean
} ;
2017-03-02 13:10:10 +00:00
/ * *
*
* @ param options
* /
constructor ( options : Object = { } ) {
2017-03-10 18:12:46 +00:00
this . eventHandlers = { } ;
this . debug = options . debug || false ;
2017-04-10 08:50:42 +00:00
this . options = Object . assign ( { errorOnMissingPlayServices : true , promptOnMissingPlayServices : true } , options ) ;
2017-03-02 13:10:10 +00:00
2017-03-10 18:12:46 +00:00
if ( this . debug ) {
2017-03-15 11:20:12 +00:00
Log . enable ( this . debug ) ;
2017-03-10 18:12:46 +00:00
}
2017-03-02 13:10:10 +00:00
2017-03-10 18:12:46 +00:00
this . _log = new Log ( 'firebase' ) ;
2017-03-02 13:10:10 +00:00
2017-04-10 08:50:42 +00:00
if ( ! this . googleApiAvailability . isAvailable ) {
if ( this . options . promptOnMissingPlayServices && this . googleApiAvailability . isUserResolvableError ) {
FirebaseModule . promptPlayServices ( ) ;
} else {
const error = ` Google Play Services is required to run this application but no valid installation was found (Code ${ this . googleApiAvailability . status } ). ` ;
if ( this . options . errorOnMissingPlayServices ) {
throw new Error ( error ) ;
} else {
console . warn ( error ) ;
}
}
2017-03-02 13:10:10 +00:00
}
2017-03-22 20:15:02 +00:00
2017-03-30 15:25:27 +00:00
this . auth = this . _staticsOrInstance ( 'auth' , AuthStatics , Auth ) ;
2017-03-22 20:15:02 +00:00
this . storage = this . _staticsOrInstance ( 'storage' , StorageStatics , Storage ) ;
this . database = this . _staticsOrInstance ( 'database' , DatabaseStatics , Database ) ;
2017-03-30 15:25:27 +00:00
this . messaging = this . _staticsOrInstance ( 'messaging' , MessagingStatics , Messaging ) ;
2017-03-27 18:11:26 +00:00
2017-03-30 15:25:27 +00:00
// init auth to start listeners
2017-03-27 18:11:26 +00:00
this . auth ( ) ;
2017-03-02 13:10:10 +00:00
}
/ * *
* Support web version of initApp .
* @ param options
* @ param name
* @ returns { * }
* /
static initializeApp ( options : Object = { } , name : string = 'default' ) {
2017-03-10 18:12:46 +00:00
if ( ! isObject ( options ) ) {
throw new Error ( 'Firebase.initializeApp(options <- requires a configuration object' ) ;
}
2017-03-02 13:10:10 +00:00
2017-03-10 18:12:46 +00:00
if ( typeof name !== 'string' ) {
throw new Error ( 'Firebase.initializeApp(options, name <- requires a string value' ) ;
}
2017-03-02 13:10:10 +00:00
2017-03-10 18:12:46 +00:00
if ( name !== 'default' ) {
throw new Error ( 'RNFirebase currently only supports one instance of firebase - the default one.' ) ;
2017-03-02 13:10:10 +00:00
}
2017-03-10 18:12:46 +00:00
if ( ! instances [ name ] ) instances [ name ] = new Firebase ( options ) ;
return instances [ name ] ;
2017-03-02 13:10:10 +00:00
}
analytics ( ) {
if ( ! this . _analytics ) {
this . _analytics = new Analytics ( this ) ;
}
return this . _analytics ;
}
2017-03-10 14:17:37 +00:00
crash ( ) {
if ( ! this . _crash ) {
this . _crash = new Crash ( this ) ;
}
return this . _crash ;
}
2017-03-02 13:10:10 +00:00
get apps ( ) : Array < string > {
return Object . keys ( instances ) ;
}
/ * *
* Returns androids GoogleApiAvailability status and message if available .
* @ returns { GoogleApiAvailabilityType | { isAvailable : boolean , status : number } }
* /
get googleApiAvailability ( ) : GoogleApiAvailabilityType {
// if not available then return a fake object for ios - saves doing platform specific logic.
return FirebaseModule . googleApiAvailability || { isAvailable : true , status : 0 } ;
}
/ * *
* Logger
* /
get log ( ) : Log {
return this . _log ;
}
/ * *
2017-03-22 20:45:53 +00:00
*
* @ param name
* @ param statics
* @ param InstanceClass
* @ returns { function ( ) }
* @ private
* /
2017-04-04 16:58:20 +00:00
_staticsOrInstance ( name , statics , InstanceClass ) : Function {
2017-03-22 20:45:53 +00:00
const getInstance = ( ) => {
const internalPropName = ` _ ${ name } ` ;
2017-03-02 13:10:10 +00:00
2017-04-04 16:58:20 +00:00
// $FlowFixMe
2017-03-22 20:45:53 +00:00
if ( ! this [ internalPropName ] ) {
2017-04-04 16:58:20 +00:00
// $FlowFixMe
2017-03-22 20:45:53 +00:00
this [ internalPropName ] = new InstanceClass ( this ) ;
}
2017-03-02 13:10:10 +00:00
2017-04-04 16:58:20 +00:00
// $FlowFixMe
2017-03-22 20:45:53 +00:00
return this [ internalPropName ] ;
} ;
2017-03-02 13:10:10 +00:00
2017-03-22 20:45:53 +00:00
Object . assign ( getInstance , statics || { } ) ;
return getInstance ;
2017-03-02 13:10:10 +00:00
}
}