Merge branch 'master' into fcm-rewrite

# Conflicts:
#	lib/modules/messaging/index.js
#	lib/types/index.js
#	tests/ios/Podfile.lock
This commit is contained in:
Chris Bianca 2018-02-14 15:28:15 +00:00
commit 804a8e4c65
52 changed files with 833 additions and 461 deletions

View File

@ -3,7 +3,7 @@
.*/*[.]android.js .*/*[.]android.js
; Ignore "BUCK" generated dirs ; Ignore "BUCK" generated dirs
.*/node_modules/react-native/\.buckd/ <PROJECT_ROOT>/\.buckd/
; Ignore unexpected extra "@providesModule" ; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.* .*/node_modules/.*/node_modules/fbjs/.*
@ -16,22 +16,8 @@
; Ignore polyfills ; Ignore polyfills
.*/Libraries/polyfills/.* .*/Libraries/polyfills/.*
# React Native problems ; Ignore metro
.*/node_modules/metro-bundler/src/DeltaBundler/DeltaCalculator.js.flow .*/node_modules/metro/.*
.*/node_modules/metro-bundler/src/DeltaBundler/DeltaPatcher.js.flow
.*/node_modules/metro-bundler/src/node-haste/AssetResolutionCache.js.flow
.*/node_modules/metro-bundler/src/node-haste/DependencyGraph.js.flow
#.*/node_modules/react-native/Libraries/Animated/src/nodes/AnimatedStyle.js
#.*/node_modules/react-native/Libraries/Components/ScrollView/ScrollViewStickyHeader.js
#.*/node_modules/react-native/Libraries/Experimental/SwipeableRow/SwipeableFlatList.js
#.*/node_modules/react-native/Libraries/Experimental/SwipeableRow/SwipeableListView.js
#.*/node_modules/react-native/Libraries/Image/ImageBackground.js
#.*/node_modules/react-native/Libraries/Lists/FlatList.js
#.*/node_modules/react-native/Libraries/Lists/MetroListView.js
#.*/node_modules/react-native/Libraries/Lists/SectionList.js
#.*/node_modules/react-native/Libraries/Lists/ViewabilityHelper.js
#.*/node_modules/react-native/Libraries/Lists/VirtualizedList.js
#.*/node_modules/react-native/Libraries/Lists/VirtualizedSectionList.js
# Ignore dist folder # Ignore dist folder
.*/dist/.* .*/dist/.*
@ -44,12 +30,13 @@
[libs] [libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow/ node_modules/react-native/flow/
node_modules/react-native/flow-github/
[options] [options]
module.system=haste
emoji=true emoji=true
module.system=haste
munge_underscores=true munge_underscores=true
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
@ -63,10 +50,9 @@ suppress_type=$FlowIssue
suppress_type=$FlowFixMe suppress_type=$FlowFixMe
suppress_type=$FlowFixMeProps suppress_type=$FlowFixMeProps
suppress_type=$FlowFixMeState suppress_type=$FlowFixMeState
suppress_type=$FixMe
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(5[0-6]\\|[1-4][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(<VERSION>\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
suppress_comment=\\(.\\|\n\\)*\\$FlowBug.* suppress_comment=\\(.\\|\n\\)*\\$FlowBug.*

View File

@ -5,7 +5,7 @@ The issue list of this repo is exclusively for bug reports.
1) For feature requests, please use our Canny board: https://react-native-firebase.canny.io/feature-requests 1) For feature requests, please use our Canny board: https://react-native-firebase.canny.io/feature-requests
2) For questions and support please use our Discord chat: https://discord.gg/t6bdqMs or Stack Overflow: https://stackoverflow.com/questions/tagged/react-native-firebase 2) For questions and support please use our Discord chat: https://discord.gg/C9aK28N or Stack Overflow: https://stackoverflow.com/questions/tagged/react-native-firebase
3) If this is a setup issue then please make sure you've correctly followed the setup guides, most setup issues such as 'duplicate dex files', 'default app has not been initialized' etc are all down to an incorrect setup as the guides haven't been correctly followed. 3) If this is a setup issue then please make sure you've correctly followed the setup guides, most setup issues such as 'duplicate dex files', 'default app has not been initialized' etc are all down to an incorrect setup as the guides haven't been correctly followed.
--> -->
@ -14,26 +14,30 @@ The issue list of this repo is exclusively for bug reports.
<!--- Please write your issue here, provide as much detail as you can, code snippets, key files which will help us to debug such as your `Podfile` and/or `app/build.gradle` file). --> <!--- Please write your issue here, provide as much detail as you can, code snippets, key files which will help us to debug such as your `Podfile` and/or `app/build.gradle` file). -->
### Environment ### Environment
<!--- (e.g. iOS, Android, Both) ---> <!--- (e.g. iOS, Android, Both) --->
1. Application Target Platform: 1. Application Target Platform:
<!--- (e.g. macOS Sierra, Windows 10) ---> <!--- (e.g. macOS Sierra, Windows 10) --->
2. Development Operating System: 2. Development Operating System:
<!--- (Xcode or Android Studio version, iOS or Android SDK version - if relevant) ---> <!--- (Xcode or Android Studio version, iOS or Android SDK version - if relevant) --->
3. Build Tools: 3. Build Tools:
<!--- (e.g. 0.45.1) ---> <!--- (e.g. 0.45.1) --->
4. React Native version: 4. React Native version:
<!--- (e.g. 2.1.3) ---> <!--- (e.g. 2.1.3) --->
5. RNFirebase Version: 5. RNFirebase Version:
<!--- (e.g. database, auth, messaging, analytics etc - or N/A if not applicable) ---> <!--- (e.g. database, auth, messaging, analytics etc - or N/A if not applicable) --->
6. Firebase Module: 6. Firebase Module:
<!-- Love react-native-firebase? Please consider supporting our collective: <!-- Love react-native-firebase? Please consider supporting our collective:

View File

@ -5,15 +5,16 @@
First, thank you for considering contributing to react-native-firebase! It's people like you that make the open source community such a great community! 😊 First, thank you for considering contributing to react-native-firebase! It's people like you that make the open source community such a great community! 😊
We welcome any type of contribution, not only code. You can help with We welcome any type of contribution, not only code. You can help with
- **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open)
- **Marketing**: writing blog posts, howto's, printing stickers, ... * **QA**: file bug reports, the more details you can give the better (e.g. screenshots with the console open)
- **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ... * **Marketing**: writing blog posts, howto's, printing stickers, ...
- **Code**: take a look at the [open issues](issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them. * **Community**: presenting the project at meetups, organizing a dedicated meetup for the local community, ...
- **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/react-native-firebase). * **Code**: take a look at the [open issues](issues). Even if you can't write code, commenting on them, showing that you care about a given issue matters. It helps us triage them.
* **Money**: we welcome financial contributions in full transparency on our [open collective](https://opencollective.com/react-native-firebase).
## Your First Contribution ## Your First Contribution
Working on your first Pull Request? You can learn how from this *free* series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github). Working on your first Pull Request? You can learn how from this _free_ series, [How to Contribute to an Open Source Project on GitHub](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github).
## Submitting code ## Submitting code
@ -41,14 +42,12 @@ You can also reach us at oss@invertase.io
Thank you to all the people who have already contributed to react-native-firebase! Thank you to all the people who have already contributed to react-native-firebase!
<a href="graphs/contributors"><img src="https://opencollective.com/react-native-firebase/contributors.svg?width=890" /></a> <a href="graphs/contributors"><img src="https://opencollective.com/react-native-firebase/contributors.svg?width=890" /></a>
### Backers ### Backers
Thank you to all our backers! [[Become a backer](https://opencollective.com/react-native-firebase#backer)] Thank you to all our backers! [[Become a backer](https://opencollective.com/react-native-firebase#backer)]
<a href="https://opencollective.com/react-native-firebase#backers" target="_blank"><img src="https://opencollective.com/react-native-firebase/backers.svg?width=890"></a> <a href="https://opencollective.com/react-native-firebase#backers" target="_blank"><img src="https://opencollective.com/react-native-firebase/backers.svg?width=890"></a>
### Sponsors ### Sponsors
Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/react-native-firebase#sponsor)) Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/react-native-firebase#sponsor))

View File

@ -11,7 +11,7 @@
<a href="/LICENSE"><img src="https://img.shields.io/npm/l/react-native-firebase.svg?style=flat-square" alt="License"></a> <a href="/LICENSE"><img src="https://img.shields.io/npm/l/react-native-firebase.svg?style=flat-square" alt="License"></a>
<a href="#backers"><img src="https://opencollective.com/react-native-firebase/backers/badge.svg" alt="Backers on Open Collective"></a> <a href="#backers"><img src="https://opencollective.com/react-native-firebase/backers/badge.svg" alt="Backers on Open Collective"></a>
<a href="#sponsors"><img src="https://opencollective.com/react-native-firebase/sponsors/badge.svg" alt="Sponsors on Open Collective"></a> <a href="#sponsors"><img src="https://opencollective.com/react-native-firebase/sponsors/badge.svg" alt="Sponsors on Open Collective"></a>
<a href="https://discord.gg/t6bdqMs"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg?style=flat-square" alt="Chat"></a> <a href="https://discord.gg/C9aK28N"><img src="https://img.shields.io/discord/295953187817521152.svg?logo=discord&style=flat-square&colorA=7289da&label=discord" alt="Chat"></a>
<a href="https://twitter.com/rnfirebase"><img src="https://img.shields.io/twitter/follow/rnfirebase.svg?style=social&label=Follow" alt="Follow on Twitter"></a> <a href="https://twitter.com/rnfirebase"><img src="https://img.shields.io/twitter/follow/rnfirebase.svg?style=social&label=Follow" alt="Follow on Twitter"></a>
</p> </p>
@ -30,13 +30,13 @@ All in all, RNFirebase provides much faster performance (~2x) over the web SDK a
--- ---
## Supported Firebase Features ## Supported Firebase Features
> The Web SDK column indicates what modules/functionality from the Web SDK are usable within React Native.
> The Web SDK column indicates what modules/functionality from the Web SDK are usable within React Native.
> '**?**' indicates partial support > '**?**' indicates partial support
| Firebase Features | v1.x.x | v2.x.x | v3.x.x | v3.1.x | v3.2.x | Web SDK | | Firebase Features | v1.x.x | v2.x.x | v3.x.x | v3.1.x | v3.2.x | Web SDK |
| ---------------------- | :---: | :---: | :---: | :---: | :---: | :---: | | -------------------------- | :----: | :----: | :----: | :----: | :----: | :-----: |
| **AdMob** | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | | **AdMob** | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ |
| **Analytics**             | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | | **Analytics**             | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| **App Indexing**           | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | **App Indexing**           | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
@ -58,12 +58,13 @@ All in all, RNFirebase provides much faster performance (~2x) over the web SDK a
| **Storage** | ✅ | ✅ | ✅ | ✅ | ✅ | **?** | | **Storage** | ✅ | ✅ | ✅ | ✅ | ✅ | **?** |
--- ---
### Supported versions - React Native / Firebase ### Supported versions - React Native / Firebase
> The table below shows the supported versions of React Native and the Firebase SDKs for different versions of `react-native-firebase` > The table below shows the supported versions of React Native and the Firebase SDKs for different versions of `react-native-firebase`
| | 1.X.X | 2.0.X | 2.1.X / 2.2.X | 3.0.X | 3.1.X | 3.2.X | | | 1.X.X | 2.0.X | 2.1.X / 2.2.X | 3.0.X | 3.1.X | 3.2.X |
|------------------------|-------------|-------------|-----------------|----------|-------------|----------| | -------------------- | ----------- | ----------- | ------------- | -------- | ----------- | -------- |
| React Native | 0.36 - 0.39 | 0.40 - 0.46 | 0.47 + | 0.48 + | 0.48 - 0.49 | 0.50 + | | React Native | 0.36 - 0.39 | 0.40 - 0.46 | 0.47 + | 0.48 + | 0.48 - 0.49 | 0.50 + |
| Firebase Android SDK | 10.2.0 + | 11.0.0 + | 11.0.0 + | 11.4.2 + | 11.6.0 + | 11.6.2 + | | Firebase Android SDK | 10.2.0 + | 11.0.0 + | 11.0.0 + | 11.4.2 + | 11.6.0 + | 11.6.2 + |
| Firebase iOS SDK | 3.15.0 + | 4.0.0 + | 4.0.0 + | 4.3.0 + | 4.5.0 + | 4.7.0 + | | Firebase iOS SDK | 3.15.0 + | 4.0.0 + | 4.0.0 + | 4.3.0 + | 4.5.0 + | 4.7.0 + |
@ -76,7 +77,7 @@ To check out our latest docs, visit [rnfirebase.io](https://rnfirebase.io)
## Questions ## Questions
For questions and support please use our [Discord chat](https://discord.gg/t6bdqMs) or [Stack Overflow](https://stackoverflow.com/questions/tagged/react-native-firebase). The issue list of this repo is **exclusively** for bug reports. For questions and support please use our [Discord chat](https://discord.gg/C9aK28N) or [Stack Overflow](https://stackoverflow.com/questions/tagged/react-native-firebase). The issue list of this repo is **exclusively** for bug reports.
## Issues ## Issues
@ -96,7 +97,7 @@ Detailed changes for each release are documented in the [releases notes](https:/
RNFirebase is an Apache-2.0 licensed open source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome [sponsors](#sponsors) and [backers](#backers). If you'd like to join them, please consider: RNFirebase is an Apache-2.0 licensed open source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome [sponsors](#sponsors) and [backers](#backers). If you'd like to join them, please consider:
- [Become a backer or sponsor on Open Collective](https://opencollective.com/react-native-firebase). * [Become a backer or sponsor on Open Collective](https://opencollective.com/react-native-firebase).
### Sponsors ### Sponsors
@ -131,4 +132,4 @@ Thank you to all the people who have already contributed to RNFirebase!
## License ## License
- See [LICENSE](/LICENSE) * See [LICENSE](/LICENSE)

View File

@ -3,7 +3,5 @@
"allowJs": true, "allowJs": true,
"allowSyntheticDefaultImports": true "allowSyntheticDefaultImports": true
}, },
"exclude": [ "exclude": ["node_modules"]
"node_modules"
]
} }

491
lib/index.d.ts vendored
View File

@ -5,88 +5,77 @@
declare module "react-native-firebase" { declare module "react-native-firebase" {
type AuthProvider = { /** 3rd party provider Credentials */
PROVIDER_ID: string, type AuthCredential = {
credential: (token: string, secret?: string) => AuthCredential, providerId: string,
token: string,
secret: string
}
type FirebaseModuleAndStatics<M, S = {}> = {
(): M;
nativeModuleExists: boolean;
} & S
// Modules commented-out do not currently have type definitions
export class Firebase {
private constructor();
// admob: FirebaseModuleAndStatics<RNFirebase.admob.AdMob>;
analytics: FirebaseModuleAndStatics<RNFirebase.Analytics>;
auth: FirebaseModuleAndStatics<RNFirebase.auth.Auth, RNFirebase.auth.AuthStatics>;
// config: FirebaseModule<RNFirebase.config.Config>;
crash: FirebaseModuleAndStatics<RNFirebase.crash.Crash>;
database: FirebaseModuleAndStatics<RNFirebase.database.Database, RNFirebase.database.DatabaseStatics>;
fabric: {
crashlytics: FirebaseModuleAndStatics<RNFirebase.crashlytics.Crashlytics>;
}; };
firestore: FirebaseModuleAndStatics<RNFirebase.firestore.Firestore, RNFirebase.firestore.FirestoreStatics>;
links: FirebaseModuleAndStatics<RNFirebase.links.Links>;
messaging: FirebaseModuleAndStatics<RNFirebase.messaging.Messaging>;
// perf: FirebaseModuleAndStatics<RNFirebase.perf.Perf>;
storage: FirebaseModuleAndStatics<RNFirebase.storage.Storage>;
// utils: FirebaseModuleAndStatics<RNFirebase.utils.Utils>;
initializeApp(options: Firebase.Options, name: string): App;
app(name?: string): App;
readonly apps: App[];
readonly SDK_VERSION: string;
}
namespace Firebase {
interface Options {
apiKey: string;
appId: string;
databaseURL: string;
messagingSenderId: string;
projectId: string;
storageBucket: string;
}
}
const firebase: Firebase;
export default firebase;
export default class FireBase { // Modules commented-out do not currently have type definitions
constructor(config?: RNFirebase.configurationOptions) export class App {
private constructor();
log: any; // admob(): RNFirebase.admob.AdMob;
analytics(): RNFirebase.Analytics; analytics(): RNFirebase.Analytics;
auth(): RNFirebase.auth.Auth;
on(type: string, handler: (msg: any) => void): any; // config(): RNFirebase.config.Config;
database: {
(): RNFirebase.database.Database
ServerValue: {
TIMESTAMP: number
}
};
auth: {
(): RNFirebase.auth.Auth
EmailAuthProvider: AuthProvider,
PhoneAuthProvider: AuthProvider,
GoogleAuthProvider: AuthProvider,
GithubAuthProvider: AuthProvider,
TwitterAuthProvider: AuthProvider,
FacebookAuthProvider: AuthProvider,
PhoneAuthState: {
CODE_SENT: string,
AUTO_VERIFY_TIMEOUT: string,
AUTO_VERIFIED: string,
ERROR: string,
},
};
/**RNFirebase mimics the Web Firebase SDK Storage,
* whilst providing some iOS and Android specific functionality.
*/
storage(): RNFirebase.storage.Storage;
/**
* Firebase Cloud Messaging (FCM) allows you to send push messages at no cost to both Android & iOS platforms.
* Assuming the installation instructions have been followed, FCM is ready to go.
* As the Firebase Web SDK has limited messaging functionality,
* the following methods within react-native-firebase have been created to handle FCM in the React Native environment.
*/
messaging(): RNFirebase.messaging.Messaging;
/**
* RNFirebase provides crash reporting for your app out of the box.
* Please note crashes do not appear in real-time on the console,
* they tend to take a number of hours to appear
* If you want to manually report a crash,
* such as a pre-caught exception this is possible by using the report method.
*/
crash(): RNFirebase.crash.Crash; crash(): RNFirebase.crash.Crash;
database(): RNFirebase.database.Database;
/** fabric: {
* Firebase Dynamic Links are links that work the way you want, on multiple crashlytics(): RNFirebase.crashlytics.Crashlytics,
* platforms, and whether or not your app is already installed.
* See the official Firebase docs:
* https://firebase.google.com/docs/dynamic-links/
*/
links(): RNFirebase.links.Links;
static fabric: {
crashlytics(): RNFirebase.crashlytics.Crashlytics;
}; };
firestore(): RNFirebase.firestore.Firestore;
apps: Array<string>; links(): RNFirebase.links.Links;
googleApiAvailability: RNFirebase.GoogleApiAvailabilityType; messaging(): RNFirebase.messaging.Messaging;
// perf(): RNFirebase.perf.Performance;
static initializeApp(options?: any | RNFirebase.configurationOptions, name?: string): FireBase; storage(): RNFirebase.storage.Storage;
// utils(): RNFirebase.utils.Utils;
static app(name?: string): FireBase; readonly name: string;
readonly options: Firebase.Options;
[key: string]: any;
} }
namespace RNFirebase { export namespace RNFirebase {
interface RnError extends Error { interface RnError extends Error {
code?: string; code?: string;
} }
@ -484,6 +473,15 @@ declare module "react-native-firebase" {
update(values: Object, onComplete?: (a: RnError | null) => any): Promise<any>; update(values: Object, onComplete?: (a: RnError | null) => any): Promise<any>;
} }
interface DatabaseStatics {
/** @see https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/ServerValue.html#TIMESTAMP */
ServerValue: {
TIMESTAMP: {
[key: string]: string
}
}
}
} }
/** /**
@ -533,6 +531,18 @@ declare module "react-native-firebase" {
[key: string]: any; [key: string]: any;
} }
type AdditionalUserInfo = {
isNewUser: boolean,
profile?: Object,
providerId: string,
username?: string,
}
type UserCredential = {
additionalUserInfo?: AdditionalUserInfo,
user: User,
}
type UserInfo = { type UserInfo = {
displayName?: string, displayName?: string,
email?: string, email?: string,
@ -547,6 +557,11 @@ declare module "react-native-firebase" {
photoURL?: string, photoURL?: string,
} }
type UserMetadata = {
creationTime?: string,
lastSignInTime?: string,
}
interface User { interface User {
/** /**
* The user's display name (if available). * The user's display name (if available).
@ -565,6 +580,8 @@ declare module "react-native-firebase" {
*/ */
isAnonymous: boolean isAnonymous: boolean
metadata: UserMetadata
phoneNumber: string | null phoneNumber: string | null
/** /**
* - The URL of the user's profile picture (if available). * - The URL of the user's profile picture (if available).
@ -594,13 +611,19 @@ declare module "react-native-firebase" {
* *
* @param forceRefresh: boolean - default to false * @param forceRefresh: boolean - default to false
*/ */
getIdToken(forceRefresh: boolean?): Promise<string> getIdToken(forceRefresh?: boolean): Promise<string>
getToken(forceRefresh?: boolean): Promise<string>
linkAndRetrieveDataWithCredential(credential: AuthCredential): Promise<UserCredential>
/** /**
* Link the user with a 3rd party credential provider. * Link the user with a 3rd party credential provider.
*/ */
linkWithCredential(credential: AuthCredential): Promise<User> linkWithCredential(credential: AuthCredential): Promise<User>
reauthenticateAndRetrieveDataWithCredential(credential: AuthCredential): Promise<UserCredential>
/** /**
* Re-authenticate a user with a third-party authentication provider * Re-authenticate a user with a third-party authentication provider
*/ */
@ -642,13 +665,6 @@ declare module "react-native-firebase" {
updateProfile(updates: UpdateProfile): Promise<void> updateProfile(updates: UpdateProfile): Promise<void>
} }
/** 3rd party provider Credentials */
type AuthCredential {
providerId: string,
token: string,
secret: string
}
type ActionCodeSettings = { type ActionCodeSettings = {
android: { android: {
installApp?: boolean, installApp?: boolean,
@ -663,12 +679,11 @@ declare module "react-native-firebase" {
} }
interface ActionCodeInfo { interface ActionCodeInfo {
email: string, data: {
error: string, email?: string,
fromEmail: string, fromEmail?: string
verifyEmail: string, },
recoverEmail: string, operation: 'PASSWORD_RESET' | 'VERIFY_EMAIL' | 'RECOVER_EMAIL'
passwordReset: string
} }
interface ConfirmationResult { interface ConfirmationResult {
@ -705,13 +720,18 @@ declare module "react-native-firebase" {
} }
namespace auth { namespace auth {
type AuthResult = { type AuthResult = {
authenticated: boolean, authenticated: boolean,
user: object | null user: object | null
} | null; } | null;
type AuthProvider = {
PROVIDER_ID: string,
credential: (token: string, secret?: string) => AuthCredential,
};
interface Auth { interface Auth {
readonly app: App;
/** /**
* Returns the current Firebase authentication state. * Returns the current Firebase authentication state.
*/ */
@ -719,7 +739,7 @@ declare module "react-native-firebase" {
/** /**
* Returns the currently signed-in user (or null). See the User class documentation for further usage. * Returns the currently signed-in user (or null). See the User class documentation for further usage.
*/ */
user: User | null currentUser: User | null
/** /**
* Gets/Sets the language for the app instance * Gets/Sets the language for the app instance
@ -749,12 +769,15 @@ declare module "react-native-firebase" {
signOut(): Promise<void> signOut(): Promise<void>
signInAnonymouslyAndRetrieveData(): Promise<UserCredential>
/** /**
* Sign an anonymous user. * Sign an anonymous user.
* If the user has already signed in, that user will be returned * If the user has already signed in, that user will be returned
*/ */
signInAnonymously(): Promise<User> signInAnonymously(): Promise<User>
createUserAndRetrieveDataWithEmailAndPassword(email: string, password: string): Promise<UserCredential>
/** /**
* We can create a user by calling the createUserWithEmailAndPassword() function. * We can create a user by calling the createUserWithEmailAndPassword() function.
@ -762,12 +785,16 @@ declare module "react-native-firebase" {
*/ */
createUserWithEmailAndPassword(email: string, password: string): Promise<User> createUserWithEmailAndPassword(email: string, password: string): Promise<User>
signInAndRetrieveDataWithEmailAndPassword(email: string, password: string): Promise<UserCredential>
/** /**
* To sign a user in with their email and password, use the signInWithEmailAndPassword() function. * To sign a user in with their email and password, use the signInWithEmailAndPassword() function.
* It accepts two parameters, the user's email and password: * It accepts two parameters, the user's email and password:
*/ */
signInWithEmailAndPassword(email: string, password: string): Promise<User> signInWithEmailAndPassword(email: string, password: string): Promise<User>
signInAndRetrieveDataWithCustomToken(token: string): Promise<UserCredential>
/** /**
* Sign a user in with a self-signed JWT token. * Sign a user in with a self-signed JWT token.
* To sign a user using a self-signed custom token, * To sign a user using a self-signed custom token,
@ -776,6 +803,8 @@ declare module "react-native-firebase" {
*/ */
signInWithCustomToken(token: string): Promise<User> signInWithCustomToken(token: string): Promise<User>
signInAndRetrieveDataWithCredential(credential: AuthCredential): Promise<UserCredential>
/** /**
* Sign in the user with a 3rd party credential provider. * Sign in the user with a 3rd party credential provider.
* credential requires the following properties: * credential requires the following properties:
@ -816,18 +845,31 @@ declare module "react-native-firebase" {
*/ */
checkActionCode(code: string): Promise<ActionCodeInfo> checkActionCode(code: string): Promise<ActionCodeInfo>
/**
* Get the currently signed in user
*/
getCurrentUser(): Promise<User | null>
/** /**
* Returns a list of authentication providers that can be used to sign in a given user (identified by its main email address). * Returns a list of authentication providers that can be used to sign in a given user (identified by its main email address).
*/ */
fetchProvidersForEmail(email: string): Promise<Array<string>> fetchProvidersForEmail(email: string): Promise<Array<string>>
verifyPasswordResetCode(code: string): Promise<string>
[key: string]: any; [key: string]: any;
} }
interface AuthStatics {
EmailAuthProvider: AuthProvider;
PhoneAuthProvider: AuthProvider;
GoogleAuthProvider: AuthProvider;
GithubAuthProvider: AuthProvider;
OAuthProvider: AuthProvider;
TwitterAuthProvider: AuthProvider;
FacebookAuthProvider: AuthProvider;
PhoneAuthState: {
CODE_SENT: string;
AUTO_VERIFY_TIMEOUT: string;
AUTO_VERIFIED: string;
ERROR: string;
};
}
} }
namespace messaging { namespace messaging {
@ -1032,7 +1074,7 @@ declare module "react-native-firebase" {
* Returns an unsubscribe function, call the returned function to * Returns an unsubscribe function, call the returned function to
* unsubscribe from all future events. * unsubscribe from all future events.
*/ */
onLink(listener: (url) => void): () => void; onLink(listener: (url: string) => void): () => void;
} }
/** /**
@ -1067,5 +1109,260 @@ declare module "react-native-firebase" {
}, },
} }
} }
namespace firestore {
interface Firestore {
readonly app: App;
batch(): WriteBatch;
collection(collectionPath: string): CollectionReference;
doc(documentPath: string): DocumentReference;
/** NOT SUPPORTED YET */
// enablePersistence(): Promise<void>;
/** NOT SUPPORTED YET */
// runTransaction(): Promise<any>;
/** NOT SUPPORTED YET */
// settings(): void;
}
interface FirestoreStatics {
FieldPath: typeof FieldPath;
FieldValue: typeof FieldValue;
GeoPoint: typeof GeoPoint;
enableLogging(enabled: boolean): void;
}
interface CollectionReference {
readonly firestore: Firestore;
readonly id: string;
readonly parent: DocumentReference;
add(data: object): Promise<DocumentReference>;
doc(documentPath?: string): DocumentReference;
endAt(snapshot: DocumentSnapshot): Query;
endAt(...varargs: any[]): Query;
endBefore(snapshot: DocumentSnapshot): Query;
endBefore(...varargs: any[]): Query;
get(): Promise<QuerySnapshot>;
limit(limit: number): Query;
onSnapshot(onNext: Query.ObserverOnNext, onError?: Query.ObserverOnError): () => void;
onSnapshot(observer: Query.Observer): () => void;
onSnapshot(queryListenOptions: Query.QueryListenOptions, onNext: Query.ObserverOnNext, onError?: Query.ObserverOnError): () => void;
onSnapshot(queryListenOptions: Query.QueryListenOptions, observer: Query.Observer): () => void;
orderBy(fieldPath: string | FieldPath, directionStr?: Types.QueryDirection): Query;
startAfter(snapshot: DocumentSnapshot): Query;
startAfter(...varargs: any[]): Query;
startAt(snapshot: DocumentSnapshot): Query;
startAt(...varargs: any[]): Query;
where(fieldPath: string, op: Types.QueryOperator, value: any): Query;
}
interface DocumentChange {
readonly doc: DocumentSnapshot;
readonly newIndex: number;
readonly oldIndex: number;
readonly type: string;
}
interface DocumentReference {
readonly firestore: Firestore;
readonly id: string | null;
readonly parent: CollectionReference;
readonly path: string;
collection(collectionPath: string): CollectionReference;
delete(): Promise<void>;
get(): Promise<DocumentSnapshot>;
onSnapshot(onNext: DocumentReference.ObserverOnNext, onError?: DocumentReference.ObserverOnError): () => void;
onSnapshot(observer: DocumentReference.Observer): () => void;
onSnapshot(documentListenOptions: DocumentReference.DocumentListenOptions, onNext: DocumentReference.ObserverOnNext, onError?: DocumentReference.ObserverOnError): () => void;
onSnapshot(documentListenOptions: DocumentReference.DocumentListenOptions, observer: DocumentReference.Observer): () => void;
set(data: object, writeOptions?: Types.WriteOptions): Promise<void>;
update(obj: object): Promise<void>;
update(key1: Types.UpdateKey, val1: any): Promise<void>;
update(key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any): Promise<void>;
update(key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any): Promise<void>;
update(key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any, key4: Types.UpdateKey, val4: any): Promise<void>;
update(key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any, key4: Types.UpdateKey, val4: any, key5: Types.UpdateKey, val5: any): Promise<void>;
}
namespace DocumentReference {
interface DocumentListenOptions {
includeMetadataChanges: boolean;
}
type ObserverOnNext = (documentSnapshot: DocumentSnapshot) => void;
type ObserverOnError = (err: object) => void;
interface Observer {
next: ObserverOnNext;
error?: ObserverOnError;
}
}
interface DocumentSnapshot {
readonly exists: boolean;
readonly id: string | null;
readonly metadata: Types.SnapshotMetadata;
readonly ref: DocumentReference;
data(): object | void;
get(fieldPath: string | FieldPath): any | undefined;
}
class FieldPath {
static documentId(): FieldPath;
constructor(...segments: string[]);
}
class FieldValue {
static delete(): FieldValue;
static serverTimestamp(): FieldValue;
}
class GeoPoint {
constructor(latitude: number, longitude: number);
readonly latitude: number;
readonly longitude: number;
}
class Path {
static fromName(name: string): Path;
constructor(pathComponents: string[]);
readonly id: string | null;
readonly isDocument: boolean;
readonly isCollection: boolean;
readonly relativeName: string;
child(relativePath: string): Path;
parent(): Path | null;
}
interface Query {
readonly firestore: Firestore;
endAt(snapshot: DocumentSnapshot): Query;
endAt(...varargs: any[]): Query;
endBefore(snapshot: DocumentSnapshot): Query;
endBefore(...varargs: any[]): Query;
get(): Promise<QuerySnapshot>;
limit(limit: number): Query;
onSnapshot(onNext: Query.ObserverOnNext, onError?: Query.ObserverOnError): () => void;
onSnapshot(observer: Query.Observer): () => void;
onSnapshot(queryListenOptions: Query.QueryListenOptions, onNext: Query.ObserverOnNext, onError?: Query.ObserverOnError): () => void;
onSnapshot(queryListenOptions: Query.QueryListenOptions, observer: Query.Observer): () => void;
orderBy(fieldPath: string | FieldPath, directionStr?: Types.QueryDirection): Query;
startAfter(snapshot: DocumentSnapshot): Query;
startAfter(...varargs: any[]): Query;
startAt(snapshot: DocumentSnapshot): Query;
startAt(...varargs: any[]): Query;
where(fieldPath: string, op: Types.QueryOperator, value: any): Query;
}
namespace Query {
interface NativeFieldPath {
elements?: string[];
string?: string;
type: 'fieldpath' | 'string';
}
interface FieldFilter {
fieldPath: NativeFieldPath;
operator: string;
value: any;
}
interface FieldOrder {
direction: string;
fieldPath: NativeFieldPath;
}
interface QueryOptions {
endAt?: any[];
endBefore?: any[];
limit?: number;
offset?: number;
selectFields?: string[];
startAfter?: any[];
startAt?: any[];
}
// The JS code expects at least one of 'includeDocumentMetadataChanges'
// or 'includeQueryMetadataChanges' to be defined.
interface _IncludeDocumentMetadataChanges {
includeDocumentMetadataChanges: boolean;
}
interface _IncludeQueryMetadataChanges {
includeQueryMetadataChanges: boolean;
}
type QueryListenOptions = _IncludeDocumentMetadataChanges | _IncludeQueryMetadataChanges | (_IncludeDocumentMetadataChanges & _IncludeQueryMetadataChanges);
type ObserverOnNext = (querySnapshot: QuerySnapshot) => void;
type ObserverOnError = (err: object) => void;
interface Observer {
next: ObserverOnNext;
error?: ObserverOnError;
}
}
interface QuerySnapshot {
readonly docChanges: DocumentChange[];
readonly docs: DocumentSnapshot[];
readonly empty: boolean;
readonly metadata: Types.SnapshotMetadata;
readonly query: Query;
readonly size: number;
forEach(callback: (snapshot: DocumentSnapshot) => any): void;
}
namespace QuerySnapshot {
interface NativeData {
changes: Types.NativeDocumentChange[];
documents: Types.NativeDocumentSnapshot[];
metadata: Types.SnapshotMetadata;
}
}
interface WriteBatch {
commit(): Promise<void>;
delete(docRef: DocumentReference): WriteBatch;
set(docRef: DocumentReference, data: object, options?: Types.WriteOptions): WriteBatch;
// multiple overrides for update() to allow strong-typed var_args
update(docRef: DocumentReference, obj: object): WriteBatch;
update(docRef: DocumentReference, key1: Types.UpdateKey, val1: any): WriteBatch;
update(docRef: DocumentReference, key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any): WriteBatch;
update(docRef: DocumentReference, key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any): WriteBatch;
update(docRef: DocumentReference, key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any, key4: Types.UpdateKey, val4: any): WriteBatch;
update(docRef: DocumentReference, key1: Types.UpdateKey, val1: any, key2: Types.UpdateKey, val2: any, key3: Types.UpdateKey, val3: any, key4: Types.UpdateKey, val4: any, key5: Types.UpdateKey, val5: any): WriteBatch;
}
namespace Types {
interface NativeDocumentChange {
document: NativeDocumentSnapshot;
newIndex: number;
oldIndex: number;
type: string;
}
interface NativeDocumentSnapshot {
data: {
[key: string]: TypeMap;
};
metadata: SnapshotMetadata;
path: string;
}
interface SnapshotMetadata {
fromCache: boolean;
hasPendingWrites: boolean;
}
type QueryDirection = 'asc' | 'ASC' | 'desc' | 'DESC';
type QueryOperator = '=' | '==' | '>' | '>=' | '<' | '<=';
interface TypeMap {
type: 'array' | 'boolean' | 'date' | 'documentid' | 'fieldvalue' | 'geopoint' | 'null' | 'number' | 'object' | 'reference' | 'string';
value: any;
}
/** The key in update() function for DocumentReference and WriteBatch. */
type UpdateKey = string | FieldPath
interface WriteOptions {
merge?: boolean;
}
}
}
} }
} }

View File

@ -3,7 +3,65 @@
*/ */
import firebase from './modules/core/firebase'; import firebase from './modules/core/firebase';
export default firebase;
/*
* Export App types
*/
export type { default as App } from './modules/core/app';
/*
* Export Auth types
*/
export type {
ActionCodeInfo,
ActionCodeSettings,
AdditionalUserInfo,
AuthCredential,
UserCredential,
UserInfo,
UserMetadata,
} from './modules/auth/types';
export type {
default as ConfirmationResult,
} from './modules/auth/ConfirmationResult';
export type { default as User } from './modules/auth/User'; export type { default as User } from './modules/auth/User';
export type { default as Message } from './modules/messaging/Message'; export type { default as Message } from './modules/messaging/Message';
export default firebase; /*
* Export Database types
*/
export type { default as DataSnapshot } from './modules/database/DataSnapshot';
export type { default as OnDisconnect } from './modules/database/OnDisconnect';
export type { default as Reference } from './modules/database/Reference';
export type { default as DataQuery } from './modules/database/Query';
/*
* Export Firestore types
*/
export type {
DocumentListenOptions,
QueryListenOptions,
SetOptions,
SnapshotMetadata,
} from './modules/firestore/types';
export type {
default as CollectionReference,
} from './modules/firestore/CollectionReference';
export type {
default as DocumentChange,
} from './modules/firestore/DocumentChange';
export type {
default as DocumentReference,
} from './modules/firestore/DocumentReference';
export type {
default as DocumentSnapshot,
} from './modules/firestore/DocumentSnapshot';
export type { default as FieldPath } from './modules/firestore/FieldPath';
export type { default as FieldValue } from './modules/firestore/FieldValue';
export type { default as GeoPoint } from './modules/firestore/GeoPoint';
export type { default as Query } from './modules/firestore/Query';
export type {
default as QuerySnapshot,
} from './modules/firestore/QuerySnapshot';
export type { default as WriteBatch } from './modules/firestore/WriteBatch';

View File

@ -1,3 +1,6 @@
/**
* @flow
*/
export default { export default {
onAdLoaded: 'onAdLoaded', onAdLoaded: 'onAdLoaded',
onAdOpened: 'onAdOpened', onAdOpened: 'onAdOpened',

View File

@ -1,18 +1,20 @@
import { NativeModules, Platform } from 'react-native'; import { Platform } from 'react-native';
import { statics } from './'; import { statics } from './';
import AdRequest from './AdRequest'; import AdRequest from './AdRequest';
import { SharedEventEmitter } from '../../utils/events'; import { SharedEventEmitter } from '../../utils/events';
import { getNativeModule } from '../../utils/native';
import { nativeToJSError } from '../../utils'; import { nativeToJSError } from '../../utils';
import type AdMob from './';
const FirebaseAdMob = NativeModules.RNFirebaseAdMob;
let subscriptions = []; let subscriptions = [];
export default class Interstitial { export default class Interstitial {
constructor(admob: Object, adUnit: string) { _admob: AdMob;
constructor(admob: AdMob, adUnit: string) {
// Interstitials on iOS require a new instance each time // Interstitials on iOS require a new instance each time
if (Platform.OS === 'ios') { if (Platform.OS === 'ios') {
FirebaseAdMob.clearInterstitial(adUnit); getNativeModule(admob).clearInterstitial(adUnit);
} }
for (let i = 0, len = subscriptions.length; i < len; i++) { for (let i = 0, len = subscriptions.length; i < len; i++) {
@ -20,7 +22,7 @@ export default class Interstitial {
} }
subscriptions = []; subscriptions = [];
this.admob = admob; this._admob = admob;
this.adUnit = adUnit; this.adUnit = adUnit;
this.loaded = false; this.loaded = false;
SharedEventEmitter.removeAllListeners(`interstitial_${adUnit}`); SharedEventEmitter.removeAllListeners(`interstitial_${adUnit}`);
@ -67,7 +69,10 @@ export default class Interstitial {
adRequest = new AdRequest().addTestDevice().build(); adRequest = new AdRequest().addTestDevice().build();
} }
return FirebaseAdMob.interstitialLoadAd(this.adUnit, adRequest); return getNativeModule(this._admob).interstitialLoadAd(
this.adUnit,
adRequest
);
} }
/** /**
@ -84,7 +89,7 @@ export default class Interstitial {
*/ */
show() { show() {
if (this.loaded) { if (this.loaded) {
FirebaseAdMob.interstitialShowAd(this.adUnit); getNativeModule(this._admob).interstitialShowAd(this.adUnit);
} }
} }

View File

@ -1,21 +1,22 @@
import { NativeModules } from 'react-native';
import { statics } from './'; import { statics } from './';
import AdRequest from './AdRequest'; import AdRequest from './AdRequest';
import { SharedEventEmitter } from '../../utils/events'; import { SharedEventEmitter } from '../../utils/events';
import { getNativeModule } from '../../utils/native';
import { nativeToJSError } from '../../utils'; import { nativeToJSError } from '../../utils';
import type AdMob from './';
const FirebaseAdMob = NativeModules.RNFirebaseAdMob;
let subscriptions = []; let subscriptions = [];
export default class RewardedVideo { export default class RewardedVideo {
constructor(admob: Object, adUnit: string) { _admob: AdMob;
constructor(admob: AdMob, adUnit: string) {
for (let i = 0, len = subscriptions.length; i < len; i++) { for (let i = 0, len = subscriptions.length; i < len; i++) {
subscriptions[i].remove(); subscriptions[i].remove();
} }
subscriptions = []; subscriptions = [];
this.admob = admob; this._admob = admob;
this.adUnit = adUnit; this.adUnit = adUnit;
this.loaded = false; this.loaded = false;
SharedEventEmitter.removeAllListeners(`rewarded_video_${adUnit}`); SharedEventEmitter.removeAllListeners(`rewarded_video_${adUnit}`);
@ -62,7 +63,10 @@ export default class RewardedVideo {
adRequest = new AdRequest().addTestDevice().build(); adRequest = new AdRequest().addTestDevice().build();
} }
return FirebaseAdMob.rewardedVideoLoadAd(this.adUnit, adRequest); return getNativeModule(this._admob).rewardedVideoLoadAd(
this.adUnit,
adRequest
);
} }
/** /**
@ -79,7 +83,7 @@ export default class RewardedVideo {
*/ */
show() { show() {
if (this.loaded) { if (this.loaded) {
FirebaseAdMob.rewardedVideoShowAd(this.adUnit); getNativeModule(this._admob).rewardedVideoShowAd(this.adUnit);
} }
} }

View File

@ -19,7 +19,7 @@ import EventTypes, {
RewardedVideoEventTypes, RewardedVideoEventTypes,
} from './EventTypes'; } from './EventTypes';
import type App from '../core/firebase-app'; import type App from '../core/app';
type NativeEvent = { type NativeEvent = {
adUnit: string, adUnit: string,
@ -29,7 +29,7 @@ type NativeEvent = {
const NATIVE_EVENTS = ['interstitial_event', 'rewarded_video_event']; const NATIVE_EVENTS = ['interstitial_event', 'rewarded_video_event'];
export const MODULE_NAME = 'RNFirebaseAdmob'; export const MODULE_NAME = 'RNFirebaseAdMob';
export const NAMESPACE = 'admob'; export const NAMESPACE = 'admob';
export default class AdMob extends ModuleBase { export default class AdMob extends ModuleBase {
@ -61,7 +61,7 @@ export default class AdMob extends ModuleBase {
const { adUnit } = event; const { adUnit } = event;
const jsEventType = `interstitial_${adUnit}`; const jsEventType = `interstitial_${adUnit}`;
if (!SharedEventEmitter.hasListeners(jsEventType)) { if (SharedEventEmitter.listeners(jsEventType).length === 0) {
// TODO // TODO
} }
@ -72,7 +72,7 @@ export default class AdMob extends ModuleBase {
const { adUnit } = event; const { adUnit } = event;
const jsEventType = `rewarded_video_${adUnit}`; const jsEventType = `rewarded_video_${adUnit}`;
if (!SharedEventEmitter.hasListeners(jsEventType)) { if (SharedEventEmitter.listeners(jsEventType).length === 0) {
// TODO // TODO
} }

View File

@ -5,7 +5,7 @@
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
const AlphaNumericUnderscore = /^[a-zA-Z0-9_]+$/; const AlphaNumericUnderscore = /^[a-zA-Z0-9_]+$/;

View File

@ -11,18 +11,10 @@ import type {
AuthCredential, AuthCredential,
NativeUser, NativeUser,
UserCredential, UserCredential,
UserInfo,
UserMetadata, UserMetadata,
} from './types'; } from './types';
type UserInfo = {
displayName?: string,
email?: string,
phoneNumber?: string,
photoURL?: string,
providerId: string,
uid: string,
};
type UpdateProfile = { type UpdateProfile = {
displayName?: string, displayName?: string,
photoURL?: string, photoURL?: string,

View File

@ -22,26 +22,19 @@ import FacebookAuthProvider from './providers/FacebookAuthProvider';
import PhoneAuthListener from './PhoneAuthListener'; import PhoneAuthListener from './PhoneAuthListener';
import type { import type {
ActionCodeInfo,
ActionCodeSettings, ActionCodeSettings,
AuthCredential, AuthCredential,
NativeUser, NativeUser,
NativeUserCredential, NativeUserCredential,
UserCredential, UserCredential,
} from './types'; } from './types';
import type App from '../core/firebase-app'; import type App from '../core/app';
type AuthState = { type AuthState = {
user?: NativeUser, user?: NativeUser,
}; };
type ActionCodeInfo = {
data: {
email?: string,
fromEmail?: string,
},
operation: 'PASSWORD_RESET' | 'VERIFY_EMAIL' | 'RECOVER_EMAIL',
};
const NATIVE_EVENTS = [ const NATIVE_EVENTS = [
'auth_state_changed', 'auth_state_changed',
'auth_id_token_changed', 'auth_id_token_changed',

View File

@ -3,6 +3,14 @@
*/ */
import type User from './User'; import type User from './User';
export type ActionCodeInfo = {
data: {
email?: string,
fromEmail?: string,
},
operation: 'PASSWORD_RESET' | 'VERIFY_EMAIL' | 'RECOVER_EMAIL',
};
export type ActionCodeSettings = { export type ActionCodeSettings = {
android: { android: {
installApp?: boolean, installApp?: boolean,
@ -16,7 +24,7 @@ export type ActionCodeSettings = {
url: string, url: string,
}; };
type AdditionalUserInfo = { export type AdditionalUserInfo = {
isNewUser: boolean, isNewUser: boolean,
profile?: Object, profile?: Object,
providerId: string, providerId: string,

View File

@ -6,7 +6,7 @@ import { getLogger } from '../../utils/log';
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
type NativeValue = { type NativeValue = {
stringValue?: string, stringValue?: string,

View File

@ -6,7 +6,7 @@ import { NativeModules } from 'react-native';
import APPS from '../../utils/apps'; import APPS from '../../utils/apps';
import INTERNALS from '../../utils/internals'; import INTERNALS from '../../utils/internals';
import App from './firebase-app'; import App from './app';
import VERSION from '../../version'; import VERSION from '../../version';
// module imports // module imports

View File

@ -5,7 +5,7 @@
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
import type { FirebaseError } from '../../types'; import type { FirebaseError } from '../../types';
export const MODULE_NAME = 'RNFirebaseCrash'; export const MODULE_NAME = 'RNFirebaseCrash';

View File

@ -1,15 +1,15 @@
/** /**
* @flow * @flow
* Snapshot representation wrapper * DataSnapshot representation wrapper
*/ */
import { isObject, deepGet, deepExists } from './../../utils'; import { isObject, deepGet, deepExists } from './../../utils';
import type Reference from './reference'; import type Reference from './Reference';
/** /**
* @class DataSnapshot * @class DataSnapshot
* @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot
*/ */
export default class Snapshot { export default class DataSnapshot {
ref: Reference; ref: Reference;
key: string; key: string;
@ -50,10 +50,10 @@ export default class Snapshot {
* @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach * @link https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach
* @returns {Snapshot} * @returns {Snapshot}
*/ */
child(path: string): Snapshot { child(path: string): DataSnapshot {
const value = deepGet(this._value, path); const value = deepGet(this._value, path);
const childRef = this.ref.child(path); const childRef = this.ref.child(path);
return new Snapshot(childRef, { return new DataSnapshot(childRef, {
value, value,
key: childRef.key, key: childRef.key,
exists: value !== null, exists: value !== null,

View File

@ -1,17 +1,17 @@
/** /**
* @flow * @flow
* Disconnect representation wrapper * OnDisconnect representation wrapper
*/ */
import { typeOf } from '../../utils'; import { typeOf } from '../../utils';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type Database from './'; import type Database from './';
import type Reference from './reference'; import type Reference from './Reference';
/** /**
* @url https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect * @url https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect
* @class Disconnect * @class OmDisconnect
*/ */
export default class Disconnect { export default class OnDisconnect {
_database: Database; _database: Database;
ref: Reference; ref: Reference;
path: string; path: string;

View File

@ -5,7 +5,7 @@
import { objectToUniqueId } from '../../utils'; import { objectToUniqueId } from '../../utils';
import type { DatabaseModifier } from '../../types'; import type { DatabaseModifier } from '../../types';
import type Reference from './reference'; import type Reference from './Reference';
// todo doc methods // todo doc methods

View File

@ -2,9 +2,9 @@
* @flow * @flow
* Database Reference representation wrapper * Database Reference representation wrapper
*/ */
import Query from './query'; import Query from './Query';
import Snapshot from './snapshot'; import DataSnapshot from './DataSnapshot';
import Disconnect from './disconnect'; import OnDisconnect from './OnDisconnect';
import { getLogger } from '../../utils/log'; import { getLogger } from '../../utils/log';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import ReferenceBase from '../../utils/ReferenceBase'; import ReferenceBase from '../../utils/ReferenceBase';
@ -218,7 +218,11 @@ export default class Reference extends ReferenceBase {
*/ */
transaction( transaction(
transactionUpdate: Function, transactionUpdate: Function,
onComplete: (error: ?Error, committed: boolean, snapshot: ?Snapshot) => *, onComplete: (
error: ?Error,
committed: boolean,
snapshot: ?DataSnapshot
) => *,
applyLocally: boolean = false applyLocally: boolean = false
) { ) {
if (!isFunction(transactionUpdate)) { if (!isFunction(transactionUpdate)) {
@ -233,14 +237,14 @@ export default class Reference extends ReferenceBase {
if (error) { if (error) {
onComplete(error, committed, null); onComplete(error, committed, null);
} else { } else {
onComplete(null, committed, new Snapshot(this, snapshotData)); onComplete(null, committed, new DataSnapshot(this, snapshotData));
} }
} }
if (error) return reject(error); if (error) return reject(error);
return resolve({ return resolve({
committed, committed,
snapshot: new Snapshot(this, snapshotData), snapshot: new DataSnapshot(this, snapshotData),
}); });
}; };
@ -264,14 +268,14 @@ export default class Reference extends ReferenceBase {
*/ */
once( once(
eventName: string = 'value', eventName: string = 'value',
successCallback: (snapshot: Object) => void, successCallback: (snapshot: DataSnapshot) => void,
cancelOrContext: (error: FirebaseError) => void, cancelOrContext: (error: FirebaseError) => void,
context?: Object context?: Object
) { ) {
return getNativeModule(this._database) return getNativeModule(this._database)
.once(this._getRefKey(), this.path, this._query.getModifiers(), eventName) .once(this._getRefKey(), this.path, this._query.getModifiers(), eventName)
.then(({ snapshot }) => { .then(({ snapshot }) => {
const _snapshot = new Snapshot(this, snapshot); const _snapshot = new DataSnapshot(this, snapshot);
if (isFunction(successCallback)) { if (isFunction(successCallback)) {
if (isObject(cancelOrContext)) if (isObject(cancelOrContext))
@ -470,10 +474,10 @@ export default class Reference extends ReferenceBase {
/** /**
* *
* @returns {Disconnect} * @returns {OnDisconnect}
*/ */
onDisconnect(): Disconnect { onDisconnect(): OnDisconnect {
return new Disconnect(this); return new OnDisconnect(this);
} }
/** /**
@ -691,7 +695,7 @@ export default class Reference extends ReferenceBase {
*/ */
on( on(
eventType: string, eventType: string,
callback: Snapshot => any, callback: DataSnapshot => any,
cancelCallbackOrContext?: Object => any | Object, cancelCallbackOrContext?: Object => any | Object,
context?: Object context?: Object
): Function { ): Function {

View File

@ -4,12 +4,12 @@
*/ */
import { NativeModules } from 'react-native'; import { NativeModules } from 'react-native';
import Reference from './reference'; import Reference from './Reference';
import TransactionHandler from './transaction'; import TransactionHandler from './transaction';
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
const NATIVE_EVENTS = [ const NATIVE_EVENTS = [
'database_transaction_event', 'database_transaction_event',

View File

@ -5,7 +5,7 @@
import ModuleBase from '../../../utils/ModuleBase'; import ModuleBase from '../../../utils/ModuleBase';
import { getNativeModule } from '../../../utils/native'; import { getNativeModule } from '../../../utils/native';
import type App from '../../core/firebase-app'; import type App from '../../core/app';
export const MODULE_NAME = 'RNFirebaseCrashlytics'; export const MODULE_NAME = 'RNFirebaseCrashlytics';
export const NAMESPACE = 'crashlytics'; export const NAMESPACE = 'crashlytics';

View File

@ -8,17 +8,13 @@ import { firestoreAutoId } from '../../utils';
import type Firestore from './'; import type Firestore from './';
import type { import type {
FirestoreQueryDirection, QueryDirection,
FirestoreQueryOperator, QueryListenOptions,
} from '../../types'; QueryOperator,
} from './types';
import type FieldPath from './FieldPath'; import type FieldPath from './FieldPath';
import type Path from './Path'; import type Path from './Path';
import type { import type { Observer, ObserverOnError, ObserverOnNext } from './Query';
Observer,
ObserverOnError,
ObserverOnNext,
QueryListenOptions,
} from './Query';
import type QuerySnapshot from './QuerySnapshot'; import type QuerySnapshot from './QuerySnapshot';
/** /**
@ -95,10 +91,7 @@ export default class CollectionReference {
); );
} }
orderBy( orderBy(fieldPath: string | FieldPath, directionStr?: QueryDirection): Query {
fieldPath: string | FieldPath,
directionStr?: FirestoreQueryDirection
): Query {
return this._query.orderBy(fieldPath, directionStr); return this._query.orderBy(fieldPath, directionStr);
} }
@ -110,7 +103,7 @@ export default class CollectionReference {
return this._query.startAt(snapshotOrVarArgs); return this._query.startAt(snapshotOrVarArgs);
} }
where(fieldPath: string, opStr: FirestoreQueryOperator, value: any): Query { where(fieldPath: string, opStr: QueryOperator, value: any): Query {
return this._query.where(fieldPath, opStr, value); return this._query.where(fieldPath, opStr, value);
} }
} }

View File

@ -5,7 +5,7 @@
import DocumentSnapshot from './DocumentSnapshot'; import DocumentSnapshot from './DocumentSnapshot';
import type Firestore from './'; import type Firestore from './';
import type { FirestoreNativeDocumentChange } from '../../types'; import type { NativeDocumentChange } from './types';
/** /**
* @class DocumentChange * @class DocumentChange
@ -16,7 +16,7 @@ export default class DocumentChange {
_oldIndex: number; _oldIndex: number;
_type: string; _type: string;
constructor(firestore: Firestore, nativeData: FirestoreNativeDocumentChange) { constructor(firestore: Firestore, nativeData: NativeDocumentChange) {
this._document = new DocumentSnapshot(firestore, nativeData.document); this._document = new DocumentSnapshot(firestore, nativeData.document);
this._newIndex = nativeData.newIndex; this._newIndex = nativeData.newIndex;
this._oldIndex = nativeData.oldIndex; this._oldIndex = nativeData.oldIndex;

View File

@ -14,15 +14,12 @@ import { getNativeModule } from '../../utils/native';
import type Firestore from './'; import type Firestore from './';
import type { import type {
FirestoreNativeDocumentSnapshot, DocumentListenOptions,
FirestoreWriteOptions, NativeDocumentSnapshot,
} from '../../types'; SetOptions,
} from './types';
import type Path from './Path'; import type Path from './Path';
type DocumentListenOptions = {
includeMetadataChanges: boolean,
};
type ObserverOnError = Object => void; type ObserverOnError = Object => void;
type ObserverOnNext = DocumentSnapshot => void; type ObserverOnNext = DocumentSnapshot => void;
@ -189,9 +186,7 @@ export default class DocumentReference {
} }
const listenerId = firestoreAutoId(); const listenerId = firestoreAutoId();
const listener = ( const listener = (nativeDocumentSnapshot: NativeDocumentSnapshot) => {
nativeDocumentSnapshot: FirestoreNativeDocumentSnapshot
) => {
const documentSnapshot = new DocumentSnapshot( const documentSnapshot = new DocumentSnapshot(
this.firestore, this.firestore,
nativeDocumentSnapshot nativeDocumentSnapshot
@ -227,12 +222,12 @@ export default class DocumentReference {
return this._offDocumentSnapshot.bind(this, listenerId, listener); return this._offDocumentSnapshot.bind(this, listenerId, listener);
} }
set(data: Object, writeOptions?: FirestoreWriteOptions): Promise<void> { set(data: Object, options?: SetOptions): Promise<void> {
const nativeData = buildNativeMap(data); const nativeData = buildNativeMap(data);
return getNativeModule(this._firestore).documentSet( return getNativeModule(this._firestore).documentSet(
this.path, this.path,
nativeData, nativeData,
writeOptions options
); );
} }

View File

@ -9,10 +9,7 @@ import { isObject } from '../../utils';
import { parseNativeMap } from './utils/serialize'; import { parseNativeMap } from './utils/serialize';
import type Firestore from './'; import type Firestore from './';
import type { import type { NativeDocumentSnapshot, SnapshotMetadata } from './types';
FirestoreNativeDocumentSnapshot,
FirestoreSnapshotMetadata,
} from '../../types';
const extractFieldPathData = (data: Object | void, segments: string[]): any => { const extractFieldPathData = (data: Object | void, segments: string[]): any => {
if (!data || !isObject(data)) { if (!data || !isObject(data)) {
@ -30,13 +27,10 @@ const extractFieldPathData = (data: Object | void, segments: string[]): any => {
*/ */
export default class DocumentSnapshot { export default class DocumentSnapshot {
_data: Object | void; _data: Object | void;
_metadata: FirestoreSnapshotMetadata; _metadata: SnapshotMetadata;
_ref: DocumentReference; _ref: DocumentReference;
constructor( constructor(firestore: Firestore, nativeData: NativeDocumentSnapshot) {
firestore: Firestore,
nativeData: FirestoreNativeDocumentSnapshot
) {
this._data = parseNativeMap(firestore, nativeData.data); this._data = parseNativeMap(firestore, nativeData.data);
this._metadata = nativeData.metadata; this._metadata = nativeData.metadata;
this._ref = new DocumentReference( this._ref = new DocumentReference(
@ -53,7 +47,7 @@ export default class DocumentSnapshot {
return this._ref.id; return this._ref.id;
} }
get metadata(): FirestoreSnapshotMetadata { get metadata(): SnapshotMetadata {
return this._metadata; return this._metadata;
} }

View File

@ -12,20 +12,21 @@ import { firestoreAutoId, isFunction, isObject } from '../../utils';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type Firestore from './'; import type Firestore from './';
import type {
FirestoreQueryDirection,
FirestoreQueryOperator,
} from '../../types';
import type Path from './Path'; import type Path from './Path';
import type {
QueryDirection,
QueryOperator,
QueryListenOptions,
} from './types';
const DIRECTIONS: { [FirestoreQueryDirection]: string } = { const DIRECTIONS: { [QueryDirection]: string } = {
ASC: 'ASCENDING', ASC: 'ASCENDING',
asc: 'ASCENDING', asc: 'ASCENDING',
DESC: 'DESCENDING', DESC: 'DESCENDING',
desc: 'DESCENDING', desc: 'DESCENDING',
}; };
const OPERATORS: { [FirestoreQueryOperator]: string } = { const OPERATORS: { [QueryOperator]: string } = {
'=': 'EQUAL', '=': 'EQUAL',
'==': 'EQUAL', '==': 'EQUAL',
'>': 'GREATER_THAN', '>': 'GREATER_THAN',
@ -58,11 +59,6 @@ type QueryOptions = {
startAt?: any[], startAt?: any[],
}; };
export type QueryListenOptions = {|
includeDocumentMetadataChanges: boolean,
includeQueryMetadataChanges: boolean,
|};
export type ObserverOnError = Object => void; export type ObserverOnError = Object => void;
export type ObserverOnNext = QuerySnapshot => void; export type ObserverOnNext = QuerySnapshot => void;
@ -320,7 +316,7 @@ export default class Query {
orderBy( orderBy(
fieldPath: string | FieldPath, fieldPath: string | FieldPath,
directionStr?: FirestoreQueryDirection = 'asc' directionStr?: QueryDirection = 'asc'
): Query { ): Query {
// TODO: Validation // TODO: Validation
// validate.isFieldPath('fieldPath', fieldPath); // validate.isFieldPath('fieldPath', fieldPath);
@ -379,7 +375,7 @@ export default class Query {
where( where(
fieldPath: string | FieldPath, fieldPath: string | FieldPath,
opStr: FirestoreQueryOperator, opStr: QueryOperator,
value: any value: any
): Query { ): Query {
// TODO: Validation // TODO: Validation

View File

@ -7,16 +7,16 @@ import DocumentSnapshot from './DocumentSnapshot';
import type Firestore from './'; import type Firestore from './';
import type { import type {
FirestoreNativeDocumentChange, NativeDocumentChange,
FirestoreNativeDocumentSnapshot, NativeDocumentSnapshot,
FirestoreSnapshotMetadata, SnapshotMetadata,
} from '../../types'; } from './types';
import type Query from './Query'; import type Query from './Query';
type QuerySnapshotNativeData = { type NativeQuerySnapshot = {
changes: FirestoreNativeDocumentChange[], changes: NativeDocumentChange[],
documents: FirestoreNativeDocumentSnapshot[], documents: NativeDocumentSnapshot[],
metadata: FirestoreSnapshotMetadata, metadata: SnapshotMetadata,
}; };
/** /**
@ -25,13 +25,13 @@ type QuerySnapshotNativeData = {
export default class QuerySnapshot { export default class QuerySnapshot {
_changes: DocumentChange[]; _changes: DocumentChange[];
_docs: DocumentSnapshot[]; _docs: DocumentSnapshot[];
_metadata: FirestoreSnapshotMetadata; _metadata: SnapshotMetadata;
_query: Query; _query: Query;
constructor( constructor(
firestore: Firestore, firestore: Firestore,
query: Query, query: Query,
nativeData: QuerySnapshotNativeData nativeData: NativeQuerySnapshot
) { ) {
this._changes = nativeData.changes.map( this._changes = nativeData.changes.map(
change => new DocumentChange(firestore, change) change => new DocumentChange(firestore, change)
@ -55,7 +55,7 @@ export default class QuerySnapshot {
return this._docs.length === 0; return this._docs.length === 0;
} }
get metadata(): FirestoreSnapshotMetadata { get metadata(): SnapshotMetadata {
return this._metadata; return this._metadata;
} }

View File

@ -10,7 +10,7 @@ import { getNativeModule } from '../../utils/native';
import type DocumentReference from './DocumentReference'; import type DocumentReference from './DocumentReference';
import type Firestore from './'; import type Firestore from './';
import type { FirestoreWriteOptions } from '../../types'; import type { SetOptions } from './types';
type DocumentWrite = { type DocumentWrite = {
data?: Object, data?: Object,
@ -47,19 +47,15 @@ export default class WriteBatch {
return this; return this;
} }
set( set(docRef: DocumentReference, data: Object, options?: SetOptions) {
docRef: DocumentReference,
data: Object,
writeOptions?: FirestoreWriteOptions
) {
// TODO: Validation // TODO: Validation
// validate.isDocumentReference('docRef', docRef); // validate.isDocumentReference('docRef', docRef);
// validate.isDocument('data', data); // validate.isDocument('data', data);
// validate.isOptionalPrecondition('writeOptions', writeOptions); // validate.isOptionalPrecondition('options', writeOptions);
const nativeData = buildNativeMap(data); const nativeData = buildNativeMap(data);
this._writes.push({ this._writes.push({
data: nativeData, data: nativeData,
options: writeOptions, options,
path: docRef.path, path: docRef.path,
type: 'SET', type: 'SET',
}); });

View File

@ -16,7 +16,7 @@ import WriteBatch from './WriteBatch';
import INTERNALS from '../../utils/internals'; import INTERNALS from '../../utils/internals';
import type DocumentSnapshot from './DocumentSnapshot'; import type DocumentSnapshot from './DocumentSnapshot';
import type App from '../core/firebase-app'; import type App from '../core/app';
import type QuerySnapshot from './QuerySnapshot'; import type QuerySnapshot from './QuerySnapshot';
type CollectionSyncEvent = { type CollectionSyncEvent = {

View File

@ -0,0 +1,54 @@
/*
* @flow
*/
export type DocumentListenOptions = {
includeMetadataChanges: boolean,
};
export type QueryDirection = 'DESC' | 'desc' | 'ASC' | 'asc';
export type QueryListenOptions = {|
includeDocumentMetadataChanges: boolean,
includeQueryMetadataChanges: boolean,
|};
export type QueryOperator = '<' | '<=' | '=' | '==' | '>' | '>=';
export type SetOptions = {
merge?: boolean,
};
export type SnapshotMetadata = {
fromCache: boolean,
hasPendingWrites: boolean,
};
export type NativeDocumentChange = {
document: NativeDocumentSnapshot,
newIndex: number,
oldIndex: number,
type: string,
};
export type NativeDocumentSnapshot = {
data: { [string]: NativeTypeMap },
metadata: SnapshotMetadata,
path: string,
};
export type NativeTypeMap = {
type:
| 'array'
| 'boolean'
| 'date'
| 'documentid'
| 'fieldvalue'
| 'geopoint'
| 'null'
| 'number'
| 'object'
| 'reference'
| 'string',
value: any,
};

View File

@ -13,7 +13,7 @@ import Path from '../Path';
import { typeOf } from '../../../utils'; import { typeOf } from '../../../utils';
import type Firestore from '../'; import type Firestore from '../';
import type { FirestoreTypeMap } from '../../../types'; import type { NativeTypeMap } from '../types';
/* /*
* Functions that build up the data needed to represent * Functions that build up the data needed to represent
@ -21,9 +21,7 @@ import type { FirestoreTypeMap } from '../../../types';
* for transmission to the native side * for transmission to the native side
*/ */
export const buildNativeMap = ( export const buildNativeMap = (data: Object): { [string]: NativeTypeMap } => {
data: Object
): { [string]: FirestoreTypeMap } => {
const nativeData = {}; const nativeData = {};
if (data) { if (data) {
Object.keys(data).forEach(key => { Object.keys(data).forEach(key => {
@ -36,7 +34,7 @@ export const buildNativeMap = (
return nativeData; return nativeData;
}; };
export const buildNativeArray = (array: Object[]): FirestoreTypeMap[] => { export const buildNativeArray = (array: Object[]): NativeTypeMap[] => {
const nativeArray = []; const nativeArray = [];
if (array) { if (array) {
array.forEach(value => { array.forEach(value => {
@ -49,7 +47,7 @@ export const buildNativeArray = (array: Object[]): FirestoreTypeMap[] => {
return nativeArray; return nativeArray;
}; };
export const buildTypeMap = (value: any): FirestoreTypeMap | null => { export const buildTypeMap = (value: any): NativeTypeMap | null => {
const type = typeOf(value); const type = typeOf(value);
if (value === null || value === undefined) { if (value === null || value === undefined) {
return { return {
@ -117,7 +115,7 @@ export const buildTypeMap = (value: any): FirestoreTypeMap | null => {
export const parseNativeMap = ( export const parseNativeMap = (
firestore: Firestore, firestore: Firestore,
nativeData: { [string]: FirestoreTypeMap } nativeData: { [string]: NativeTypeMap }
): Object | void => { ): Object | void => {
let data; let data;
if (nativeData) { if (nativeData) {
@ -131,7 +129,7 @@ export const parseNativeMap = (
const parseNativeArray = ( const parseNativeArray = (
firestore: Firestore, firestore: Firestore,
nativeArray: FirestoreTypeMap[] nativeArray: NativeTypeMap[]
): any[] => { ): any[] => {
const array = []; const array = [];
if (nativeArray) { if (nativeArray) {
@ -142,7 +140,7 @@ const parseNativeArray = (
return array; return array;
}; };
const parseTypeMap = (firestore: Firestore, typeMap: FirestoreTypeMap): any => { const parseTypeMap = (firestore: Firestore, typeMap: NativeTypeMap): any => {
const { type, value } = typeMap; const { type, value } = typeMap;
if (type === 'null') { if (type === 'null') {
return null; return null;

View File

@ -7,7 +7,7 @@ import ModuleBase from '../../utils/ModuleBase';
import { areObjectKeysContainedInOther, isObject, isString } from '../../utils'; import { areObjectKeysContainedInOther, isObject, isString } from '../../utils';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
const EVENT_TYPE = { const EVENT_TYPE = {
Link: 'dynamic_link_received', Link: 'dynamic_link_received',

View File

@ -16,7 +16,7 @@ import {
RemoteNotificationResult, RemoteNotificationResult,
} from './types'; } from './types';
import type App from '../core/firebase-app'; import type App from '../core/app';
import type { NativeMessage } from './types'; import type { NativeMessage } from './types';
type OnMessage = Message => any; type OnMessage = Message => any;

View File

@ -6,7 +6,7 @@ import Trace from './Trace';
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
export const MODULE_NAME = 'RNFirebasePerformance'; export const MODULE_NAME = 'RNFirebasePerformance';
export const NAMESPACE = 'perf'; export const NAMESPACE = 'perf';

View File

@ -10,7 +10,7 @@ import { getLogger } from '../../utils/log';
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native'; import { getNativeModule } from '../../utils/native';
import type App from '../core/firebase-app'; import type App from '../core/app';
const FirebaseStorage = NativeModules.RNFirebaseStorage; const FirebaseStorage = NativeModules.RNFirebaseStorage;

View File

@ -3,7 +3,7 @@ import { NativeModules } from 'react-native';
import INTERNALS from '../../utils/internals'; import INTERNALS from '../../utils/internals';
import { isIOS } from '../../utils'; import { isIOS } from '../../utils';
import ModuleBase from '../../utils/ModuleBase'; import ModuleBase from '../../utils/ModuleBase';
import type App from '../core/firebase-app'; import type App from '../core/app';
const FirebaseCoreModule = NativeModules.RNFirebase; const FirebaseCoreModule = NativeModules.RNFirebase;

View File

@ -52,7 +52,7 @@ export type FirebaseModuleConfig = {
}; };
export type FirebaseModuleName = export type FirebaseModuleName =
| 'RNFirebaseAdmob' | 'RNFirebaseAdMob'
| 'RNFirebaseAnalytics' | 'RNFirebaseAnalytics'
| 'RNFirebaseAuth' | 'RNFirebaseAuth'
| 'RNFirebaseRemoteConfig' | 'RNFirebaseRemoteConfig'
@ -170,47 +170,6 @@ export type FirestoreModule = {
nativeModuleExists: boolean, nativeModuleExists: boolean,
} & FirestoreStatics; } & FirestoreStatics;
export type FirestoreNativeDocumentChange = {
document: FirestoreNativeDocumentSnapshot,
newIndex: number,
oldIndex: number,
type: string,
};
export type FirestoreNativeDocumentSnapshot = {
data: { [string]: FirestoreTypeMap },
metadata: FirestoreSnapshotMetadata,
path: string,
};
export type FirestoreSnapshotMetadata = {
fromCache: boolean,
hasPendingWrites: boolean,
};
export type FirestoreQueryDirection = 'DESC' | 'desc' | 'ASC' | 'asc';
export type FirestoreQueryOperator = '<' | '<=' | '=' | '==' | '>' | '>=';
export type FirestoreTypeMap = {
type:
| 'array'
| 'boolean'
| 'date'
| 'documentid'
| 'fieldvalue'
| 'geopoint'
| 'null'
| 'number'
| 'object'
| 'reference'
| 'string',
value: any,
};
export type FirestoreWriteOptions = {
merge?: boolean,
};
/* InstanceId types */ /* InstanceId types */
export type InstanceIdModule = { export type InstanceIdModule = {

View File

@ -4,7 +4,7 @@
import { initialiseLogger } from './log'; import { initialiseLogger } from './log';
import { initialiseNativeModule } from './native'; import { initialiseNativeModule } from './native';
import type App from '../modules/core/firebase-app'; import type App from '../modules/core/app';
import type { FirebaseModuleConfig, FirebaseNamespace } from '../types'; import type { FirebaseModuleConfig, FirebaseNamespace } from '../types';
export default class ModuleBase { export default class ModuleBase {

View File

@ -4,11 +4,11 @@
import { NativeEventEmitter, NativeModules } from 'react-native'; import { NativeEventEmitter, NativeModules } from 'react-native';
import { SharedEventEmitter } from './events'; import { SharedEventEmitter } from './events';
import DatabaseSnapshot from '../modules/database/snapshot'; import DataSnapshot from '../modules/database/DataSnapshot';
import DatabaseReference from '../modules/database/reference'; import DatabaseReference from '../modules/database/Reference';
import { isString, nativeToJSError } from '../utils'; import { isString, nativeToJSError } from '../utils';
type Listener = DatabaseSnapshot => any; type Listener = DataSnapshot => any;
type Registration = { type Registration = {
key: string, key: string,
@ -83,7 +83,7 @@ class SyncTree {
// forward on to users .on(successCallback <-- listener // forward on to users .on(successCallback <-- listener
return SharedEventEmitter.emit( return SharedEventEmitter.emit(
eventRegistrationKey, eventRegistrationKey,
new DatabaseSnapshot(registration.ref, snapshot), new DataSnapshot(registration.ref, snapshot),
previousChildName previousChildName
); );
} }

View File

@ -2,7 +2,7 @@
* @flow * @flow
*/ */
import { NativeModules } from 'react-native'; import { NativeModules } from 'react-native';
import App from '../modules/core/firebase-app'; import App from '../modules/core/app';
import INTERNALS from './internals'; import INTERNALS from './internals';
import { isAndroid, isObject, isString } from './'; import { isAndroid, isObject, isString } from './';

8
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "react-native-firebase", "name": "react-native-firebase",
"version": "3.2.2", "version": "3.2.5",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -8086,6 +8086,12 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true "dev": true
}, },
"typescript": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
"integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
"dev": true
},
"ua-parser-js": { "ua-parser-js": {
"version": "0.7.17", "version": "0.7.17",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz",

View File

@ -1,17 +1,18 @@
{ {
"name": "react-native-firebase", "name": "react-native-firebase",
"version": "3.2.2", "version": "3.2.5",
"author": "Invertase <contact@invertase.io> (http://invertase.io)", "author": "Invertase <contact@invertase.io> (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, Dynamic Links, Messaging (FCM), Remote Config, Storage and Performance.", "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, Dynamic Links, Messaging (FCM), Remote Config, Storage and Performance.",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"scripts": { "scripts": {
"build": "genversion lib/version.js && npm run build-lib && npm run build-flow", "build": "genversion lib/version.js && npm run validate-ts-declarations && npm run build-lib && npm run build-flow",
"build-flow": "flow-copy-source -i */__tests__* lib dist", "build-flow": "flow-copy-source -i */__tests__* lib dist",
"build-lib": "BABEL_ENV=publish babel lib -d dist --ignore __tests__ --copy-files", "build-lib": "BABEL_ENV=publish babel lib -d dist --ignore __tests__ --copy-files",
"clean": "rimraf dist/", "clean": "rimraf dist/",
"flow": "flow", "flow": "flow",
"format": "eslint --fix ./lib ./tests/src ./tests/lib", "format:assets": "prettier --ignore-path .gitignore --write \"**/*.{json,md}\"",
"format": "npm run format:assets && npm run lint -- --fix",
"lint": "eslint ./lib ./tests/src ./tests/lib", "lint": "eslint ./lib ./tests/src ./tests/lib",
"precommit": "lint-staged", "precommit": "lint-staged",
"prepublish": "npm run clean && npm run build", "prepublish": "npm run clean && npm run build",
@ -21,7 +22,8 @@
"tests-npm-install": "cd tests && npm install", "tests-npm-install": "cd tests && npm install",
"tests-pod-install": "cd tests && npm run ios:pod:install", "tests-pod-install": "cd tests && npm run ios:pod:install",
"tests-watch-start": "npm run test-cli watch init start", "tests-watch-start": "npm run test-cli watch init start",
"tests-watch-stop": "npm run test-cli watch stop" "tests-watch-stop": "npm run test-cli watch stop",
"validate-ts-declarations": "tsc --project ./"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -44,6 +46,7 @@
"auth", "auth",
"config", "config",
"digits", "digits",
"fabric",
"phone-auth", "phone-auth",
"sms", "sms",
"firestore", "firestore",
@ -101,6 +104,7 @@
"react-native": "^0.52.0", "react-native": "^0.52.0",
"rimraf": "^2.6.2", "rimraf": "^2.6.2",
"shelljs": "^0.7.8", "shelljs": "^0.7.8",
"typescript": "^2.6.2",
"wml": "0.0.82" "wml": "0.0.82"
}, },
"dependencies": { "dependencies": {
@ -129,12 +133,12 @@
"eslint --fix", "eslint --fix",
"git add" "git add"
], ],
"tests/src/**/*.js": [ "tests/{src|lib}/**/*.js": [
"eslint --fix", "eslint --fix",
"git add" "git add"
], ],
"tests/lib/**/*.js": [ "*.{json,md,scss}": [
"eslint --fix", "prettier --write",
"git add" "git add"
] ]
} }

View File

@ -1,4 +1,12 @@
module.exports = { module.exports = {
trailingComma: 'es5', trailingComma: 'es5',
singleQuote: true, singleQuote: true,
overrides: [
{
files: '*.json',
options: {
printWidth: 400,
},
},
],
}; };

View File

@ -143,11 +143,10 @@ android {
project.ext.firebaseVersion = '11.8.0' project.ext.firebaseVersion = '11.8.0'
dependencies { dependencies {
// compile(project(':react-native-firebase')) {
// transitive = false
// }
compile project(':react-native-vector-icons') compile project(':react-native-vector-icons')
compile project(':react-native-firebase') compile(project(':react-native-firebase')) {
transitive = false
}
compile fileTree(dir: "libs", include: ["*.jar"]) compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.google.android.gms:play-services-base:$firebaseVersion" compile "com.google.android.gms:play-services-base:$firebaseVersion"
compile "com.google.firebase:firebase-ads:$firebaseVersion" compile "com.google.firebase:firebase-ads:$firebaseVersion"

View File

@ -164,7 +164,7 @@ PODS:
- React/Core - React/Core
- React/fishhook - React/fishhook
- React/RCTBlob - React/RCTBlob
- RNFirebase (3.2.2): - RNFirebase (3.2.4):
- React - React
- yoga (0.52.0.React) - yoga (0.52.0.React)
@ -228,7 +228,7 @@ SPEC CHECKSUMS:
nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3 nanopb: 5601e6bca2dbf1ed831b519092ec110f66982ca3
Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03 Protobuf: 8a9838fba8dae3389230e1b7f8c104aa32389c03
React: 61a6bdf17a9ff16875c230e6ff278d9de274e16c React: 61a6bdf17a9ff16875c230e6ff278d9de274e16c
RNFirebase: 5cf5405d1b67c9720ce63a2da3d6d5346415d0f7 RNFirebase: 011e47909cf54070f72d50b8d61eb7b347774d29
yoga: 646606bf554d54a16711f35596178522fbc00480 yoga: 646606bf554d54a16711f35596178522fbc00480
PODFILE CHECKSUM: 67c98bcb203cb992da590bcab6f690f727653ca5 PODFILE CHECKSUM: 67c98bcb203cb992da590bcab6f690f727653ca5

18
tsconfig.json Normal file
View File

@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"jsx": "react",
"sourceMap": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"lib": ["es2015", "es2016", "esnext", "dom"]
},
"files": ["./lib/index.d.ts"]
}