import { Component, FormEvent, ReactElement } from 'react'; import { observer } from 'mobx-react'; import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl'; import { mdiArrowLeftCircle } from '@mdi/js'; import { noop } from 'lodash'; import Icon from '../ui/icon'; import { LIVE_FRANZ_API } from '../../config'; import { API_VERSION } from '../../environment-remote'; import { serverBase } from '../../api/apiBase'; // TODO: Remove this line after fixing password recovery in-app import Form from '../../lib/Form'; import { required, email } from '../../helpers/validation-helpers'; import Input from '../ui/input/index'; import Button from '../ui/button'; import Link from '../ui/Link'; import { H1 } from '../ui/headline'; import { GlobalError } from '../../@types/ferdium-components.types'; const messages = defineMessages({ headline: { id: 'login.headline', defaultMessage: 'Sign in', }, emailLabel: { id: 'login.email.label', defaultMessage: 'Email address', }, passwordLabel: { id: 'login.password.label', defaultMessage: 'Password', }, submitButtonLabel: { id: 'login.submit.label', defaultMessage: 'Sign in', }, invalidCredentials: { id: 'login.invalidCredentials', defaultMessage: 'Email or password not valid', }, customServerQuestion: { id: 'login.customServerQuestion', defaultMessage: 'Using a custom Ferdium server?', }, customServerSuggestion: { id: 'login.customServerSuggestion', defaultMessage: 'Try importing your Franz account', }, tokenExpired: { id: 'login.tokenExpired', defaultMessage: 'Your session expired, please login again.', }, serverLogout: { id: 'login.serverLogout', defaultMessage: 'Your session expired, please login again.', }, signupLink: { id: 'login.link.signup', defaultMessage: 'Create a free account', }, passwordLink: { id: 'login.link.password', defaultMessage: 'Reset password', }, }); interface IProps extends WrappedComponentProps { onSubmit: (...args: any[]) => void; isSubmitting: boolean; isTokenExpired: boolean; isServerLogout: boolean; signupRoute: string; passwordRoute: string; // TODO: Uncomment this line after fixing password recovery in-app error: GlobalError; } @observer class Login extends Component { form: Form; constructor(props: IProps) { super(props); this.form = new Form({ fields: { email: { label: this.props.intl.formatMessage(messages.emailLabel), value: '', validators: [required, email], }, password: { label: this.props.intl.formatMessage(messages.passwordLabel), value: '', validators: [required], type: 'password', }, }, }); } submit(e: FormEvent): void { e.preventDefault(); this.form.submit({ onSuccess: (form: Form) => { this.props.onSubmit(form.values()); }, onError: noop, }); } render(): ReactElement { const { form } = this; const { isSubmitting, isTokenExpired, isServerLogout, signupRoute, error, intl, // passwordRoute, // TODO: Uncomment this line after fixing password recovery in-app } = this.props; return (
this.submit(e)}>

{intl.formatMessage(messages.headline)}

{isTokenExpired && (

{intl.formatMessage(messages.tokenExpired)}

)} {isServerLogout && (

{intl.formatMessage(messages.serverLogout)}

)} {error.code === 'invalid-credentials' && ( <>

{intl.formatMessage(messages.invalidCredentials)}

{window['ferdium'].stores.settings.all.app.server !== LIVE_FRANZ_API && (

{intl.formatMessage(messages.customServerQuestion)}{' '} {intl.formatMessage(messages.customServerSuggestion)}

)} )} {isSubmitting ? (
); } } export default injectIntl(Login);