From 382acc8ef241a4605397ab0de8c9940e4c4d3474 Mon Sep 17 00:00:00 2001 From: Helen Lin Date: Fri, 6 Jan 2023 14:30:57 -0800 Subject: [PATCH 01/58] working shopify analytics --- apps/nextjs/pages/_app.tsx | 56 +++++- apps/nextjs/pages/index.tsx | 8 +- apps/nextjs/pages/test.tsx | 105 +++++++++++ packages/react/src/ShopifyCookies.tsx | 52 ++++++ packages/react/src/index.ts | 18 ++ packages/react/src/shopify-analytics-types.ts | 51 ++++++ packages/react/src/shopify-analytics.tsx | 165 ++++++++++++++++++ .../analytics-errors-utils.ts | 7 + .../custom-storefront-customer-tracking.ts | 93 ++++++++++ .../schemas/trekkie-storefront-page-view.ts | 52 ++++++ .../shopify-analytics-constants.ts | 29 +++ .../shopify-analytics-utils.ts | 39 +++++ .../shopify-cookies-utils.tsx | 74 ++++++++ 13 files changed, 747 insertions(+), 2 deletions(-) create mode 100644 apps/nextjs/pages/test.tsx create mode 100644 packages/react/src/ShopifyCookies.tsx create mode 100644 packages/react/src/shopify-analytics-types.ts create mode 100644 packages/react/src/shopify-analytics.tsx create mode 100644 packages/react/src/shopify-analytics/analytics-errors-utils.ts create mode 100644 packages/react/src/shopify-analytics/schemas/custom-storefront-customer-tracking.ts create mode 100644 packages/react/src/shopify-analytics/schemas/trekkie-storefront-page-view.ts create mode 100644 packages/react/src/shopify-analytics/shopify-analytics-constants.ts create mode 100644 packages/react/src/shopify-analytics/shopify-analytics-utils.ts create mode 100644 packages/react/src/shopify-analytics/shopify-cookies-utils.tsx diff --git a/apps/nextjs/pages/_app.tsx b/apps/nextjs/pages/_app.tsx index 2110e84c..35aa4aee 100644 --- a/apps/nextjs/pages/_app.tsx +++ b/apps/nextjs/pages/_app.tsx @@ -1,8 +1,50 @@ import '../styles/globals.css'; import type {AppProps} from 'next/app'; -import {ShopifyProvider, CartProvider} from '@shopify/hydrogen-react'; +import { + ShopifyProvider, + CartProvider, + ShopifyCookies, + sendShopifyAnalytics, + getClientBrowserParameters, + AnalyticsEventName, + type ShopifyPageViewPayload, +} from '@shopify/hydrogen-react'; +import {useRouter} from 'next/router'; +import {useEffect} from 'react'; + +const analyticsShopData = { + shopId: 55145660472, + currency: 'USD', + storefrontId: '9928760', +}; +let isInit = false; export default function App({Component, pageProps}: AppProps) { + const router = useRouter() + const hasUserConsent = true; + const analyticsPageData = { + hasUserConsent, + pageType: pageProps.data.pageType, + } + + useEffect(() => { + const handleRouteChange = () => { + sendPageView(analyticsPageData); + } + + router.events.on('routeChangeComplete', handleRouteChange); + + // First load event guard + if (!isInit) { + isInit = true; + sendPageView(analyticsPageData); + } + + return () => { + router.events.off('routeChangeComplete', handleRouteChange) + } + }, [analyticsPageData]) + return ( + ); } + +function sendPageView(analyticsPageData: Partial) { + sendShopifyAnalytics({ + eventName: AnalyticsEventName.PAGE_VIEW, + payload: { + ...getClientBrowserParameters(), + ...analyticsShopData, + ...analyticsPageData, + } as ShopifyPageViewPayload + }) +} diff --git a/apps/nextjs/pages/index.tsx b/apps/nextjs/pages/index.tsx index 0648e8fa..9419a955 100644 --- a/apps/nextjs/pages/index.tsx +++ b/apps/nextjs/pages/index.tsx @@ -10,7 +10,9 @@ import { Image as ShopifyImage, type StorefrontApiResponseOk, useShop, + AnalyticsPageType, } from '@shopify/hydrogen-react'; +import Link from 'next/link'; export const getServerSideProps: GetServerSideProps = async () => { // @TODO figure out how to get the client's IP address correctly and accurately. @@ -28,7 +30,10 @@ export const getServerSideProps: GetServerSideProps = async () => { }); // @TODO I don't love how we do this with 'errors' and 'data' - return {props: {data: response, errors: null}}; + return {props: {data: { + pageType: AnalyticsPageType.home, + ...response + }, errors: null}}; } catch (err) { console.error(err); return {props: {data: null, errors: [(err as Error).toString()]}}; @@ -63,6 +68,7 @@ export default function Home({ loading="eager" />
Storefront API Domain: {storeDomain}
+ Go to Test