import _ from 'underscore'; import React from 'react'; import PropTypes from 'prop-types'; import { RetinaImg, Flexbox } from 'mailspring-component-kit'; import { MailspringAPIRequest } from 'mailspring-exports'; export default class NewsletterSignup extends React.Component { static displayName = 'NewsletterSignup'; static propTypes = { name: PropTypes.string, emailAddress: PropTypes.string, }; constructor(props) { super(props); this.state = { status: 'Pending' }; } componentDidMount() { this._mounted = true; return this._onGetStatus(); } componentWillReceiveProps(nextProps) { if (!_.isEqual(this.props, nextProps)) { this._onGetStatus(nextProps); } } componentWillUnmount() { this._mounted = false; } _setState(state) { if (!this._mounted) { return; } this.setState(state); } _onGetStatus = async (props = this.props) => { this._setState({ status: 'Pending' }); try { const { status } = await MailspringAPIRequest.makeRequest({ server: 'identity', method: 'GET', path: this._path(props), }); if (status === 'Never Subscribed') { this._onSubscribe(); } else { this._setState({ status }); } } catch (err) { this._setState({ status: 'Error' }); } }; _onSubscribe = async () => { this._setState({ status: 'Pending' }); try { const { status } = await MailspringAPIRequest.makeRequest({ server: 'identity', method: 'POST', path: this._path(), }); this._setState({ status }); } catch (err) { this._setState({ status: 'Error' }); } }; _onUnsubscribe = () => { this._setState({ status: 'Pending' }); try { const { status } = MailspringAPIRequest.makeRequest({ server: 'identity', method: 'DELETE', path: this._path(), }); this._setState({ status }); } catch (err) { this._setState({ status: 'Error' }); } }; _path(props = this.props) { return `/api/newsletter/first-account/${encodeURIComponent( props.emailAddress )}?name=${encodeURIComponent(props.name)}`; } _renderControl() { if (this.state.status === 'Pending') { return ( ); } if (this.state.status === 'Error') { return ( ); } if (this.state.status === 'Subscribed') { return ( ); } return ( ); } render() { return (
{this._renderControl()}
); } }