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 });