import { useTranslation } from "react-i18next"; import React from "react"; import { useTracking } from "#/hooks/use-tracking"; import { useNavigation } from "#/context/navigation-context"; import { I18nKey } from "#/i18n/declaration"; import { DangerModal } from "../confirmation-modals/danger-modal"; import { extractSettings } from "#/utils/settings-utils"; import { ModalBackdrop } from "../modal-backdrop"; import { ModelSelector } from "./model-selector"; import { Settings } from "#/types/settings"; import { BrandButton } from "#/components/features/settings/brand-button"; import { SettingsInput } from "#/components/features/settings/settings-input"; import { HelpLink } from "#/ui/help-link"; import { useSaveSettings } from "#/hooks/mutation/use-save-settings"; import { getAgentSettingValue } from "#/utils/sdk-settings-schema"; import { SETTINGS_FORM } from "#/utils/constants"; interface SettingsFormProps { settings: Settings; onClose: () => void; } export function SettingsForm({ settings, onClose }: SettingsFormProps) { const { trackSettingsSaved } = useTracking(); const { mutate: saveUserSettings } = useSaveSettings(); const { currentPath } = useNavigation(); const { t } = useTranslation("openhands"); const formRef = React.useRef(null); const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] = React.useState(false); const handleFormSubmission = async (formData: FormData) => { const newSettings = extractSettings(formData); await saveUserSettings(newSettings, { onSuccess: () => { onClose(); const agentLlm = ((newSettings.agent_settings_diff as Record) ?.llm as Record) ?? {}; trackSettingsSaved({ llmModel: agentLlm.model, llmApiKeySet: agentLlm.api_key ? "SET" : "UNSET", searchApiKeySet: newSettings.search_api_key ? "SET" : "UNSET", remoteRuntimeResourceFactor: newSettings.remote_runtime_resource_factor, }); }, }); }; 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 (currentPath.startsWith("/conversations/")) { setConfirmEndSessionModalOpen(true); } else { handleFormSubmission(formData); } }; const isLLMKeySet = settings.llm_api_key_set; const currentModel = getAgentSettingValue(settings, "llm.model"); return (
" : ""} labelClassName={SETTINGS_FORM.LABEL_CLASSNAME} />
{t(I18nKey.BUTTON$SAVE)}
{confirmEndSessionModalOpen && ( setConfirmEndSessionModalOpen(false), }, }} /> )}
); }