Spaces:
Build error
Build error
| 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 { 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 { KeyStatusIcon } from "#/components/features/settings/key-status-icon"; | |
| import { SettingsInput } from "#/components/features/settings/settings-input"; | |
| import { HelpLink } from "#/components/features/settings/help-link"; | |
| import { useSaveSettings } from "#/hooks/mutation/use-save-settings"; | |
| interface SettingsFormProps { | |
| settings: Settings; | |
| models: string[]; | |
| onClose: () => void; | |
| } | |
| export function SettingsForm({ settings, models, onClose }: SettingsFormProps) { | |
| const { mutate: saveUserSettings } = useSaveSettings(); | |
| const location = useLocation(); | |
| const { t } = useTranslation(); | |
| const formRef = React.useRef<HTMLFormElement>(null); | |
| const [confirmEndSessionModalOpen, setConfirmEndSessionModalOpen] = | |
| React.useState(false); | |
| const handleFormSubmission = async (formData: FormData) => { | |
| const newSettings = extractSettings(formData); | |
| await saveUserSettings(newSettings, { | |
| onSuccess: () => { | |
| onClose(); | |
| posthog.capture("settings_saved", { | |
| LLM_MODEL: newSettings.LLM_MODEL, | |
| LLM_API_KEY_SET: newSettings.LLM_API_KEY_SET ? "SET" : "UNSET", | |
| SEARCH_API_KEY_SET: newSettings.SEARCH_API_KEY ? "SET" : "UNSET", | |
| REMOTE_RUNTIME_RESOURCE_FACTOR: | |
| newSettings.REMOTE_RUNTIME_RESOURCE_FACTOR, | |
| }); | |
| }, | |
| }); | |
| }; | |
| const handleConfirmEndSession = () => { | |
| const formData = new FormData(formRef.current ?? undefined); | |
| handleFormSubmission(formData); | |
| }; | |
| const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => { | |
| event.preventDefault(); | |
| const formData = new FormData(event.currentTarget); | |
| if (location.pathname.startsWith("/conversations/")) { | |
| setConfirmEndSessionModalOpen(true); | |
| } else { | |
| handleFormSubmission(formData); | |
| } | |
| }; | |
| const isLLMKeySet = settings.LLM_API_KEY_SET; | |
| return ( | |
| <div> | |
| <form | |
| ref={formRef} | |
| data-testid="settings-form" | |
| className="flex flex-col gap-6" | |
| onSubmit={handleSubmit} | |
| > | |
| <div className="flex flex-col gap-4"> | |
| <ModelSelector | |
| models={organizeModelsAndProviders(models)} | |
| currentModel={settings.LLM_MODEL} | |
| /> | |
| <SettingsInput | |
| testId="llm-api-key-input" | |
| name="llm-api-key-input" | |
| label={t(I18nKey.SETTINGS_FORM$API_KEY)} | |
| type="password" | |
| className="w-full" | |
| placeholder={isLLMKeySet ? "<hidden>" : ""} | |
| startContent={isLLMKeySet && <KeyStatusIcon isSet={isLLMKeySet} />} | |
| /> | |
| <HelpLink | |
| testId="llm-api-key-help-anchor" | |
| text={t(I18nKey.SETTINGS$DONT_KNOW_API_KEY)} | |
| linkText={t(I18nKey.SETTINGS$CLICK_FOR_INSTRUCTIONS)} | |
| href="https://docs.all-hands.dev/usage/installation#getting-an-api-key" | |
| /> | |
| </div> | |
| <div className="flex flex-col gap-2"> | |
| <BrandButton | |
| testId="save-settings-button" | |
| type="submit" | |
| variant="primary" | |
| className="w-full" | |
| > | |
| {t(I18nKey.BUTTON$SAVE)} | |
| </BrandButton> | |
| </div> | |
| </form> | |
| {confirmEndSessionModalOpen && ( | |
| <ModalBackdrop> | |
| <DangerModal | |
| title={t(I18nKey.MODAL$END_SESSION_TITLE)} | |
| description={t(I18nKey.MODAL$END_SESSION_MESSAGE)} | |
| buttons={{ | |
| danger: { | |
| text: t(I18nKey.BUTTON$END_SESSION), | |
| onClick: handleConfirmEndSession, | |
| }, | |
| cancel: { | |
| text: t(I18nKey.BUTTON$CANCEL), | |
| onClick: () => setConfirmEndSessionModalOpen(false), | |
| }, | |
| }} | |
| /> | |
| </ModalBackdrop> | |
| )} | |
| </div> | |
| ); | |
| } | |