import React, { Component, useEffect } from "react"; import PropTypes from "prop-types"; import { withRouter } from "react-router"; import { Box, Button, TextInput, Text, Link, toastr, Checkbox, PasswordInput, FieldContainer, } from "asc-web-components"; import PageLayout from "../../components/PageLayout"; import styled, { css } from "styled-components"; import { withTranslation } from "react-i18next"; import i18n from "./i18n"; import ForgotPasswordModalDialog from "./sub-components/forgot-password-modal-dialog"; import { sendInstructionsToChangePassword } from "../../api/people"; import Register from "./sub-components/register-container"; import { createPasswordHash, tryRedirectTo } from "../../utils"; import { checkPwd } from "../../desktop"; import { inject, observer } from "mobx-react"; const LoginContainer = styled.div` display: flex; flex-direction: column; align-items: center; margin: 120px auto 0 auto; max-width: 960px; @media (max-width: 768px) { padding: 0 16px; max-width: 475px; } @media (max-width: 375px) { margin: 72px auto 0 auto; max-width: 311px; } .greeting-title { width: 100%; @media (max-width: 768px) { text-align: left; } @media (max-width: 375px) { font-size: 23px; } } .auth-form-container { margin: 32px 213px 0 213px; width: 311px; @media (max-width: 768px) { margin: 32px 0 0 0; width: 100%; } @media (max-width: 375px) { margin: 32px 0 0 0; width: 100%; } .login-forgot-wrapper { height: 36px; padding: 14px 0; .login-checkbox-wrapper { display: flex; .login-checkbox { float: left; span { font-size: 12px; } } } .login-link { line-height: 18px; margin-left: auto; } } .login-button { margin-bottom: 16px; } .login-button-dialog { margin-right: 8px; } .login-bottom-border { width: 100%; height: 1px; background: #eceef1; } .login-bottom-text { margin: 0 8px; } } `; const LoginFormWrapper = styled.div` display: grid; grid-template-rows: ${(props) => props.enabledJoin ? props.isDesktop ? css`1fr 10px` : css`1fr 66px` : css`1fr`}; width: 100%; height: calc(100vh-56px); `; class Form extends Component { constructor(props) { super(props); this.state = { identifierValid: true, identifier: "", isLoading: false, isDisabled: false, passwordValid: true, password: "", isChecked: false, openDialog: false, email: "", emailError: false, errorText: "", socialButtons: [], }; } onChangeLogin = (event) => { this.setState({ identifier: event.target.value }); !this.state.identifierValid && this.setState({ identifierValid: true }); this.state.errorText && this.setState({ errorText: "" }); }; onChangePassword = (event) => { this.setState({ password: event.target.value }); !this.state.passwordValid && this.setState({ passwordValid: true }); this.state.errorText && this.setState({ errorText: "" }); }; onChangeEmail = (event) => { this.setState({ email: event.target.value, emailError: false }); }; onChangeCheckbox = () => this.setState({ isChecked: !this.state.isChecked }); onClick = () => { this.setState({ openDialog: true, isDisabled: true, email: this.state.identifier, }); }; onKeyPress = (event) => { if (event.key === "Enter") { !this.state.isDisabled ? this.onSubmit() : this.onSendPasswordInstructions(); } }; onSendPasswordInstructions = () => { if (!this.state.email.trim()) { this.setState({ emailError: true }); } else { this.setState({ isLoading: true }); sendInstructionsToChangePassword(this.state.email) .then( (res) => toastr.success(res), (message) => toastr.error(message) ) .finally(this.onDialogClose()); } }; onDialogClose = () => { this.setState({ openDialog: false, isDisabled: false, isLoading: false, email: "", emailError: false, }); }; onSubmit = () => { const { errorText, identifier, password } = this.state; const { login, hashSettings, isDesktop, defaultPage } = this.props; errorText && this.setState({ errorText: "" }); let hasError = false; const userName = identifier.trim(); if (!userName) { hasError = true; this.setState({ identifierValid: !hasError }); } const pass = password.trim(); if (!pass) { hasError = true; this.setState({ passwordValid: !hasError }); } if (hasError) return false; this.setState({ isLoading: true }); const hash = createPasswordHash(pass, hashSettings); isDesktop && checkPwd(); login(userName, hash) .then(() => tryRedirectTo(defaultPage)) .catch((error) => { this.setState({ errorText: error, identifierValid: !error, passwordValid: !error, isLoading: false, }); }); }; componentDidMount() { const { match, t, organizationName } = this.props; const { error, confirmedEmail } = match.params; document.title = `${t("Authorization")} – ${organizationName}`; //TODO: implement the setDocumentTitle() utility in ASC.Web.Common error && this.setState({ errorText: error }); confirmedEmail && this.setState({ identifier: confirmedEmail }); window.addEventListener("keyup", this.onKeyPress); } componentWillUnmount() { window.removeEventListener("keyup", this.onKeyPress); } settings = { minLength: 6, upperCase: false, digits: false, specSymbols: false, }; render() { const { greetingTitle, match, t } = this.props; const { identifierValid, identifier, isLoading, passwordValid, password, isChecked, openDialog, email, emailError, errorText, socialButtons, } = this.state; const { params } = match; //console.log("Login render"); return ( <> {greetingTitle}
{t("Remember")}} /> {/*{t("RememberHelper")} } />*/} {t("ForgotPassword")}
{openDialog && ( )}