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 Form from '../../lib/Form'; import Input from '../ui/input/index'; import Select from '../ui/Select'; import Button from '../ui/button'; import Link from '../ui/Link'; import Infobox from '../ui/Infobox'; import { url, required } from '../../helpers/validation-helpers'; import { LIVE_FERDIUM_API, LIVE_FRANZ_API } from '../../config'; import globalMessages from '../../i18n/globalMessages'; import { H1 } from '../ui/headline'; import Icon from '../ui/icon'; const messages = defineMessages({ headline: { id: 'changeserver.headline', defaultMessage: 'Change server', }, label: { id: 'changeserver.label', defaultMessage: 'Server', }, warning: { id: 'changeserver.warning', defaultMessage: 'Extra settings offered by Ferdium will not be saved', }, customServerLabel: { id: 'changeserver.customServerLabel', defaultMessage: 'Custom server', }, urlError: { id: 'changeserver.urlError', defaultMessage: 'Enter a valid URL', }, }); interface IProps extends WrappedComponentProps { onSubmit: (...args: any[]) => void; server: string; } @observer class ChangeServer extends Component { ferdiumServer: string = LIVE_FERDIUM_API; franzServer: string = LIVE_FRANZ_API; defaultServers: string[] = [LIVE_FERDIUM_API, LIVE_FRANZ_API]; form: Form; constructor(props: IProps) { super(props); this.form = new Form({ fields: { server: { label: this.props.intl.formatMessage(messages.label), value: this.props.server, options: [ { value: this.ferdiumServer, label: 'Ferdium (Default)' }, { value: this.franzServer, label: 'Franz' }, { value: this.defaultServers.includes(this.props.server) ? '' : this.props.server, label: 'Custom', }, ], }, customServer: { label: this.props.intl.formatMessage(messages.customServerLabel), placeholder: this.props.intl.formatMessage( messages.customServerLabel, ), value: '', validators: [url, required], }, }, }); } componentDidMount(): void { if (this.defaultServers.includes(this.props.server)) { this.form.$('server').value = this.props.server; } else { this.form.$('server').value = ''; this.form.$('customServer').value = this.props.server; } } submit(e: FormEvent): void { e.preventDefault(); this.form.submit({ onSuccess: form => { if (!this.defaultServers.includes(form.values().server)) { form.$('server').onChange(form.values().customServer); } this.props.onSubmit(form.values()); }, onError: form => { if (this.defaultServers.includes(form.values().server)) { this.props.onSubmit(form.values()); } }, }); } render(): ReactElement { const { form } = this; const { intl } = this.props; return (
this.submit(e)}>

{intl.formatMessage(messages.headline)}

{form.$('server').value === this.franzServer && ( {intl.formatMessage(messages.warning)} )} )}
); } } export default injectIntl(ChangeServer);