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.
- package/LICENSE +20 -0
- package/README.md +31 -0
- package/android/build.gradle +118 -0
- package/android/gradle.properties +7 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/mappinteligenceplugin/ConfigAdapter.kt +25 -0
- package/android/src/main/java/com/mappinteligenceplugin/MappinteligencePluginModule.kt +489 -0
- package/android/src/main/java/com/mappinteligenceplugin/MappinteligencePluginPackage.kt +23 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/ActionEventMapper.kt +26 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/CampaignActionMapper.kt +17 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/CampaignParametersMapper.kt +28 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/ECommerceParametersMapper.kt +59 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/EventParametersMapper.kt +17 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/ExceptionTypeMapper.kt +13 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/Mapper.kt +5 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/MediaEventMapper.kt +43 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/MediaParametersMapper.kt +29 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/PageParametersMapper.kt +23 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/ProductMapper.kt +29 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/SessionParametersMapper.kt +16 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/UserCategoriesMapper.kt +49 -0
- package/android/src/main/java/com/mappinteligenceplugin/mapper/Util.kt +75 -0
- package/ios/MappinteligencePlugin.h +11 -0
- package/ios/MappinteligencePlugin.mm +533 -0
- package/lib/commonjs/Converters.js +168 -0
- package/lib/commonjs/Converters.js.map +1 -0
- package/lib/commonjs/DataTypes.js +71 -0
- package/lib/commonjs/DataTypes.js.map +1 -0
- package/lib/commonjs/GlobalErrorHandler.js +51 -0
- package/lib/commonjs/GlobalErrorHandler.js.map +1 -0
- package/lib/commonjs/UseWebTracking.js +114 -0
- package/lib/commonjs/UseWebTracking.js.map +1 -0
- package/lib/commonjs/global.d.js +6 -0
- package/lib/commonjs/global.d.js.map +1 -0
- package/lib/commonjs/index.js +401 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/promiseRejectionHandler.js +50 -0
- package/lib/commonjs/promiseRejectionHandler.js.map +1 -0
- package/lib/module/Converters.js +155 -0
- package/lib/module/Converters.js.map +1 -0
- package/lib/module/DataTypes.js +65 -0
- package/lib/module/DataTypes.js.map +1 -0
- package/lib/module/GlobalErrorHandler.js +44 -0
- package/lib/module/GlobalErrorHandler.js.map +1 -0
- package/lib/module/UseWebTracking.js +107 -0
- package/lib/module/UseWebTracking.js.map +1 -0
- package/lib/module/global.d.js +4 -0
- package/lib/module/global.d.js.map +1 -0
- package/lib/module/index.js +321 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/promiseRejectionHandler.js +44 -0
- package/lib/module/promiseRejectionHandler.js.map +1 -0
- package/lib/typescript/src/Converters.d.ts +10 -0
- package/lib/typescript/src/Converters.d.ts.map +1 -0
- package/lib/typescript/src/DataTypes.d.ts +151 -0
- package/lib/typescript/src/DataTypes.d.ts.map +1 -0
- package/lib/typescript/src/GlobalErrorHandler.d.ts +3 -0
- package/lib/typescript/src/GlobalErrorHandler.d.ts.map +1 -0
- package/lib/typescript/src/UseWebTracking.d.ts +13 -0
- package/lib/typescript/src/UseWebTracking.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +201 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/promiseRejectionHandler.d.ts +3 -0
- package/lib/typescript/src/promiseRejectionHandler.d.ts.map +1 -0
- package/mapp-intelligence-reactnative-plugin.podspec +25 -0
- package/package.json +163 -0
- package/src/Converters.tsx +219 -0
- package/src/DataTypes.tsx +168 -0
- package/src/GlobalErrorHandler.tsx +58 -0
- package/src/UseWebTracking.tsx +135 -0
- package/src/global.d.ts +24 -0
- package/src/index.tsx +410 -0
- 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;
|
package/src/global.d.ts
ADDED
|
@@ -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 {};
|