mapp-intelligence-reactnative-plugin 1.0.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.
Files changed (74) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +31 -0
  3. package/android/build.gradle +118 -0
  4. package/android/gradle.properties +7 -0
  5. package/android/src/main/AndroidManifest.xml +3 -0
  6. package/android/src/main/AndroidManifestNew.xml +2 -0
  7. package/android/src/main/java/com/mappinteligenceplugin/ConfigAdapter.kt +25 -0
  8. package/android/src/main/java/com/mappinteligenceplugin/MappinteligencePluginModule.kt +489 -0
  9. package/android/src/main/java/com/mappinteligenceplugin/MappinteligencePluginPackage.kt +23 -0
  10. package/android/src/main/java/com/mappinteligenceplugin/mapper/ActionEventMapper.kt +26 -0
  11. package/android/src/main/java/com/mappinteligenceplugin/mapper/CampaignActionMapper.kt +17 -0
  12. package/android/src/main/java/com/mappinteligenceplugin/mapper/CampaignParametersMapper.kt +28 -0
  13. package/android/src/main/java/com/mappinteligenceplugin/mapper/ECommerceParametersMapper.kt +59 -0
  14. package/android/src/main/java/com/mappinteligenceplugin/mapper/EventParametersMapper.kt +17 -0
  15. package/android/src/main/java/com/mappinteligenceplugin/mapper/ExceptionTypeMapper.kt +13 -0
  16. package/android/src/main/java/com/mappinteligenceplugin/mapper/Mapper.kt +5 -0
  17. package/android/src/main/java/com/mappinteligenceplugin/mapper/MediaEventMapper.kt +43 -0
  18. package/android/src/main/java/com/mappinteligenceplugin/mapper/MediaParametersMapper.kt +29 -0
  19. package/android/src/main/java/com/mappinteligenceplugin/mapper/PageParametersMapper.kt +23 -0
  20. package/android/src/main/java/com/mappinteligenceplugin/mapper/ProductMapper.kt +29 -0
  21. package/android/src/main/java/com/mappinteligenceplugin/mapper/SessionParametersMapper.kt +16 -0
  22. package/android/src/main/java/com/mappinteligenceplugin/mapper/UserCategoriesMapper.kt +49 -0
  23. package/android/src/main/java/com/mappinteligenceplugin/mapper/Util.kt +75 -0
  24. package/ios/MappinteligencePlugin.h +11 -0
  25. package/ios/MappinteligencePlugin.mm +533 -0
  26. package/lib/commonjs/Converters.js +168 -0
  27. package/lib/commonjs/Converters.js.map +1 -0
  28. package/lib/commonjs/DataTypes.js +71 -0
  29. package/lib/commonjs/DataTypes.js.map +1 -0
  30. package/lib/commonjs/GlobalErrorHandler.js +51 -0
  31. package/lib/commonjs/GlobalErrorHandler.js.map +1 -0
  32. package/lib/commonjs/UseWebTracking.js +114 -0
  33. package/lib/commonjs/UseWebTracking.js.map +1 -0
  34. package/lib/commonjs/global.d.js +6 -0
  35. package/lib/commonjs/global.d.js.map +1 -0
  36. package/lib/commonjs/index.js +401 -0
  37. package/lib/commonjs/index.js.map +1 -0
  38. package/lib/commonjs/promiseRejectionHandler.js +50 -0
  39. package/lib/commonjs/promiseRejectionHandler.js.map +1 -0
  40. package/lib/module/Converters.js +155 -0
  41. package/lib/module/Converters.js.map +1 -0
  42. package/lib/module/DataTypes.js +65 -0
  43. package/lib/module/DataTypes.js.map +1 -0
  44. package/lib/module/GlobalErrorHandler.js +44 -0
  45. package/lib/module/GlobalErrorHandler.js.map +1 -0
  46. package/lib/module/UseWebTracking.js +107 -0
  47. package/lib/module/UseWebTracking.js.map +1 -0
  48. package/lib/module/global.d.js +4 -0
  49. package/lib/module/global.d.js.map +1 -0
  50. package/lib/module/index.js +321 -0
  51. package/lib/module/index.js.map +1 -0
  52. package/lib/module/promiseRejectionHandler.js +44 -0
  53. package/lib/module/promiseRejectionHandler.js.map +1 -0
  54. package/lib/typescript/src/Converters.d.ts +10 -0
  55. package/lib/typescript/src/Converters.d.ts.map +1 -0
  56. package/lib/typescript/src/DataTypes.d.ts +151 -0
  57. package/lib/typescript/src/DataTypes.d.ts.map +1 -0
  58. package/lib/typescript/src/GlobalErrorHandler.d.ts +3 -0
  59. package/lib/typescript/src/GlobalErrorHandler.d.ts.map +1 -0
  60. package/lib/typescript/src/UseWebTracking.d.ts +13 -0
  61. package/lib/typescript/src/UseWebTracking.d.ts.map +1 -0
  62. package/lib/typescript/src/index.d.ts +201 -0
  63. package/lib/typescript/src/index.d.ts.map +1 -0
  64. package/lib/typescript/src/promiseRejectionHandler.d.ts +3 -0
  65. package/lib/typescript/src/promiseRejectionHandler.d.ts.map +1 -0
  66. package/mapp-intelligence-reactnative-plugin.podspec +25 -0
  67. package/package.json +163 -0
  68. package/src/Converters.tsx +219 -0
  69. package/src/DataTypes.tsx +168 -0
  70. package/src/GlobalErrorHandler.tsx +58 -0
  71. package/src/UseWebTracking.tsx +135 -0
  72. package/src/global.d.ts +24 -0
  73. package/src/index.tsx +410 -0
  74. package/src/promiseRejectionHandler.tsx +54 -0
@@ -0,0 +1,219 @@
1
+ import type {
2
+ CampaignParameters,
3
+ EcommerceParameters,
4
+ EventParameters,
5
+ MediaEvent,
6
+ MediaParameteres,
7
+ PageParameters,
8
+ SessionParameters,
9
+ UserCategories,
10
+ } from './DataTypes';
11
+
12
+ //MARK: methods for converting objects
13
+ export function convertUserCategories(userCategories?: UserCategories | null) {
14
+ if (userCategories == null) {
15
+ return null;
16
+ }
17
+ console.log('convertUserCategories');
18
+ const birthday = userCategories?.birthday;
19
+ const categories = userCategories?.customCategories;
20
+
21
+ const userCategorisesDict: Object = {
22
+ birthday:
23
+ birthday != null
24
+ ? { day: birthday.day, month: birthday.month, year: birthday.year }
25
+ : null,
26
+ city: userCategories?.city,
27
+ country: userCategories?.country,
28
+ emailAddress: userCategories?.emailAddress,
29
+ emailReceiverId: userCategories?.emailReceiverId,
30
+ firstName: userCategories?.firstName,
31
+ gender: userCategories?.gender,
32
+ customerId: userCategories?.customerId,
33
+ lastName: userCategories?.lastName,
34
+ newsletterSubscribed: userCategories?.newsletterSubscribed,
35
+ phoneNumber: userCategories?.phoneNumber,
36
+ street: userCategories?.street,
37
+ streetNumber: userCategories?.streetNumber,
38
+ zipCode: userCategories?.zipCode,
39
+ customCategories:
40
+ categories != null ? Object.fromEntries(categories.entries()) : null,
41
+ };
42
+ return userCategorisesDict;
43
+ }
44
+
45
+ export function convertPageParameters(
46
+ pageParameters?: PageParameters | null
47
+ ): Object | null {
48
+ console.log('convertPageParameters');
49
+ if (pageParameters == null) {
50
+ return null;
51
+ }
52
+
53
+ const params = pageParameters?.params;
54
+ const cat = pageParameters?.categories;
55
+
56
+ const page: Object = {
57
+ params: params != null ? Object.fromEntries(params.entries()) : {},
58
+ categories: cat != null ? Object.fromEntries(cat) : {},
59
+ searchTerm: pageParameters?.searchTerm,
60
+ };
61
+
62
+ return page;
63
+ }
64
+
65
+ export function convertSessionParamters(
66
+ sessionParamaters?: SessionParameters | null
67
+ ): Object | null {
68
+ console.log('convertSessionParamters');
69
+ if (sessionParamaters == null) {
70
+ return null;
71
+ }
72
+ const data = sessionParamaters?.parameters;
73
+ return data != null ? Object.fromEntries(data.entries()) : {};
74
+ }
75
+
76
+ export function convertEcommerceParameters(
77
+ ecommerceParameters?: EcommerceParameters | null
78
+ ): Object | null {
79
+ console.log('convertEcommerceParameters');
80
+ if (ecommerceParameters == null) {
81
+ return null;
82
+ }
83
+
84
+ let products: Object[] = [];
85
+ ecommerceParameters.products?.map((item) => {
86
+ let categories = item.categories;
87
+ let ecommercParams = item.ecommerceParameters;
88
+ products.push({
89
+ name: item?.name,
90
+ cost: item.cost,
91
+ quantity: item.quantity,
92
+ productAdvertiseID: item.productAdvertiseID,
93
+ productSoldOut: item.productSoldOut,
94
+ productVariant: item.productVariant,
95
+ categories:
96
+ categories != null ? Object.fromEntries(categories.entries()) : {},
97
+ ecommerceParameters:
98
+ ecommercParams != null
99
+ ? Object.fromEntries(ecommercParams.entries())
100
+ : {},
101
+ });
102
+ });
103
+
104
+ const customParams = ecommerceParameters.customParameters;
105
+
106
+ const ecommerce: Object = {
107
+ products: products,
108
+ status: ecommerceParameters.status,
109
+ currency: ecommerceParameters.currency,
110
+ orderID: ecommerceParameters.orderID,
111
+ orderValue: ecommerceParameters.orderValue,
112
+ returningOrNewCustomer: ecommerceParameters.returningOrNewCustomer,
113
+ returnValue: ecommerceParameters.returnValue,
114
+ cancellationValue: ecommerceParameters.cancellationValue,
115
+ couponValue: ecommerceParameters.couponValue,
116
+ paymentMethod: ecommerceParameters.paymentMethod,
117
+ shippingServiceProvider: ecommerceParameters.shippingServiceProvider,
118
+ shippingSpeed: ecommerceParameters.shippingSpeed,
119
+ shippingCost: ecommerceParameters.shippingCost,
120
+ markUp: ecommerceParameters.markUp,
121
+ orderStatus: ecommerceParameters.orderStatus,
122
+ customParameters:
123
+ customParams != null ? Object.fromEntries(customParams.entries()) : {},
124
+ };
125
+
126
+ return ecommerce;
127
+ }
128
+
129
+ export function convertCampaignParameters(
130
+ campaignParameters?: CampaignParameters | null
131
+ ): Object | null {
132
+ console.log('convertCapaignParameters');
133
+ if (campaignParameters == null) {
134
+ return null;
135
+ }
136
+
137
+ const params = campaignParameters?.customParameters;
138
+
139
+ const campaign: Object = {
140
+ campaignId: campaignParameters?.campaignId,
141
+ action: campaignParameters?.action,
142
+ mediaCode: campaignParameters?.mediaCode,
143
+ oncePerSession: campaignParameters?.oncePerSession,
144
+ customParameters:
145
+ params != null ? Object.fromEntries(params.entries()) : {},
146
+ };
147
+ return campaign;
148
+ }
149
+
150
+ export function convertEventParameters(
151
+ event?: EventParameters | null
152
+ ): Object | null {
153
+ if (event == null) {
154
+ return null;
155
+ }
156
+
157
+ const customParams =
158
+ event.customParameters != null
159
+ ? Object.fromEntries(event.customParameters?.entries())
160
+ : null;
161
+
162
+ const eventParams: Object = {
163
+ customParameters: customParams,
164
+ };
165
+
166
+ return eventParams;
167
+ }
168
+
169
+ export function convertMediaParameters(
170
+ mediaParam?: MediaParameteres | null
171
+ ): Object | null {
172
+ if (mediaParam == null) {
173
+ return null;
174
+ }
175
+
176
+ const params: Object = {
177
+ name: mediaParam?.name,
178
+ action: mediaParam?.action,
179
+ position: mediaParam?.position,
180
+ duration: mediaParam?.duration,
181
+ bandwith: mediaParam?.bandwith,
182
+ soundIsMuted: mediaParam?.soundIsMuted,
183
+ soundVolume: mediaParam?.soundVolume,
184
+ customCategories:
185
+ mediaParam?.customCategories != null
186
+ ? Object.fromEntries(mediaParam.customCategories?.entries())
187
+ : null,
188
+ };
189
+
190
+ return params;
191
+ }
192
+
193
+ export function convertMediaEvent(
194
+ mediaEvent?: MediaEvent | null
195
+ ): Object | null {
196
+ if (mediaEvent == null) {
197
+ return null;
198
+ }
199
+
200
+ const custom =
201
+ mediaEvent.customParameters != null
202
+ ? Object.fromEntries(mediaEvent?.customParameters?.entries())
203
+ : null;
204
+ const eCommerce = convertEcommerceParameters(mediaEvent.eCommerceParameters);
205
+ const session = convertSessionParamters(mediaEvent.sessionParameters);
206
+ const event = convertEventParameters(mediaEvent.eventParameters);
207
+ const mediaParams = convertMediaParameters(mediaEvent.parameters);
208
+
209
+ const data: Object = {
210
+ pageName: mediaEvent.pageName,
211
+ parameters: mediaParams,
212
+ eventParameters: event,
213
+ sessionParameters: session,
214
+ eCommerceParameters: eCommerce,
215
+ customParameters: custom,
216
+ };
217
+
218
+ return data;
219
+ }
@@ -0,0 +1,168 @@
1
+ interface PartialPageParameters {
2
+ searchTerm?: string | null;
3
+ params?: Map<number, string> | null;
4
+ categories?: Map<number, string> | null;
5
+ }
6
+ export type PageParameters = Required<PartialPageParameters>;
7
+
8
+ interface PartialBirthday {
9
+ day: number;
10
+ month: number;
11
+ year: number;
12
+ }
13
+ export type MIBirthday = Required<PartialBirthday>;
14
+
15
+ export enum MIGender {
16
+ unknown = 1,
17
+ male = 2,
18
+ female = 3,
19
+ }
20
+
21
+ interface PartialUserCategoris {
22
+ birthday?: MIBirthday | null;
23
+ city?: string | null;
24
+ country?: string | null;
25
+ emailAddress?: string | null;
26
+ emailReceiverId?: string | null;
27
+ firstName?: string | null;
28
+ gender?: MIGender | MIGender.unknown;
29
+ customerId?: string | null;
30
+ lastName?: string | null;
31
+ newsletterSubscribed?: boolean | null;
32
+ phoneNumber?: string | null;
33
+ street?: string | null;
34
+ streetNumber?: string | null;
35
+ zipCode?: string | null | undefined;
36
+ customCategories?: Map<number, string> | null;
37
+ }
38
+
39
+ export type UserCategories = PartialUserCategoris;
40
+
41
+ interface ParticularEcommerceParameters {
42
+ products?: MIProduct[] | null;
43
+ status?: MIStatus | null;
44
+ currency?: string | null;
45
+ orderID?: string | null;
46
+ orderValue?: number | null;
47
+ returningOrNewCustomer?: string | null;
48
+ returnValue?: number | null;
49
+ cancellationValue?: number | null;
50
+ couponValue?: number | null;
51
+ paymentMethod?: string | null;
52
+ shippingServiceProvider?: string | null;
53
+ shippingSpeed?: string | null;
54
+ shippingCost?: number | null;
55
+ markUp?: number | null;
56
+ orderStatus?: string | null;
57
+ customParameters?: Map<number, string> | null;
58
+ }
59
+ export type EcommerceParameters = Required<ParticularEcommerceParameters>;
60
+
61
+ export interface MIProduct {
62
+ name?: string | null;
63
+ cost?: number | null;
64
+ quantity?: number | null;
65
+ productAdvertiseID?: number | null;
66
+ productSoldOut?: boolean | null;
67
+ productVariant?: string | null;
68
+ categories?: Map<number, string> | null;
69
+ ecommerceParameters?: Map<string, string> | null;
70
+ }
71
+
72
+ export enum MIStatus {
73
+ noneStatus = 0,
74
+ addedToBasket = 1,
75
+ purchased = 2,
76
+ viewed = 3,
77
+ deletedFromBasket = 4,
78
+ addedToWishlist = 5,
79
+ deletedFromWishlist = 6,
80
+ checkout = 7,
81
+ }
82
+
83
+ export enum MIAction {
84
+ click = 1,
85
+ view = 2,
86
+ }
87
+
88
+ interface ParticularCampaignParameters {
89
+ campaignId?: string | null;
90
+ action?: MIAction | null;
91
+ mediaCode?: string | null;
92
+ oncePerSession?: boolean | null;
93
+ customParameters?: Map<number, string> | null;
94
+ }
95
+ export type CampaignParameters = Required<ParticularCampaignParameters>;
96
+
97
+ interface ParticularSessionParameters {
98
+ parameters?: Map<number, string> | null;
99
+ }
100
+ export type SessionParameters = Required<ParticularSessionParameters>;
101
+
102
+ export interface EventParameters {
103
+ customParameters: Map<number, string>;
104
+ }
105
+
106
+ export enum MediaParam {
107
+ media_category = 'mg',
108
+ media_action = 'mk',
109
+ media_position = 'mt1',
110
+ media_duration = 'mt2',
111
+ bandwidth = 'bw',
112
+ volume = 'vol',
113
+ mute = 'mut',
114
+ name = 'mi',
115
+ }
116
+
117
+ export interface MediaParameteres {
118
+ name: string;
119
+ action: string;
120
+ position: number;
121
+ duration: number;
122
+ bandwith?: number | null;
123
+ soundIsMuted?: boolean | null;
124
+ soundVolume?: number | null;
125
+ customCategories: Map<number, string> | null;
126
+ }
127
+
128
+ export interface MediaEvent {
129
+ pageName: string;
130
+ parameters: MediaParameteres | null;
131
+ eventParameters?: EventParameters | null;
132
+ sessionParameters?: SessionParameters | null;
133
+ eCommerceParameters?: EcommerceParameters | null;
134
+ customParameters?: Map<number, string> | null;
135
+ }
136
+
137
+ export enum ExceptionType {
138
+ none = 0,
139
+ uncaught = 1,
140
+ caught = 2,
141
+ custom = 3,
142
+ all = 4,
143
+ uncaught_and_custom = 5,
144
+ uncaught_and_caught = 6,
145
+ custom_and_caught = 7,
146
+ }
147
+
148
+ export enum MediaAction {
149
+ init = 'init',
150
+ play = 'play',
151
+ pause = 'pause',
152
+ stop = 'stop',
153
+ seek = 'seek',
154
+ pos = 'pos',
155
+ eof = 'eof',
156
+ }
157
+
158
+ export enum LogLevel {
159
+ all = 1, // All logs of the above.
160
+ debug = 2, // The lowest priority that you would normally log, and purely
161
+ // informational in nature.
162
+ warning = 3, // Something is missing and might fail if not corrected
163
+ error = 4, // Something has failed.
164
+ fault = 5, // A failure in a key system.
165
+ info = 6, // Informational logs for updating configuration or migrating from
166
+ // older versions of the library.
167
+ none = 7, // None of the logs.
168
+ }
@@ -0,0 +1,58 @@
1
+ import { trackException } from './index';
2
+ // import {
3
+ // getUnhandledPromiseRejectionTracker,
4
+ // setUnhandledPromiseRejectionTracker,
5
+ // } from './promiseRejectionHandler';
6
+ const {
7
+ polyfillGlobal,
8
+ } = require('react-native/Libraries/Utilities/PolyfillFunctions');
9
+ const Promise = require('promise/setimmediate/es6-extensions');
10
+ const tracking = require('promise/setimmediate/rejection-tracking');
11
+
12
+ export type GlobalErrorHandler = (
13
+ error: any,
14
+ isFatal: boolean | undefined
15
+ ) => void;
16
+
17
+ var onErrorCallback: ((e: Error, isFatal: Boolean) => {}) | undefined | null =
18
+ null;
19
+
20
+ const defaultErrorHandler: GlobalErrorHandler = (error, isFatal) => {
21
+ try {
22
+ trackException(error, error.stackTrace);
23
+ console.log('GLOBAL ERROR HANDLER: ', isFatal, error);
24
+ } catch (err) {
25
+ console.error(err);
26
+ } finally {
27
+ onErrorCallback?.(error, isFatal ?? false);
28
+ }
29
+ };
30
+
31
+ export const setGlobalErrorHandler = (
32
+ errorCallback?: ((e: Error, isFatal: Boolean) => {}) | undefined | null,
33
+ errorHandler: GlobalErrorHandler = defaultErrorHandler
34
+ ): void => {
35
+ onErrorCallback = errorCallback;
36
+
37
+ polyfillGlobal('Promise', () => {
38
+ tracking.enable({
39
+ allRejections: true,
40
+ onUnhandled: (_: number, error: unknown) => {
41
+ errorHandler(error, false);
42
+ },
43
+ });
44
+
45
+ return Promise;
46
+ });
47
+
48
+ ErrorUtils.setGlobalHandler(errorHandler);
49
+ // const prevTracker = getUnhandledPromiseRejectionTracker();
50
+
51
+ // setUnhandledPromiseRejectionTracker((id: any, error: any) => {
52
+ // console.warn('Unhandled promise rejection!', id, error);
53
+ // if (prevTracker !== undefined) {
54
+ // //prevTracker(id, error);
55
+ // errorHandler(error, false);
56
+ // }
57
+ // });
58
+ };
@@ -0,0 +1,135 @@
1
+ // useWebTracking.tsx
2
+ import { useRef, useCallback } from 'react';
3
+ import {
4
+ trackPageWithCustomData,
5
+ trackAction,
6
+ trackException,
7
+ getEverId,
8
+ } from './index';
9
+ //import * as MappIntelligencePlugin from 'react-native-mappinteligence-plugin';
10
+ import type { WebViewMessageEvent } from 'react-native-webview';
11
+ import { WebView } from 'react-native-webview';
12
+
13
+ const runOnce = `
14
+ var meta = document.createElement('meta');
15
+ meta.setAttribute('name', 'viewport');
16
+ meta.setAttribute('content', 'width=device-width, height=device-height, initial-scale=0.85, maximum-scale=1.0, user-scalable=no');
17
+ document.getElementsByTagName('head')[0].appendChild(meta);
18
+
19
+ window.WebtrekkAndroidWebViewCallback = {};
20
+
21
+ window.WebtrekkAndroidWebViewCallback.trackCustomPage = function(pageName,param){
22
+ window.ReactNativeWebView.postMessage(JSON.stringify({ 'method': 'trackCustomPage', 'name':pageName, 'params':param }));
23
+ }
24
+
25
+ window.WebtrekkAndroidWebViewCallback.trackCustomEvent = function(eventName, param){
26
+ window.ReactNativeWebView.postMessage(JSON.stringify({ 'method': 'trackCustomEvent', 'name':eventName, 'params':param }));
27
+ }
28
+
29
+ window.WebtrekkAndroidWebViewCallback.getEverId = function(){
30
+ window.ReactNativeWebView.postMessage(JSON.stringify({ 'method': 'getEverId', 'name':'webtrekkApplicationEverId', 'params': window.webtrekkApplicationEverId }));
31
+ }
32
+ `;
33
+ const injectEverIdScript = `window.webtrekkApplicationEverId = '%everId%' ; true; `;
34
+
35
+ type OnMessage = (data: any) => void;
36
+
37
+ type OnLoad = () => void;
38
+
39
+ const useWebTracking = (
40
+ onMessage?: OnMessage | null,
41
+ onLoad?: OnLoad | null
42
+ ) => {
43
+ const webViewRef = useRef<WebView>(null);
44
+
45
+ const handleMessage = useCallback(
46
+ (event: WebViewMessageEvent) => {
47
+ try {
48
+ const message = JSON.parse(event.nativeEvent.data);
49
+ const method = message.method;
50
+ const name = message.name;
51
+ const params = message.params;
52
+
53
+ console.log(method, name, params);
54
+
55
+ if (method === 'trackCustomPage') {
56
+ trackCustomPage(name, params);
57
+ } else if (method === 'trackCustomEvent') {
58
+ trackCustomEvent(name, params);
59
+ }
60
+ } catch (error) {
61
+ console.error('Error parsing message from WebView', error);
62
+ }
63
+ onMessage?.(event.nativeEvent.data);
64
+ },
65
+ [onMessage]
66
+ );
67
+
68
+ const trackCustomPage = (name: string, params: any) => {
69
+ try {
70
+ const parameters = getJson(params) ?? new Map();
71
+ console.log('Page Name: ', name, '; Params: ', parameters);
72
+ trackPageWithCustomData(name, parameters);
73
+ } catch (error) {
74
+ console.error(error);
75
+ }
76
+ };
77
+
78
+ const trackCustomEvent = (name: string, params: any) => {
79
+ try {
80
+ const parameters = getJson(params);
81
+ console.log('Event Name: ', name, '; Params: ', parameters);
82
+ trackAction(name, parameters, null, null, null, null);
83
+ } catch (error) {
84
+ console.error(error);
85
+ }
86
+ };
87
+
88
+ const getJson = (data?: any | null): any => {
89
+ try {
90
+ if (data) {
91
+ const json = JSON.parse(data);
92
+ return json;
93
+ }
94
+ return null;
95
+ } catch (error) {
96
+ return null;
97
+ }
98
+ };
99
+
100
+ const handleLoad = useCallback(() => {
101
+ getEverId()
102
+ .then((everId: string) => {
103
+ if (webViewRef.current) {
104
+ const scripts = injectEverIdScript.replace('%everId%', everId);
105
+ webViewRef.current.injectJavaScript(scripts);
106
+ console.log('Injected scripts: ', scripts);
107
+
108
+ setTimeout(() => {
109
+ webViewRef.current?.injectJavaScript(
110
+ `window.WebtrekkAndroidWebViewCallback.getEverId()`
111
+ );
112
+ }, 1000);
113
+ }
114
+ })
115
+ .catch((error: Error) => {
116
+ console.error(error);
117
+ trackException(error);
118
+ });
119
+
120
+ if (onLoad) {
121
+ onLoad();
122
+ }
123
+ }, []);
124
+
125
+ const getInjectedJavaScript = (script?: string | undefined | null) => {
126
+ if (script) {
127
+ return runOnce + '; true; ' + script;
128
+ }
129
+ return runOnce;
130
+ };
131
+
132
+ return { webViewRef, handleMessage, handleLoad, getInjectedJavaScript };
133
+ };
134
+
135
+ export default useWebTracking;
@@ -0,0 +1,24 @@
1
+ // src/global.d.ts
2
+ declare global {
3
+ interface GlobalEventHandlersEventMap {
4
+ onunhandledrejection: PromiseRejectionEvent;
5
+ }
6
+
7
+ interface PromiseRejectionEvent extends Event {
8
+ promise: Promise<any>;
9
+ reason: any;
10
+ }
11
+
12
+ interface Global {
13
+ onununhandledrejection?: (event: PromiseRejectionEvent) => void;
14
+ }
15
+
16
+ const global: Global;
17
+ }
18
+
19
+ type Tracker = (id: number, error: unknown) => void;
20
+
21
+ export function getUnhandledPromiseRejectionTracker(): Tracker | undefined;
22
+ export function setUnhandledPromiseRejectionTracker(tracker: Tracker): void;
23
+
24
+ export {};