import { useLocation } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { z } from "zod"; import { ExitIcon } from "~/assets/icons/ExitIcon"; import { LinkButton } from "~/components/primitives/Buttons"; import { Header2, Header3 } from "~/components/primitives/Headers"; import { useEnvironment } from "~/hooks/useEnvironment"; import { useOrganization } from "~/hooks/useOrganizations"; import { useProject } from "~/hooks/useProject"; import { findProjectBySlug } from "~/models/project.server"; import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server"; import { WaitpointPresenter } from "~/presenters/v3/WaitpointPresenter.server"; import { runOpsNewReplicaClient, runOpsLegacyReplica, runOpsSplitReadEnabled, type PrismaClientOrTransaction, } from "~/db.server"; import { requireUserId } from "~/services/session.server"; import { cn } from "~/utils/cn"; import { EnvironmentParamSchema, v3WaitpointTokensPath } from "~/utils/pathBuilder"; import { CompleteWaitpointForm } from "../resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.waitpoints.$waitpointFriendlyId.complete/route"; import { WaitpointDetailTable } from "~/components/runs/v3/WaitpointDetails"; import { TaskRunsTable } from "~/components/runs/v3/TaskRunsTable"; import { InfoIconTooltip } from "~/components/primitives/Tooltip"; import { logger } from "~/services/logger.server"; const Params = EnvironmentParamSchema.extend({ waitpointParam: z.string(), }); export const loader = async ({ request, params }: LoaderFunctionArgs) => { const userId = await requireUserId(request); const { organizationSlug, projectParam, envParam, waitpointParam } = Params.parse(params); const project = await findProjectBySlug(organizationSlug, projectParam, userId); if (!project) { throw new Response(undefined, { status: 404, statusText: "Project not found", }); } const environment = await findEnvironmentBySlug(project.id, envParam, userId); if (!environment) { throw new Response(undefined, { status: 404, statusText: "Environment not found", }); } try { const presenter = new WaitpointPresenter(undefined, undefined, { newClient: runOpsNewReplicaClient as unknown as PrismaClientOrTransaction, legacyReplica: runOpsLegacyReplica as unknown as PrismaClientOrTransaction, splitEnabled: runOpsSplitReadEnabled, }); const result = await presenter.call({ friendlyId: waitpointParam, environmentId: environment.id, projectId: project.id, }); if (!result) { throw new Response(undefined, { status: 404, statusText: "Waitpoint not found", }); } return typedjson({ waitpoint: result }); } catch (error) { logger.error("Error loading waitpoint for inspector", { error, organizationSlug, projectParam, envParam, waitpointParam, }); throw new Response(undefined, { status: 400, statusText: "Something went wrong, if this problem persists please contact support.", }); } }; export default function Page() { const { waitpoint } = useTypedLoaderData(); const location = useLocation(); const organization = useOrganization(); const project = useProject(); const environment = useEnvironment(); return (
{waitpoint.id}
Related runs
{waitpoint.status === "WAITING" && (
)}
); }