import { Show, createSignal } from 'solid-js' import type { JSX } from 'solid-js' import { t } from '../../../utils/intl' import styles from './AuthModal.module.scss' import { clsx } from 'clsx' import { SocialProviders } from './SocialProviders' import { isValidEmail } from './validators' import { ApiError } from '../../../utils/apiClient' import { email, setEmail } from './sharedLogic' import { useRouter } from '../../../stores/router' import type { AuthModalSearchParams } from './types' import { hideModal } from '../../../stores/ui' import { checkEmail, useEmailChecks } from '../../../stores/emailChecks' import { register } from '../../../context/auth' type FormFields = { name: string email: string password: string } type ValidationErrors = Partial> export const RegisterForm = () => { const { changeSearchParam } = useRouter() const { emailChecks } = useEmailChecks() const [submitError, setSubmitError] = createSignal('') const [name, setName] = createSignal('') const [password, setPassword] = createSignal('') const [isSubmitting, setIsSubmitting] = createSignal(false) const [isSuccess, setIsSuccess] = createSignal(false) const [validationErrors, setValidationErrors] = createSignal({}) const handleEmailInput = (newEmail: string) => { setValidationErrors(({ email: _notNeeded, ...rest }) => rest) setEmail(newEmail) } const handleEmailBlur = () => { if (isValidEmail(email())) { checkEmail(email()) } } const handlePasswordInput = (newPassword: string) => { setValidationErrors(({ password: _notNeeded, ...rest }) => rest) setPassword(newPassword) } const handleNameInput = (newPasswordCopy: string) => { setValidationErrors(({ name: _notNeeded, ...rest }) => rest) setName(newPasswordCopy) } const handleSubmit = async (event: Event) => { event.preventDefault() setSubmitError('') const newValidationErrors: ValidationErrors = {} const clearName = name().trim() const clearEmail = email().trim() if (!clearName) { newValidationErrors.name = t('Please enter a name to sign your comments and publication') } if (!clearEmail) { newValidationErrors.email = t('Please enter email') } else if (!isValidEmail(email())) { newValidationErrors.email = t('Invalid email') } if (!password()) { newValidationErrors.password = t('Please enter password') } setValidationErrors(newValidationErrors) const emailCheckResult = await checkEmail(clearEmail) const isValid = Object.keys(newValidationErrors).length === 0 && !emailCheckResult if (!isValid) { return } setIsSubmitting(true) try { await register({ name: clearName, email: clearEmail, password: password() }) setIsSuccess(true) } catch (error) { if (error instanceof ApiError && error.code === 'user_already_exists') { return } setSubmitError(error.message) } finally { setIsSubmitting(false) } } return ( <>

{t('Create account')}

  • {submitError()}
handleNameInput(event.currentTarget.value)} />
{validationErrors().name}
handleEmailInput(event.currentTarget.value)} onBlur={handleEmailBlur} />
{validationErrors().email}
{t("This email is already taken. If it's you")},{' '} { event.preventDefault() changeSearchParam('mode', 'login') }} > {t('enter')}
handlePasswordInput(event.currentTarget.value)} />
{validationErrors().password}
changeSearchParam('mode', 'login')}> {t('I have an account')}
{t('Almost done! Check your email.')}
{t("We've sent you a message with a link to enter our website.")}
) }