@react-native-firebase/app 20.0.0 → 20.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +26 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
- package/ios/RNFBApp/RNFBVersion.m +1 -1
- package/lib/common/index.js +2 -0
- package/lib/index.d.ts +1 -0
- package/lib/internal/RNFBNativeEventEmitter.js +31 -6
- package/lib/internal/nativeModule.android.js +2 -0
- package/lib/internal/nativeModule.ios.js +2 -0
- package/lib/internal/nativeModule.js +4 -0
- package/lib/internal/nativeModuleAndroidIos.js +45 -0
- package/lib/internal/nativeModuleWeb.js +48 -0
- package/lib/internal/registry/app.js +2 -1
- package/lib/internal/registry/nativeModule.js +11 -15
- package/lib/internal/web/RNFBAppModule.js +266 -0
- package/lib/internal/web/firebaseApp.js +3 -0
- package/lib/internal/web/firebaseAppCheck.js +6 -0
- package/lib/internal/web/firebaseAuth.js +4 -0
- package/lib/internal/web/firebaseDatabase.js +4 -0
- package/lib/internal/web/firebaseFirestore.js +4 -0
- package/lib/internal/web/firebaseFunctions.js +4 -0
- package/lib/internal/web/firebaseInstallations.js +6 -0
- package/lib/internal/web/firebaseRemoteConfig.js +6 -0
- package/lib/internal/web/firebaseStorage.js +4 -0
- package/lib/internal/web/memidb/FDBCursor.js +503 -0
- package/lib/internal/web/memidb/FDBCursorWithValue.js +11 -0
- package/lib/internal/web/memidb/FDBDatabase.js +172 -0
- package/lib/internal/web/memidb/FDBFactory.js +256 -0
- package/lib/internal/web/memidb/FDBIndex.js +187 -0
- package/lib/internal/web/memidb/FDBKeyRange.js +71 -0
- package/lib/internal/web/memidb/FDBObjectStore.js +411 -0
- package/lib/internal/web/memidb/FDBOpenDBRequest.js +9 -0
- package/lib/internal/web/memidb/FDBRequest.js +33 -0
- package/lib/internal/web/memidb/FDBTransaction.js +216 -0
- package/lib/internal/web/memidb/FDBVersionChangeEvent.js +12 -0
- package/lib/internal/web/memidb/LICENSE +208 -0
- package/lib/internal/web/memidb/index.js +39 -0
- package/lib/internal/web/memidb/lib/Database.js +32 -0
- package/lib/internal/web/memidb/lib/FakeDOMStringList.js +72 -0
- package/lib/internal/web/memidb/lib/FakeEvent.js +38 -0
- package/lib/internal/web/memidb/lib/FakeEventTarget.js +110 -0
- package/lib/internal/web/memidb/lib/Index.js +157 -0
- package/lib/internal/web/memidb/lib/KeyGenerator.js +22 -0
- package/lib/internal/web/memidb/lib/ObjectStore.js +172 -0
- package/lib/internal/web/memidb/lib/RecordStore.js +141 -0
- package/lib/internal/web/memidb/lib/binarySearch.js +78 -0
- package/lib/internal/web/memidb/lib/canInjectKey.js +25 -0
- package/lib/internal/web/memidb/lib/cmp.js +77 -0
- package/lib/internal/web/memidb/lib/enforceRange.js +13 -0
- package/lib/internal/web/memidb/lib/errors.js +69 -0
- package/lib/internal/web/memidb/lib/extractKey.js +39 -0
- package/lib/internal/web/memidb/lib/scheduling.js +30 -0
- package/lib/internal/web/memidb/lib/types.js +1 -0
- package/lib/internal/web/memidb/lib/validateKeyPath.js +54 -0
- package/lib/internal/web/memidb/lib/valueToKey.js +62 -0
- package/lib/internal/web/memidb/lib/valueToKeyRange.js +19 -0
- package/lib/internal/web/structuredClone/index.js +222 -0
- package/lib/internal/web/utils.js +35 -0
- package/lib/utils/UtilsStatics.js +3 -2
- package/lib/version.js +1 -1
- package/package.json +9 -8
package/CHANGELOG.md
CHANGED
@@ -3,6 +3,32 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
5
5
|
|
6
|
+
## [20.2.0](https://github.com/invertase/react-native-firebase/compare/v20.1.0...v20.2.0) (2024-07-15)
|
7
|
+
|
8
|
+
### Features
|
9
|
+
|
10
|
+
- **other:** Add analytics support ([#7899](https://github.com/invertase/react-native-firebase/issues/7899)) ([cbdf9ec](https://github.com/invertase/react-native-firebase/commit/cbdf9ec78452a73751d1afeca428842898f63134))
|
11
|
+
- **Other:** add App Check support ([#7905](https://github.com/invertase/react-native-firebase/issues/7905)) ([753b16e](https://github.com/invertase/react-native-firebase/commit/753b16e1a06f949c679fb75053c319394dd5ecfe))
|
12
|
+
- **other:** add App/Core support ([1b2e247](https://github.com/invertase/react-native-firebase/commit/1b2e2473d526c3356ab8619b226943446fd49452))
|
13
|
+
- **other:** Add Auth support ([#7878](https://github.com/invertase/react-native-firebase/issues/7878)) ([54befe7](https://github.com/invertase/react-native-firebase/commit/54befe776353f07eeab9b044d6261eeb76f1f238))
|
14
|
+
- **other:** Add Database support ([#7887](https://github.com/invertase/react-native-firebase/issues/7887)) ([fbb773a](https://github.com/invertase/react-native-firebase/commit/fbb773a87c167bdc92265fe261aeb777d4660cd7))
|
15
|
+
- **other:** Add Firestore support ([#7882](https://github.com/invertase/react-native-firebase/issues/7882)) ([0ebd1dd](https://github.com/invertase/react-native-firebase/commit/0ebd1ddd221c50dde489bce30ad5ed64037d8439))
|
16
|
+
- **Other:** Add Remote Config support ([#7895](https://github.com/invertase/react-native-firebase/issues/7895)) ([a41e556](https://github.com/invertase/react-native-firebase/commit/a41e5568869320fb91afc01403ed402e5312e15c))
|
17
|
+
- **other:** Add Storage support ([#7888](https://github.com/invertase/react-native-firebase/issues/7888)) ([9b8dda7](https://github.com/invertase/react-native-firebase/commit/9b8dda704a01243039624bfcc7614021e6c3a527))
|
18
|
+
|
19
|
+
### Bug Fixes
|
20
|
+
|
21
|
+
- **app, android:** adopt firebase-android-sdk 31.1.1 ([dba1beb](https://github.com/invertase/react-native-firebase/commit/dba1beba97d88d1110e0838b6287fd4907cfa8a7))
|
22
|
+
- **app, android:** adopt firebase-android-sdk 33.1.2 ([0dfa2af](https://github.com/invertase/react-native-firebase/commit/0dfa2af484cfd12a282490cb82726b29859e30bf))
|
23
|
+
- **app, ios:** firebase-ios-sdk 10.28.0 ([91c626d](https://github.com/invertase/react-native-firebase/commit/91c626d0d32435a6305696fb4084553341d99ca9))
|
24
|
+
- **ios:** adopt firebase-ios-sdk 10.29.0 ([1b19cc6](https://github.com/invertase/react-native-firebase/commit/1b19cc697f21ac1e21ab3a7a399c1ef90711800b))
|
25
|
+
|
26
|
+
## [20.1.0](https://github.com/invertase/react-native-firebase/compare/v20.0.0...v20.1.0) (2024-06-04)
|
27
|
+
|
28
|
+
### Features
|
29
|
+
|
30
|
+
- **app:** ios sdk 10.27.0 / android sdk 33.1.0 ([b6158d6](https://github.com/invertase/react-native-firebase/commit/b6158d6ff355ea9156b6f3c3b062c74aaf0d240e))
|
31
|
+
|
6
32
|
## [20.0.0](https://github.com/invertase/react-native-firebase/compare/v19.3.0...v20.0.0) (2024-05-20)
|
7
33
|
|
8
34
|
### ⚠ BREAKING CHANGES
|
package/lib/common/index.js
CHANGED
@@ -85,6 +85,8 @@ export const isIOS = Platform.OS === 'ios';
|
|
85
85
|
|
86
86
|
export const isAndroid = Platform.OS === 'android';
|
87
87
|
|
88
|
+
export const isOther = Platform.OS !== 'ios' && Platform.OS !== 'android';
|
89
|
+
|
88
90
|
export function tryJSONParse(string) {
|
89
91
|
try {
|
90
92
|
return string && JSON.parse(string);
|
package/lib/index.d.ts
CHANGED
@@ -15,24 +15,47 @@
|
|
15
15
|
*
|
16
16
|
*/
|
17
17
|
|
18
|
-
import { NativeEventEmitter
|
19
|
-
|
20
|
-
const { RNFBAppModule } = NativeModules;
|
18
|
+
import { NativeEventEmitter } from 'react-native';
|
19
|
+
import { getReactNativeModule } from './nativeModule';
|
21
20
|
|
22
21
|
class RNFBNativeEventEmitter extends NativeEventEmitter {
|
23
22
|
constructor() {
|
24
|
-
super(RNFBAppModule);
|
23
|
+
super(getReactNativeModule('RNFBAppModule'));
|
25
24
|
this.ready = false;
|
26
25
|
}
|
27
26
|
|
28
27
|
addListener(eventType, listener, context) {
|
28
|
+
const RNFBAppModule = getReactNativeModule('RNFBAppModule');
|
29
29
|
if (!this.ready) {
|
30
30
|
RNFBAppModule.eventsNotifyReady(true);
|
31
31
|
this.ready = true;
|
32
32
|
}
|
33
33
|
RNFBAppModule.eventsAddListener(eventType);
|
34
|
+
if (global.RNFBDebug) {
|
35
|
+
// eslint-disable-next-line no-console
|
36
|
+
console.debug(`[RNFB-->Event][👂] ${eventType} -> listening`);
|
37
|
+
}
|
38
|
+
const listenerDebugger = (...args) => {
|
39
|
+
if (global.RNFBDebug) {
|
40
|
+
// eslint-disable-next-line no-console
|
41
|
+
console.debug(`[RNFB<--Event][📣] ${eventType} <-`, JSON.stringify(args[0]));
|
42
|
+
// Possible leaking test if events are still being received after the test.
|
43
|
+
// This is not super accurate but it's better than nothing, e.g. if doing setup/teardown
|
44
|
+
// logic outside of a test this may cause false positives.
|
45
|
+
if (global.RNFBTest && !global.RNFBDebugInTestLeakDetection) {
|
46
|
+
// eslint-disable-next-line no-console
|
47
|
+
console.debug(
|
48
|
+
`[TEST--->Leak][💡] Possible leaking test detected! An event (☝️) ` +
|
49
|
+
`was received outside of any running tests which may indicates that some ` +
|
50
|
+
`listeners/event subscriptions that have not been unsubscribed from in your ` +
|
51
|
+
`test code. The last test that ran was: "${global.RNFBDebugLastTest}".`,
|
52
|
+
);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
return listener(...args);
|
56
|
+
};
|
34
57
|
|
35
|
-
let subscription = super.addListener(`rnfb_${eventType}`,
|
58
|
+
let subscription = super.addListener(`rnfb_${eventType}`, listenerDebugger, context);
|
36
59
|
|
37
60
|
// React Native 0.65+ altered EventEmitter:
|
38
61
|
// - removeSubscription is gone
|
@@ -41,7 +64,7 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
|
|
41
64
|
// make sure eventType for backwards compatibility just in case
|
42
65
|
subscription.eventType = `rnfb_${eventType}`;
|
43
66
|
|
44
|
-
// New style is to return a remove function on the object, just in
|
67
|
+
// New style is to return a remove function on the object, just in case people call that,
|
45
68
|
// we will modify it to do our native unsubscription then call the original
|
46
69
|
let originalRemove = subscription.remove;
|
47
70
|
let newRemove = () => {
|
@@ -59,12 +82,14 @@ class RNFBNativeEventEmitter extends NativeEventEmitter {
|
|
59
82
|
}
|
60
83
|
|
61
84
|
removeAllListeners(eventType) {
|
85
|
+
const RNFBAppModule = getReactNativeModule('RNFBAppModule');
|
62
86
|
RNFBAppModule.eventsRemoveListener(eventType, true);
|
63
87
|
super.removeAllListeners(`rnfb_${eventType}`);
|
64
88
|
}
|
65
89
|
|
66
90
|
// This is likely no longer ever called, but it is here for backwards compatibility with RN <= 0.64
|
67
91
|
removeSubscription(subscription) {
|
92
|
+
const RNFBAppModule = getReactNativeModule('RNFBAppModule');
|
68
93
|
RNFBAppModule.eventsRemoveListener(subscription.eventType.replace('rnfb_'), false);
|
69
94
|
if (super.removeSubscription) {
|
70
95
|
super.removeSubscription(subscription);
|
@@ -0,0 +1,45 @@
|
|
1
|
+
/* eslint-disable no-console */
|
2
|
+
import { NativeModules } from 'react-native';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* This is used by Android and iOS to get a native module.
|
6
|
+
* We additionally add a Proxy to the module to intercept calls
|
7
|
+
* and log them to the console for debugging purposes, if enabled.
|
8
|
+
* @param moduleName
|
9
|
+
*/
|
10
|
+
export function getReactNativeModule(moduleName) {
|
11
|
+
const nativeModule = NativeModules[moduleName];
|
12
|
+
if (!global.RNFBDebug) {
|
13
|
+
return nativeModule;
|
14
|
+
}
|
15
|
+
return new Proxy(nativeModule, {
|
16
|
+
ownKeys(target) {
|
17
|
+
return Object.keys(target);
|
18
|
+
},
|
19
|
+
get: (_, name) => {
|
20
|
+
if (typeof nativeModule[name] !== 'function') return nativeModule[name];
|
21
|
+
return (...args) => {
|
22
|
+
console.debug(`[RNFB->Native][🔵] ${moduleName}.${name} -> ${JSON.stringify(args)}`);
|
23
|
+
const result = nativeModule[name](...args);
|
24
|
+
if (result && result.then) {
|
25
|
+
return result.then(
|
26
|
+
res => {
|
27
|
+
console.debug(`[RNFB<-Native][🟢] ${moduleName}.${name} <- ${JSON.stringify(res)}`);
|
28
|
+
return res;
|
29
|
+
},
|
30
|
+
err => {
|
31
|
+
console.debug(`[RNFB<-Native][🔴] ${moduleName}.${name} <- ${JSON.stringify(err)}`);
|
32
|
+
throw err;
|
33
|
+
},
|
34
|
+
);
|
35
|
+
}
|
36
|
+
console.debug(`[RNFB<-Native][🟢] ${moduleName}.${name} <- ${JSON.stringify(result)}`);
|
37
|
+
return result;
|
38
|
+
};
|
39
|
+
},
|
40
|
+
});
|
41
|
+
}
|
42
|
+
|
43
|
+
export function setReactNativeModule() {
|
44
|
+
// No-op
|
45
|
+
}
|
@@ -0,0 +1,48 @@
|
|
1
|
+
/* eslint-disable no-console */
|
2
|
+
|
3
|
+
import RNFBAppModule from './web/RNFBAppModule';
|
4
|
+
|
5
|
+
const nativeModuleRegistry = {};
|
6
|
+
|
7
|
+
export function getReactNativeModule(moduleName) {
|
8
|
+
const nativeModule = nativeModuleRegistry[moduleName];
|
9
|
+
// Throw an error if the module is not registered.
|
10
|
+
if (!nativeModule) {
|
11
|
+
throw new Error(`Native module ${moduleName} is not registered.`);
|
12
|
+
}
|
13
|
+
if (!global.RNFBDebug) {
|
14
|
+
return nativeModule;
|
15
|
+
}
|
16
|
+
return new Proxy(nativeModule, {
|
17
|
+
ownKeys(target) {
|
18
|
+
return Object.keys(target);
|
19
|
+
},
|
20
|
+
get: (_, name) => {
|
21
|
+
if (typeof nativeModule[name] !== 'function') return nativeModule[name];
|
22
|
+
return (...args) => {
|
23
|
+
console.debug(`[RNFB->Native][🔵] ${moduleName}.${name} -> ${JSON.stringify(args)}`);
|
24
|
+
const result = nativeModule[name](...args);
|
25
|
+
if (result && result.then) {
|
26
|
+
return result.then(
|
27
|
+
res => {
|
28
|
+
console.debug(`[RNFB<-Native][🟢] ${moduleName}.${name} <- ${JSON.stringify(res)}`);
|
29
|
+
return res;
|
30
|
+
},
|
31
|
+
err => {
|
32
|
+
console.debug(`[RNFB<-Native][🔴] ${moduleName}.${name} <- ${JSON.stringify(err)}`);
|
33
|
+
throw err;
|
34
|
+
},
|
35
|
+
);
|
36
|
+
}
|
37
|
+
console.debug(`[RNFB<-Native][🟢] ${moduleName}.${name} <- ${JSON.stringify(result)}`);
|
38
|
+
return result;
|
39
|
+
};
|
40
|
+
},
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
export function setReactNativeModule(moduleName, nativeModule) {
|
45
|
+
nativeModuleRegistry[moduleName] = nativeModule;
|
46
|
+
}
|
47
|
+
|
48
|
+
setReactNativeModule('RNFBAppModule', RNFBAppModule);
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
import {
|
19
19
|
isIOS,
|
20
|
+
isOther,
|
20
21
|
isNull,
|
21
22
|
isObject,
|
22
23
|
isString,
|
@@ -201,7 +202,7 @@ export function setLogLevel(logLevel) {
|
|
201
202
|
throw new Error('LogLevel must be one of "error", "warn", "info", "debug", "verbose"');
|
202
203
|
}
|
203
204
|
|
204
|
-
if (isIOS) {
|
205
|
+
if (isIOS || isOther) {
|
205
206
|
getAppModule().setLogLevel(logLevel);
|
206
207
|
}
|
207
208
|
}
|
@@ -15,11 +15,12 @@
|
|
15
15
|
*
|
16
16
|
*/
|
17
17
|
|
18
|
-
import { NativeModules, Platform } from 'react-native';
|
19
18
|
import { APP_NATIVE_MODULE } from '../constants';
|
20
19
|
import NativeFirebaseError from '../NativeFirebaseError';
|
21
20
|
import RNFBNativeEventEmitter from '../RNFBNativeEventEmitter';
|
22
21
|
import SharedEventEmitter from '../SharedEventEmitter';
|
22
|
+
import { getReactNativeModule } from '../nativeModule';
|
23
|
+
import { isAndroid, isIOS } from '../../common';
|
23
24
|
|
24
25
|
const NATIVE_MODULE_REGISTRY = {};
|
25
26
|
const NATIVE_MODULE_EVENT_SUBSCRIPTIONS = {};
|
@@ -102,7 +103,7 @@ function initialiseNativeModule(module) {
|
|
102
103
|
const nativeModuleNames = multiModule ? nativeModuleName : [nativeModuleName];
|
103
104
|
|
104
105
|
for (let i = 0; i < nativeModuleNames.length; i++) {
|
105
|
-
const nativeModule =
|
106
|
+
const nativeModule = getReactNativeModule(nativeModuleNames[i]);
|
106
107
|
|
107
108
|
// only error if there's a single native module
|
108
109
|
// as multi modules can mean some are optional
|
@@ -173,24 +174,19 @@ function subscribeToNativeModuleEvent(eventName) {
|
|
173
174
|
*/
|
174
175
|
function getMissingModuleHelpText(namespace) {
|
175
176
|
const snippet = `firebase.${namespace}()`;
|
176
|
-
const nativeModule = namespace.charAt(0).toUpperCase() + namespace.slice(1);
|
177
177
|
|
178
|
-
if (
|
178
|
+
if (isIOS || isAndroid) {
|
179
179
|
return (
|
180
|
-
`You attempted to use a
|
181
|
-
|
182
|
-
'
|
180
|
+
`You attempted to use a Firebase module that's not installed natively on your project by calling ${snippet}.` +
|
181
|
+
`\r\n\r\nEnsure you have installed the npm package '@react-native-firebase/${namespace}',` +
|
182
|
+
' have imported it in your project, and have rebuilt your native application.'
|
183
183
|
);
|
184
184
|
}
|
185
185
|
|
186
|
-
const rnFirebasePackage = `'io.invertase.firebase.${namespace}.ReactNativeFirebase${nativeModule}Package'`;
|
187
|
-
const newInstance = `'new ReactNativeFirebase${nativeModule}Package()'`;
|
188
|
-
|
189
186
|
return (
|
190
|
-
`You attempted to use a
|
191
|
-
`\r\n\r\nEnsure you have
|
192
|
-
|
193
|
-
'\r\n\r\nSee http://invertase.link/android for full setup instructions.'
|
187
|
+
`You attempted to use a Firebase module that's not installed on your project by calling ${snippet}.` +
|
188
|
+
`\r\n\r\nEnsure you have installed the npm package '@react-native-firebase/${namespace}' and` +
|
189
|
+
' have imported it in your project.'
|
194
190
|
);
|
195
191
|
}
|
196
192
|
|
@@ -222,7 +218,7 @@ export function getAppModule() {
|
|
222
218
|
}
|
223
219
|
|
224
220
|
const namespace = 'app';
|
225
|
-
const nativeModule =
|
221
|
+
const nativeModule = getReactNativeModule(APP_NATIVE_MODULE);
|
226
222
|
|
227
223
|
if (!nativeModule) {
|
228
224
|
throw new Error(getMissingModuleHelpText(namespace));
|
@@ -0,0 +1,266 @@
|
|
1
|
+
/* eslint-disable no-console */
|
2
|
+
import { initializeApp, setLogLevel, getApp, getApps, deleteApp } from './firebaseApp';
|
3
|
+
|
4
|
+
import { DeviceEventEmitter } from 'react-native';
|
5
|
+
|
6
|
+
// Variables for events tracking.
|
7
|
+
let jsReady = false;
|
8
|
+
let jsListenerCount = 0;
|
9
|
+
let queuedEvents = [];
|
10
|
+
let jsListeners = {};
|
11
|
+
|
12
|
+
// For compatibility we have a fake preferences storage,
|
13
|
+
// it does not persist across app restarts.
|
14
|
+
let fakePreferencesStorage = {};
|
15
|
+
|
16
|
+
function eventsGetListenersMap() {
|
17
|
+
return {
|
18
|
+
listeners: jsListenerCount,
|
19
|
+
queued: queuedEvents.length,
|
20
|
+
events: jsListeners,
|
21
|
+
};
|
22
|
+
}
|
23
|
+
|
24
|
+
function eventsSendEvent(eventName, eventBody) {
|
25
|
+
if (!jsReady || !jsListeners.hasOwnProperty(eventName)) {
|
26
|
+
const event = {
|
27
|
+
eventName,
|
28
|
+
eventBody,
|
29
|
+
};
|
30
|
+
queuedEvents.push(event);
|
31
|
+
return;
|
32
|
+
}
|
33
|
+
setImmediate(() => DeviceEventEmitter.emit('rnfb_' + eventName, eventBody));
|
34
|
+
}
|
35
|
+
|
36
|
+
function eventsSendQueuedEvents() {
|
37
|
+
if (queuedEvents.length === 0) {
|
38
|
+
return;
|
39
|
+
}
|
40
|
+
const events = Array.from(queuedEvents);
|
41
|
+
queuedEvents = [];
|
42
|
+
for (let i = 0; i < events.length; i++) {
|
43
|
+
const event = events[i];
|
44
|
+
eventsSendEvent(event.eventName, event.eventBody);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
export default {
|
49
|
+
// Natively initialized apps, but in the case of web, we don't have any.
|
50
|
+
NATIVE_FIREBASE_APPS: [],
|
51
|
+
// The raw JSON string of the Firebase config, from the users firebase.json file.
|
52
|
+
// In the case of web, we can't support this.
|
53
|
+
FIREBASE_RAW_JSON: '{}',
|
54
|
+
|
55
|
+
/**
|
56
|
+
* Initializes a Firebase app.
|
57
|
+
*
|
58
|
+
* @param {object} options - The Firebase app options.
|
59
|
+
* @param {object} appConfig - The Firebase app config.
|
60
|
+
* @returns {object} - The Firebase app instance.
|
61
|
+
*/
|
62
|
+
async initializeApp(options, appConfig) {
|
63
|
+
const name = appConfig.name;
|
64
|
+
const existingApp = getApps().find(app => app.name === name);
|
65
|
+
if (existingApp) {
|
66
|
+
return existingApp;
|
67
|
+
}
|
68
|
+
const newAppConfig = {
|
69
|
+
name,
|
70
|
+
};
|
71
|
+
if (
|
72
|
+
appConfig.automaticDataCollectionEnabled === true ||
|
73
|
+
appConfig.automaticDataCollectionEnabled === false
|
74
|
+
) {
|
75
|
+
newAppConfig.automaticDataCollectionEnabled = appConfig.automaticDataCollectionEnabled;
|
76
|
+
}
|
77
|
+
const optionsCopy = Object.assign({}, options);
|
78
|
+
// TODO RNFB is using the old gaTrackingId property, we should remove this in the future
|
79
|
+
// in favor of the measurementId property.
|
80
|
+
if (optionsCopy.gaTrackingId) {
|
81
|
+
optionsCopy.measurementId = optionsCopy.gaTrackingId;
|
82
|
+
}
|
83
|
+
delete optionsCopy.clientId;
|
84
|
+
initializeApp(optionsCopy, newAppConfig);
|
85
|
+
return {
|
86
|
+
options,
|
87
|
+
appConfig,
|
88
|
+
};
|
89
|
+
},
|
90
|
+
|
91
|
+
/**
|
92
|
+
* Sets the log level for the Firebase app.
|
93
|
+
*
|
94
|
+
* @param {string} logLevel - The log level to set.
|
95
|
+
*/
|
96
|
+
setLogLevel(logLevel) {
|
97
|
+
setLogLevel(logLevel);
|
98
|
+
},
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Sets the automatic data collection for the Firebase app.
|
102
|
+
*
|
103
|
+
* @param {string} appName - The name of the Firebase app.
|
104
|
+
* @param {boolean} enabled - Whether to enable automatic data collection.
|
105
|
+
*/
|
106
|
+
setAutomaticDataCollectionEnabled(appName, enabled) {
|
107
|
+
getApp(appName).automaticDataCollectionEnabled = enabled;
|
108
|
+
},
|
109
|
+
|
110
|
+
/**
|
111
|
+
* Deletes a Firebase app.
|
112
|
+
*
|
113
|
+
* @param {string} appName - The name of the Firebase app to delete.
|
114
|
+
*/
|
115
|
+
async deleteApp(appName) {
|
116
|
+
if (getApp(appName)) {
|
117
|
+
deleteApp(appName);
|
118
|
+
}
|
119
|
+
},
|
120
|
+
|
121
|
+
/**
|
122
|
+
* Gets the meta data.
|
123
|
+
* Unsupported on web.
|
124
|
+
*
|
125
|
+
* @returns {object} - The meta data
|
126
|
+
*/
|
127
|
+
metaGetAll() {
|
128
|
+
return {};
|
129
|
+
},
|
130
|
+
|
131
|
+
/**
|
132
|
+
* Gets the firebase.json data.
|
133
|
+
* Unsupported on web.
|
134
|
+
*
|
135
|
+
* @returns {object} - The JSON data for the firebase.json file.
|
136
|
+
*/
|
137
|
+
jsonGetAll() {
|
138
|
+
return {};
|
139
|
+
},
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Sets a boolean value for a preference.
|
143
|
+
* Unsupported on web.
|
144
|
+
*
|
145
|
+
* @param {string} key - The key of the preference.
|
146
|
+
* @param {boolean} value - The value to set.
|
147
|
+
*/
|
148
|
+
async preferencesSetBool(key, value) {
|
149
|
+
fakePreferencesStorage[key] = value;
|
150
|
+
},
|
151
|
+
|
152
|
+
/**
|
153
|
+
* Sets a string value for a preference.
|
154
|
+
* Unsupported on web.
|
155
|
+
*
|
156
|
+
* @param {string} key - The key of the preference.
|
157
|
+
* @param {string} value - The value to set.
|
158
|
+
*/
|
159
|
+
preferencesSetString(key, value) {
|
160
|
+
fakePreferencesStorage[key] = value;
|
161
|
+
},
|
162
|
+
|
163
|
+
/**
|
164
|
+
* Gets all preferences.
|
165
|
+
* Unsupported on web.
|
166
|
+
*
|
167
|
+
* @returns {object} - The preferences.
|
168
|
+
*/
|
169
|
+
preferencesGetAll() {
|
170
|
+
return Object.assign({}, fakePreferencesStorage);
|
171
|
+
},
|
172
|
+
|
173
|
+
/**
|
174
|
+
* Clears all preferences.
|
175
|
+
* Unsupported on web.
|
176
|
+
*/
|
177
|
+
preferencesClearAll() {
|
178
|
+
fakePreferencesStorage = {};
|
179
|
+
},
|
180
|
+
|
181
|
+
/**
|
182
|
+
* Adds a listener for an event.
|
183
|
+
* Unsupported on web.
|
184
|
+
*
|
185
|
+
* @param {string} eventName - The name of the event to listen for.
|
186
|
+
*/
|
187
|
+
addListener() {
|
188
|
+
// Keep: Required for RN built in Event Emitter Calls.
|
189
|
+
},
|
190
|
+
/**
|
191
|
+
* Removes a listener for an event.
|
192
|
+
* Unsupported on web.
|
193
|
+
*
|
194
|
+
* @param {string} eventName - The name of the event to remove the listener for.
|
195
|
+
*/
|
196
|
+
removeListeners() {
|
197
|
+
// Keep: Required for RN built in Event Emitter Calls.
|
198
|
+
},
|
199
|
+
|
200
|
+
/**
|
201
|
+
* Notifies the app that it is ready to receive events.
|
202
|
+
*
|
203
|
+
* @param {boolean} ready - Whether the app is ready to receive events.
|
204
|
+
* @returns {void}
|
205
|
+
*/
|
206
|
+
eventsNotifyReady(ready) {
|
207
|
+
jsReady = ready;
|
208
|
+
if (jsReady) {
|
209
|
+
setImmediate(() => eventsSendQueuedEvents());
|
210
|
+
}
|
211
|
+
},
|
212
|
+
|
213
|
+
/**
|
214
|
+
* Gets all the listeners registered.
|
215
|
+
*
|
216
|
+
* @returns {object} - The listeners for the event.
|
217
|
+
*/
|
218
|
+
eventsGetListeners() {
|
219
|
+
return eventsGetListenersMap();
|
220
|
+
},
|
221
|
+
|
222
|
+
/**
|
223
|
+
* Sends an event to the app for testing purposes.
|
224
|
+
*
|
225
|
+
* @param {string} eventName - The name of the event to send.
|
226
|
+
* @param {object} eventBody - The body of the event to send.
|
227
|
+
* @returns {void}
|
228
|
+
*/
|
229
|
+
eventsPing(eventName, eventBody) {
|
230
|
+
eventsSendEvent(eventName, eventBody);
|
231
|
+
},
|
232
|
+
|
233
|
+
/**
|
234
|
+
* Adds a listener for an event.
|
235
|
+
*
|
236
|
+
* @param {string} eventName - The name of the event to listen for.
|
237
|
+
*/
|
238
|
+
eventsAddListener(eventName) {
|
239
|
+
jsListenerCount++;
|
240
|
+
if (!jsListeners.hasOwnProperty(eventName)) {
|
241
|
+
jsListeners[eventName] = 1;
|
242
|
+
} else {
|
243
|
+
jsListeners[eventName]++;
|
244
|
+
}
|
245
|
+
setImmediate(() => eventsSendQueuedEvents());
|
246
|
+
},
|
247
|
+
|
248
|
+
/**
|
249
|
+
* Removes a single listener for an event or all listeners for an event.
|
250
|
+
*
|
251
|
+
* @param {string} eventName - The name of the event to remove the listener for.
|
252
|
+
* @param {boolean} all - Optional. Whether to remove all listeners for the event.
|
253
|
+
*/
|
254
|
+
eventsRemoveListener(eventName, all) {
|
255
|
+
if (jsListeners.hasOwnProperty(eventName)) {
|
256
|
+
if (jsListeners[eventName] <= 1 || all) {
|
257
|
+
const count = jsListeners[eventName];
|
258
|
+
jsListenerCount -= count;
|
259
|
+
delete jsListeners[eventName];
|
260
|
+
} else {
|
261
|
+
jsListenerCount--;
|
262
|
+
jsListeners[eventName]--;
|
263
|
+
}
|
264
|
+
}
|
265
|
+
},
|
266
|
+
};
|
@@ -0,0 +1,6 @@
|
|
1
|
+
// We need to share firebase imports between modules, otherwise
|
2
|
+
// apps and instances of the firebase modules are not shared.
|
3
|
+
import 'firebase/app';
|
4
|
+
export { getApp } from 'firebase/app';
|
5
|
+
export * from 'firebase/app-check';
|
6
|
+
export { makeIDBAvailable } from './memidb';
|
@@ -0,0 +1,6 @@
|
|
1
|
+
// We need to share firebase imports between modules, otherwise
|
2
|
+
// apps and instances of the firebase modules are not shared.
|
3
|
+
import 'firebase/app';
|
4
|
+
export { getApp } from 'firebase/app';
|
5
|
+
export * from 'firebase/installations';
|
6
|
+
export { makeIDBAvailable } from './memidb';
|
@@ -0,0 +1,6 @@
|
|
1
|
+
// We need to share firebase imports between modules, otherwise
|
2
|
+
// apps and instances of the firebase modules are not shared.
|
3
|
+
import 'firebase/app';
|
4
|
+
export { getApp } from 'firebase/app';
|
5
|
+
export * from 'firebase/remote-config';
|
6
|
+
export { makeIDBAvailable } from './memidb';
|