UNPKG

@shopify/hydrogen-react

Version:

React components, hooks, and utilities for creating custom Shopify storefronts

235 lines (234 loc) • 7.1 kB
import { AnalyticsPageType, ShopifySalesChannel } from "./analytics-constants.mjs"; import { schemaWrapper, addDataIf, parseGid } from "./analytics-utils.mjs"; import { buildUUID } from "./cookies-utils.mjs"; import { version } from "./package.json.mjs"; const SCHEMA_ID = "custom_storefront_customer_tracking/1.2"; const PAGE_RENDERED_EVENT_NAME = "page_rendered"; const COLLECTION_PAGE_RENDERED_EVENT_NAME = "collection_page_rendered"; const PRODUCT_PAGE_RENDERED_EVENT_NAME = "product_page_rendered"; const PRODUCT_ADDED_TO_CART_EVENT_NAME = "product_added_to_cart"; const SEARCH_SUBMITTED_EVENT_NAME = "search_submitted"; function prepareAdditionalPayload(payload) { return { canonical_url: payload.canonicalUrl || payload.url, customer_id: parseInt(parseGid(payload.customerId).id || "0") }; } function pageView(payload) { const pageViewPayload = payload; const additionalPayload = prepareAdditionalPayload(pageViewPayload); const pageType = pageViewPayload.pageType; const pageViewEvents = []; pageViewEvents.push( schemaWrapper( SCHEMA_ID, addDataIf( { event_name: PAGE_RENDERED_EVENT_NAME, ...additionalPayload }, formatPayload(pageViewPayload) ) ) ); switch (pageType) { case AnalyticsPageType.collection: pageViewEvents.push( schemaWrapper( SCHEMA_ID, addDataIf( { event_name: COLLECTION_PAGE_RENDERED_EVENT_NAME, ...additionalPayload, collection_name: pageViewPayload.collectionHandle, collection_id: parseInt( parseGid(pageViewPayload.collectionId).id ) }, formatPayload(pageViewPayload) ) ) ); break; case AnalyticsPageType.product: pageViewEvents.push( schemaWrapper( SCHEMA_ID, addDataIf( { event_name: PRODUCT_PAGE_RENDERED_EVENT_NAME, ...additionalPayload, products: formatProductPayload(pageViewPayload.products), total_value: pageViewPayload.totalValue }, formatPayload(pageViewPayload) ) ) ); break; case AnalyticsPageType.search: pageViewEvents.push( schemaWrapper( SCHEMA_ID, addDataIf( { event_name: SEARCH_SUBMITTED_EVENT_NAME, ...additionalPayload, search_string: pageViewPayload.searchString }, formatPayload(pageViewPayload) ) ) ); break; } return pageViewEvents; } function pageView2(payload) { const pageViewPayload = payload; const additionalPayload = prepareAdditionalPayload(pageViewPayload); return [ schemaWrapper( SCHEMA_ID, addDataIf( { event_name: PAGE_RENDERED_EVENT_NAME, ...additionalPayload }, formatPayload(pageViewPayload) ) ) ]; } function collectionView(payload) { const pageViewPayload = payload; const additionalPayload = prepareAdditionalPayload(pageViewPayload); return [ schemaWrapper( SCHEMA_ID, addDataIf( { event_name: COLLECTION_PAGE_RENDERED_EVENT_NAME, ...additionalPayload, collection_name: pageViewPayload.collectionHandle, collection_id: parseInt(parseGid(pageViewPayload.collectionId).id) }, formatPayload(pageViewPayload) ) ) ]; } function productView(payload) { const pageViewPayload = payload; const additionalPayload = prepareAdditionalPayload(pageViewPayload); return [ schemaWrapper( SCHEMA_ID, addDataIf( { event_name: PRODUCT_PAGE_RENDERED_EVENT_NAME, ...additionalPayload, products: formatProductPayload(pageViewPayload.products), total_value: pageViewPayload.totalValue }, formatPayload(pageViewPayload) ) ) ]; } function searchView(payload) { const pageViewPayload = payload; const additionalPayload = prepareAdditionalPayload(pageViewPayload); return [ schemaWrapper( SCHEMA_ID, addDataIf( { event_name: SEARCH_SUBMITTED_EVENT_NAME, ...additionalPayload, search_string: pageViewPayload.searchString }, formatPayload(pageViewPayload) ) ) ]; } function addToCart(payload) { const addToCartPayload = payload; const cartToken = parseGid(addToCartPayload.cartId); return [ schemaWrapper( SCHEMA_ID, addDataIf( { event_name: PRODUCT_ADDED_TO_CART_EVENT_NAME, customerId: addToCartPayload.customerId, cart_token: (cartToken == null ? void 0 : cartToken.id) ? `${cartToken.id}` : null, total_value: addToCartPayload.totalValue, products: formatProductPayload(addToCartPayload.products), customer_id: parseInt( parseGid(addToCartPayload.customerId).id || "0" ) }, formatPayload(addToCartPayload) ) ) ]; } function formatPayload(payload) { const payloadWithPrivacy = payload; return { source: payload.shopifySalesChannel || ShopifySalesChannel.headless, asset_version_id: payload.assetVersionId || version, hydrogenSubchannelId: payload.storefrontId || payload.hydrogenSubchannelId || "0", is_persistent_cookie: payload.hasUserConsent, deprecated_visit_token: payload.visitToken, unique_token: payload.uniqueToken, event_time: Date.now(), event_id: buildUUID(), event_source_url: payload.url, referrer: payload.referrer, user_agent: payload.userAgent, navigation_type: payload.navigationType, navigation_api: payload.navigationApi, shop_id: parseInt(parseGid(payload.shopId).id), currency: payload.currency, ccpa_enforced: payloadWithPrivacy.ccpaEnforced || false, gdpr_enforced: payloadWithPrivacy.gdprEnforced || false, gdpr_enforced_as_string: payloadWithPrivacy.gdprEnforced ? "true" : "false", analytics_allowed: payload.analyticsAllowed || false, marketing_allowed: payload.marketingAllowed || false, sale_of_data_allowed: payload.saleOfDataAllowed || false }; } function formatProductPayload(products) { return products ? products.map((p) => { const product = addDataIf( { variant_gid: p.variantGid, category: p.category, sku: p.sku, product_id: parseInt(parseGid(p.productGid).id), variant_id: parseInt(parseGid(p.variantGid).id) }, { product_gid: p.productGid, name: p.name, variant: p.variantName || "", brand: p.brand, price: parseFloat(p.price), quantity: Number(p.quantity || 0) } ); return JSON.stringify(product); }) : []; } export { addToCart, collectionView, pageView, pageView2, productView, searchView }; //# sourceMappingURL=analytics-schema-custom-storefront-customer-tracking.mjs.map