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"
/>
>
),
}}
>
);
}