@react-native-firebase/analytics 20.3.0 → 20.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
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.5.0](https://github.com/invertase/react-native-firebase/compare/v20.4.0...v20.5.0) (2024-09-11)
7
+
8
+ ### Features
9
+
10
+ - **analytics:** initiate on device measurement with sha256-hashed values ([#7963](https://github.com/invertase/react-native-firebase/issues/7963)) ([5ce51e1](https://github.com/invertase/react-native-firebase/commit/5ce51e1b8b225bb509b4a0d444f42fa4c5f3effc))
11
+
12
+ ## [20.4.0](https://github.com/invertase/react-native-firebase/compare/v20.3.0...v20.4.0) (2024-08-13)
13
+
14
+ ### Bug Fixes
15
+
16
+ - **analytics:** update the typing for Item ([#7919](https://github.com/invertase/react-native-firebase/issues/7919)) ([c2c4576](https://github.com/invertase/react-native-firebase/commit/c2c457608c865f6d25e4b9b6689cbc00721de194))
17
+
6
18
  ## [20.3.0](https://github.com/invertase/react-native-firebase/compare/v20.2.1...v20.3.0) (2024-07-19)
7
19
 
8
20
  ### Bug Fixes
@@ -1,6 +1,62 @@
1
1
  import { describe, expect, it, xit } from '@jest/globals';
2
2
 
3
- import { firebase } from '../lib';
3
+ import {
4
+ firebase,
5
+ getAnalytics,
6
+ initializeAnalytics,
7
+ logEvent,
8
+ setAnalyticsCollectionEnabled,
9
+ setSessionTimeoutDuration,
10
+ getAppInstanceId,
11
+ getSessionId,
12
+ setUserId,
13
+ setUserProperty,
14
+ setUserProperties,
15
+ resetAnalyticsData,
16
+ logAddPaymentInfo,
17
+ logScreenView,
18
+ logAddShippingInfo,
19
+ logAddToCart,
20
+ logAddToWishlist,
21
+ logAppOpen,
22
+ logBeginCheckout,
23
+ logCampaignDetails,
24
+ logEarnVirtualCurrency,
25
+ logGenerateLead,
26
+ logJoinGroup,
27
+ logLevelEnd,
28
+ logLevelStart,
29
+ logLevelUp,
30
+ logLogin,
31
+ logPostScore,
32
+ logSelectContent,
33
+ logPurchase,
34
+ logRefund,
35
+ logRemoveFromCart,
36
+ logSearch,
37
+ logSelectItem,
38
+ logSetCheckoutOption,
39
+ logSelectPromotion,
40
+ logShare,
41
+ logSignUp,
42
+ logSpendVirtualCurrency,
43
+ logTutorialBegin,
44
+ logTutorialComplete,
45
+ logUnlockAchievement,
46
+ logViewCart,
47
+ logViewItem,
48
+ logViewItemList,
49
+ logViewPromotion,
50
+ logViewSearchResults,
51
+ setDefaultEventParameters,
52
+ initiateOnDeviceConversionMeasurementWithEmailAddress,
53
+ initiateOnDeviceConversionMeasurementWithHashedEmailAddress,
54
+ initiateOnDeviceConversionMeasurementWithPhoneNumber,
55
+ initiateOnDeviceConversionMeasurementWithHashedPhoneNumber,
56
+ isSupported,
57
+ setConsent,
58
+ settings,
59
+ } from '../lib';
4
60
 
5
61
  describe('Analytics', function () {
6
62
  describe('namespace', function () {
@@ -595,4 +651,271 @@ describe('Analytics', function () {
595
651
  );
596
652
  });
597
653
  });
654
+
655
+ describe('initiateOnDeviceConversionMeasurementWithHashedEmailAddress()', function () {
656
+ it('throws if not a string', function () {
657
+ expect(() =>
658
+ // @ts-ignore
659
+ firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedEmailAddress(true),
660
+ ).toThrowError(
661
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedEmailAddress(*) 'hashedEmailAddress' expected a string value.",
662
+ );
663
+ });
664
+ });
665
+
666
+ describe('initiateOnDeviceConversionMeasurementWithHashedPhoneNumber()', function () {
667
+ it('throws if not a string', function () {
668
+ expect(() =>
669
+ // @ts-ignore
670
+ firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(1234),
671
+ ).toThrowError(
672
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(*) 'hashedPhoneNumber' expected a string value.",
673
+ );
674
+ });
675
+
676
+ it('throws if hashed value is a phone number in E.164 format', function () {
677
+ expect(() =>
678
+ firebase
679
+ .analytics()
680
+ .initiateOnDeviceConversionMeasurementWithHashedPhoneNumber('+1234567890'),
681
+ ).toThrowError(
682
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(*) 'hashedPhoneNumber' expected a sha256-hashed value of a phone number in E.164 format.",
683
+ );
684
+ });
685
+ });
686
+
687
+ describe('modular', function () {
688
+ it('`getAnalytics` function is properly exposed to end user', function () {
689
+ expect(getAnalytics).toBeDefined();
690
+ });
691
+
692
+ it('`initializeAnalytics` function is properly exposed to end user', function () {
693
+ expect(initializeAnalytics).toBeDefined();
694
+ });
695
+
696
+ it('`logEvent` function is properly exposed to end user', function () {
697
+ expect(logEvent).toBeDefined();
698
+ });
699
+
700
+ it('`setAnalyticsCollectionEnabled` function is properly exposed to end user', function () {
701
+ expect(setAnalyticsCollectionEnabled).toBeDefined();
702
+ });
703
+
704
+ it('`setSessionTimeoutDuration` function is properly exposed to end user', function () {
705
+ expect(setSessionTimeoutDuration).toBeDefined();
706
+ });
707
+
708
+ it('`getAppInstanceId` function is properly exposed to end user', function () {
709
+ expect(getAppInstanceId).toBeDefined();
710
+ });
711
+
712
+ it('`getSessionId` function is properly exposed to end user', function () {
713
+ expect(getSessionId).toBeDefined();
714
+ });
715
+
716
+ it('`setUserId` function is properly exposed to end user', function () {
717
+ expect(setUserId).toBeDefined();
718
+ });
719
+
720
+ it('`setUserProperty` function is properly exposed to end user', function () {
721
+ expect(setUserProperty).toBeDefined();
722
+ });
723
+
724
+ it('`setUserProperties` function is properly exposed to end user', function () {
725
+ expect(setUserProperties).toBeDefined();
726
+ });
727
+
728
+ it('`resetAnalyticsData` function is properly exposed to end user', function () {
729
+ expect(resetAnalyticsData).toBeDefined();
730
+ });
731
+
732
+ it('`logAddPaymentInfo` function is properly exposed to end user', function () {
733
+ expect(logAddPaymentInfo).toBeDefined();
734
+ });
735
+
736
+ it('`logScreenView` function is properly exposed to end user', function () {
737
+ expect(logScreenView).toBeDefined();
738
+ });
739
+
740
+ it('`logAddShippingInfo` function is properly exposed to end user', function () {
741
+ expect(logAddShippingInfo).toBeDefined();
742
+ });
743
+
744
+ it('`logAddToCart` function is properly exposed to end user', function () {
745
+ expect(logAddToCart).toBeDefined();
746
+ });
747
+
748
+ it('`logAddToWishlist` function is properly exposed to end user', function () {
749
+ expect(logAddToWishlist).toBeDefined();
750
+ });
751
+
752
+ it('`logAppOpen` function is properly exposed to end user', function () {
753
+ expect(logAppOpen).toBeDefined();
754
+ });
755
+
756
+ it('`logBeginCheckout` function is properly exposed to end user', function () {
757
+ expect(logBeginCheckout).toBeDefined();
758
+ });
759
+
760
+ it('`logCampaignDetails` function is properly exposed to end user', function () {
761
+ expect(logCampaignDetails).toBeDefined();
762
+ });
763
+
764
+ it('`logEarnVirtualCurrency` function is properly exposed to end user', function () {
765
+ expect(logEarnVirtualCurrency).toBeDefined();
766
+ });
767
+
768
+ it('`logGenerateLead` function is properly exposed to end user', function () {
769
+ expect(logGenerateLead).toBeDefined();
770
+ });
771
+
772
+ it('`logJoinGroup` function is properly exposed to end user', function () {
773
+ expect(logJoinGroup).toBeDefined();
774
+ });
775
+
776
+ it('`logLevelEnd` function is properly exposed to end user', function () {
777
+ expect(logLevelEnd).toBeDefined();
778
+ });
779
+
780
+ it('`logLevelStart` function is properly exposed to end user', function () {
781
+ expect(logLevelStart).toBeDefined();
782
+ });
783
+
784
+ it('`logLevelUp` function is properly exposed to end user', function () {
785
+ expect(logLevelUp).toBeDefined();
786
+ });
787
+
788
+ it('`logLogin` function is properly exposed to end user', function () {
789
+ expect(logLogin).toBeDefined();
790
+ });
791
+
792
+ it('`logPostScore` function is properly exposed to end user', function () {
793
+ expect(logPostScore).toBeDefined();
794
+ });
795
+
796
+ it('`logSelectContent` function is properly exposed to end user', function () {
797
+ expect(logSelectContent).toBeDefined();
798
+ });
799
+
800
+ it('`logPurchase` function is properly exposed to end user', function () {
801
+ expect(logPurchase).toBeDefined();
802
+ });
803
+
804
+ it('`logRefund` function is properly exposed to end user', function () {
805
+ expect(logRefund).toBeDefined();
806
+ });
807
+
808
+ it('`logRemoveFromCart` function is properly exposed to end user', function () {
809
+ expect(logRemoveFromCart).toBeDefined();
810
+ });
811
+
812
+ it('`logSearch` function is properly exposed to end user', function () {
813
+ expect(logSearch).toBeDefined();
814
+ });
815
+
816
+ it('`logSelectItem` function is properly exposed to end user', function () {
817
+ expect(logSelectItem).toBeDefined();
818
+ });
819
+
820
+ it('`logSetCheckoutOption` function is properly exposed to end user', function () {
821
+ expect(logSetCheckoutOption).toBeDefined();
822
+ });
823
+
824
+ it('`logSelectPromotion` function is properly exposed to end user', function () {
825
+ expect(logSelectPromotion).toBeDefined();
826
+ });
827
+
828
+ it('`logShare` function is properly exposed to end user', function () {
829
+ expect(logShare).toBeDefined();
830
+ });
831
+
832
+ it('`logSignUp` function is properly exposed to end user', function () {
833
+ expect(logSignUp).toBeDefined();
834
+ });
835
+
836
+ it('`logSpendVirtualCurrency` function is properly exposed to end user', function () {
837
+ expect(logSpendVirtualCurrency).toBeDefined();
838
+ });
839
+
840
+ it('`logTutorialBegin` function is properly exposed to end user', function () {
841
+ expect(logTutorialBegin).toBeDefined();
842
+ });
843
+
844
+ it('`logTutorialComplete` function is properly exposed to end user', function () {
845
+ expect(logTutorialComplete).toBeDefined();
846
+ });
847
+
848
+ it('`logUnlockAchievement` function is properly exposed to end user', function () {
849
+ expect(logUnlockAchievement).toBeDefined();
850
+ });
851
+
852
+ it('`logViewCart` function is properly exposed to end user', function () {
853
+ expect(logViewCart).toBeDefined();
854
+ });
855
+
856
+ it('`logViewItem` function is properly exposed to end user', function () {
857
+ expect(logViewItem).toBeDefined();
858
+ });
859
+
860
+ it('`logViewItemList` function is properly exposed to end user', function () {
861
+ expect(logViewItemList).toBeDefined();
862
+ });
863
+
864
+ it('`logViewPromotion` function is properly exposed to end user', function () {
865
+ expect(logViewPromotion).toBeDefined();
866
+ });
867
+
868
+ it('`logViewSearchResults` function is properly exposed to end user', function () {
869
+ expect(logViewSearchResults).toBeDefined();
870
+ });
871
+
872
+ it('`setDefaultEventParameters` function is properly exposed to end user', function () {
873
+ expect(setDefaultEventParameters).toBeDefined();
874
+ });
875
+
876
+ it('`initiateOnDeviceConversionMeasurementWithEmailAddress` function is properly exposed to end user', function () {
877
+ expect(initiateOnDeviceConversionMeasurementWithEmailAddress).toBeDefined();
878
+ });
879
+
880
+ it('`initiateOnDeviceConversionMeasurementWithHashedEmailAddress` function is properly exposed to end user', function () {
881
+ expect(initiateOnDeviceConversionMeasurementWithHashedEmailAddress).toBeDefined();
882
+ });
883
+
884
+ it('`initiateOnDeviceConversionMeasurementWithHashedEmailAddress` throws if not a string', function () {
885
+ expect(() =>
886
+ // @ts-ignore
887
+ initiateOnDeviceConversionMeasurementWithHashedEmailAddress(getAnalytics(), true),
888
+ ).toThrowError(
889
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedEmailAddress(*) 'hashedEmailAddress' expected a string value.",
890
+ );
891
+ });
892
+
893
+ it('`initiateOnDeviceConversionMeasurementWithHashedPhoneNumber` should throw if the value is in E.164 format', function () {
894
+ expect(() =>
895
+ initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(getAnalytics(), '+1234567890'),
896
+ ).toThrowError(
897
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(*) 'hashedPhoneNumber' expected a sha256-hashed value of a phone number in E.164 format.",
898
+ );
899
+ });
900
+
901
+ it('`initiateOnDeviceConversionMeasurementWithPhoneNumber` function is properly exposed to end user', function () {
902
+ expect(initiateOnDeviceConversionMeasurementWithPhoneNumber).toBeDefined();
903
+ });
904
+
905
+ it('`initiateOnDeviceConversionMeasurementWithHashedPhoneNumber` function is properly exposed to end user', function () {
906
+ expect(initiateOnDeviceConversionMeasurementWithHashedPhoneNumber).toBeDefined();
907
+ });
908
+
909
+ it('`isSupported` function is properly exposed to end user', function () {
910
+ expect(isSupported).toBeDefined();
911
+ });
912
+
913
+ it('`setConsent` function is properly exposed to end user', function () {
914
+ expect(setConsent).toBeDefined();
915
+ });
916
+
917
+ it('`settings` function is properly exposed to end user', function () {
918
+ expect(settings).toBeDefined();
919
+ });
920
+ });
598
921
  });
@@ -164,6 +164,20 @@ RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithEmailAddress
164
164
  return resolve([NSNull null]);
165
165
  }
166
166
 
167
+ RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithHashedEmailAddress
168
+ : (NSString *)hashedEmailAddress resolver
169
+ : (RCTPromiseResolveBlock)resolve rejecter
170
+ : (RCTPromiseRejectBlock)reject) {
171
+ @try {
172
+ NSData *emailAddress = [hashedEmailAddress dataUsingEncoding:NSUTF8StringEncoding];
173
+ [FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedEmailAddress:emailAddress];
174
+ } @catch (NSException *exception) {
175
+ return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
176
+ }
177
+
178
+ return resolve([NSNull null]);
179
+ }
180
+
167
181
  RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithPhoneNumber
168
182
  : (NSString *)phoneNumber resolver
169
183
  : (RCTPromiseResolveBlock)resolve rejecter
@@ -177,6 +191,20 @@ RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithPhoneNumber
177
191
  return resolve([NSNull null]);
178
192
  }
179
193
 
194
+ RCT_EXPORT_METHOD(initiateOnDeviceConversionMeasurementWithHashedPhoneNumber
195
+ : (NSString *)hashedPhoneNumber resolver
196
+ : (RCTPromiseResolveBlock)resolve rejecter
197
+ : (RCTPromiseRejectBlock)reject) {
198
+ @try {
199
+ NSData *phoneNumber = [hashedPhoneNumber dataUsingEncoding:NSUTF8StringEncoding];
200
+ [FIRAnalytics initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:phoneNumber];
201
+ } @catch (NSException *exception) {
202
+ return [RNFBSharedUtils rejectPromiseWithExceptionDict:reject exception:exception];
203
+ }
204
+
205
+ return resolve([NSNull null]);
206
+ }
207
+
180
208
  RCT_EXPORT_METHOD(setConsent
181
209
  : (NSDictionary *)consentSettings resolver
182
210
  : (RCTPromiseResolveBlock)resolve rejecter
package/lib/index.d.ts CHANGED
@@ -94,7 +94,7 @@ export namespace FirebaseAnalyticsTypes {
94
94
  /**
95
95
  * The Google [Place ID](https://developers.google.com/places/place-id) that corresponds to the associated item (String). Alternatively, you can supply your own custom Location ID.
96
96
  */
97
- item_location_id?: string;
97
+ location_id?: string;
98
98
  /**
99
99
  * The Item variant.
100
100
  */
@@ -109,6 +109,38 @@ export namespace FirebaseAnalyticsTypes {
109
109
  * See https://github.com/invertase/react-native-firebase/issues/4578#issuecomment-771703420 for more information
110
110
  */
111
111
  price?: number;
112
+ /**
113
+ * The affiliation of the item.
114
+ */
115
+ affiliation?: string;
116
+ /**
117
+ * The coupon associated with the item.
118
+ */
119
+ coupon?: string;
120
+ /**
121
+ * The creative name associated with the item.
122
+ */
123
+ creative_name?: string;
124
+ /**
125
+ * The creative slot associated with the item.
126
+ */
127
+ creative_slot?: string;
128
+ /**
129
+ * The discount applied to the item.
130
+ */
131
+ discount?: Currency;
132
+ /**
133
+ * The index of the item.
134
+ */
135
+ index?: number;
136
+ /**
137
+ * The promotion ID associated with the item.
138
+ */
139
+ promotion_id?: string;
140
+ /**
141
+ * The promotion name associated with the item.
142
+ */
143
+ promotion_name?: string;
112
144
  }
113
145
 
114
146
  export interface AddPaymentInfoEventParameters {
@@ -1723,23 +1755,51 @@ export namespace FirebaseAnalyticsTypes {
1723
1755
  setDefaultEventParameters(params?: { [key: string]: any }): Promise<void>;
1724
1756
 
1725
1757
  /**
1726
- * start privacy-sensitive on-device conversion management.
1758
+ * Start privacy-sensitive on-device conversion management.
1727
1759
  * This is iOS-only.
1728
- * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile
1760
+ * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile.
1729
1761
  *
1762
+ * @platform ios
1730
1763
  * @param emailAddress email address, properly formatted complete with domain name e.g, 'user@example.com'
1731
1764
  */
1732
1765
  initiateOnDeviceConversionMeasurementWithEmailAddress(emailAddress: string): Promise<void>;
1733
1766
 
1734
1767
  /**
1735
- * start privacy-sensitive on-device conversion management.
1768
+ * Start privacy-sensitive on-device conversion management.
1736
1769
  * This is iOS-only.
1737
- * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile
1770
+ * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile.
1771
+ * You need to pass the sha256-hashed of normalized email address to this function. See [this link](https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3#use-hashed-credentials) for more information.
1738
1772
  *
1773
+ * @platform ios
1774
+ * @param hashedEmailAddress sha256-hashed of normalized email address, properly formatted complete with domain name e.g, 'user@example.com'
1775
+ */
1776
+ initiateOnDeviceConversionMeasurementWithHashedEmailAddress(
1777
+ hashedEmailAddress: string,
1778
+ ): Poromise<void>;
1779
+
1780
+ /**
1781
+ * Start privacy-sensitive on-device conversion management.
1782
+ * This is iOS-only.
1783
+ * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile.
1784
+ *
1785
+ * @platform ios
1739
1786
  * @param phoneNumber phone number in E.164 format - that is a leading + sign, then up to 15 digits, no dashes or spaces.
1740
1787
  */
1741
1788
  initiateOnDeviceConversionMeasurementWithPhoneNumber(phoneNumber: string): Promise<void>;
1742
1789
 
1790
+ /**
1791
+ * Start privacy-sensitive on-device conversion management.
1792
+ * This is iOS-only.
1793
+ * This is a no-op if you do not include '$RNFirebaseAnalyticsGoogleAppMeasurementOnDeviceConversion = true' in your Podfile.
1794
+ * You need to pass the sha256-hashed of phone number in E.164 format. See [this link](https://firebase.google.com/docs/tutorials/ads-ios-on-device-measurement/step-3#use-hashed-credentials) for more information.
1795
+ *
1796
+ * @platform ios
1797
+ * @param hashedPhoneNumber sha256-hashed of normalized phone number in E.164 format - that is a leading + sign, then up to 15 digits, no dashes or spaces.
1798
+ */
1799
+ initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(
1800
+ hashedPhoneNumber: string,
1801
+ ): Promise<void>;
1802
+
1743
1803
  /**
1744
1804
  * For Consent Mode!
1745
1805
  *
package/lib/index.js CHANGED
@@ -40,58 +40,6 @@ import fallBackModule from './web/RNFBAnalyticsModule';
40
40
  import version from './version';
41
41
  import * as structs from './structs';
42
42
 
43
- export {
44
- getAnalytics,
45
- logEvent,
46
- setAnalyticsCollectionEnabled,
47
- setSessionTimeoutDuration,
48
- getAppInstanceId,
49
- getSessionId,
50
- setUserId,
51
- setUserProperty,
52
- setUserProperties,
53
- resetAnalyticsData,
54
- logAddPaymentInfo,
55
- logScreenView,
56
- logAddShippingInfo,
57
- logAddToCart,
58
- logAddToWishlist,
59
- logAppOpen,
60
- logBeginCheckout,
61
- logCampaignDetails,
62
- logEarnVirtualCurrency,
63
- logGenerateLead,
64
- logJoinGroup,
65
- logLevelEnd,
66
- logLevelStart,
67
- logLevelUp,
68
- logLogin,
69
- logPostScore,
70
- logSelectContent,
71
- logPurchase,
72
- logRefund,
73
- logRemoveFromCart,
74
- logSearch,
75
- logSelectItem,
76
- logSetCheckoutOption,
77
- logSelectPromotion,
78
- logShare,
79
- logSignUp,
80
- logSpendVirtualCurrency,
81
- logTutorialBegin,
82
- logTutorialComplete,
83
- logUnlockAchievement,
84
- logViewCart,
85
- logViewItem,
86
- logViewItemList,
87
- logViewPromotion,
88
- logViewSearchResults,
89
- setDefaultEventParameters,
90
- initiateOnDeviceConversionMeasurementWithEmailAddress,
91
- initiateOnDeviceConversionMeasurementWithPhoneNumber,
92
- setConsent,
93
- } from './modular/index';
94
-
95
43
  const ReservedEventNames = [
96
44
  'ad_activeview',
97
45
  'ad_click',
@@ -795,6 +743,22 @@ class FirebaseAnalyticsModule extends FirebaseModule {
795
743
  return this.native.initiateOnDeviceConversionMeasurementWithEmailAddress(emailAddress);
796
744
  }
797
745
 
746
+ initiateOnDeviceConversionMeasurementWithHashedEmailAddress(hashedEmailAddress) {
747
+ if (!isString(hashedEmailAddress)) {
748
+ throw new Error(
749
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedEmailAddress(*) 'hashedEmailAddress' expected a string value.",
750
+ );
751
+ }
752
+
753
+ if (!isIOS) {
754
+ return;
755
+ }
756
+
757
+ return this.native.initiateOnDeviceConversionMeasurementWithHashedEmailAddress(
758
+ hashedEmailAddress,
759
+ );
760
+ }
761
+
798
762
  initiateOnDeviceConversionMeasurementWithPhoneNumber(phoneNumber) {
799
763
  if (!isE164PhoneNumber(phoneNumber)) {
800
764
  throw new Error(
@@ -808,6 +772,28 @@ class FirebaseAnalyticsModule extends FirebaseModule {
808
772
 
809
773
  return this.native.initiateOnDeviceConversionMeasurementWithPhoneNumber(phoneNumber);
810
774
  }
775
+
776
+ initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(hashedPhoneNumber) {
777
+ if (isE164PhoneNumber(hashedPhoneNumber)) {
778
+ throw new Error(
779
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(*) 'hashedPhoneNumber' expected a sha256-hashed value of a phone number in E.164 format.",
780
+ );
781
+ }
782
+
783
+ if (!isString(hashedPhoneNumber)) {
784
+ throw new Error(
785
+ "firebase.analytics().initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(*) 'hashedPhoneNumber' expected a string value.",
786
+ );
787
+ }
788
+
789
+ if (!isIOS) {
790
+ return;
791
+ }
792
+
793
+ return this.native.initiateOnDeviceConversionMeasurementWithHashedPhoneNumber(
794
+ hashedPhoneNumber,
795
+ );
796
+ }
811
797
  }
812
798
 
813
799
  // import { SDK_VERSION } from '@react-native-firebase/analytics';
@@ -826,6 +812,8 @@ export default createModuleNamespace({
826
812
  ModuleClass: FirebaseAnalyticsModule,
827
813
  });
828
814
 
815
+ export * from './modular/index';
816
+
829
817
  // import analytics, { firebase } from '@react-native-firebase/analytics';
830
818
  // analytics().logEvent(...);
831
819
  // firebase.analytics().logEvent(...);