import { Component } from 'react'; import { observer } from 'mobx-react'; import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl'; import { Link } from 'react-router-dom'; import classnames from 'classnames'; import { noop } from 'lodash'; import Infobox from '../ui/Infobox'; import Appear from '../ui/effects/Appear'; import Form from '../../lib/Form'; import { email, required } from '../../helpers/validation-helpers'; import Input from '../ui/input/index'; import Button from '../ui/button'; import { H1 } from '../ui/headline'; const messages = defineMessages({ settingsHeadline: { id: 'settings.invite.headline', defaultMessage: 'Invite Friends', }, headline: { id: 'invite.headline.friends', defaultMessage: 'Invite 3 of your friends or colleagues', }, nameLabel: { id: 'invite.name.label', defaultMessage: 'Name', }, emailLabel: { id: 'invite.email.label', defaultMessage: 'Email address', }, submitButtonLabel: { id: 'invite.submit.label', defaultMessage: 'Send invites', }, skipButtonLabel: { id: 'invite.skip.label', defaultMessage: 'I want to do this later', }, inviteSuccessInfo: { id: 'invite.successInfo', defaultMessage: 'Invitations sent successfully', }, }); interface IProps extends WrappedComponentProps { onSubmit: (...args: any[]) => void; embed?: boolean; isInviteSuccessful?: boolean; isLoadingInvite?: boolean; } interface IState { showSuccessInfo: boolean; } @observer class Invite extends Component { form: Form; constructor(props: IProps) { super(props); this.state = { showSuccessInfo: false }; this.form = new Form({ fields: { invite: [ ...Array.from({ length: 3 }).fill({ fields: { name: { label: this.props.intl.formatMessage(messages.nameLabel), placeholder: this.props.intl.formatMessage(messages.nameLabel), onChange: () => { this.setState({ showSuccessInfo: false }); }, validators: [required], // related: ['invite.0.email'], // path accepted but does not work }, email: { label: this.props.intl.formatMessage(messages.emailLabel), placeholder: this.props.intl.formatMessage(messages.emailLabel), onChange: () => { this.setState({ showSuccessInfo: false }); }, validators: [email], }, }, }), ], }, }); } componentDidMount() { const selector: HTMLElement | null = document.querySelector('input:first-child'); if (selector) { selector.focus(); } } submit(e) { e.preventDefault(); this.form?.submit({ onSuccess: form => { this.props.onSubmit({ invites: form.values().invite }); this.form?.clear(); // this.form.$('invite.0.name').focus(); // path accepted but does not focus ;( const selector: HTMLElement | null = document.querySelector('input:first-child'); if (selector) { selector.focus(); } this.setState({ showSuccessInfo: true }); }, onError: noop, }); } render() { const { form } = this; const { intl } = this.props; const { embed = false, isInviteSuccessful = false, isLoadingInvite = false, } = this.props; const atLeastOneEmailAddress = form .$('invite') .map(invite => invite.$('email').value) .some(emailValue => emailValue.trim() !== ''); const sendButtonClassName = classnames({ auth__button: true, 'invite__embed--button': embed, }); const renderForm = ( <> {this.state.showSuccessInfo && isInviteSuccessful && ( {intl.formatMessage(messages.inviteSuccessInfo)} )}
this.submit(e)}> {!embed && ( )}

{intl.formatMessage(messages.headline)}

{form.$('invite').map(invite => (
))}