Files
web/packages/tracking/lib/useTrackSoftNavigationBasic.ts
Linus Flood fdf124bd0c Merged in feat/book-504-at-pageview (pull request #3099)
Feat(BOOK-504): basic pageview event

* fix

* Cleanup


Approved-by: Joakim Jäderberg
2025-11-07 07:57:19 +00:00

84 lines
2.1 KiB
TypeScript

"use client"
import { useSession } from "next-auth/react"
import { startTransition, useEffect, useRef, useState } from "react"
import { useSessionId } from "@scandic-hotels/common/hooks/useSessionId"
import useRouterTransitionStore from "@scandic-hotels/common/stores/router-transition"
import { isValidSession } from "@scandic-hotels/trpc/utils/session"
import { createSDKPageObject, trackPageView } from "./pageview"
import type { TrackingSDKPageData } from "./types"
type TrackingSDKProps = {
pageData: TrackingSDKPageData
pathName: string
}
enum TransitionStatusEnum {
NotRun = "NotRun",
Running = "Running",
Done = "Done",
}
type TransitionStatus = keyof typeof TransitionStatusEnum
export const useTrackSoftNavigationBasic = ({
pageData,
pathName,
}: TrackingSDKProps) => {
const [status, setStatus] = useState<TransitionStatus>(
TransitionStatusEnum.NotRun
)
const sessionId = useSessionId()
const { data: session } = useSession()
const validSession = isValidSession(session)
const { isTransitioning, stopRouterTransition } = useRouterTransitionStore()
const previousPathname = useRef<string | null>(null)
useEffect(() => {
if (isTransitioning && status === TransitionStatusEnum.NotRun) {
startTransition(() => {
setStatus(TransitionStatusEnum.Running)
})
return
}
if (isTransitioning && status === TransitionStatusEnum.Running) {
setStatus(TransitionStatusEnum.Done)
stopRouterTransition()
return
}
if (!isTransitioning && status === TransitionStatusEnum.Done) {
const trackingData = {
...pageData,
sessionId,
pathName,
}
const pageObject = createSDKPageObject(trackingData)
trackPageView({
event: "pageViewBasic",
pageInfo: pageObject,
userInfo: {
loginStatus: validSession ? "logged in" : "Non-logged in",
},
})
setStatus(TransitionStatusEnum.NotRun) // Reset status
previousPathname.current = pathName // Update for next render
}
}, [
isTransitioning,
status,
stopRouterTransition,
pageData,
pathName,
sessionId,
])
}