diff --git a/frontend/src/app/actors-grid.tsx b/frontend/src/app/actors-grid.tsx index 73333ee2c2..1e4559ca77 100644 --- a/frontend/src/app/actors-grid.tsx +++ b/frontend/src/app/actors-grid.tsx @@ -17,7 +17,7 @@ import { SmallText, WithTooltip, } from "@/components"; -import { cloudEnv } from "@/lib/env"; +import { getRivetRunUrl } from "@/lib/env"; import { features } from "@/lib/features"; import { ActorIcon } from "@/components/lazy-icon"; import { useDataProvider, useCloudNamespaceDataProvider } from "@/components/actors"; @@ -350,11 +350,7 @@ function DeploymentsSection() { managedPool?.status === "ready" && managedPool?.config?.image != null; const deploymentUrl = isDeployed && nsData?.access?.engineNamespaceName - ? (() => { - const engineNsName = nsData.access.engineNamespaceName; - const isProduction = cloudEnv().DEPLOYMENT_TYPE === "production"; - return `https://${engineNsName}${isProduction ? "" : ".staging"}.rivet.run/`; - })() + ? `${getRivetRunUrl(nsData.access.engineNamespaceName)}/` : null; if (isLoadingPool || !hasPool) { diff --git a/frontend/src/app/feedback-button.tsx b/frontend/src/app/feedback-button.tsx index 3325e5d088..7c774ff221 100644 --- a/frontend/src/app/feedback-button.tsx +++ b/frontend/src/app/feedback-button.tsx @@ -20,7 +20,7 @@ export function FeedbackButton({ source = "web" }: { source?: string }) { // already typing in an input/textarea/contenteditable somewhere else. useEffect(() => { const handler = (e: KeyboardEvent) => { - if (e.key.toLowerCase() !== "f") return; + if (!e.key && e.key.toLowerCase() !== "f") return; if (e.metaKey || e.ctrlKey || e.altKey) return; const target = e.target as HTMLElement | null; if (!target) return; diff --git a/frontend/src/app/getting-started.tsx b/frontend/src/app/getting-started.tsx index 16ee41fc46..6c28f8c536 100644 --- a/frontend/src/app/getting-started.tsx +++ b/frontend/src/app/getting-started.tsx @@ -43,7 +43,7 @@ import { import { defineStepper } from "@/components/ui/stepper"; import { deriveProviderFromMetadata } from "@/lib/data"; import { successfulBackendSetupEffect } from "@/lib/effects"; -import { cloudEnv, engineEnv } from "@/lib/env"; +import { cloudEnv, engineEnv, getRivetRunUrl } from "@/lib/env"; import { features } from "@/lib/features"; import { usePublishableToken } from "@/queries/accessors"; import { queryClient } from "@/queries/global"; @@ -1486,10 +1486,7 @@ function FrontendSetup() { const deploymentUrl = useMemo(() => { if (provider === "rivet" && nsData?.access?.engineNamespaceName) { - const engineNsName = nsData.access.engineNamespaceName; - const env = cloudEnv(); - const isProduction = env.DEPLOYMENT_TYPE === "production"; - return `https://${engineNsName}${isProduction ? "" : ".staging"}.rivet.run`; + return getRivetRunUrl(nsData.access.engineNamespaceName); } if (!config?.url) return null; try { diff --git a/frontend/src/lib/env.ts b/frontend/src/lib/env.ts index 443419f223..a01889db19 100644 --- a/frontend/src/lib/env.ts +++ b/frontend/src/lib/env.ts @@ -34,3 +34,10 @@ export const cloudEnvSchema = commonEnvSchema.merge( ); export const cloudEnv = () => cloudEnvSchema.parse(import.meta.env); + +export const isStagingHost = () => + typeof window !== "undefined" && + /(^|\.)staging\.rivet\.dev$/.test(window.location.hostname); + +export const getRivetRunUrl = (engineNsName: string) => + `https://${engineNsName}${isStagingHost() ? ".staging" : ""}.rivet.run`;