Repository URL to install this package:
|
Version:
0.0.3 ▾
|
import { oneRouter } from '@skava/router';
import { getTyped } from 'composition';
import { isNonEmptyArray } from 'exotic';
import { GOOGLE_TAG_MANGER_ID } from 'src/bootstrap/api/config';
import { sessionContainer } from '@skava/packages/core/auth/session';
import { localeContainer } from '@skava/packages/features/Locale';
import { requestIdleCallback } from '@skava/packages/libraries/request-idle-callback';
import { transformPDPData, transformPLPData, transformPlpProductVariant, transformPdpProductVariant, } from './transform';
const IS_BROWSER = typeof window === 'object';
/**
* or analytics, but should be `gtm`
*/
function toGoogleTagManager() {
return window.gta;
}
function load() {
window.dataLayer = window.dataLayer || [];
window.gta = function (argumentsToTrack) {
dataLayer.push(argumentsToTrack);
};
}
class AnalyticsContainer {
constructor() {
this.queue = [];
}
get tracker() {
return toGoogleTagManager();
}
trackPageEvent() {
const pathname = oneRouter.entries().pathname;
const productRelatedPaths = ['/search', '/product', '/category', '/merchProductList'];
const isProductRelatedPage = productRelatedPaths.some(productRelatedPath => pathname.includes(productRelatedPath));
const customDimension = this.getCommonCustomDimensions();
if (!isProductRelatedPage) {
this.pushToDataLayer({ event: 'pageView', ...customDimension });
}
}
initializeAnalytics() {
load();
this.tracker('js', new Date());
this.tracker('config', GOOGLE_TAG_MANGER_ID);
this.trackPageEvent();
oneRouter.history.listen(() => {
const processPageAnalyticsTracking = () => setTimeout(() => this.trackPageEvent(), 1000);
requestIdleCallback(processPageAnalyticsTracking);
});
}
getCommonCustomDimensions() {
const { country, language } = localeContainer.item;
return {
SK_UserType: sessionContainer.isRegisteredUser ? 'signedIn' : 'guest',
SK_Region: country,
SK_Language: language,
};
}
trackCustomEvent(eventDetails) {
const { category, action, label } = eventDetails;
const commonCustomDimensions = this.getCommonCustomDimensions();
this.pushToDataLayer({
event: 'customEventTracking',
category,
action,
label,
...commonCustomDimensions,
});
}
pushToDataLayer(argumentsToTrack) {
dataLayer.push(argumentsToTrack);
}
trackPDPTagManager(item) {
const transformedData = transformPDPData(item);
const commonCustomDimensions = this.getCommonCustomDimensions();
/**
* To unblock serverside rendering
*/
window.dataLayer = window.dataLayer || [];
this.pushToDataLayer({
event: 'productDetailImpression',
ecommerce: {
detail: {
products: transformedData,
},
},
...commonCustomDimensions,
});
}
trackPLPTagManager(productLists) {
const isSearch = oneRouter.entries().pathname.includes('/search');
const searchTerm = isSearch === true ? oneRouter.entries().searchTerm : '';
const transformedData = transformPLPData(productLists, searchTerm);
const commonCustomDimensions = this.getCommonCustomDimensions();
/**
* To unblock serverside rendering
*/
window.dataLayer = window.dataLayer || [];
this.pushToDataLayer({
event: 'productImpression',
ecommerce: {
impressions: transformedData,
},
...commonCustomDimensions,
});
if (isSearch) {
const noResult = productLists && productLists.length > 0 ? '' : '&searchCat=noResults';
const pageUrl = oneRouter.entries().href + '?SKSearchTerm=' + searchTerm + noResult;
const pageViewDetails = {
pageURL: pageUrl,
pagePath: oneRouter.entries().pathname,
pageTitle: 'Search Page',
SK_SearchResultsReturned: productLists.length,
};
this.trackVirtualPageView(pageViewDetails);
}
}
getProductVariantDetails(productOptions) {
const variants = productOptions.map(option => {
return option.value;
});
return variants.join(',');
}
trackVirtualPageView(pageViewDetails) {
const { pageURL, pagePath, pageTitle, ...remainingprops } = pageViewDetails;
const commonCustomDimensions = this.getCommonCustomDimensions();
analyticsContainer.pushToDataLayer({
event: 'virtualPageView',
virtualPageURL: pageURL,
virtualPagePath: pagePath,
virtualPageTitle: pageTitle,
...commonCustomDimensions,
...remainingprops,
});
}
cartProducts(checkoutProductDetails) {
const cartProducts = checkoutProductDetails.map((product, index) => {
const { name, identifier, salePrice, quantity } = product;
return {
name,
identifier,
salePrice,
brand: '',
category: '',
variant: '',
quantity,
list: [],
position: index + 1,
};
});
return cartProducts;
}
trackPurchaseEcommerce(checkoutProductDetails, orderId, orderDetails) {
const orderProducts = this.cartProducts(checkoutProductDetails);
const commonCustomDimensions = this.getCommonCustomDimensions();
const { grandTotal, grandTotalTax, estTotalShippingPrice } = orderDetails;
analyticsContainer.pushToDataLayer({
event: 'purchase',
ecommerce: {
purchase: {
actionField: {
id: orderId,
affiliation: '0.00',
revenue: grandTotal,
tax: grandTotalTax,
shipping: estTotalShippingPrice,
coupon: '',
},
products: orderProducts,
},
},
...commonCustomDimensions,
});
}
trackCheckoutEcommerce(checkoutProductDetails) {
const cartProducts = this.cartProducts(checkoutProductDetails);
const commonCustomDimensions = this.getCommonCustomDimensions();
analyticsContainer.pushToDataLayer({
event: 'checkout',
ecommerce: {
checkout: {
actionField: {
step: '1',
},
products: cartProducts,
},
},
...commonCustomDimensions,
});
}
trackAddToListGA(productDetails) {
const { name, key } = isNonEmptyArray(productDetails.listItems) && productDetails.listItems[0];
const eventDetails = {
category: oneRouter.pathname,
action: 'addToWishList',
label: key + '_' + name,
};
this.trackCustomEvent(eventDetails);
}
trackRemoveFromCartGA(productDetails) {
const { skuId, name, price, salePrice, quantity, productOptions, category, brand, } = productDetails;
const product = {
name,
id: skuId,
price: price || salePrice,
brand: brand || 'Matee',
category: category || '',
variant: this.getProductVariantDetails(productOptions),
quantity,
dimension2: 'BOPIS',
};
analyticsContainer.pushToDataLayer({
event: 'removeFromCart',
ecommerce: {
remove: {
products: [product],
},
},
});
}
pushAddToCartEventLayer(ProductDetail) {
this.pushToDataLayer({
event: 'addToCart',
ecommerce: {
add: {
products: [ProductDetail],
},
},
});
}
trackAddToCartEventFromPdp(productDetail) {
const { product, quantity } = productDetail;
const { string, array } = getTyped(product);
const variant = transformPdpProductVariant(product);
const transformedProductDetail = {
id: string('currentlySelectedSkuId'),
name: string('name'),
price: string('salePriceValue'),
brand: string('brand'),
category: '',
variant,
dimension2: 'BOPIS',
position: 0,
quantity,
};
this.pushAddToCartEventLayer(transformedProductDetail);
}
trackAddToCartEvent(productDetail) {
const { string, number } = getTyped(productDetail);
const { quantity } = productDetail;
const { productOptions, salePrice } = productDetail.currentlySelectedSku;
const transformedProductDetail = {
id: string('identifier'),
name: string('name'),
price: salePrice,
brand: productDetail.brandName,
category: '',
variant: transformPlpProductVariant(productOptions),
dimension2: 'BOPIS',
position: 0,
quantity: quantity === 0 ? quantity + 1 : quantity,
};
this.pushAddToCartEventLayer(transformedProductDetail);
}
}
const analyticsContainer = new AnalyticsContainer();
if (typeof window === 'object') {
console.warn('@todo @@packages merged analytics, needs to initialize the same...');
analyticsContainer.initializeAnalytics();
}
export { AnalyticsContainer };
export { analyticsContainer };
//# sourceMappingURL=container.js.map