import { colors } from '@0xproject/react-shared'; import * as _ from 'lodash'; import * as React from 'react'; import { Button } from 'ts/components/ui/button'; import { Container } from 'ts/components/ui/container'; import { Input } from 'ts/components/ui/input'; import { Text } from 'ts/components/ui/text'; import { backendClient } from 'ts/utils/backend_client'; export interface SubscribeFormProps {} export enum SubscribeFormStatus { None, Error, Success, Loading, Other, } export interface SubscribeFormState { emailText: string; lastSubmittedEmail: string; status: SubscribeFormStatus; } const FORM_FONT_SIZE = '15px'; // TODO: Translate visible strings. https://app.asana.com/0/628666249318202/697485674422001 export class SubscribeForm extends React.Component { public state = { emailText: '', lastSubmittedEmail: '', status: SubscribeFormStatus.None, }; public render(): React.ReactNode { return ( Subscribe to our newsletter for 0x relayer and dApp updates
{this._renderMessage()}
); } private _renderMessage(): React.ReactNode { let message = null; switch (this.state.status) { case SubscribeFormStatus.Error: message = 'Sorry, something went wrong. Try again later.'; break; case SubscribeFormStatus.Loading: message = 'One second...'; break; case SubscribeFormStatus.Success: message = `Thanks! ${this.state.lastSubmittedEmail} is now on the mailing list.`; break; case SubscribeFormStatus.None: break; default: throw new Error( 'The SubscribeFormStatus switch statement is not exhaustive when choosing an error message.', ); } return ( {message || 'spacer text (never shown to user)'} ); } private _handleEmailInputChange(event: React.ChangeEvent): void { this.setState({ emailText: event.target.value }); } private async _handleFormSubmitAsync(event: React.FormEvent): Promise { event.preventDefault(); if (_.isUndefined(this.state.emailText) || _.isEmpty(this.state.emailText)) { return; } this.setState({ status: SubscribeFormStatus.Loading, lastSubmittedEmail: this.state.emailText, }); try { const response = await backendClient.subscribeToNewsletterAsync(this.state.emailText); const status = response.status === 200 ? SubscribeFormStatus.Success : SubscribeFormStatus.Error; this.setState({ status, emailText: '' }); } catch (error) { this._setStatus(SubscribeFormStatus.Error); } } private _setStatus(status: SubscribeFormStatus): void { this.setState({ status }); } }