Merged in fix/tracking-pageload-issues (pull request #1630)

fix(tracking): fixes not sending pageview events when promise isn't resolving

* fix(tracking): fixes not sending pageview events when promise isn't resolving

* Refactor


Approved-by: Anton Gunnarsson
This commit is contained in:
Linus Flood
2025-03-25 12:33:04 +00:00
parent 53a610913a
commit 4cd6e7b55b
3 changed files with 105 additions and 71 deletions

View File

@@ -13,6 +13,7 @@ import useRouterTransitionStore from "@/stores/router-transition"
import useTrackingStore from "@/stores/tracking"
import { useSessionId } from "@/hooks/useSessionId"
import { promiseWithTimeout } from "@/utils/promiseWithTimeout"
import { createSDKPageObject, trackPageView } from "@/utils/tracking"
import type { TrackingSDKProps } from "@/types/components/tracking"
@@ -52,7 +53,7 @@ export default function RouterTransition({
hasRunInitial.current = true
setHasRun()
const getPageLoadTime = () => {
const getPageLoadTimeEntry = () => {
return new Promise<number>((resolve) => {
const observer = new PerformanceObserver((entries) => {
const navEntry = entries.getEntriesByType("navigation")[0]
@@ -65,23 +66,36 @@ export default function RouterTransition({
})
}
const getLCPTime = () => {
return new Promise<number>((resolve) => {
const getLCPTimeEntry = () => {
return new Promise<number | undefined>((resolve) => {
const observer = new PerformanceObserver((entries) => {
const lastEntry = entries.getEntries().pop()
const lastEntry = entries.getEntries().at(-1)
if (lastEntry) {
observer.disconnect()
resolve(lastEntry.startTime / 1000)
}
})
observer.observe({ type: "largest-contentful-paint", buffered: true })
const lcpSupported =
PerformanceObserver.supportedEntryTypes?.includes(
"largest-contentful-paint"
)
if (lcpSupported) {
observer.observe({
type: "largest-contentful-paint",
buffered: true,
})
} else {
resolve(undefined)
}
})
}
const trackPerformance = async () => {
const [pageLoadTime, lcpTime] = await Promise.all([
getPageLoadTime(),
getLCPTime(),
promiseWithTimeout(getPageLoadTimeEntry(), 3000),
promiseWithTimeout(getLCPTimeEntry(), 3000),
])
const trackingData = {