diff --git a/landing/subscription-form.css b/landing/subscription-form.css index b7231b34e..69a083e52 100644 --- a/landing/subscription-form.css +++ b/landing/subscription-form.css @@ -1,70 +1,70 @@ form { display: flex; } .button { cursor: pointer; border: none; padding: 16px 32px; border-radius: 4px; color: var(--white-100); background: var(--violet-dark-60); min-width: 184px; } -.button_success { +.buttonSuccess { background-color: var(--success-dark-90); } -.button_failure { +.buttonFailure { background-color: var(--error-dark-50); } .button:hover { background-color: var(--violet-dark-80); } -.button_success:hover { +.buttonSuccess:hover { background-color: var(--success-dark-90); } -.button_failure:hover { +.buttonFailure:hover { background: var(--error-dark-50); } -input.email_input { +input.emailInput { flex: 1; padding: 16px 24px; background-color: transparent; color: var(--white-100); border: 1px solid var(--white-80); border-radius: 4px; outline: none; transition: 300ms; margin-right: 12px; } -input.email_input:focus { +input.emailInput:focus { border: 1.5px solid var(--white-100); transition: 300ms; } -input.email_input_failure { +input.emailInputFailure { border: 1px solid var(--error-dark-50); } @media (max-width: 1099px) { form { display: block; } .button { width: 100%; height: 50px; } - input.email_input { + input.emailInput { width: 100%; height: 50px; margin-bottom: 16px; } } diff --git a/landing/subscription-form.react.js b/landing/subscription-form.react.js index e1eb298ac..67e814870 100644 --- a/landing/subscription-form.react.js +++ b/landing/subscription-form.react.js @@ -1,105 +1,105 @@ // @flow import classNames from 'classnames'; import * as React from 'react'; import { validEmailRegex } from 'lib/shared/account-utils.js'; import css from './subscription-form.css'; import typography from './typography.css'; type SubscriptionFormStatus = | { +status: 'pending' } | { +status: 'in_progress' } | { +status: 'success' } | { +status: 'error', +error: string }; function SubscriptionForm(): React.Node { const [email, setEmail] = React.useState(''); const [subscriptionFormStatus, setSubscriptionFormStatus] = React.useState({ status: 'pending' }); const onEmailSubmitted = React.useCallback( async (e: Event) => { e.preventDefault(); if ( subscriptionFormStatus.status === 'in_progress' || subscriptionFormStatus.status === 'success' ) { return; } if (email.search(validEmailRegex) === -1) { setSubscriptionFormStatus({ status: 'error', error: 'Invalid email' }); return; } setSubscriptionFormStatus({ status: 'in_progress' }); try { const response = await fetch('subscribe_email', { method: 'POST', credentials: 'same-origin', body: JSON.stringify({ email }), headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', }, }); const respJson = await response.json(); if (!respJson.success) { setSubscriptionFormStatus({ status: 'error', error: 'Request failed', }); return; } setSubscriptionFormStatus({ status: 'success' }); document.activeElement?.blur(); } catch { setSubscriptionFormStatus({ status: 'error', error: 'Network failed' }); } }, [email, subscriptionFormStatus], ); React.useEffect(() => { setSubscriptionFormStatus({ status: 'pending' }); }, [email]); let btnText = 'Request Access'; let btnStyle = css.button; - let inputStyle = css.email_input; + let inputStyle = css.emailInput; if (subscriptionFormStatus.status === 'error') { btnText = subscriptionFormStatus.error; - btnStyle = `${css.button} ${css.button_failure}`; - inputStyle = `${css.email_input} ${css.email_input_failure}`; + btnStyle = `${css.button} ${css.buttonFailure}`; + inputStyle = `${css.emailInput} ${css.emailInputFailure}`; } else if (subscriptionFormStatus.status === 'success') { btnText = 'Requested!'; - btnStyle = `${css.button} ${css.button_success}`; + btnStyle = `${css.button} ${css.buttonSuccess}`; } const inputClassName = classNames([typography.paragraph2, inputStyle]); const buttonClassName = classNames([typography.paragraph2, btnStyle]); const onEmailChange = React.useCallback(e => { setEmail(e.target.value); }, []); return (
); } export default SubscriptionForm;