webapp/src/components/Nav/AuthModal/ForgotPasswordForm.tsx

104 lines
3.0 KiB
TypeScript
Raw Normal View History

2022-10-21 18:17:04 +00:00
import { t } from '../../../utils/intl'
import styles from './AuthModal.module.scss'
import { clsx } from 'clsx'
2022-10-31 16:40:55 +00:00
import { createSignal, JSX, Show } from 'solid-js'
2022-10-21 18:17:04 +00:00
import { useRouter } from '../../../stores/router'
import { email, setEmail } from './sharedLogic'
import type { AuthModalSearchParams } from './types'
import { isValidEmail } from './validators'
2022-11-01 22:25:18 +00:00
import { signSendLink } from '../../../stores/auth'
import { locale } from '../../../stores/ui'
2022-10-21 18:17:04 +00:00
type FormFields = {
email: string
}
type ValidationErrors = Partial<Record<keyof FormFields, string | JSX.Element>>
export const ForgotPasswordForm = () => {
const { changeSearchParam } = useRouter<AuthModalSearchParams>()
const handleEmailInput = (newEmail: string) => {
setValidationErrors(({ email: _notNeeded, ...rest }) => rest)
setEmail(newEmail)
}
const [submitError, setSubmitError] = createSignal('')
const [isSubmitting, setIsSubmitting] = createSignal(false)
const [validationErrors, setValidationErrors] = createSignal<ValidationErrors>({})
const handleSubmit = async (event: Event) => {
event.preventDefault()
setSubmitError('')
const newValidationErrors: ValidationErrors = {}
if (!email()) {
newValidationErrors.email = t('Please enter email')
} else if (!isValidEmail(email())) {
newValidationErrors.email = t('Invalid email')
}
setValidationErrors(newValidationErrors)
const isValid = Object.keys(newValidationErrors).length === 0
if (!isValid) {
return
}
setIsSubmitting(true)
try {
2022-11-02 07:25:36 +00:00
const result = await signSendLink({ email: email(), lang: locale() })
if (result.error) setSubmitError(result.error)
2022-10-21 18:17:04 +00:00
} catch (error) {
setSubmitError(error.message)
} finally {
setIsSubmitting(false)
}
}
return (
2022-10-23 20:59:15 +00:00
<form onSubmit={handleSubmit}>
2022-10-21 18:17:04 +00:00
<h4>{t('Forgot password?')}</h4>
2022-10-25 16:25:42 +00:00
<div class={styles.authSubtitle}>{t('Everything is ok, please give us your email address')}</div>
2022-10-21 18:17:04 +00:00
<Show when={submitError()}>
<div class={styles.authInfo}>
<ul>
<li class={styles.warn}>{submitError()}</li>
</ul>
</div>
</Show>
2022-10-23 20:59:15 +00:00
<Show when={validationErrors().email}>
<div class={styles.validationError}>{validationErrors().email}</div>
</Show>
2022-10-21 18:17:04 +00:00
<div class="pretty-form__item">
<input
id="email"
name="email"
autocomplete="email"
type="email"
value={email()}
placeholder={t('Email')}
onInput={(event) => handleEmailInput(event.currentTarget.value)}
/>
<label for="email">{t('Email')}</label>
</div>
<div>
<button class={clsx('button', styles.submitButton)} disabled={isSubmitting()} type="submit">
{isSubmitting() ? '...' : t('Restore password')}
</button>
</div>
<div class={styles.authControl}>
<span class={styles.authLink} onClick={() => changeSearchParam('mode', 'login')}>
{t('I know the password')}
</span>
</div>
</form>
)
}