import React, { useState } from 'react'; import { useAppContext } from './app'; import { flash } from './toast'; import { Link } from 'react-router-dom'; import Logo from './logo'; const SignUp: React.FC<{}> = () => { const [submitting, setSubmitting] = useState(false); const { request, setState, redirect } = useAppContext() as any; const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [password2, setPassword2] = useState(''); const [email, setEmail] = useState(''); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const handleTogglePassword = () => setShowPassword(!showPassword); const handleToggleConfirmPassword = () => setShowConfirmPassword(!showConfirmPassword); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); // Perform validation if (username.trim() === '') { flash('Please enter a username'); return; } if (password.trim() === '') { flash('Please enter a password'); return; } if (password2.trim() === '') { flash('Please confirm your password'); return; } if (password !== password2) { flash('Passwords do not match'); return; } if (email.trim() === '') { flash('Please enter an email'); return; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { flash('Please enter a valid email'); return; } const passwordRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{12,}$/; if (!passwordRegex.test(password)) { let errorMessage = 'Password must meet the following requirements:\n'; if (password.length < 12) { errorMessage += '- Be 12 characters long\n'; } if (!/(?=.*[a-z])/.test(password)) { errorMessage += '- Contain at least one lowercase letter\n'; } if (!/(?=.*[A-Z])/.test(password)) { errorMessage += '- Contain at least one uppercase letter\n'; } if (!/(?=.*\d)/.test(password)) { errorMessage += '- Contain at least one number\n'; } if (!/(?=.*[@$!%*?&])/.test(password)) { errorMessage += '- Contain at least one symbol\n'; } flash(errorMessage); return; } setSubmitting(true); request('/register', 'POST', { email: email.trim(), username: username.trim(), password: password.trim() }).then((result: { token: string, key: string, iv: string }) => { localStorage.setItem('token', JSON.stringify({ token: result.token, key: result.key, iv: result.iv })); setState({ token: result.token, key: result.key, iv: result.iv }); redirect('/'); }).catch((e: any) => { console.error(e); flash('An error occurred. Please try again later'); }).finally(() => { setSubmitting(false); }); }; return (

Sign Up

{submitting ? (

Submitting...

) : ( <>
setEmail(e.target.value)} type="text" id="email" name="email" />
setUsername(e.target.value)} type="text" id="username" name="username" />
setPassword(e.target.value)} type={showPassword ? "text" : "password"} id="password" name="password" />
setPassword2(e.target.value)} type={showConfirmPassword ? "text" : "password"} id="password2" name="password2" />
Already have an account? Sign In! )}
); } export default SignUp;