From 27bf0d8a165783f8deeba9fdf47d203bf603ed37 Mon Sep 17 00:00:00 2001 From: Fred Carlsen Date: Tue, 11 Dec 2018 14:33:43 +0100 Subject: Add form handler --- .../website/ts/@next/components/newsletterForm.tsx | 98 ++++++++++++++++++---- 1 file changed, 82 insertions(+), 16 deletions(-) (limited to 'packages/website/ts') diff --git a/packages/website/ts/@next/components/newsletterForm.tsx b/packages/website/ts/@next/components/newsletterForm.tsx index 972183b00..ab962f046 100644 --- a/packages/website/ts/@next/components/newsletterForm.tsx +++ b/packages/website/ts/@next/components/newsletterForm.tsx @@ -3,47 +3,78 @@ import styled from 'styled-components'; import { colors } from 'ts/style/colors'; +interface Props { +} + interface InputProps { + isSubmitted: boolean; name: string; label: string; type: string; } -interface Props { +interface ArrowProps { + isSubmitted: boolean; } -const Input = (props: InputProps) => { +const Input: React.ReactNode = React.forwardRef((props: InputProps, ref) => { const { name, label, type } = props; const id = `input-${name}`; return ( - <> + - - + + ); }; export class NewsletterForm extends React.Component { - public submit = () => { - // submit this form - } - + public emailInput = React.createRef(); + public state = { + isSubmitted: false, + }; public render(): React.ReactNode { + const {isSubmitted} = this.state; + return ( - + - + - - + + - + + 🎉 Thank you for signing up! Subscribe to our newsletter for updates in the 0x ecosystem - ) + ); + } + + private async _onSubmit(e) { + e.preventDefault(); + + const email = this.emailInput.current.value; + + this.setState({ isSubmitted: true }); + + try { + const response = await fetch('/email', { + method: 'post', + headers: { + 'content-type': 'application/json; charset=utf-8', + }, + body: JSON.stringify({ email }), + }); + const json = await response.json(); + + console.log(response.json()); + } catch (e) { + console.log(e); + } } } @@ -60,7 +91,7 @@ const StyledInput = styled.input` background-color: transparent; border: 0; border-bottom: 1px solid #393939; - color: ${colors.textDarkSecondary}; + color: #B1B1B1; // #9D9D9D on light theme font-size: 1.294117647rem; padding: 15px 0; outline: none; @@ -71,6 +102,13 @@ const InputWrapper = styled.div` position: relative; `; +const InnerInputWrapper = styled.div` + opacity: ${props => props.isSubmitted && 0}; + visibility: ${props => props.isSubmitted && 'hidden'}; + transition: opacity 0.25s ease-in-out, visibility 0.25s ease-in-out; + transition-delay: 0.30s; +`; + const SubmitButton = styled.button` width: 44px; height: 44px; @@ -79,6 +117,12 @@ const SubmitButton = styled.button` position: absolute; right: 0; top: calc(50% - 22px); + overflow: hidden; + outline: 0; + + &:focus-within { + background-color: #eee; + } `; const Text = styled.p` @@ -88,3 +132,25 @@ const Text = styled.p` line-height: 1.2em; margin-top: 15px; `; + +const SuccessText = styled.p` + color: #B1B1B1; + font-size: 1rem; + font-weight: 300; + line-height: 1.2em; + padding-top: 25px; + position: absolute; + left: 0; + top: 0; + text-align: center; + right: 50px; + opacity: ${props => props.isSubmitted ? 1 : 0}; + visibility: ${props => props.isSubmitted ? 'visible' : 'hidden'}; + transition: opacity 0.25s ease-in-out, visibility 0.25s ease-in-out; + transition-delay: 0.55s; +`; + +const Arrow = styled.svg` + transform: ${props => props.isSubmitted && `translateX(44px)`}; + transition: transform 0.25s ease-in-out; +`; -- cgit v1.2.3