import React, { useEffect, useState } from 'react'; import { Form, Field } from 'react-final-form'; import { OnChange } from 'react-final-form-listeners'; import { useTranslation } from 'react-i18next'; import Button from '@mui/material/Button'; import { AuthenticationService } from 'api'; import { CheckboxField, InputField, KnownHosts } from 'components'; import { useAutoConnect } from 'hooks'; import { HostDTO, SettingDTO } from 'services'; import { APP_USER } from 'types'; import './LoginForm.css'; const LoginForm = ({ onSubmit, disableSubmitButton, onResetPassword }: LoginFormProps) => { const { t } = useTranslation(); const PASSWORD_LABEL = t('Common.label.password'); const STORED_PASSWORD_LABEL = `* ${t('LoginForm.label.savedPassword')} *`; const [host, setHost] = useState(null); const [useStoredPasswordLabel, setUseStoredPasswordLabel] = useState(false); const [autoConnect, setAutoConnect] = useAutoConnect(); const validate = values => { const errors: any = {}; if (!values.userName) { errors.userName = t('Common.validation.required'); } if (!values.selectedHost) { errors.selectedHost = t('Common.validation.required'); } return errors; } const useStoredPassword = (remember, password) => remember && host?.hashedPassword && !password; const togglePasswordLabel = (useStoredLabel) => { setUseStoredPasswordLabel(useStoredLabel); }; const handleOnSubmit = ({ userName, ...values }) => { userName = userName?.trim(); console.log(userName, values); onSubmit({ userName, ...values }); } return (
{({ handleSubmit, form }) => { const { values } = form.getState(); useEffect(() => { SettingDTO.get(APP_USER).then((userSetting: SettingDTO) => { if (userSetting?.autoConnect && !AuthenticationService.connectionAttemptMade()) { HostDTO.getAll().then(hosts => { let lastSelectedHost = hosts.find(({ lastSelected }) => lastSelected); if (lastSelectedHost?.remember && lastSelectedHost?.hashedPassword) { togglePasswordLabel(true); form.change('selectedHost', lastSelectedHost); form.change('userName', lastSelectedHost.userName); form.change('remember', true); form.submit(); } }); } }); }, []); useEffect(() => { if (!host) { return; } form.change('userName', host.userName); form.change('password', ''); onRememberChange(host.remember); onAutoConnectChange(host.remember && autoConnect); togglePasswordLabel(useStoredPassword(host.remember, values.password)); }, [host]); const onUserNameChange = (userName) => { const fieldChanged = host?.userName?.toLowerCase() !== values.userName?.toLowerCase(); if (useStoredPassword(values.remember, values.password) && fieldChanged) { setHost(({ hashedPassword: _hashedPassword, ...s }) => ({ ...s, userName })); } } const onRememberChange = (checked) => { form.change('remember', checked); if (!checked && values.autoConnect) { onAutoConnectChange(false); } togglePasswordLabel(useStoredPassword(checked, values.password)); } const onAutoConnectChange = (checked) => { setAutoConnect(checked); form.change('autoConnect', checked); if (checked && !values.remember) { form.change('remember', true); } } return (
{onUserNameChange}
setUseStoredPasswordLabel(false)} onBlur={() => togglePasswordLabel(useStoredPassword(values.remember, values.password))} name='password' type='password' component={InputField} autoComplete='new-password' />
{onRememberChange}
{setHost}
{onAutoConnectChange}
) }} ); }; interface LoginFormProps { onSubmit: any; disableSubmitButton: boolean, onResetPassword: any; } export default LoginForm;