webapp/src/components/_shared/Subscribe/Subscribe.tsx

111 lines
3.0 KiB
TypeScript
Raw Normal View History

import { createSignal, JSX, Show } from 'solid-js'
2023-10-21 12:45:07 +00:00
import { useLocalize } from '../../../context/localize'
import { validateEmail } from '../../../utils/validateEmail'
import { Button } from '../Button'
import styles from './Subscribe.module.scss'
2023-10-21 12:45:07 +00:00
import { useSnackbar } from '../../../context/snackbar'
import { Icon } from '../Icon'
2022-09-09 11:53:35 +00:00
2023-10-21 12:45:07 +00:00
type Props = {
variant?: 'mobileSubscription'
}
export const Subscribe = (props: Props) => {
2023-02-17 09:21:02 +00:00
const { t } = useLocalize()
2022-09-09 11:53:35 +00:00
const [title, setTitle] = createSignal('')
const [email, setEmail] = createSignal('')
const [emailError, setEmailError] = createSignal<string>(null)
const {
actions: { showSnackbar }
} = useSnackbar()
const validate = (): boolean => {
if (!email()) {
setEmailError(t('Please enter email'))
return false
}
if (!validateEmail(email())) {
setEmailError(t('Please check your email address'))
return false
}
setEmailError(null)
return true
}
const handleInput: JSX.ChangeEventHandlerUnion<HTMLInputElement, Event> = (event) => {
setEmailError(null)
setEmail(event.target.value)
}
const handleSubmit = async (event: SubmitEvent) => {
event.preventDefault()
if (!validate()) return
2022-09-09 11:53:35 +00:00
setTitle(t('...subscribing'))
2023-05-11 19:54:05 +00:00
const requestOptions = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ email: email() })
2023-05-11 19:54:05 +00:00
}
const response = await fetch('/api/newsletter', requestOptions)
if (response.ok) {
2023-10-16 09:54:14 +00:00
setTitle(t('Following'))
showSnackbar({ body: t('Thank you for subscribing') })
} else {
if (response.status === 400) {
setEmailError(t('Please check your email address'))
} else {
setEmailError(t('Something went wrong, please try again'))
}
setTitle('')
}
2022-09-09 11:53:35 +00:00
}
2022-10-19 22:16:17 +00:00
2022-09-09 11:53:35 +00:00
return (
2023-10-21 12:45:07 +00:00
<form
class={props.variant === 'mobileSubscription' ? styles.mobileSubscription : styles.form}
onSubmit={handleSubmit}
novalidate
>
2023-05-12 14:57:33 +00:00
<Show when={!title()} fallback={title()}>
2023-10-21 12:45:07 +00:00
<Show
when={props.variant === 'mobileSubscription'}
fallback={
<div class={styles.controls}>
<input
type="email"
name="email"
value={email()}
onInput={handleInput}
class={styles.input}
placeholder={t('Fill email')}
/>
<Button class={styles.button} type="submit" variant="secondary" value={t('Subscribe')} />
</div>
}
>
<div class="pretty-form__item">
<input type="email" placeholder={t('Your email')} id="subscription-email" />
<label for="subscription-email">{t('Your email')}</label>
<button type="submit" class={styles.mobileSubscriptionSubmit}>
<Icon name="arrow-right" />
</button>
</div>
</Show>
<Show when={emailError()}>
<div class={styles.error}>{emailError()}</div>
</Show>
2023-05-12 14:57:33 +00:00
</Show>
</form>
2022-09-09 11:53:35 +00:00
)
}