From 0d3936ea32091b05ed4d65a2ef2489a9a8920def Mon Sep 17 00:00:00 2001 From: Kacper Wojciechowski <39823706+jog1t@users.noreply.github.com> Date: Tue, 14 Oct 2025 02:00:02 +0200 Subject: [PATCH] chore: error handling for vercel --- .../src/app/dialogs/connect-vercel-frame.tsx | 6 +- .../src/app/forms/connect-vercel-form.tsx | 91 ++++++++++++++++--- frontend/src/app/forms/stepper-form.tsx | 1 - 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/frontend/src/app/dialogs/connect-vercel-frame.tsx b/frontend/src/app/dialogs/connect-vercel-frame.tsx index e55511a0ce..439db56138 100644 --- a/frontend/src/app/dialogs/connect-vercel-frame.tsx +++ b/frontend/src/app/dialogs/connect-vercel-frame.tsx @@ -6,7 +6,7 @@ import { } from "@tanstack/react-query"; import confetti from "canvas-confetti"; import { useWatch } from "react-hook-form"; -import z from "zod"; +import type z from "zod"; import * as ConnectVercelForm from "@/app/forms/connect-vercel-form"; import { HelpDropdown } from "@/app/help-dropdown"; import { @@ -21,7 +21,7 @@ import { import { type Region, useEngineCompatDataProvider } from "@/components/actors"; import { type JoinStepSchemas, StepperForm } from "../forms/stepper-form"; -const {stepper} = ConnectVercelForm; +const { stepper } = ConnectVercelForm; type FormValues = z.infer>; @@ -183,7 +183,7 @@ function Step3() {

- +
); diff --git a/frontend/src/app/forms/connect-vercel-form.tsx b/frontend/src/app/forms/connect-vercel-form.tsx index 2f4a9eda89..7a10f93fda 100644 --- a/frontend/src/app/forms/connect-vercel-form.tsx +++ b/frontend/src/app/forms/connect-vercel-form.tsx @@ -5,10 +5,18 @@ import { faTriangleExclamation, Icon, } from "@rivet-gg/icons"; +import type { Rivet } from "@rivetkit/engine-api-full"; import { useInfiniteQuery, useQuery } from "@tanstack/react-query"; import { AnimatePresence, motion } from "framer-motion"; import { useEffect } from "react"; -import { useController, useFieldArray, useForm, useFormContext, useWatch } from "react-hook-form"; +import { + useController, + useFieldArray, + useForm, + useFormContext, + useWatch, +} from "react-hook-form"; +import { match, P } from "ts-pattern"; import { useDebounceValue } from "usehooks-ts"; import z from "zod"; import { @@ -33,9 +41,8 @@ import { SelectValue, } from "@/components"; import { useEngineCompatDataProvider } from "@/components/actors"; -import { VisibilitySensor } from "@/components/visibility-sensor"; import { defineStepper } from "@/components/ui/stepper"; -import { Rivet } from "@rivetkit/engine-api-full"; +import { VisibilitySensor } from "@/components/visibility-sensor"; const endpointSchema = z .string() @@ -405,7 +412,13 @@ const code = ({ plan }: { plan: string }) => export const Json = ({ plan }: { plan: string }) => { return (
- code({plan}).replaceAll(" // [!code highlight]", "")}> + + code({ plan }).replaceAll(" // [!code highlight]", "") + } + > @@ -462,15 +476,15 @@ export function ConnectionCheck() { const enabled = !!endpoint && endpointSchema.safeParse(endpoint).success; - console.log(enabled); - const [debounced] = useDebounceValue(endpoint, 300); const { isSuccess, data, isError, isRefetchError, isLoadingError, error } = useQuery({ ...dataProvider.runnerHealthCheckQueryOptions({ runnerUrl: debounced, - headers: Object.fromEntries(headers.filter(([k, v]) => k && v).map(([k, v]) => [k, v])), + headers: Object.fromEntries( + headers.filter(([k, v]) => k && v).map(([k, v]) => [k, v]), + ), }), enabled, retry: 0, @@ -517,7 +531,9 @@ export function ConnectionCheck() { Health check failed, verify the endpoint is correct.

- {isRivetHealthCheckFailureResponse(error) ?

{JSON.stringify(error.failure.error)}

: null} + {isRivetHealthCheckFailureResponse(error) ? ( + + ) : null}

Endpoint{" "} { + return ( +

+ Health check failed with status{" "} + {e.nonSuccessStatus.statusCode} +

+ ); + }) + .with({ invalidRequest: P.any }, (e) => { + return

Health check failed because the request was invalid.

; + }) + .with({ invalidResponseJson: P.any }, (e) => { + return ( +

+ Health check failed because the response was not valid JSON. +

+ ); + }) + .with({ requestFailed: P.any }, (e) => { + return ( +

+ Health check failed because the request could not be + completed. +

+ ); + }) + .with({ requestTimedOut: P.any }, (e) => { + return

Health check failed because the request timed out.

; + }) + .with({ invalidResponseSchema: P.any }, (e) => { + return ( +

Health check failed because the response was not valid.

+ ); + }) + .exhaustive(); +} diff --git a/frontend/src/app/forms/stepper-form.tsx b/frontend/src/app/forms/stepper-form.tsx index 06745712fd..2120ebb615 100644 --- a/frontend/src/app/forms/stepper-form.tsx +++ b/frontend/src/app/forms/stepper-form.tsx @@ -87,7 +87,6 @@ function Content({ const ref = useRef> | null>({}); const handleSubmit = (values: z.infer>) => { - console.log("submitting"); ref.current = { ...ref.current, ...values }; if (stepper.isLast) { return onSubmit?.({ values: ref.current, form, stepper });