From 2e99525c94dadce8e958ccec8a11490d584e3d55 Mon Sep 17 00:00:00 2001 From: Christel Westerberg Date: Mon, 26 Aug 2024 14:30:49 +0200 Subject: [PATCH] fix: track navigation transitions --- components/TrackingSDK/Client.tsx | 46 +-------------- components/TrackingSDK/RouterTransition.tsx | 64 ++++++++++++++++----- components/TrackingSDK/index.tsx | 2 +- utils/tracking.ts | 26 ++++++++- 4 files changed, 80 insertions(+), 58 deletions(-) diff --git a/components/TrackingSDK/Client.tsx b/components/TrackingSDK/Client.tsx index 5add36f8a..a3236c477 100644 --- a/components/TrackingSDK/Client.tsx +++ b/components/TrackingSDK/Client.tsx @@ -5,31 +5,9 @@ import { useCallback, useEffect, useState } from "react" import { webviews } from "@/constants/routes/webviews" -import { TrackingSDKData, TrackingSDKProps } from "@/types/components/tracking" +import { createSDKPageObject } from "@/utils/tracking" -function createSDKPageObject(trackingData: TrackingSDKData) { - const [lang, ...segments] = trackingData.pathName - .split("/") - .filter((seg: string) => seg) - - const joinedSegments = segments.join("|") - - const { host: domain } = window.location - const page_obj = { - pageType: trackingData.pageType, - pageName: joinedSegments, - pageId: trackingData.pageId, - channel: trackingData.channel, - siteSection: joinedSegments, - domain, - siteversion: "new-web", - domainlanguage: trackingData.lang ? trackingData.lang : lang, - createDate: trackingData.createdDate, - publishDate: trackingData.publishedDate, - // sessionid: "", // base on what? - } - return page_obj -} +import { TrackingSDKProps } from "@/types/components/tracking" export default function TrackingSDK({ pageData, userData }: TrackingSDKProps) { const pathName = usePathname() @@ -73,14 +51,9 @@ export default function TrackingSDK({ pageData, userData }: TrackingSDKProps) { entry as PerformanceNavigationTiming window.adobeDataLayer.push({ - event: "pageViewEnd", + event: "pageView", pageInfo: pageObject, userInfo: userData, - timing: { - duration, - loadEventEnd, - startTime, - }, }) } }) @@ -99,19 +72,6 @@ export default function TrackingSDK({ pageData, userData }: TrackingSDKProps) { } }, [pathName, pageData, userData, initPerformanceTracking]) - useEffect(() => { - if (window.adobeDataLayer) { - const trackingData = { ...pageData, pathName } - const pageObject = createSDKPageObject(trackingData) - - window.adobeDataLayer.push({ - event: "pageView", - pageInfo: pageObject, - userInfo: userData, - }) - } - }, [pathName, pageData, userData]) - useEffect(() => { // handle consent window.addEventListener("CookiebotOnAccept", CookiebotCallbackOnAccept) diff --git a/components/TrackingSDK/RouterTransition.tsx b/components/TrackingSDK/RouterTransition.tsx index 1b5de9346..cb2597c20 100644 --- a/components/TrackingSDK/RouterTransition.tsx +++ b/components/TrackingSDK/RouterTransition.tsx @@ -1,35 +1,73 @@ "use client" -import { startTransition, useEffect, useOptimistic } from "react" +import { usePathname } from "next/navigation" +import { startTransition, useEffect, useOptimistic, useState } from "react" import useRouterTransitionStore from "@/stores/router-transition" -export default function RouterTransition() { +import { createSDKPageObject } from "@/utils/tracking" + +import { TrackingSDKProps } from "@/types/components/tracking" + +enum TransitionStatusEnum { + NotRun = "NotRun", + Running = "Running", + Done = "Done", +} + +type TransitionStatus = keyof typeof TransitionStatusEnum + +export default function RouterTransition({ + pageData, + userData, +}: TrackingSDKProps) { const [loading, setLoading] = useOptimistic(false) + const [status, setStatus] = useState( + TransitionStatusEnum.NotRun + ) + + const pathName = usePathname() const { isTransitioning, stopRouterTransition } = useRouterTransitionStore() useEffect(() => { - if (!isTransitioning) { - return - } - - if (isTransitioning) { + if (isTransitioning && status === TransitionStatusEnum.NotRun) { startTransition(() => { + setStatus(TransitionStatusEnum.Running) setLoading(true) }) - } - - if (!loading && isTransitioning) { + } else if ( + !loading && + isTransitioning && + status === TransitionStatusEnum.Running + ) { + setStatus(TransitionStatusEnum.Done) stopRouterTransition() - - // Send event to adobe that navigation transition is completed + } else if ( + !loading && + !isTransitioning && + status === TransitionStatusEnum.Done + ) { if (window.adobeDataLayer) { + const trackingData = { ...pageData, pathName } + const pageObject = createSDKPageObject(trackingData) + window.adobeDataLayer.push({ event: "pageViewEnd", + pageInfo: pageObject, + userInfo: userData, }) } } - }, [isTransitioning, setLoading, loading, stopRouterTransition]) + }, [ + isTransitioning, + loading, + status, + setLoading, + stopRouterTransition, + pageData, + pathName, + userData, + ]) return null } diff --git a/components/TrackingSDK/index.tsx b/components/TrackingSDK/index.tsx index e725630e3..d267341b6 100644 --- a/components/TrackingSDK/index.tsx +++ b/components/TrackingSDK/index.tsx @@ -20,7 +20,7 @@ export default async function TrackingSDK({ return ( <> - + ) } diff --git a/utils/tracking.ts b/utils/tracking.ts index 1f4d0f388..bb3b15166 100644 --- a/utils/tracking.ts +++ b/utils/tracking.ts @@ -1,4 +1,4 @@ -import { TrackingPosition } from "@/types/components/tracking" +import { TrackingPosition, TrackingSDKData } from "@/types/components/tracking" export function trackClick(name: string) { if (typeof window !== "undefined" && window.adobeDataLayer) { @@ -32,3 +32,27 @@ export function trackLoginClick(position: TrackingPosition) { window.adobeDataLayer.push(loginEvent) } } + +export function createSDKPageObject(trackingData: TrackingSDKData) { + const [lang, ...segments] = trackingData.pathName + .split("/") + .filter((seg: string) => seg) + + const joinedSegments = segments.join("|") + + const { host: domain } = window.location + const page_obj = { + pageType: trackingData.pageType, + pageName: joinedSegments, + pageId: trackingData.pageId, + channel: trackingData.channel, + siteSection: joinedSegments, + domain, + siteversion: "new-web", + domainlanguage: trackingData.lang ? trackingData.lang : lang, + createDate: trackingData.createdDate, + publishDate: trackingData.publishedDate, + // sessionid: "", // base on what? + } + return page_obj +}