import Cookies from 'js-cookie'; import type { FunctionComponent } from 'preact'; import { useState } from 'preact/hooks'; import { TOKEN_COOKIE_NAME } from '../../lib/constants'; const EmailLoginForm: FunctionComponent<{}> = () => { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [message, setMessage] = useState<{ type: 'success' | 'error' | 'verification' | 'warning'; message: string; } | null>(null); const handleFormSubmit = async (e: Event) => { e.preventDefault(); // Check if the verification-email-sent-at is less than 5 seconds ago const verificationEmailSentAt = localStorage.getItem( 'verification-email-sent-at' ); console.log(verificationEmailSentAt); if (verificationEmailSentAt) { const now = new Date(); if (Number(verificationEmailSentAt) > now.getTime()) { return setMessage({ type: 'warning', message: 'Please wait before sending another verification email.', }); } } const res = await fetch('http://localhost:8080/v1-login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, password, }), }); const json = await res.json(); // If the response isn't ok, we'll throw an error if (json.type === 'user_not_verified') { return setMessage({ type: 'verification', message: 'Your account is not verified. Please click the verification link in your email. Or resend verification email.', }); } if (json.token) { // If the response is ok, we'll set the token in a cookie Cookies.set(TOKEN_COOKIE_NAME, json.token); window.location.href = '/'; } else { setMessage({ type: 'error', message: json.message, }); } }; const handleResendVerificationEmail = async () => { // Check if the verification-email-sent-at is less than 5 seconds ago const verificationEmailSentAt = localStorage.getItem( 'verification-email-sent-at' ); if (verificationEmailSentAt) { const now = new Date(); if (Number(verificationEmailSentAt) > now.getTime()) { return setMessage({ type: 'warning', message: 'Please wait before sending another verification email.', }); } } const res = await fetch( 'http://localhost:8080/v1-send-verification-email', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ email, }), } ); const json = await res.json(); // If the response isn't ok, we'll throw an error if (!res.ok) { return setMessage({ type: 'error', message: json.message, }); } // If the response is ok, we'll set the token in a cookie setMessage({ type: 'success', message: 'Verification instructions have been sent to your email.', }); // Current time + 5 seconds, save it to localStorage const now = new Date(); const time = now.getTime(); const expireTime = time + 5000; now.setTime(expireTime); localStorage.setItem( 'verification-email-sent-at', now.getTime().toString() ); }; return (
setEmail(String((e.target as any).value))} /> setPassword(String((e.target as any).value))} /> {message && ( <> {message.type === 'verification' ? (
Your account is not verified. Please click the verification link in your email. Or{' '}
) : (
{message.message}
)} )}
); }; export default EmailLoginForm;