import { useLocation } from "react-router"; import { useTranslation } from "react-i18next"; import React from "react"; import posthog from "posthog-js"; import { I18nKey } from "#/i18n/declaration"; import { organizeModelsAndProviders } from "#/utils/organize-models-and-providers"; import { getDefaultSettings, Settings } from "#/services/settings"; import { extractModelAndProvider } from "#/utils/extract-model-and-provider"; import { DangerModal } from "../confirmation-modals/danger-modal"; import { extractSettings, saveSettingsView } from "#/utils/settings-utils"; import { useEndSession } from "#/hooks/use-end-session"; import { ModalButton } from "../../buttons/modal-button"; import { AdvancedOptionSwitch } from "../../inputs/advanced-option-switch"; import { AgentInput } from "../../inputs/agent-input"; import { APIKeyInput } from "../../inputs/api-key-input"; import { BaseUrlInput } from "../../inputs/base-url-input"; import { ConfirmationModeSwitch } from "../../inputs/confirmation-mode-switch"; import { CustomModelInput } from "../../inputs/custom-model-input"; import { SecurityAnalyzerInput } from "../../inputs/security-analyzers-input"; import { ModalBackdrop } from "../modal-backdrop"; import { ModelSelector } from "./model-selector"; import { RuntimeSizeSelector } from "./runtime-size-selector"; import { useConfig } from "#/hooks/query/use-config"; import { useCurrentSettings } from "#/context/settings-context"; interface SettingsFormProps { disabled?: boolean; settings: Settings; models: string[]; agents: string[]; securityAnalyzers: string[]; onClose: () => void; } export function SettingsForm({ disabled, settings, models, agents, securityAnalyzers, onClose, }: SettingsFormProps) { const { saveUserSettings } = useCurrentSettings(); const endSession = useEndSession(); const { data: config } = useConfig(); const location = useLocation(); const { t } = useTranslation(); const formRef = React.useRef(null); const advancedAlreadyInUse = React.useMemo(() => { if (models.length > 0) { const organizedModels = organizeModelsAndProviders(models); const { provider, model } = extractModelAndProvider( settings.LLM_MODEL || "", ); const isKnownModel = provider in organizedModels && organizedModels[provider].models.includes(model); const isUsingSecurityAnalyzer = !!settings.SECURITY_ANALYZER; const isUsingConfirmationMode = !!settings.CONFIRMATION_MODE; const isUsingBaseUrl = !!settings.LLM_BASE_URL; const isUsingCustomModel = !!settings.LLM_MODEL && !isKnownModel; return ( isUsingSecurityAnalyzer || isUsingConfirmationMode || isUsingBaseUrl || isUsingCustomModel ); } return false; }, [settings, models]); const [showAdvancedOptions, setShowAdvancedOptions] = React.useState(advancedAlreadyInUse); const [confirmResetDefaultsModalOpen, setConfirmResetDefaultsModalOpen] = React.useState(false); const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] = React.useState(false); const resetOngoingSession = () => { if (location.pathname.startsWith("/conversations/")) { endSession(); } }; const handleFormSubmission = async (formData: FormData) => { const keys = Array.from(formData.keys()); const isUsingAdvancedOptions = keys.includes("use-advanced-options"); const newSettings = extractSettings(formData); saveSettingsView(isUsingAdvancedOptions ? "advanced" : "basic"); await saveUserSettings(newSettings); onClose(); resetOngoingSession(); posthog.capture("settings_saved", { LLM_MODEL: newSettings.LLM_MODEL, LLM_API_KEY: newSettings.LLM_API_KEY ? "SET" : "UNSET", REMOTE_RUNTIME_RESOURCE_FACTOR: newSettings.REMOTE_RUNTIME_RESOURCE_FACTOR, }); }; const handleConfirmResetSettings = async () => { await saveUserSettings(getDefaultSettings()); onClose(); resetOngoingSession(); posthog.capture("settings_reset"); }; const handleConfirmEndSession = () => { const formData = new FormData(formRef.current ?? undefined); handleFormSubmission(formData); }; const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget); if (location.pathname.startsWith("/conversations/")) { setConfirmEndSessionModalOpen(true); } else { handleFormSubmission(formData); } }; const isSaasMode = config?.APP_MODE === "saas"; return (
{showAdvancedOptions && ( <> )} {!showAdvancedOptions && ( )} {showAdvancedOptions && ( <> {isSaasMode && ( )} )}
{ setConfirmResetDefaultsModalOpen(true); }} />
{confirmResetDefaultsModalOpen && ( setConfirmResetDefaultsModalOpen(false), }, }} /> )} {confirmEndSessionModalOpen && ( setConfirmEndSessionModalOpen(false), }, }} /> )}
); }