1- import type { ShopifyAnalytics , ShopifyAnalyticsProduct } from '@shopify/hydrogen-react'
1+ import type {
2+ ShopifyAddToCartPayload ,
3+ ShopifyAnalytics ,
4+ ShopifyAnalyticsProduct ,
5+ ShopifyPageViewPayload ,
6+ } from '@shopify/hydrogen-react'
27import type {
38 AnalyticsConsentFlags ,
49 AnalyticsEmitter ,
@@ -17,7 +22,11 @@ import {
1722
1823import { createLogger } from '../log'
1924import { persistTrackingTokens } from './cookies'
20- import { version } from '../../../../package.json'
25+ import { MODULE_VERSION } from '../version'
26+
27+ type PrivacyFields = { ccpaEnforced ?: boolean , gdprEnforced ?: boolean }
28+
29+ type AnalyticsPayload = ( ShopifyPageViewPayload | ShopifyAddToCartPayload ) & PrivacyFields
2130
2231const MAX_QUEUED_EVENTS = 20
2332
@@ -96,12 +105,12 @@ function lineToProduct(line: ShopifyAnalyticsCartLine): AnalyticsProductInput {
96105 }
97106}
98107
99- function send ( eventName : string , payload : Record < string , unknown > , domain ?: string ) {
108+ function send ( eventName : string , payload : AnalyticsPayload , domain ?: string ) {
100109 const logger = createLogger ( )
101110
102111 logger . debug ( `Sending analytics event \`${ eventName } \`` )
103112
104- sendShopifyAnalytics ( { eventName, payload } as unknown as ShopifyAnalytics , domain )
113+ sendShopifyAnalytics ( { eventName, payload } as ShopifyAnalytics , domain )
105114 . catch ( error => logger . debug ( `Failed to send analytics event \`${ eventName } \`:` , error ) )
106115}
107116
@@ -115,7 +124,7 @@ export function createShopifySubscriber(emitter: AnalyticsEmitter, options: {
115124} ) {
116125 const { shop, domain, cookieDomain, canTrack, getConsent, whenReady } = options
117126
118- const basePayload = ( ) : Record < string , unknown > | null => {
127+ const basePayload = ( ) : ( ShopifyPageViewPayload & PrivacyFields ) | null => {
119128 const resolved = shop ( )
120129
121130 if ( ! validateShop ( resolved ) ) return null
@@ -124,10 +133,10 @@ export function createShopifySubscriber(emitter: AnalyticsEmitter, options: {
124133
125134 return {
126135 shopifySalesChannel : ShopifySalesChannel . headless ,
127- assetVersionId : version ,
136+ assetVersionId : MODULE_VERSION ,
128137 shopId : resolved . shopId ,
129- currency : resolved . currency ,
130- acceptedLanguage : resolved . acceptedLanguage ,
138+ currency : resolved . currency as ShopifyPageViewPayload [ 'currency' ] ,
139+ acceptedLanguage : resolved . acceptedLanguage as ShopifyPageViewPayload [ 'acceptedLanguage' ] ,
131140 hydrogenSubchannelId : resolved . hydrogenSubchannelId ,
132141 hasUserConsent : canTrack ( ) ,
133142 ...( getConsent ?.( ) ?? {
@@ -155,7 +164,7 @@ export function createShopifySubscriber(emitter: AnalyticsEmitter, options: {
155164 document . addEventListener ( 'visitorConsentCollected' , flush )
156165 }
157166
158- const track = ( build : ( payload : Record < string , unknown > ) => void ) => {
167+ const track = ( build : ( payload : ShopifyPageViewPayload & PrivacyFields ) => void ) => {
159168 const run = ( ) => {
160169 const payload = basePayload ( )
161170
@@ -169,7 +178,7 @@ export function createShopifySubscriber(emitter: AnalyticsEmitter, options: {
169178 } )
170179 }
171180
172- let viewPayload : Record < string , unknown > = { }
181+ let viewPayload : Partial < ShopifyPageViewPayload > = { }
173182
174183 emitter . on ( 'page_viewed' , ( data ) => {
175184 track ( ( payload ) => {
0 commit comments