From fd28e772a83b75bfb840cdd47940f3e87140a48e Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 16 May 2026 21:05:49 -0300 Subject: [PATCH] fix(dashboard): show no-auth card for free providers instead of OAuth modal OpenCode Free (noAuth: true) was routed through OAuthModal which tried to call a non-existent /api/oauth/opencode/authorize endpoint, resulting in a 500 error. Detect noAuth free providers via FREE_PROVIDERS[id]?.noAuth and render a NoAuthProviderCard (lock_open + description) instead of the connections section with the "+ Add" button that triggered the broken flow. --- .../dashboard/providers/[id]/page.tsx | 6 +++++- src/shared/components/NoAuthProviderCard.tsx | 21 +++++++++++++++++++ src/shared/components/index.tsx | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/shared/components/NoAuthProviderCard.tsx diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx index 063183b372..cac8ba720c 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/page.tsx @@ -19,9 +19,11 @@ import { Toggle, Select, ProxyConfigModal, + NoAuthProviderCard, } from "@/shared/components"; import { LOCAL_PROVIDERS, + FREE_PROVIDERS, getProviderAlias, isOpenAICompatibleProvider, isAnthropicCompatibleProvider, @@ -1084,6 +1086,7 @@ export default function ProviderDetailPage() { providerInfo?.toggleAuthType === "oauth" || providerInfo?.toggleAuthType === "free"; const providerSupportsPat = supportsApiKeyOnFreeProvider(providerId); const isOAuth = providerSupportsOAuth && !providerSupportsPat; + const isFreeNoAuth = FREE_PROVIDERS[providerId]?.noAuth === true; const registryModels = getModelsByProviderId(providerId); // Prefer synced API-discovered models when available, then merge built-ins // and user-managed custom models without duplicating IDs. @@ -3167,7 +3170,8 @@ export default function ProviderDetailPage() { )} {/* Connections */} - {!isUpstreamProxyProvider && ( + {!isUpstreamProxyProvider && isFreeNoAuth && } + {!isUpstreamProxyProvider && !isFreeNoAuth && (
diff --git a/src/shared/components/NoAuthProviderCard.tsx b/src/shared/components/NoAuthProviderCard.tsx new file mode 100644 index 0000000000..d4bceb4693 --- /dev/null +++ b/src/shared/components/NoAuthProviderCard.tsx @@ -0,0 +1,21 @@ +"use client"; + +import Card from "./Card"; + +export default function NoAuthProviderCard() { + return ( + +
+
+ lock_open +
+
+

No authentication required

+

+ This provider is ready to use immediately — no signup or API key needed. +

+
+
+
+ ); +} diff --git a/src/shared/components/index.tsx b/src/shared/components/index.tsx index 568c9e44e0..af975c2826 100644 --- a/src/shared/components/index.tsx +++ b/src/shared/components/index.tsx @@ -32,6 +32,7 @@ export { default as NotificationToast } from "./NotificationToast"; export { default as FilterBar } from "./FilterBar"; export { default as ColumnToggle } from "./ColumnToggle"; export { default as DataTable } from "./DataTable"; +export { default as NoAuthProviderCard } from "./NoAuthProviderCard"; // Layouts export * from "./layouts";