| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- import { Input, Switch, Tooltip, useDisclosure } from "@nextui-org/react";
- import React from "react";
- import { useTranslation } from "react-i18next";
- import { FaEye, FaEyeSlash } from "react-icons/fa";
- import { AvailableLanguages } from "../../../i18n";
- import { I18nKey } from "../../../i18n/declaration";
- import { AutocompleteCombobox } from "./AutocompleteCombobox";
- import { Settings } from "#/services/settings";
- import { organizeModelsAndProviders } from "#/utils/organizeModelsAndProviders";
- import { extractModelAndProvider } from "#/utils/extractModelAndProvider";
- import { ModelSelector } from "./ModelSelector";
- interface SettingsFormProps {
- settings: Settings;
- models: string[];
- agents: string[];
- securityAnalyzers: string[];
- disabled: boolean;
- onModelChange: (model: string) => void;
- onBaseURLChange: (baseURL: string) => void;
- onAPIKeyChange: (apiKey: string) => void;
- onAgentChange: (agent: string) => void;
- onLanguageChange: (language: string) => void;
- onConfirmationModeChange: (confirmationMode: boolean) => void;
- onSecurityAnalyzerChange: (securityAnalyzer: string) => void;
- }
- function SettingsForm({
- settings,
- models,
- agents,
- securityAnalyzers,
- disabled,
- onModelChange,
- onBaseURLChange,
- onAPIKeyChange,
- onAgentChange,
- onLanguageChange,
- onConfirmationModeChange,
- onSecurityAnalyzerChange,
- }: SettingsFormProps) {
- const { t } = useTranslation();
- const { isOpen: isVisible, onOpenChange: onVisibleChange } = useDisclosure();
- const advancedAlreadyInUse = React.useMemo(() => {
- const organizedModels = organizeModelsAndProviders(models);
- const { provider, model } = extractModelAndProvider(
- settings.LLM_MODEL || "",
- );
- const isKnownModel =
- provider in organizedModels &&
- organizedModels[provider].models.includes(model);
- return (
- !!settings.SECURITY_ANALYZER ||
- !!settings.CONFIRMATION_MODE ||
- !!settings.LLM_BASE_URL ||
- (!!settings.LLM_MODEL && !isKnownModel)
- );
- }, [settings, models]);
- const [enableAdvanced, setEnableAdvanced] =
- React.useState(advancedAlreadyInUse);
- React.useEffect(() => {
- setEnableAdvanced(advancedAlreadyInUse);
- }, [advancedAlreadyInUse]);
- const handleAdvancedChange = (value: boolean) => {
- setEnableAdvanced(value);
- };
- return (
- <>
- <Switch
- data-testid="advanced-options-toggle"
- aria-checked={enableAdvanced}
- isSelected={enableAdvanced}
- onValueChange={handleAdvancedChange}
- >
- Advanced Options
- </Switch>
- {enableAdvanced && (
- <>
- <Input
- data-testid="custom-model-input"
- label="Custom Model"
- onValueChange={onModelChange}
- defaultValue={settings.LLM_MODEL}
- />
- <Input
- data-testid="base-url-input"
- label="Base URL"
- onValueChange={onBaseURLChange}
- defaultValue={settings.LLM_BASE_URL}
- />
- </>
- )}
- {!enableAdvanced && (
- <ModelSelector
- isDisabled={disabled}
- models={organizeModelsAndProviders(models)}
- currentModel={settings.LLM_MODEL}
- />
- )}
- <Input
- label="API Key"
- isDisabled={disabled}
- aria-label="apikey"
- data-testid="apikey"
- placeholder={t(I18nKey.SETTINGS$API_KEY_PLACEHOLDER)}
- type={isVisible ? "text" : "password"}
- value={settings.LLM_API_KEY || ""}
- onChange={(e) => {
- onAPIKeyChange(e.target.value);
- }}
- endContent={
- <button
- className="focus:outline-none"
- type="button"
- onClick={onVisibleChange}
- >
- {isVisible ? (
- <FaEye className="text-2xl text-default-400 pointer-events-none" />
- ) : (
- <FaEyeSlash className="text-2xl text-default-400 pointer-events-none" />
- )}
- </button>
- }
- />
- <AutocompleteCombobox
- ariaLabel="language"
- items={AvailableLanguages}
- defaultKey={settings.LANGUAGE}
- onChange={onLanguageChange}
- tooltip={t(I18nKey.SETTINGS$LANGUAGE_TOOLTIP)}
- disabled={disabled}
- />
- {enableAdvanced && (
- <AutocompleteCombobox
- ariaLabel="agent"
- items={agents.map((agent) => ({ value: agent, label: agent }))}
- defaultKey={settings.AGENT}
- onChange={onAgentChange}
- tooltip={t(I18nKey.SETTINGS$AGENT_TOOLTIP)}
- />
- )}
- {enableAdvanced && (
- <AutocompleteCombobox
- ariaLabel="securityanalyzer"
- items={securityAnalyzers.map((securityAnalyzer) => ({
- value: securityAnalyzer,
- label: securityAnalyzer,
- }))}
- defaultKey={settings.SECURITY_ANALYZER}
- onChange={onSecurityAnalyzerChange}
- tooltip={t(I18nKey.SETTINGS$SECURITY_ANALYZER)}
- disabled={disabled}
- />
- )}
- {enableAdvanced && (
- <Switch
- aria-label="confirmationmode"
- data-testid="confirmationmode"
- defaultSelected={
- settings.CONFIRMATION_MODE || !!settings.SECURITY_ANALYZER
- }
- onValueChange={onConfirmationModeChange}
- isDisabled={disabled || !!settings.SECURITY_ANALYZER}
- isSelected={settings.CONFIRMATION_MODE}
- >
- <Tooltip
- content={t(I18nKey.SETTINGS$CONFIRMATION_MODE_TOOLTIP)}
- closeDelay={100}
- delay={500}
- >
- {t(I18nKey.SETTINGS$CONFIRMATION_MODE)}
- </Tooltip>
- </Switch>
- )}
- </>
- );
- }
- export default SettingsForm;
|