import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import * as util from "../../util"; import * as config from "../../../config"; // Components import PasswordReq from "../../common/PasswordReq"; import Avatars from "../../common/Avatars"; import BgColor from "../../common/BgColor"; // Styles import "./Auth.css"; const SignUp = (props) => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [avatar, setAvatar] = useState(""); const [bgColor, setBgColor] = useState(""); const [validEmail, setValidEmail] = useState(true); const [validPassword, setValidPassword] = useState(true); const [processing, setProcessing] = useState(false); const [failedToSignUp, setFailedToSignUp] = useState(false); const [duplicateAccount, setDuplicateAccount] = useState(false); const inputRef = React.useRef(); useEffect(() => { document.addEventListener("keydown", handleKeyDown); inputRef.current.focus(); return () => { document.removeEventListener("keydown", handleKeyDown); }; }, []); const handleKeyDown = (e) => { if (e.keyCode === 27) { // keyCode 27 is Escape key props.closeSignUp(); } }; const signUp = async () => { try { const baseUrl = util.getApiUrlBase(); const url = `${baseUrl}signUp`; const options = { method: "POST", body: JSON.stringify({ email: email, password: password, avatar: avatar, bgColor: bgColor, channelType: config.IVS_CHANNEL_TYPE.toUpperCase() === "BASIC" ? "BASIC" : "STANDARD", channelLatencyMode: config.IVS_LATENCY_MODE.toUpperCase() === "LOW" ? "LOW" : "NORMAL", }), }; const response = await fetch(url, options); if (response.status === 201) { const json = await response.json(); setFailedToSignUp(false); setProcessing(false); util.setWithExpiry( `ugc`, json.AuthenticationResult, json.AuthenticationResult.ExpiresIn ); props.setUserAuth(json.AuthenticationResult); props.getUserInfo(json.AuthenticationResult); props.getUserStreamInfo(json.AuthenticationResult); props.closeSignUp(); } else { const errorMessage = await response.text(); console.log(errorMessage); if (errorMessage.includes("UsernameExistsException")) { setDuplicateAccount(true); } throw new Error("Unable to signup"); } } catch (error) { console.log(error.message); setFailedToSignUp(true); setProcessing(false); } }; const handleEmailChange = (e) => { setEmail(e.target.value); }; const handlePasswordChange = (e) => { setPassword(e.target.value); }; const handleConfirmPasswordChange = (e) => { setConfirmPassword(e.target.value); }; const handleColorClick = (e, name) => { setBgColor(name); }; const resetSignUp = () => { setValidEmail(true); setValidPassword(true); setProcessing(false); setFailedToSignUp(false); setDuplicateAccount(false); }; const handleSignUp = (e) => { e.preventDefault(); resetSignUp(); const vEmail = util.validateEmail(email); const vPassword = util.validatePassword(password); if (vEmail && vPassword) { setProcessing(true); signUp(); } setValidEmail(vEmail); setValidPassword(vPassword); }; const handleAvatarClick = (e, name) => { setAvatar(name); }; const handleLinkClick = (e) => { e.preventDefault(); props.closeSignUp(); props.showSignIn(); }; const signUpDisabled = !email || !password || !confirmPassword || !avatar || !bgColor || processing || password !== confirmPassword; const signUpText = processing ? "Processing..." : "Create Account"; return (

Create account

{email && !validEmail && (
Invalid email
)} {duplicateAccount && (
That email has already been registered. Did you mean to{" "} sign in ?
)}
Select Avatar
Select Color
{failedToSignUp && (
Failed to sign up!
)}
Already have an account?{" "} Sign in
); }; SignUp.propTypes = { closeSignUp: PropTypes.func, showSignIn: PropTypes.func, setUserAuth: PropTypes.func, getUserInfo: PropTypes.func, setUserInfo: PropTypes.func, getUserStreamInfo: PropTypes.func, }; export default SignUp;