From 684bb50368cb797ae9fda8fb56df2e2376d59c30 Mon Sep 17 00:00:00 2001 From: Max Fratane Date: Sun, 2 May 2021 17:07:07 -0300 Subject: [PATCH] feat(analytics): Adding default event parameters (#5246) * Adding firebase default parameter function call to android * iOS implementation * e2e tests Co-authored-by: Mike Hardy --- .../analytics/__tests__/analytics.test.ts | 9 +++++++++ .../UniversalFirebaseAnalyticsModule.java | 7 +++++++ .../ReactNativeFirebaseAnalyticsModule.java | 11 ++++++++++ packages/analytics/e2e/analytics.e2e.js | 14 +++++++++++++ .../ios/RNFBAnalytics/RNFBAnalyticsModule.m | 15 ++++++++++++++ packages/analytics/lib/index.d.ts | 20 +++++++++++++++++++ packages/analytics/lib/index.js | 10 ++++++++++ 7 files changed, 86 insertions(+) diff --git a/packages/analytics/__tests__/analytics.test.ts b/packages/analytics/__tests__/analytics.test.ts index cc9f17e3c7..c2273e5548 100644 --- a/packages/analytics/__tests__/analytics.test.ts +++ b/packages/analytics/__tests__/analytics.test.ts @@ -164,6 +164,15 @@ describe('Analytics', function () { }); }); + describe('setDefaultEventParameters()', function () { + it('errors if params is not a object', function () { + // @ts-ignore test + expect(() => firebase.analytics().setDefaultEventParameters('123')).toThrowError( + "firebase.analytics().setDefaultEventParameters(*) 'params' expected an object value when it is defined.", + ); + }); + }); + describe('logAddToCart()', function () { it('errors if param is not an object', function () { // @ts-ignore test diff --git a/packages/analytics/android/src/main/java/io/invertase/firebase/analytics/UniversalFirebaseAnalyticsModule.java b/packages/analytics/android/src/main/java/io/invertase/firebase/analytics/UniversalFirebaseAnalyticsModule.java index bad38fc1ec..e84249acc9 100644 --- a/packages/analytics/android/src/main/java/io/invertase/firebase/analytics/UniversalFirebaseAnalyticsModule.java +++ b/packages/analytics/android/src/main/java/io/invertase/firebase/analytics/UniversalFirebaseAnalyticsModule.java @@ -96,4 +96,11 @@ Task resetAnalyticsData() { return null; }); } + + Task setDefaultEventParameters(Bundle parameters) { + return Tasks.call(() -> { + FirebaseAnalytics.getInstance(getContext()).setDefaultEventParameters(parameters); + return null; + }); + } } diff --git a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java index 2d1ab6e6f8..a3edd38d0c 100644 --- a/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java +++ b/packages/analytics/android/src/reactnative/java/io/invertase/firebase/analytics/ReactNativeFirebaseAnalyticsModule.java @@ -131,6 +131,17 @@ public void resetAnalyticsData(Promise promise) { }); } + @ReactMethod + public void setDefaultEventParameters(@Nullable ReadableMap params, Promise promise) { + module.setDefaultEventParameters(toBundle(params)).addOnCompleteListener(task -> { + if (task.isSuccessful()) { + promise.resolve(task.getResult()); + } else { + rejectPromiseWithExceptionMap(promise, task.getException()); + } + }); + } + private Bundle toBundle(ReadableMap readableMap) { Bundle bundle = Arguments.toBundle(readableMap); if (bundle == null) { diff --git a/packages/analytics/e2e/analytics.e2e.js b/packages/analytics/e2e/analytics.e2e.js index bc48a41aa3..0e70537988 100644 --- a/packages/analytics/e2e/analytics.e2e.js +++ b/packages/analytics/e2e/analytics.e2e.js @@ -418,4 +418,18 @@ describe('analytics()', function () { }); }); }); + + describe('setDefaultEventParameters()', function () { + it('set null default parameter', async function () { + await firebase.analytics().setDefaultEventParameters(null); + }); + + it('set undefined default parameter', async function () { + await firebase.analytics().setDefaultEventParameters(undefined); + }); + + it('set default parameters', async function () { + await firebase.analytics().setDefaultEventParameters({ number: 1, stringn: '123' }); + }); + }); }); diff --git a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m index b682bce972..833917255b 100644 --- a/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m +++ b/packages/analytics/ios/RNFBAnalytics/RNFBAnalyticsModule.m @@ -142,6 +142,21 @@ - (dispatch_queue_t)methodQueue { return resolve([FIRAnalytics appInstanceID]); } + RCT_EXPORT_METHOD(setDefaultEventParameters: + (NSDictionary *) params + resolver: + (RCTPromiseResolveBlock) resolve + rejecter: + (RCTPromiseRejectBlock) reject) { + @try { + [FIRAnalytics setDefaultEventParameters:[self cleanJavascriptParams:params]]; + } @catch (NSException *exception) { + return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception]; + } + + return resolve([NSNull null]); + } + #pragma mark - #pragma mark Private methods diff --git a/packages/analytics/lib/index.d.ts b/packages/analytics/lib/index.d.ts index 0e324f95f1..25cfe18743 100644 --- a/packages/analytics/lib/index.d.ts +++ b/packages/analytics/lib/index.d.ts @@ -1468,6 +1468,26 @@ export namespace FirebaseAnalyticsTypes { * @param params See {@link analytics.ViewSearchResultsParameters}. */ logViewSearchResults(params: ViewSearchResultsParameters): Promise; + + /** + * Adds parameters that will be set on every event logged from the SDK, including automatic ones. + * + * #### Example + * + * ```js + * await firebase.analytics().setDefaultEventParameters({ + * userId: '1234', + * }); + * ``` + * + * + * @param params Parameters to be added to the map of parameters added to every event. + * They will be added to the map of default event parameters, replacing any existing + * parameter with the same name. Valid parameter values are String, long, and double. + * Setting a key's value to null will clear that parameter. Passing in a null bundle + * will clear all parameters. + */ + setDefaultEventParameters(params?: { [key: string]: any }): Promise; } } diff --git a/packages/analytics/lib/index.js b/packages/analytics/lib/index.js index 9300cfa957..1b17d0fa10 100644 --- a/packages/analytics/lib/index.js +++ b/packages/analytics/lib/index.js @@ -666,6 +666,16 @@ class FirebaseAnalyticsModule extends FirebaseModule { ), ); } + + setDefaultEventParameters(params) { + if (!isObject(params) && !isNull(params) && !isUndefined(params)) { + throw new Error( + "firebase.analytics().setDefaultEventParameters(*) 'params' expected an object value when it is defined.", + ); + } + + return this.native.setDefaultEventParameters(params); + } } // import { SDK_VERSION } from '@react-native-firebase/analytics';