@mparticle/web-facebook-kit 2.2.0 → 2.3.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/dist/FacebookEventForwarder.common.js +393 -366
- package/dist/FacebookEventForwarder.esm.js +393 -366
- package/package.json +9 -6
|
@@ -34,446 +34,473 @@ var isobject$1 = getCjsExportFromNamespace(isobject);
|
|
|
34
34
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
35
35
|
// See the License for the specific language governing permissions and
|
|
36
36
|
// limitations under the License.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
var name = 'Facebook',
|
|
40
|
-
moduleId = 45,
|
|
41
|
-
MessageType = {
|
|
42
|
-
SessionStart: 1,
|
|
43
|
-
SessionEnd: 2,
|
|
44
|
-
PageView: 3,
|
|
45
|
-
PageEvent: 4,
|
|
46
|
-
CrashReport: 5,
|
|
47
|
-
OptOut: 6,
|
|
48
|
-
Commerce: 16,
|
|
49
|
-
},
|
|
50
|
-
IdentityType = {
|
|
51
|
-
Other: 0,
|
|
52
|
-
CustomerId: 1,
|
|
53
|
-
Facebook: 2,
|
|
54
|
-
Twitter: 3,
|
|
55
|
-
Google: 4,
|
|
56
|
-
Microsoft: 5,
|
|
57
|
-
Yahoo: 6,
|
|
58
|
-
Email: 7,
|
|
59
|
-
FacebookCustomAudienceId: 9,
|
|
60
|
-
Other2: 10,
|
|
61
|
-
Other3: 11,
|
|
62
|
-
Other4: 12,
|
|
63
|
-
Other5: 13,
|
|
64
|
-
Other6: 14,
|
|
65
|
-
Other7: 15,
|
|
66
|
-
Other8: 16,
|
|
67
|
-
Other9: 17,
|
|
68
|
-
Other10: 18,
|
|
69
|
-
MobileNumber: 19,
|
|
70
|
-
PhoneNumber2: 20,
|
|
71
|
-
PhoneNumber3: 21,
|
|
72
|
-
},
|
|
73
|
-
SupportedCommerceTypes = [],
|
|
74
|
-
// Standard FB Event Names from https://developers.facebook.com/docs/facebook-pixel/reference#standard-events
|
|
75
|
-
ADD_TO_CART_EVENT_NAME = 'AddToCart',
|
|
76
|
-
ADD_TO_WISHLIST_EVENT_NAME = 'AddToWishlist',
|
|
77
|
-
CHECKOUT_EVENT_NAME = 'InitiateCheckout',
|
|
78
|
-
PAGE_VIEW_EVENT_NAME = 'PageView',
|
|
79
|
-
PURCHASE_EVENT_NAME = 'Purchase',
|
|
80
|
-
REMOVE_FROM_CART_EVENT_NAME = 'RemoveFromCart',
|
|
81
|
-
VIEW_CONTENT_EVENT_NAME = 'ViewContent',
|
|
82
|
-
constructor = function () {
|
|
83
|
-
var self = this,
|
|
84
|
-
isInitialized = false,
|
|
85
|
-
reportingService = null,
|
|
86
|
-
settings,
|
|
87
|
-
productAttributeMapping;
|
|
88
|
-
|
|
89
|
-
self.name = name;
|
|
90
|
-
|
|
91
|
-
function initForwarder(forwarderSettings, service, testMode, trackerId, userAttributes, userIdentities) {
|
|
92
|
-
settings = forwarderSettings;
|
|
93
|
-
reportingService = service;
|
|
94
|
-
|
|
95
|
-
SupportedCommerceTypes = [
|
|
96
|
-
mParticle.ProductActionType.Checkout,
|
|
97
|
-
mParticle.ProductActionType.Purchase,
|
|
98
|
-
mParticle.ProductActionType.AddToCart,
|
|
99
|
-
mParticle.ProductActionType.RemoveFromCart,
|
|
100
|
-
mParticle.ProductActionType.AddToWishlist,
|
|
101
|
-
mParticle.ProductActionType.ViewDetail
|
|
102
|
-
];
|
|
103
37
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
38
|
+
|
|
39
|
+
var name = 'Facebook',
|
|
40
|
+
moduleId = 45,
|
|
41
|
+
MessageType = {
|
|
42
|
+
SessionStart: 1,
|
|
43
|
+
SessionEnd: 2,
|
|
44
|
+
PageView: 3,
|
|
45
|
+
PageEvent: 4,
|
|
46
|
+
CrashReport: 5,
|
|
47
|
+
OptOut: 6,
|
|
48
|
+
Commerce: 16,
|
|
49
|
+
},
|
|
50
|
+
IdentityType = {
|
|
51
|
+
Other: 0,
|
|
52
|
+
CustomerId: 1,
|
|
53
|
+
Facebook: 2,
|
|
54
|
+
Twitter: 3,
|
|
55
|
+
Google: 4,
|
|
56
|
+
Microsoft: 5,
|
|
57
|
+
Yahoo: 6,
|
|
58
|
+
Email: 7,
|
|
59
|
+
FacebookCustomAudienceId: 9,
|
|
60
|
+
Other2: 10,
|
|
61
|
+
Other3: 11,
|
|
62
|
+
Other4: 12,
|
|
63
|
+
Other5: 13,
|
|
64
|
+
Other6: 14,
|
|
65
|
+
Other7: 15,
|
|
66
|
+
Other8: 16,
|
|
67
|
+
Other9: 17,
|
|
68
|
+
Other10: 18,
|
|
69
|
+
MobileNumber: 19,
|
|
70
|
+
PhoneNumber2: 20,
|
|
71
|
+
PhoneNumber3: 21,
|
|
72
|
+
},
|
|
73
|
+
SupportedCommerceTypes = [],
|
|
74
|
+
// Standard FB Event Names from https://developers.facebook.com/docs/facebook-pixel/reference#standard-events
|
|
75
|
+
ADD_TO_CART_EVENT_NAME = 'AddToCart',
|
|
76
|
+
ADD_TO_WISHLIST_EVENT_NAME = 'AddToWishlist',
|
|
77
|
+
CHECKOUT_EVENT_NAME = 'InitiateCheckout',
|
|
78
|
+
PAGE_VIEW_EVENT_NAME = 'PageView',
|
|
79
|
+
PURCHASE_EVENT_NAME = 'Purchase',
|
|
80
|
+
REMOVE_FROM_CART_EVENT_NAME = 'RemoveFromCart',
|
|
81
|
+
VIEW_CONTENT_EVENT_NAME = 'ViewContent',
|
|
82
|
+
constructor = function () {
|
|
83
|
+
var self = this,
|
|
84
|
+
isInitialized = false,
|
|
85
|
+
reportingService = null,
|
|
86
|
+
settings,
|
|
87
|
+
productAttributeMapping;
|
|
88
|
+
|
|
89
|
+
self.name = name;
|
|
90
|
+
|
|
91
|
+
function initForwarder(forwarderSettings, service, testMode, trackerId, userAttributes, userIdentities) {
|
|
92
|
+
settings = forwarderSettings;
|
|
93
|
+
reportingService = service;
|
|
94
|
+
|
|
95
|
+
SupportedCommerceTypes = [
|
|
96
|
+
mParticle.ProductActionType.Checkout,
|
|
97
|
+
mParticle.ProductActionType.Purchase,
|
|
98
|
+
mParticle.ProductActionType.AddToCart,
|
|
99
|
+
mParticle.ProductActionType.RemoveFromCart,
|
|
100
|
+
mParticle.ProductActionType.AddToWishlist,
|
|
101
|
+
mParticle.ProductActionType.ViewDetail
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
if (!testMode) {
|
|
106
|
+
!function (f, b, e, v, n, t, s) {
|
|
107
|
+
if (f.fbq) return; n = f.fbq = function () { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments); }; if (!f._fbq) f._fbq = n;
|
|
108
|
+
n.push = n; n.loaded = !0; n.version = '2.0'; n.queue = []; t = b.createElement(e); t.async = !0; t.src = v; s = b.getElementsByTagName(e)[0];
|
|
109
|
+
s.parentNode.insertBefore(t, s);
|
|
110
|
+
} (window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
|
|
111
|
+
|
|
112
|
+
var visitorData = {};
|
|
113
|
+
|
|
114
|
+
if(settings.externalUserIdentityType && userIdentities && userIdentities.length > 0) {
|
|
115
|
+
var selectedType = IdentityType[settings.externalUserIdentityType];
|
|
116
|
+
var selectedIdentity = userIdentities.filter(function (identityElement) {
|
|
117
|
+
if (identityElement.Type === selectedType) {
|
|
118
|
+
return identityElement.Identity;
|
|
124
119
|
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
if (selectedIdentity.length > 0) {
|
|
123
|
+
visitorData['external_id'] = selectedIdentity[0].Identity;
|
|
125
124
|
}
|
|
126
125
|
}
|
|
126
|
+
}
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
if (settings.disablePushState === 'True') {
|
|
129
|
+
// Facebook will automatically track page views whenever a new state is pushed to the HTML 5 History State API
|
|
130
|
+
// this option can be disabled to prevent duplicate page views
|
|
131
|
+
// https://developers.facebook.com/docs/facebook-pixel/implementation/tag_spa/#tagging-single-page-applications
|
|
132
|
+
fbq.disablePushState = true;
|
|
133
|
+
}
|
|
134
|
+
fbq('init', settings.pixelId, visitorData);
|
|
135
|
+
|
|
136
|
+
loadMappings();
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
isInitialized = true;
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
return 'Successfully initialized: ' + name;
|
|
141
141
|
|
|
142
|
-
}
|
|
143
|
-
catch (e) {
|
|
144
|
-
return 'Can\'t initialize forwarder: ' + name + ':' + e;
|
|
145
|
-
}
|
|
146
142
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
productAttributeMapping = settings.productAttributeMapping
|
|
150
|
-
? JSON.parse(settings.productAttributeMapping.replace(/"/g, '"'))
|
|
151
|
-
: [];
|
|
143
|
+
catch (e) {
|
|
144
|
+
return 'Can\'t initialize forwarder: ' + name + ':' + e;
|
|
152
145
|
}
|
|
146
|
+
}
|
|
153
147
|
|
|
154
|
-
|
|
155
|
-
|
|
148
|
+
function loadMappings() {
|
|
149
|
+
productAttributeMapping = settings.productAttributeMapping
|
|
150
|
+
? JSON.parse(settings.productAttributeMapping.replace(/"/g, '"'))
|
|
151
|
+
: [];
|
|
152
|
+
}
|
|
156
153
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
154
|
+
function processEvent(event) {
|
|
155
|
+
var reportEvent = false;
|
|
160
156
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
logPageView(event);
|
|
165
|
-
}
|
|
166
|
-
else if (event.EventDataType == MessageType.PageEvent) {
|
|
167
|
-
reportEvent = true;
|
|
168
|
-
logPageEvent(event);
|
|
169
|
-
}
|
|
170
|
-
else if (event.EventDataType == MessageType.Commerce) {
|
|
171
|
-
reportEvent = logCommerceEvent(event);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (reportEvent && reportingService) {
|
|
175
|
-
reportingService(self, event);
|
|
176
|
-
}
|
|
157
|
+
if (!isInitialized) {
|
|
158
|
+
return 'Can\'t send forwarder ' + name + ', not initialized';
|
|
159
|
+
}
|
|
177
160
|
|
|
178
|
-
|
|
161
|
+
try {
|
|
162
|
+
if (event.EventDataType == MessageType.PageView) {
|
|
163
|
+
reportEvent = true;
|
|
164
|
+
logPageView(event);
|
|
179
165
|
}
|
|
180
|
-
|
|
181
|
-
|
|
166
|
+
else if (event.EventDataType == MessageType.PageEvent) {
|
|
167
|
+
reportEvent = true;
|
|
168
|
+
logPageEvent(event);
|
|
169
|
+
}
|
|
170
|
+
else if (event.EventDataType == MessageType.Commerce) {
|
|
171
|
+
reportEvent = logCommerceEvent(event);
|
|
182
172
|
}
|
|
183
|
-
}
|
|
184
173
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
event.ProductAction.ProductActionType &&
|
|
189
|
-
SupportedCommerceTypes.indexOf(event.ProductAction.ProductActionType) > -1) {
|
|
174
|
+
if (reportEvent && reportingService) {
|
|
175
|
+
reportingService(self, event);
|
|
176
|
+
}
|
|
190
177
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
178
|
+
return 'Successfully sent to forwarder ' + name;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return 'Can\'t send to forwarder: ' + name + ' ' + error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
196
184
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
185
|
+
function logCommerceEvent(event) {
|
|
186
|
+
if (event.ProductAction &&
|
|
187
|
+
event.ProductAction.ProductList &&
|
|
188
|
+
event.ProductAction.ProductActionType &&
|
|
189
|
+
SupportedCommerceTypes.indexOf(event.ProductAction.ProductActionType) > -1) {
|
|
190
|
+
var eventName,
|
|
191
|
+
totalValue,
|
|
192
|
+
params = cloneEventAttributes(event),
|
|
193
|
+
eventID = createEventId(event),
|
|
194
|
+
sendProductNamesAsContents = settings.sendProductNamesasContents || false;
|
|
200
195
|
|
|
201
|
-
|
|
202
|
-
if (curr.Sku) {
|
|
203
|
-
arr.push(curr.Sku);
|
|
204
|
-
}
|
|
205
|
-
return arr;
|
|
206
|
-
}, []);
|
|
196
|
+
params['currency'] = event.CurrencyCode || 'USD';
|
|
207
197
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
198
|
+
if (event.EventName) {
|
|
199
|
+
params['content_name'] = event.EventName;
|
|
200
|
+
}
|
|
211
201
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if (eventCategory) {
|
|
216
|
-
params['content_category'] = eventCategory;
|
|
217
|
-
}
|
|
218
|
-
if (event.ProductAction.ProductActionType == mParticle.ProductActionType.Checkout && event.ProductAction.CheckoutStep) {
|
|
219
|
-
params['checkout_step'] = event.ProductAction.CheckoutStep;
|
|
220
|
-
}
|
|
202
|
+
var productSkus = event.ProductAction.ProductList.reduce(function (arr, curr) {
|
|
203
|
+
if (curr.Sku) {
|
|
204
|
+
arr.push(curr.Sku);
|
|
221
205
|
}
|
|
206
|
+
return arr;
|
|
207
|
+
}, []);
|
|
222
208
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
209
|
+
if (productSkus && productSkus.length > 0) {
|
|
210
|
+
params['content_ids'] = productSkus;
|
|
211
|
+
}
|
|
226
212
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
213
|
+
// Override content_name with product names array if setting enabled
|
|
214
|
+
if (sendProductNamesAsContents) {
|
|
215
|
+
var productNames = buildProductNames(event.ProductAction.ProductList);
|
|
216
|
+
if (productNames && productNames.length > 0) {
|
|
217
|
+
params['content_name'] = productNames;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
233
220
|
|
|
234
|
-
|
|
221
|
+
// Set order_id if TransactionId exists
|
|
222
|
+
if (event.ProductAction.TransactionId) {
|
|
223
|
+
params['order_id'] = event.ProductAction.TransactionId;
|
|
224
|
+
}
|
|
235
225
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
eventName = VIEW_CONTENT_EVENT_NAME;
|
|
244
|
-
}
|
|
226
|
+
// Build contents array
|
|
227
|
+
var contents = buildProductContents(event.ProductAction.ProductList);
|
|
228
|
+
if (contents && contents.length > 0) {
|
|
229
|
+
params['contents'] = contents;
|
|
230
|
+
}
|
|
245
231
|
|
|
232
|
+
if (event.ProductAction.ProductActionType == mParticle.ProductActionType.AddToWishlist ||
|
|
233
|
+
event.ProductAction.ProductActionType == mParticle.ProductActionType.Checkout) {
|
|
234
|
+
var eventCategory = getEventCategoryString(event);
|
|
235
|
+
if (eventCategory) {
|
|
236
|
+
params['content_category'] = eventCategory;
|
|
246
237
|
}
|
|
247
|
-
|
|
248
|
-
|
|
238
|
+
if (event.ProductAction.ProductActionType == mParticle.ProductActionType.Checkout && event.ProductAction.CheckoutStep) {
|
|
239
|
+
params['checkout_step'] = event.ProductAction.CheckoutStep;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
249
242
|
|
|
250
|
-
|
|
243
|
+
if (event.ProductAction.ProductActionType == mParticle.ProductActionType.AddToCart ||
|
|
244
|
+
event.ProductAction.ProductActionType == mParticle.ProductActionType.AddToWishlist ||
|
|
245
|
+
event.ProductAction.ProductActionType == mParticle.ProductActionType.ViewDetail) {
|
|
251
246
|
|
|
252
|
-
|
|
253
|
-
|
|
247
|
+
totalValue = event.ProductAction.ProductList.reduce(function(sum, product){
|
|
248
|
+
if (isNumeric(product.Price) && isNumeric(product.Quantity)) {
|
|
249
|
+
sum += product.Price * product.Quantity;
|
|
254
250
|
}
|
|
251
|
+
return sum;
|
|
252
|
+
}, 0);
|
|
255
253
|
|
|
256
|
-
|
|
257
|
-
if (isNumeric(product.Quantity)) {
|
|
258
|
-
sum += product.Quantity;
|
|
259
|
-
}
|
|
260
|
-
return sum;
|
|
261
|
-
}, 0);
|
|
262
|
-
params['num_items'] = num_items;
|
|
263
|
-
|
|
264
|
-
if (event.ProductAction.TransactionId) {
|
|
265
|
-
params['order_id'] = event.ProductAction.TransactionId;
|
|
266
|
-
}
|
|
254
|
+
params['value'] = totalValue;
|
|
267
255
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
256
|
+
if (event.ProductAction.ProductActionType == mParticle.ProductActionType.AddToWishlist){
|
|
257
|
+
eventName = ADD_TO_WISHLIST_EVENT_NAME;
|
|
258
|
+
}
|
|
259
|
+
else if (event.ProductAction.ProductActionType == mParticle.ProductActionType.AddToCart){
|
|
260
|
+
eventName = ADD_TO_CART_EVENT_NAME;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
eventName = VIEW_CONTENT_EVENT_NAME;
|
|
275
264
|
}
|
|
276
|
-
else if (event.ProductAction.ProductActionType == mParticle.ProductActionType.RemoveFromCart) {
|
|
277
|
-
eventName = REMOVE_FROM_CART_EVENT_NAME;
|
|
278
|
-
|
|
279
|
-
// remove from cart can be performed in 1 of 2 ways:
|
|
280
|
-
// 1. mParticle.eCommerce.logProductEvent(), which contains event.ProductAction.TotalAmount
|
|
281
|
-
// 2. mParticle.eCommerce.Cart.remove(), which does not contain event.ProductAction.TotalAmount
|
|
282
|
-
// when there is no TotalAmount, a manual calculation must be done
|
|
283
|
-
if (event.ProductAction.TotalAmount) {
|
|
284
|
-
totalValue = event.ProductAction.TotalAmount;
|
|
285
|
-
} else {
|
|
286
|
-
totalValue = event.ProductAction.ProductList.reduce(function(sum, product) {
|
|
287
|
-
if (isNumeric(product.TotalAmount)) {
|
|
288
|
-
sum += product.TotalAmount;
|
|
289
|
-
}
|
|
290
|
-
return sum;
|
|
291
|
-
}, 0);
|
|
292
|
-
}
|
|
293
265
|
|
|
294
|
-
|
|
266
|
+
}
|
|
267
|
+
else if (event.ProductAction.ProductActionType == mParticle.ProductActionType.Checkout ||
|
|
268
|
+
event.ProductAction.ProductActionType == mParticle.ProductActionType.Purchase) {
|
|
295
269
|
|
|
296
|
-
|
|
297
|
-
return true;
|
|
298
|
-
}
|
|
270
|
+
eventName = event.ProductAction.ProductActionType == mParticle.ProductActionType.Checkout ? CHECKOUT_EVENT_NAME : PURCHASE_EVENT_NAME;
|
|
299
271
|
|
|
300
|
-
if (
|
|
301
|
-
|
|
272
|
+
if (event.ProductAction.TotalAmount) {
|
|
273
|
+
params['value'] = event.ProductAction.TotalAmount;
|
|
302
274
|
}
|
|
303
|
-
|
|
304
|
-
|
|
275
|
+
|
|
276
|
+
var num_items = event.ProductAction.ProductList.reduce(function(sum, product){
|
|
277
|
+
if (isNumeric(product.Quantity)) {
|
|
278
|
+
sum += product.Quantity;
|
|
279
|
+
}
|
|
280
|
+
return sum;
|
|
281
|
+
}, 0);
|
|
282
|
+
params['num_items'] = num_items;
|
|
283
|
+
}
|
|
284
|
+
else if (event.ProductAction.ProductActionType == mParticle.ProductActionType.RemoveFromCart) {
|
|
285
|
+
eventName = REMOVE_FROM_CART_EVENT_NAME;
|
|
286
|
+
|
|
287
|
+
// remove from cart can be performed in 1 of 2 ways:
|
|
288
|
+
// 1. mParticle.eCommerce.logProductEvent(), which contains event.ProductAction.TotalAmount
|
|
289
|
+
// 2. mParticle.eCommerce.Cart.remove(), which does not contain event.ProductAction.TotalAmount
|
|
290
|
+
// when there is no TotalAmount, a manual calculation must be done
|
|
291
|
+
if (event.ProductAction.TotalAmount) {
|
|
292
|
+
totalValue = event.ProductAction.TotalAmount;
|
|
293
|
+
} else {
|
|
294
|
+
totalValue = event.ProductAction.ProductList.reduce(function(sum, product) {
|
|
295
|
+
if (isNumeric(product.TotalAmount)) {
|
|
296
|
+
sum += product.TotalAmount;
|
|
297
|
+
}
|
|
298
|
+
return sum;
|
|
299
|
+
}, 0);
|
|
305
300
|
}
|
|
306
301
|
|
|
302
|
+
params['value'] = totalValue;
|
|
303
|
+
|
|
304
|
+
fbq('trackCustom', eventName || 'customEvent', params, eventID);
|
|
307
305
|
return true;
|
|
308
306
|
}
|
|
309
307
|
|
|
310
|
-
|
|
311
|
-
|
|
308
|
+
if (eventName) {
|
|
309
|
+
fbq('track', eventName, params, eventID);
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
312
314
|
|
|
313
|
-
|
|
314
|
-
logPageEvent(event, PAGE_VIEW_EVENT_NAME);
|
|
315
|
+
return true;
|
|
315
316
|
}
|
|
316
317
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
var eventID = createEventId(event);
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
320
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
321
|
+
function logPageView(event) {
|
|
322
|
+
logPageEvent(event, PAGE_VIEW_EVENT_NAME);
|
|
323
|
+
}
|
|
325
324
|
|
|
326
|
-
|
|
327
|
-
|
|
325
|
+
function logPageEvent(event, eventName) {
|
|
326
|
+
var params = cloneEventAttributes(event);
|
|
327
|
+
var eventID = createEventId(event);
|
|
328
328
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
try {
|
|
333
|
-
attr = JSON.parse(JSON.stringify(event.EventAttributes));
|
|
334
|
-
}
|
|
335
|
-
catch (e) {
|
|
336
|
-
//
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
return attr;
|
|
329
|
+
eventName = eventName || event.EventName;
|
|
330
|
+
if (event.EventName) {
|
|
331
|
+
params['content_name'] = event.EventName;
|
|
340
332
|
}
|
|
341
333
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
function getEventCategoryString(event) {
|
|
334
|
+
fbq('trackCustom', eventName || 'customEvent', params, eventID);
|
|
335
|
+
}
|
|
347
336
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
337
|
+
function cloneEventAttributes(event) {
|
|
338
|
+
var attr = {};
|
|
339
|
+
if (event && event.EventAttributes) {
|
|
340
|
+
try {
|
|
341
|
+
attr = JSON.parse(JSON.stringify(event.EventAttributes));
|
|
353
342
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
enumValue = event.EventCategory;
|
|
343
|
+
catch (e) {
|
|
344
|
+
//
|
|
357
345
|
}
|
|
346
|
+
}
|
|
347
|
+
return attr;
|
|
348
|
+
}
|
|
358
349
|
|
|
359
|
-
|
|
350
|
+
function isNumeric(n) {
|
|
351
|
+
return !isNaN(parseFloat(n)) && isFinite(n);
|
|
352
|
+
}
|
|
360
353
|
|
|
361
|
-
|
|
362
|
-
if (enumValue == enumTypeValues[category]) {
|
|
363
|
-
return category;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
354
|
+
function getEventCategoryString(event) {
|
|
367
355
|
|
|
368
|
-
|
|
356
|
+
var enumTypeValues;
|
|
357
|
+
var enumValue;
|
|
358
|
+
if (event.EventDataType == MessageType.Commerce) {
|
|
359
|
+
enumTypeValues = event.EventCategory ? mParticle.CommerceEventType : mParticle.ProductActionType;
|
|
360
|
+
enumValue = event.EventCategory || event.ProductAction.ProductActionType;
|
|
369
361
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
* Creates a nested array of content items with product details.
|
|
374
|
-
*
|
|
375
|
-
* @param {Array} productList - Array of products from event.ProductAction.ProductList
|
|
376
|
-
* @returns {Array} Array of content objects for Facebook Pixel
|
|
377
|
-
*/
|
|
378
|
-
function buildProductContents(productList) {
|
|
379
|
-
if (!productList || productList.length === 0) {
|
|
380
|
-
return [];
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
return productList
|
|
384
|
-
.filter(function(product) {
|
|
385
|
-
return product && product.Sku;
|
|
386
|
-
})
|
|
387
|
-
.map(function(product) {
|
|
388
|
-
var contentItem = {
|
|
389
|
-
id: product.Sku,
|
|
390
|
-
quantity: isNumeric(product.Quantity) ? product.Quantity : 1,
|
|
391
|
-
name: product.Name,
|
|
392
|
-
brand: product.Brand,
|
|
393
|
-
category: product.Category,
|
|
394
|
-
variant: product.Variant,
|
|
395
|
-
item_price: isNumeric(product.Price) ? product.Price : null
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
// Apply configured mappings to custom attributes
|
|
399
|
-
productAttributeMapping.forEach(function(productMapping) {
|
|
400
|
-
if (!isobject$1(productMapping) || !productMapping.map || !productMapping.value) {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
var sourceField = productMapping.map;
|
|
405
|
-
var facebookFieldName = productMapping.value;
|
|
406
|
-
var value = null;
|
|
407
|
-
|
|
408
|
-
// Check for Product level field first
|
|
409
|
-
if (product.hasOwnProperty(sourceField)) {
|
|
410
|
-
value = product[sourceField];
|
|
411
|
-
}
|
|
412
|
-
// then check for Product.Attributes level field
|
|
413
|
-
else if (product.Attributes && product.Attributes[sourceField]) {
|
|
414
|
-
value = product.Attributes[sourceField];
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
if (value !== null && value !== undefined) {
|
|
418
|
-
contentItem[facebookFieldName] = value;
|
|
419
|
-
}
|
|
420
|
-
});
|
|
421
|
-
return contentItem;
|
|
422
|
-
});
|
|
362
|
+
else {
|
|
363
|
+
enumTypeValues = mParticle.EventType;
|
|
364
|
+
enumValue = event.EventCategory;
|
|
423
365
|
}
|
|
424
366
|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
367
|
+
if (enumTypeValues && enumValue) {
|
|
368
|
+
|
|
369
|
+
for (var category in enumTypeValues) {
|
|
370
|
+
if (enumValue == enumTypeValues[category]) {
|
|
371
|
+
return category;
|
|
372
|
+
}
|
|
429
373
|
}
|
|
430
374
|
}
|
|
431
375
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
};
|
|
435
|
-
|
|
436
|
-
function getId() {
|
|
437
|
-
return moduleId;
|
|
438
|
-
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
439
378
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
379
|
+
/**
|
|
380
|
+
* Builds contents array for Facebook Pixel commerce events.
|
|
381
|
+
* Creates a nested array of content items with product details.
|
|
382
|
+
*
|
|
383
|
+
* @param {Array} productList - Array of products from event.ProductAction.ProductList
|
|
384
|
+
* @returns {Array} Array of content objects for Facebook Pixel
|
|
385
|
+
*/
|
|
386
|
+
function buildProductContents(productList) {
|
|
387
|
+
if (!productList || productList.length === 0) {
|
|
388
|
+
return [];
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
return productList
|
|
392
|
+
.filter(function(product) {
|
|
393
|
+
return product && product.Sku;
|
|
394
|
+
})
|
|
395
|
+
.map(function(product) {
|
|
396
|
+
var contentItem = {
|
|
397
|
+
id: product.Sku,
|
|
398
|
+
quantity: isNumeric(product.Quantity) ? product.Quantity : 1,
|
|
399
|
+
name: product.Name,
|
|
400
|
+
brand: product.Brand,
|
|
401
|
+
category: product.Category,
|
|
402
|
+
variant: product.Variant,
|
|
403
|
+
item_price: isNumeric(product.Price) ? product.Price : null
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
// Apply configured mappings to custom attributes
|
|
407
|
+
productAttributeMapping.forEach(function(productMapping) {
|
|
408
|
+
if (!isobject$1(productMapping) || !productMapping.map || !productMapping.value) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
var sourceField = productMapping.map;
|
|
413
|
+
var facebookFieldName = productMapping.value;
|
|
414
|
+
var value = null;
|
|
415
|
+
|
|
416
|
+
// Check for Product level field first
|
|
417
|
+
if (product.hasOwnProperty(sourceField)) {
|
|
418
|
+
value = product[sourceField];
|
|
419
|
+
}
|
|
420
|
+
// then check for Product.Attributes level field
|
|
421
|
+
else if (product.Attributes && product.Attributes[sourceField]) {
|
|
422
|
+
value = product.Attributes[sourceField];
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (value !== null && value !== undefined) {
|
|
426
|
+
contentItem[facebookFieldName] = value;
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
return contentItem;
|
|
430
|
+
});
|
|
444
431
|
}
|
|
445
432
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
return
|
|
433
|
+
// https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events#event-deduplication-options
|
|
434
|
+
function createEventId(event) {
|
|
435
|
+
return {
|
|
436
|
+
eventID: event.SourceMessageId || null
|
|
437
|
+
}
|
|
449
438
|
}
|
|
450
439
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
}
|
|
440
|
+
/**
|
|
441
|
+
* Builds array of product names from product list
|
|
442
|
+
* @param {Array} productList - Array of products
|
|
443
|
+
* @returns {Array} Array of product names
|
|
444
|
+
*/
|
|
445
|
+
function buildProductNames(productList) {
|
|
446
|
+
if (!productList || productList.length === 0) {
|
|
447
|
+
return [];
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
return productList
|
|
451
|
+
.filter(function(product) {
|
|
452
|
+
return product && product.Name;
|
|
453
|
+
})
|
|
454
|
+
.map(function(product) {
|
|
455
|
+
return product.Name;
|
|
456
|
+
});
|
|
460
457
|
}
|
|
461
|
-
|
|
458
|
+
|
|
459
|
+
this.init = initForwarder;
|
|
460
|
+
this.process = processEvent;
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
function getId() {
|
|
464
|
+
return moduleId;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function register(config) {
|
|
468
|
+
if (!config) {
|
|
469
|
+
console.log('You must pass a config object to register the kit ' + name);
|
|
470
|
+
return;
|
|
462
471
|
}
|
|
463
472
|
|
|
464
|
-
if (
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
473
|
+
if (!isobject$1(config)) {
|
|
474
|
+
console.log('\'config\' must be an object. You passed in a ' + typeof config);
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (isobject$1(config.kits)) {
|
|
479
|
+
config.kits[name] = {
|
|
480
|
+
constructor: constructor
|
|
481
|
+
};
|
|
482
|
+
} else {
|
|
483
|
+
config.kits = {};
|
|
484
|
+
config.kits[name] = {
|
|
485
|
+
constructor: constructor
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
console.log('Successfully registered ' + name + ' to your mParticle configuration');
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (typeof window !== 'undefined') {
|
|
492
|
+
if (window && window.mParticle && window.mParticle.addForwarder) {
|
|
493
|
+
window.mParticle.addForwarder({
|
|
494
|
+
name: name,
|
|
495
|
+
constructor: constructor,
|
|
496
|
+
getId: getId
|
|
497
|
+
});
|
|
472
498
|
}
|
|
499
|
+
}
|
|
473
500
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
501
|
+
var FacebookEventForwarder = {
|
|
502
|
+
register: register
|
|
503
|
+
};
|
|
477
504
|
var FacebookEventForwarder_1 = FacebookEventForwarder.register;
|
|
478
505
|
|
|
479
506
|
export default FacebookEventForwarder;
|