From a1d74b9c4a6586f05bdeb9f3a87e7115902307c2 Mon Sep 17 00:00:00 2001 From: Kacper Wojciechowski <39823706+jog1t@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:46:12 +0100 Subject: [PATCH] fix(dashboard): display support dropdown on actor error --- frontend/src/app/context-switcher.tsx | 16 ++++++++++------ frontend/src/app/runner-config-table.tsx | 3 ++- .../src/components/actors/actor-status-label.tsx | 14 ++++---------- .../actors/guard-connectable-inspector.tsx | 11 +++++++++++ frontend/src/components/ui/popover.tsx | 2 +- frontend/src/queries/types.ts | 10 ++++++++++ 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/frontend/src/app/context-switcher.tsx b/frontend/src/app/context-switcher.tsx index 1286ee941b..77da61cb20 100644 --- a/frontend/src/app/context-switcher.tsx +++ b/frontend/src/app/context-switcher.tsx @@ -288,7 +288,8 @@ function ProjectList({ startIcon={} onClick={() => { onHover?.(null); - navigate({ + onClose?.(); + return navigate({ to: ".", search: (old) => ({ ...old, @@ -344,7 +345,8 @@ function ProjectList({ keywords={["create", "new", "project"]} onSelect={() => { onHover?.(null); - navigate({ + onClose?.(); + return navigate({ to: ".", search: (old) => ({ ...old, @@ -466,7 +468,8 @@ function NamespaceList({ size="sm" startIcon={} onClick={() => { - navigate({ + onClose?.(); + return navigate({ to: ".", search: (old) => ({ ...old, @@ -490,10 +493,11 @@ function NamespaceList({ ]} className="static w-full" onSelect={() => { + onClose?.(); clerk.setActive({ organization, }); - navigate({ + return navigate({ to: "/orgs/$organization/projects/$project/ns/$namespace", params: { organization: organization, @@ -501,7 +505,6 @@ function NamespaceList({ namespace: namespace.name, }, }); - onClose?.(); }} > @@ -523,7 +526,8 @@ function NamespaceList({ { - navigate({ + onClose?.(); + return navigate({ to: ".", search: (old) => ({ ...old, diff --git a/frontend/src/app/runner-config-table.tsx b/frontend/src/app/runner-config-table.tsx index 2de1e29c25..eb17da7425 100644 --- a/frontend/src/app/runner-config-table.tsx +++ b/frontend/src/app/runner-config-table.tsx @@ -40,6 +40,7 @@ import { useEngineCompatDataProvider, } from "@/components/actors"; import { REGION_LABEL } from "@/components/matchmaker/lobby-region"; +import { RivetActorError } from "@/queries/types"; interface RunnerConfigsTableProps { isLoading?: boolean; @@ -217,7 +218,7 @@ function StatusCell({ datacenters: Record; }) { const errors = useMemo(() => { - const errorMap: Record = {}; + const errorMap: Record = {}; let hasErrors = false; for (const [dc, config] of Object.entries(datacenters)) { if (config.runnerPoolError) { diff --git a/frontend/src/components/actors/actor-status-label.tsx b/frontend/src/components/actors/actor-status-label.tsx index 9bbd8b7bb6..3d93b3bc64 100644 --- a/frontend/src/components/actors/actor-status-label.tsx +++ b/frontend/src/components/actors/actor-status-label.tsx @@ -1,4 +1,3 @@ -import type { Rivet } from "@rivetkit/engine-api-full"; import { useQuery } from "@tanstack/react-query"; import { formatISO } from "date-fns"; import { isObject } from "lodash"; @@ -15,6 +14,7 @@ import { ScrollArea } from "../ui/scroll-area"; import { Code } from "../ui/typography"; import { useDataProvider } from "./data-provider"; import type { ActorId, ActorStatus } from "./queries"; +import { RivetActorError } from "@/queries/types"; export const ACTOR_STATUS_LABEL_MAP = { unknown: "Unknown", @@ -159,13 +159,7 @@ export function QueriedActorError({ actorId }: { actorId: ActorId }) { export function RunnerPoolError({ error, }: { - error: - | string - | null - | { runner_id: string } - | { serverless_http_error: unknown } - | { serverless_connection_error: unknown } - | { serverless_invalid_sse_payload: unknown }; + error: RivetActorError }) { return match(error) .with(P.nullish, () => null) @@ -241,13 +235,13 @@ export function ErrorDetails({ error }: { error: unknown }) { View Error Details - + {json ? (
diff --git a/frontend/src/components/actors/guard-connectable-inspector.tsx b/frontend/src/components/actors/guard-connectable-inspector.tsx index a7133c0e8f..503e573bad 100644 --- a/frontend/src/components/actors/guard-connectable-inspector.tsx +++ b/frontend/src/components/actors/guard-connectable-inspector.tsx @@ -3,6 +3,7 @@ import { faExclamationTriangle, faPowerOff, + faQuestionCircle, faSpinnerThird, Icon, } from "@rivet-gg/icons"; @@ -16,6 +17,7 @@ import { useRouteContext, useSearch } from "@tanstack/react-router"; import { createContext, type ReactNode, useContext, useMemo } from "react"; import { match, P } from "ts-pattern"; import { useLocalStorage } from "usehooks-ts"; +import { HelpDropdown } from "@/app/help-dropdown"; import { isRivetApiError } from "@/lib/errors"; import { DiscreteCopyButton } from "../copy-area"; import { getConfig, useConfig } from "../lib/config"; @@ -87,6 +89,15 @@ function UnavailableInfo({

Actor is unavailable.

+ + + + )) .with("pending", () => ) diff --git a/frontend/src/components/ui/popover.tsx b/frontend/src/components/ui/popover.tsx index b235499bae..f43db9ab88 100644 --- a/frontend/src/components/ui/popover.tsx +++ b/frontend/src/components/ui/popover.tsx @@ -19,7 +19,7 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fill-mode-forwards data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className, )} {...props} diff --git a/frontend/src/queries/types.ts b/frontend/src/queries/types.ts index 3dc37c341f..312597448a 100644 --- a/frontend/src/queries/types.ts +++ b/frontend/src/queries/types.ts @@ -25,3 +25,13 @@ export const Changelog = z.array(ChangelogItem); export type Changelog = z.infer; export type ChangelogItem = z.infer; + + +export type RivetActorError = + | string + | null + | object + | { runner_id: string } + | { serverless_http_error: unknown } + | { serverless_connection_error: unknown } + | { serverless_invalid_sse_payload: unknown }; \ No newline at end of file