@shopify/hydrogen-react
Version:
React components, hooks, and utilities for creating custom Shopify storefronts
173 lines (172 loc) • 5.45 kB
JavaScript
import { AnalyticsEventName } from "./analytics-constants.mjs";
import { errorIfServer } from "./analytics-utils.mjs";
import { pageView } from "./analytics-schema-trekkie-storefront-page-view.mjs";
import { pageView as pageView$1, addToCart, pageView2, collectionView, productView, searchView } from "./analytics-schema-custom-storefront-customer-tracking.mjs";
import { getTrackingValues } from "./tracking-utils.mjs";
function sendShopifyAnalytics(event, shopDomain) {
const { eventName, payload } = event;
if (!payload.hasUserConsent) return Promise.resolve();
let events = [];
const pageViewPayload = payload;
if (eventName === AnalyticsEventName.PAGE_VIEW) {
events = events.concat(
pageView(pageViewPayload),
pageView$1(pageViewPayload)
);
} else if (eventName === AnalyticsEventName.ADD_TO_CART) {
events = events.concat(
addToCart(payload)
);
} else if (eventName === AnalyticsEventName.PAGE_VIEW_2) {
events = events.concat(
pageView(pageViewPayload),
pageView2(pageViewPayload)
);
} else if (eventName === AnalyticsEventName.COLLECTION_VIEW) {
events = events.concat(collectionView(pageViewPayload));
} else if (eventName === AnalyticsEventName.PRODUCT_VIEW) {
events = events.concat(productView(pageViewPayload));
} else if (eventName === AnalyticsEventName.SEARCH_VIEW) {
events = events.concat(searchView(pageViewPayload));
}
if (events.length) {
return sendToShopify(events, shopDomain);
} else {
return Promise.resolve();
}
}
function isLighthouseUserAgent() {
if (typeof window === "undefined" || !window.navigator) return false;
return /Chrome-Lighthouse/.test(window.navigator.userAgent);
}
const ERROR_MESSAGE = "sendShopifyAnalytics request is unsuccessful";
function sendToShopify(events, shopDomain) {
if (isLighthouseUserAgent()) {
return Promise.resolve();
}
const eventsToBeSent = {
events,
metadata: {
event_sent_at_ms: Date.now()
}
};
try {
return fetch(
shopDomain ? `https://${shopDomain}/.well-known/shopify/monorail/unstable/produce_batch` : "https://monorail-edge.shopifysvc.com/unstable/produce_batch",
{
method: "post",
headers: {
"content-type": "text/plain"
},
body: JSON.stringify(eventsToBeSent)
}
).then((response) => {
if (!response.ok) {
throw new Error("Response failed");
}
return response.text();
}).then((data) => {
if (data) {
const jsonResponse = JSON.parse(data);
jsonResponse.result.forEach((eventResponse) => {
if (eventResponse.status !== 200) {
console.error(ERROR_MESSAGE, "\n\n", eventResponse.message);
}
});
}
}).catch((err) => {
console.error(ERROR_MESSAGE, err);
if (true) {
throw new Error(ERROR_MESSAGE);
}
});
} catch (error) {
return Promise.resolve();
}
}
function getClientBrowserParameters() {
if (errorIfServer("getClientBrowserParameters")) {
return {
uniqueToken: "",
visitToken: "",
url: "",
path: "",
search: "",
referrer: "",
title: "",
userAgent: "",
navigationType: "",
navigationApi: ""
};
}
const [navigationType, navigationApi] = getNavigationType();
const trackingValues = getTrackingValues();
return {
uniqueToken: trackingValues.uniqueToken,
visitToken: trackingValues.visitToken,
url: location.href,
path: location.pathname,
search: location.search,
referrer: document.referrer,
title: document.title,
userAgent: navigator.userAgent,
navigationType,
navigationApi
};
}
function getNavigationTypeExperimental() {
try {
const navigationEntries = (performance == null ? void 0 : performance.getEntriesByType) && (performance == null ? void 0 : performance.getEntriesByType("navigation"));
if (navigationEntries && navigationEntries[0]) {
const rawType = window.performance.getEntriesByType(
"navigation"
)[0]["type"];
const navType = rawType && rawType.toString();
return navType;
}
} catch (err) {
}
return void 0;
}
function getNavigationTypeLegacy() {
var _a, _b;
try {
if (PerformanceNavigation && ((_a = performance == null ? void 0 : performance.navigation) == null ? void 0 : _a.type) !== null && ((_b = performance == null ? void 0 : performance.navigation) == null ? void 0 : _b.type) !== void 0) {
const rawType = performance.navigation.type;
switch (rawType) {
case PerformanceNavigation.TYPE_NAVIGATE:
return "navigate";
case PerformanceNavigation.TYPE_RELOAD:
return "reload";
case PerformanceNavigation.TYPE_BACK_FORWARD:
return "back_forward";
default:
return `unknown: ${rawType}`;
}
}
} catch (err) {
}
return void 0;
}
function getNavigationType() {
try {
let navApi = "PerformanceNavigationTiming";
let navType = getNavigationTypeExperimental();
if (!navType) {
navType = getNavigationTypeLegacy();
navApi = "performance.navigation";
}
if (navType) {
return [navType, navApi];
} else {
return ["unknown", "unknown"];
}
} catch (err) {
}
return ["error", "error"];
}
export {
getClientBrowserParameters,
sendShopifyAnalytics
};
//# sourceMappingURL=analytics.mjs.map