pre-bemis
This commit is contained in:
68
components/perf/RouteAudit.tsx
Normal file
68
components/perf/RouteAudit.tsx
Normal file
@@ -0,0 +1,68 @@
|
||||
"use client";
|
||||
|
||||
import { useEffect } from "react";
|
||||
import { usePathname, useSearchParams } from "next/navigation";
|
||||
|
||||
const PERF_ENABLED = process.env.NEXT_PUBLIC_PERF_LOGS === "1";
|
||||
const STORAGE_KEY = "perf_nav_start";
|
||||
|
||||
type NavMark = {
|
||||
href?: string;
|
||||
from?: string;
|
||||
ts: number;
|
||||
};
|
||||
|
||||
function readNavMark(): NavMark | null {
|
||||
try {
|
||||
const raw = sessionStorage.getItem(STORAGE_KEY);
|
||||
if (!raw) return null;
|
||||
const parsed = JSON.parse(raw) as NavMark;
|
||||
if (!parsed || typeof parsed.ts !== "number") return null;
|
||||
return parsed;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function clearNavMark() {
|
||||
try {
|
||||
sessionStorage.removeItem(STORAGE_KEY);
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
export function RouteAudit() {
|
||||
const pathname = usePathname();
|
||||
const searchParams = useSearchParams();
|
||||
|
||||
useEffect(() => {
|
||||
if (!PERF_ENABLED) return;
|
||||
|
||||
const params = searchParams?.toString();
|
||||
const to = params ? `${pathname}?${params}` : pathname;
|
||||
const mark = readNavMark();
|
||||
if (!mark) return;
|
||||
|
||||
const durationMs = Date.now() - mark.ts;
|
||||
const payload = {
|
||||
from: mark.from ?? "",
|
||||
to,
|
||||
href: mark.href ?? "",
|
||||
durationMs,
|
||||
startedAt: mark.ts,
|
||||
};
|
||||
|
||||
console.info("[perf.nav]", payload);
|
||||
fetch("/api/debug/perf", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ event: "nav", data: payload }),
|
||||
keepalive: true,
|
||||
}).catch(() => {});
|
||||
|
||||
clearNavMark();
|
||||
}, [pathname, searchParams]);
|
||||
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user