diff --git a/webview-ui/src/components/common/ApiKeyInput.tsx b/webview-ui/src/components/common/ApiKeyInput.tsx new file mode 100644 index 00000000000..a4cfd1b6d99 --- /dev/null +++ b/webview-ui/src/components/common/ApiKeyInput.tsx @@ -0,0 +1,41 @@ +import { useState } from "react" +import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" + +type ApiKeyInputProps = { + value: string + onInput: (event: Event | React.FormEvent) => void + placeholder: string + label: string + className?: string + name?: string + children?: React.ReactNode +} + +export const ApiKeyInput = ({ value, onInput, placeholder, label, className, name, children }: ApiKeyInputProps) => { + const [showApiKey, setShowApiKey] = useState(false) + + return ( +
+ + + {children} + +
setShowApiKey(!showApiKey)}> + {showApiKey ? ( + + ) : ( + + )} +
+
+ ) +} diff --git a/webview-ui/src/components/settings/providers/Anthropic.tsx b/webview-ui/src/components/settings/providers/Anthropic.tsx index f340e73f729..7996acdb889 100644 --- a/webview-ui/src/components/settings/providers/Anthropic.tsx +++ b/webview-ui/src/components/settings/providers/Anthropic.tsx @@ -6,6 +6,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform, noTransform } from "../transforms" @@ -32,14 +33,12 @@ export const Anthropic = ({ apiConfiguration, setApiConfigurationField }: Anthro return ( <> - - - + label={t("settings:providers.anthropicApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Bedrock.tsx b/webview-ui/src/components/settings/providers/Bedrock.tsx index 1839298f9b6..9a3565f27cc 100644 --- a/webview-ui/src/components/settings/providers/Bedrock.tsx +++ b/webview-ui/src/components/settings/providers/Bedrock.tsx @@ -6,6 +6,7 @@ import { type ProviderSettings, type ModelInfo, BEDROCK_REGIONS } from "@roo-cod import { useAppTranslation } from "@src/i18n/TranslationContext" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, StandardTooltip } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform, noTransform } from "../transforms" @@ -59,30 +60,24 @@ export const Bedrock = ({ apiConfiguration, setApiConfigurationField, selectedMo ) : ( <> - - - - + - - - + - - + label={t("settings:providers.awsSessionToken")} + /> )}
diff --git a/webview-ui/src/components/settings/providers/Chutes.tsx b/webview-ui/src/components/settings/providers/Chutes.tsx index c51479421a9..89c6b9ed166 100644 --- a/webview-ui/src/components/settings/providers/Chutes.tsx +++ b/webview-ui/src/components/settings/providers/Chutes.tsx @@ -5,6 +5,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -29,14 +30,12 @@ export const Chutes = ({ apiConfiguration, setApiConfigurationField }: ChutesPro return ( <> - - - + label={t("settings:providers.chutesApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/DeepSeek.tsx b/webview-ui/src/components/settings/providers/DeepSeek.tsx index 6f0ac2d92af..080e38c92d1 100644 --- a/webview-ui/src/components/settings/providers/DeepSeek.tsx +++ b/webview-ui/src/components/settings/providers/DeepSeek.tsx @@ -5,6 +5,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -29,14 +30,12 @@ export const DeepSeek = ({ apiConfiguration, setApiConfigurationField }: DeepSee return ( <> - - - + label={t("settings:providers.deepSeekApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Gemini.tsx b/webview-ui/src/components/settings/providers/Gemini.tsx index 21056f12d53..a01266b027b 100644 --- a/webview-ui/src/components/settings/providers/Gemini.tsx +++ b/webview-ui/src/components/settings/providers/Gemini.tsx @@ -6,6 +6,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -34,14 +35,12 @@ export const Gemini = ({ apiConfiguration, setApiConfigurationField }: GeminiPro return ( <> - - - + label={t("settings:providers.geminiApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Glama.tsx b/webview-ui/src/components/settings/providers/Glama.tsx index ca1c6590ef4..74deefa1988 100644 --- a/webview-ui/src/components/settings/providers/Glama.tsx +++ b/webview-ui/src/components/settings/providers/Glama.tsx @@ -8,6 +8,7 @@ import type { RouterModels } from "@roo/api" import { useAppTranslation } from "@src/i18n/TranslationContext" import { getGlamaAuthUrl } from "@src/oauth/urls" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" import { ModelPicker } from "../ModelPicker" @@ -44,14 +45,12 @@ export const Glama = ({ return ( <> - - - + label={t("settings:providers.glamaApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Groq.tsx b/webview-ui/src/components/settings/providers/Groq.tsx index a8a910d1ace..26113f1ba1e 100644 --- a/webview-ui/src/components/settings/providers/Groq.tsx +++ b/webview-ui/src/components/settings/providers/Groq.tsx @@ -5,6 +5,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -29,14 +30,12 @@ export const Groq = ({ apiConfiguration, setApiConfigurationField }: GroqProps) return ( <> - - - + label={t("settings:providers.groqApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/LiteLLM.tsx b/webview-ui/src/components/settings/providers/LiteLLM.tsx index a2467b3c0b1..f8df2e21edf 100644 --- a/webview-ui/src/components/settings/providers/LiteLLM.tsx +++ b/webview-ui/src/components/settings/providers/LiteLLM.tsx @@ -10,6 +10,7 @@ import { vscode } from "@src/utils/vscode" import { useExtensionState } from "@src/context/ExtensionStateContext" import { useAppTranslation } from "@src/i18n/TranslationContext" import { Button } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" import { ModelPicker } from "../ModelPicker" @@ -98,14 +99,12 @@ export const LiteLLM = ({ - - - + label={t("settings:providers.litellmApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")} diff --git a/webview-ui/src/components/settings/providers/Mistral.tsx b/webview-ui/src/components/settings/providers/Mistral.tsx index 666d1421c31..154551a61b7 100644 --- a/webview-ui/src/components/settings/providers/Mistral.tsx +++ b/webview-ui/src/components/settings/providers/Mistral.tsx @@ -7,6 +7,7 @@ import type { RouterModels } from "@roo/api" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -32,14 +33,12 @@ export const Mistral = ({ apiConfiguration, setApiConfigurationField }: MistralP return ( <> - - {t("settings:providers.mistralApiKey")} - + label={t("settings:providers.mistralApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Moonshot.tsx b/webview-ui/src/components/settings/providers/Moonshot.tsx index db5f162a9d6..1f6e397275b 100644 --- a/webview-ui/src/components/settings/providers/Moonshot.tsx +++ b/webview-ui/src/components/settings/providers/Moonshot.tsx @@ -5,6 +5,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" import { cn } from "@/lib/utils" @@ -45,14 +46,12 @@ export const Moonshot = ({ apiConfiguration, setApiConfigurationField }: Moonsho
- - - + label={t("settings:providers.moonshotApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/OpenAI.tsx b/webview-ui/src/components/settings/providers/OpenAI.tsx index e2f7857fe09..4f25c181ba0 100644 --- a/webview-ui/src/components/settings/providers/OpenAI.tsx +++ b/webview-ui/src/components/settings/providers/OpenAI.tsx @@ -6,6 +6,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -56,14 +57,12 @@ export const OpenAI = ({ apiConfiguration, setApiConfigurationField }: OpenAIPro /> )} - - - + label={t("settings:providers.openAiApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx index 736b0253c43..81c38e0db55 100644 --- a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx +++ b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx @@ -16,6 +16,7 @@ import { ExtensionMessage } from "@roo/ExtensionMessage" import { useAppTranslation } from "@src/i18n/TranslationContext" import { Button, StandardTooltip } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { convertHeadersToObject } from "../utils/headers" import { inputEventTransform, noTransform } from "../transforms" @@ -129,14 +130,12 @@ export const OpenAICompatible = ({ className="w-full"> - - - + label={t("settings:providers.apiKey")} + /> - + label={t("settings:providers.openRouterApiKey")}>
- {apiConfiguration?.openRouterApiKey && ( )}
-
+
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Requesty.tsx b/webview-ui/src/components/settings/providers/Requesty.tsx index ac9e2735e96..ef2d9b8867c 100644 --- a/webview-ui/src/components/settings/providers/Requesty.tsx +++ b/webview-ui/src/components/settings/providers/Requesty.tsx @@ -9,6 +9,7 @@ import { vscode } from "@src/utils/vscode" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" import { Button } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" import { ModelPicker } from "../ModelPicker" @@ -48,19 +49,17 @@ export const Requesty = ({ return ( <> - + label={t("settings:providers.requestyApiKey")}>
- {apiConfiguration?.requestyApiKey && ( )}
-
+
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Unbound.tsx b/webview-ui/src/components/settings/providers/Unbound.tsx index 001ebf058e6..405ec97df1c 100644 --- a/webview-ui/src/components/settings/providers/Unbound.tsx +++ b/webview-ui/src/components/settings/providers/Unbound.tsx @@ -10,6 +10,7 @@ import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" import { vscode } from "@src/utils/vscode" import { Button } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" import { ModelPicker } from "../ModelPicker" @@ -135,14 +136,12 @@ export const Unbound = ({ return ( <> - - - + label={t("settings:providers.unboundApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}
diff --git a/webview-ui/src/components/settings/providers/Vertex.tsx b/webview-ui/src/components/settings/providers/Vertex.tsx index 19a136927a2..5d725a3429d 100644 --- a/webview-ui/src/components/settings/providers/Vertex.tsx +++ b/webview-ui/src/components/settings/providers/Vertex.tsx @@ -5,6 +5,7 @@ import { type ProviderSettings, VERTEX_REGIONS } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@src/components/ui" +import { ApiKeyInput } from "@src/components/common/ApiKeyInput" import { inputEventTransform } from "../transforms" @@ -53,13 +54,12 @@ export const Vertex = ({ apiConfiguration, setApiConfigurationField }: VertexPro
- - - + label={t("settings:providers.googleCloudCredentials")} + /> return ( <> - - - + label={t("settings:providers.xaiApiKey")} + />
{t("settings:providers.apiKeyStorageNotice")}