forked from cnviradiya/vsf-facebook-pixel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.ts
82 lines (73 loc) · 2.52 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import { currentStoreView } from '@vue-storefront/core/lib/multistore';
import { isServer } from '@vue-storefront/core/helpers';
import { StorefrontModule } from '@vue-storefront/core/lib/modules'
import { Route } from "vue-router";
import prepareProductObject from './util/prepareProductObject';
import prepareCheckoutObject from './util/prepareCheckoutObject';
import Vue from 'vue'
declare const fbq;
const facebookPixelSnippet = function(f, b, e, v, callback) {
let n, t, s;
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;
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];
s.parentNode.insertBefore(t, s);
t.onload = callback;
};
export const FacebookPixel: StorefrontModule = function ({ router, store, appConfig }) {
if (!isServer) {
const getPixelId = (): string => {
const { storeCode } = currentStoreView()
if (!appConfig.facebookPixel) {
return ''
}
return appConfig.facebookPixel[`id_${storeCode}`]
? appConfig.facebookPixel[`id_${storeCode}`]
: appConfig.facebookPixel.id
}
const pixelId = getPixelId()
if (!pixelId) {
console.log('[FBP] Check FBPixel configuration! ID not prvodied')
} else {
facebookPixelSnippet(
window,
document,
"script",
"https://connect.facebook.net/en_US/fbevents.js",
() => {
fbq("init", appConfig.facebookPixel.id);
fbq("track", "PageView");
router.afterEach((to: Route, from: Route) => {
fbq("track", "PageView");
})
store.subscribe(({ type, payload }) => {
// Adding a Product to the Shopping Cart
if (type === 'cart/cart/ADD') {
fbq("track", "AddToCart", prepareProductObject(payload.product));
}
// Adding a Product to the Wishlist
if (type.includes('wishlist/ADD')) {
fbq("track", "AddToWishlist", prepareProductObject(payload.product));
}
})
Vue.prototype.$bus.$on("checkout-after-created", () => {
fbq('track', 'InitiateCheckout', prepareCheckoutObject(store, false));
});
Vue.prototype.$bus.$on('order-before-placed', (payload) => {
fbq('track', 'Purchase', prepareCheckoutObject(store, true));
})
}
)
}
}
}