import { StringParam, useQueryParam, withDefault } from "use-query-params"; import { PublishTraceSwitch } from "@/src/components/publish-object-switch"; import { DetailPageNav } from "@/src/features/navigate-detail-pages/DetailPageNav"; import { useRouter } from "next/router"; import { api } from "@/src/utils/api"; import { StarTraceDetailsToggle } from "@/src/components/star-toggle"; import { ErrorPage } from "@/src/components/error-page"; import { DeleteTraceButton } from "@/src/components/deleteButton"; import Page from "@/src/components/layouts/page"; import { Trace } from "@/src/components/trace"; import { TagTraceDetailsPopover } from "@/src/features/tag/components/TagTraceDetailsPopover"; import { useIsAuthenticatedAndProjectMember } from "@/src/features/auth/hooks"; export function TracePage({ traceId, timestamp, }: { traceId: string; timestamp?: Date; }) { const router = useRouter(); const trace = api.traces.byIdWithObservationsAndScores.useQuery( { traceId, timestamp, projectId: router.query.projectId as string, }, { retry(failureCount, error) { if ( error.data?.code === "UNAUTHORIZED" || error.data?.code === "NOT_FOUND" ) return false; return failureCount < 3; }, }, ); const isAuthenticatedAndProjectMember = useIsAuthenticatedAndProjectMember( trace.data?.projectId ?? "", ); const traceFilterOptions = api.traces.filterOptions.useQuery( { projectId: trace.data?.projectId as string, }, { trpc: { context: { skipBatch: true, }, }, enabled: !!trace.data?.projectId && isAuthenticatedAndProjectMember, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, staleTime: Infinity, }, ); const filterOptionTags = traceFilterOptions.data?.tags ?? []; const allTags = filterOptionTags.map((t) => t.value); const [selectedTab, setSelectedTab] = useQueryParam( "display", withDefault(StringParam, "details"), ); if (trace.error?.data?.code === "UNAUTHORIZED") return ; if (trace.error?.data?.code === "NOT_FOUND") return ( void window.location.reload(), }} /> ); if (!trace.data) return
Loading...
; return (
), actionButtonsRight: ( <> { const { view, display, projectId } = router.query; const queryParams = new URLSearchParams({ ...(typeof view === "string" ? { view } : {}), ...(typeof display === "string" ? { display } : {}), }); const queryParamString = Boolean(queryParams.size) ? `?${queryParams.toString()}` : ""; const timestamp = entry.params && entry.params.timestamp ? encodeURIComponent(entry.params.timestamp) : undefined; return `/project/${projectId as string}/traces/${entry.id}${queryParamString}${timestamp ? `?timestamp=${timestamp}` : ""}`; }} listKey="traces" /> ), }} >
); }