import React, { useCallback, useState } from 'react'; import { Input, Button, Form, message, Image, Select } from 'antd'; import { UserOutlined, LockOutlined } from '@ant-design/icons'; import { useReactiveVar } from '@apollo/client'; import styled, { useTheme } from 'styled-components/macro'; import { Redirect } from 'react-router'; import styles from './login.module.css'; import { Message } from '../shared/Message'; import { isLoggedInVar } from './checkAuthStatus'; import analytics, { EventType } from '../analytics'; import { useAppConfig } from '../useAppConfig'; import { PageRoutes } from '../../conf/Global'; import useGetInviteTokenFromUrlParams from './useGetInviteTokenFromUrlParams'; type FormValues = { fullName: string; email: string; password: string; confirmPassword: string; title: string; }; const FormInput = styled(Input)` &&& { height: 32px; font-size: 12px; border: 1px solid #555555; border-radius: 5px; background-color: transparent; color: white; line-height: 1.5715; } > .ant-input { color: white; font-size: 14px; background-color: transparent; } > .ant-input:hover { color: white; font-size: 14px; background-color: transparent; } `; const TitleSelector = styled(Select)` .ant-select-selector { color: white; border: 1px solid #555555 !important; background-color: transparent !important; } .ant-select-arrow { color: white; } `; export type SignUpProps = Record; export const SignUp: React.VFC = () => { const isLoggedIn = useReactiveVar(isLoggedInVar); const inviteToken = useGetInviteTokenFromUrlParams(); const themeConfig = useTheme(); const [loading, setLoading] = useState(false); const { refreshContext } = useAppConfig(); const handleSignUp = useCallback( (values: FormValues) => { setLoading(true); const requestOptions = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ fullName: values.fullName, email: values.email, password: values.password, title: values.title, inviteToken, }), }; fetch('/signUp', requestOptions) .then(async (response) => { if (!response.ok) { const data = await response.json(); const error = (data && data.message) || response.status; return Promise.reject(error); } isLoggedInVar(true); refreshContext(); analytics.event({ type: EventType.SignUpEvent, title: values.title }); return Promise.resolve(); }) .catch((error) => { message.error(`Failed to log in! ${error}`); }) .finally(() => setLoading(false)); }, [refreshContext, inviteToken], ); if (isLoggedIn && !loading) { return ; } return (
{loading && }
Email} > } data-testid="email" /> Full Name} > } data-testid="name" /> ({ validator() { if (getFieldValue('password').length < 8) { return Promise.reject( new Error('Your password is less than 8 characters!'), ); } return Promise.resolve(); }, }), ]} name="password" // eslint-disable-next-line jsx-a11y/label-has-associated-control label={} > } type="password" data-testid="password" /> ({ validator() { if (getFieldValue('confirmPassword') !== getFieldValue('password')) { return Promise.reject(new Error('Your passwords do not match!')); } return Promise.resolve(); }, }), ]} name="confirmPassword" // eslint-disable-next-line jsx-a11y/label-has-associated-control label={} > } type="password" data-testid="confirmPassword" /> Title} > Data Analyst Data Engineer Data Scientist Software Engineer Manager Product Manager Other {({ getFieldsValue }) => { const { fullName, email, password, confirmPassword, title } = getFieldsValue(); const fieldsAreNotEmpty = !!fullName && !!email && !!password && !!confirmPassword && !!title; const passwordsMatch = password === confirmPassword; const formIsComplete = fieldsAreNotEmpty && passwordsMatch; return ( ); }}
); };