import { useState } from 'react'; import { Stack, Group, Checkbox } from '@mantine/core'; import { Button, PasswordInput, SegmentedControl, TextInput, toast } from '/@/renderer/components'; import { useForm } from '@mantine/form'; import { useFocusTrap } from '@mantine/hooks'; import { closeAllModals } from '@mantine/modals'; import isElectron from 'is-electron'; import { nanoid } from 'nanoid/non-secure'; import { AuthenticationResponse } from '/@/renderer/api/types'; import { useAuthStoreActions } from '/@/renderer/store'; import { ServerType, toServerType } from '/@/renderer/types'; import { api } from '/@/renderer/api'; import { useTranslation } from 'react-i18next'; const localSettings = isElectron() ? window.electron.localSettings : null; const SERVER_TYPES = [ { label: 'Jellyfin', value: ServerType.JELLYFIN }, { label: 'Navidrome', value: ServerType.NAVIDROME }, { label: 'Subsonic', value: ServerType.SUBSONIC }, ]; interface AddServerFormProps { onCancel: () => void; } export const AddServerForm = ({ onCancel }: AddServerFormProps) => { const { t } = useTranslation(); const focusTrapRef = useFocusTrap(true); const [isLoading, setIsLoading] = useState(false); const { addServer, setCurrentServer } = useAuthStoreActions(); const form = useForm({ initialValues: { legacyAuth: false, name: (localSettings ? localSettings.env.SERVER_NAME : window.SERVER_NAME) ?? '', password: '', savePassword: false, type: (localSettings ? localSettings.env.SERVER_TYPE : toServerType(window.SERVER_TYPE)) ?? ServerType.JELLYFIN, url: (localSettings ? localSettings.env.SERVER_URL : window.SERVER_URL) ?? 'https://', username: '', }, }); // server lock for web is only true if lock is true *and* all other properties are set const serverLock = (localSettings ? !!localSettings.env.SERVER_LOCK : !!window.SERVER_LOCK && window.SERVER_TYPE && window.SERVER_NAME && window.SERVER_URL) || false; const isSubmitDisabled = !form.values.name || !form.values.url || !form.values.username; const handleSubmit = form.onSubmit(async (values) => { const authFunction = api.controller.authenticate; if (!authFunction) { return toast.error({ message: t('error.invalidServer', { postProcess: 'sentenceCase' }), }); } try { setIsLoading(true); const data: AuthenticationResponse | undefined = await authFunction( values.url, { legacy: values.legacyAuth, password: values.password, username: values.username, }, values.type as ServerType, ); if (!data) { return toast.error({ message: t('error.authenticationFailed', { postProcess: 'sentenceCase' }), }); } const serverItem = { credential: data.credential, id: nanoid(), name: values.name, ndCredential: data.ndCredential, type: values.type as ServerType, url: values.url.replace(/\/$/, ''), userId: data.userId, username: data.username, }; addServer(serverItem); setCurrentServer(serverItem); closeAllModals(); toast.success({ message: t('form.addServer.success', { postProcess: 'sentenceCase' }), }); if (localSettings && values.savePassword) { const saved = await localSettings.passwordSet(values.password, serverItem.id); if (!saved) { toast.error({ message: t('form.addServer.error', { context: 'savePassword', postProcess: 'sentenceCase', }), }); } } } catch (err: any) { setIsLoading(false); return toast.error({ message: err?.message }); } return setIsLoading(false); }); return (
); };