fix login

This commit is contained in:
Ildar Kamalov
2025-01-24 15:26:38 +03:00
parent 9d5042b1f0
commit f3f38e1a57
4 changed files with 60 additions and 86 deletions

View File

@@ -4,13 +4,13 @@ import { useTranslation } from 'react-i18next';
import { Input } from '../../components/ui/Controls/Input';
import { validateRequiredValue } from '../../helpers/validators';
type FormValues = {
export type LoginFormValues = {
username: string;
password: string;
};
type LoginFormProps = {
onSubmit: (data: FormValues) => void;
onSubmit: (data: LoginFormValues) => void;
processing: boolean;
};
@@ -20,7 +20,7 @@ const Form = ({ onSubmit, processing }: LoginFormProps) => {
handleSubmit,
control,
formState: { isValid },
} = useForm<FormValues>({
} = useForm<LoginFormValues>({
mode: 'onBlur',
defaultValues: {
username: '',

View File

@@ -1,95 +1,68 @@
import React, { Component } from 'react';
import { connect } from 'react-redux';
import flow from 'lodash/flow';
import { withTranslation, Trans } from 'react-i18next';
import React, { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { Trans } from 'react-i18next';
import * as actionCreators from '../../actions/login';
import { Logo } from '../../components/ui/svg/logo';
import Toasts from '../../components/Toasts';
import Footer from '../../components/ui/Footer';
import Icons from '../../components/ui/Icons';
import Form from './Form';
import Form, { LoginFormValues } from './Form';
import './Login.css';
import '../../components/ui/Tabler.css';
import { LoginState } from '../../initialState';
type LoginProps = {
login: {
processingLogin: boolean;
};
processLogin: (args: { name: string; password: string }) => unknown;
};
export const Login = () => {
const dispatch = useDispatch();
const { processingLogin } = useSelector((state: LoginState) => state.login);
const [isForgotPasswordVisible, setIsForgotPasswordVisible] = useState(false);
type LoginState = {
isForgotPasswordVisible: boolean;
};
class Login extends Component<LoginProps, LoginState> {
state = {
isForgotPasswordVisible: false,
const handleSubmit = ({ username: name, password }: LoginFormValues) => {
dispatch(actionCreators.processLogin({ name, password }));
};
handleSubmit = ({ username: name, password }: { username: string; password: string }) => {
this.props.processLogin({ name, password });
const toggleText = () => {
setIsForgotPasswordVisible((prev) => !prev);
};
toggleText = () => {
this.setState((prevState) => ({
isForgotPasswordVisible: !prevState.isForgotPasswordVisible,
}));
};
render() {
const { processingLogin } = this.props.login;
const { isForgotPasswordVisible } = this.state;
return (
<div className="login">
<div className="login__form">
<div className="text-center mb-6">
<Logo className="h-6 login__logo" />
</div>
<Form onSubmit={this.handleSubmit} processing={processingLogin} />
<div className="login__info">
<button type="button" className="btn btn-link login__link" onClick={this.toggleText}>
<Trans>forgot_password</Trans>
</button>
{isForgotPasswordVisible && (
<div className="login__message">
<Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#password-reset"
key="0"
target="_blank"
rel="noopener noreferrer">
link
</a>,
]}>
forgot_password_desc
</Trans>
</div>
)}
</div>
return (
<div className="login">
<div className="login__form">
<div className="text-center mb-6">
<Logo className="h-6 login__logo" />
</div>
<Footer />
<Form onSubmit={handleSubmit} processing={processingLogin} />
<Toasts />
<div className="login__info">
<button type="button" className="btn btn-link login__link" onClick={toggleText}>
<Trans>forgot_password</Trans>
</button>
<Icons />
{isForgotPasswordVisible && (
<div className="login__message">
<Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#password-reset"
key="0"
target="_blank"
rel="noopener noreferrer">
link
</a>,
]}>
forgot_password_desc
</Trans>
</div>
)}
</div>
</div>
);
}
}
const mapStateToProps = ({ login, toasts }: any) => ({ login, toasts });
export default flow([withTranslation(), connect(mapStateToProps, actionCreators)])(Login);
<Footer />
<Toasts />
<Icons />
</div>
);
};

View File

@@ -8,7 +8,7 @@ import configureStore from '../configureStore';
import reducers from '../reducers/login';
import '../i18n';
import Login from './Login';
import { Login } from './Login';
import { LoginState } from '../initialState';
const store = configureStore<LoginState>(reducers, {});