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

98 lines
2.9 KiB
TypeScript
Raw Normal View History

import type { ConfirmEmailSearchParams } from './types'
2022-10-25 16:25:42 +00:00
import { clsx } from 'clsx'
2023-12-18 07:52:52 +00:00
import { createEffect, createMemo, createSignal, onMount, Show } from 'solid-js'
import { useLocalize } from '../../../context/localize'
import { useSession } from '../../../context/session'
2023-11-28 13:18:25 +00:00
import { ApiError } from '../../../graphql/error'
import { useRouter } from '../../../stores/router'
import { hideModal } from '../../../stores/ui'
import styles from './AuthModal.module.scss'
2022-10-25 16:25:42 +00:00
export const EmailConfirm = () => {
2023-02-17 09:21:02 +00:00
const { t } = useLocalize()
const {
2023-12-16 14:13:14 +00:00
actions: { confirmEmail, loadSession, loadAuthor },
session,
2022-11-14 10:02:08 +00:00
} = useSession()
2023-12-18 07:52:52 +00:00
const [confirmedEmail, setConfirmedEmail] = createSignal<boolean>(false)
2022-10-25 16:25:42 +00:00
2022-11-14 01:17:12 +00:00
const [isTokenExpired, setIsTokenExpired] = createSignal(false)
const [isTokenInvalid, setIsTokenInvalid] = createSignal(false)
2023-12-16 14:13:14 +00:00
const { searchParams, changeSearchParam } = useRouter<ConfirmEmailSearchParams>()
2022-10-25 16:25:42 +00:00
onMount(async () => {
2023-12-16 14:13:14 +00:00
const token = searchParams().access_token
if (token) {
2023-12-18 07:52:52 +00:00
changeSearchParam({})
2023-12-16 14:13:14 +00:00
try {
await confirmEmail({ token })
await loadSession()
await loadAuthor()
} catch (error) {
2023-12-18 07:52:52 +00:00
// TODO: adapt this code to authorizer
2023-12-16 14:13:14 +00:00
if (error instanceof ApiError) {
if (error.code === 'token_expired') {
setIsTokenExpired(true)
return
}
if (error.code === 'token_invalid') {
setIsTokenInvalid(true)
return
}
2022-11-14 01:17:12 +00:00
}
2023-12-16 14:13:14 +00:00
console.log(error)
2022-11-14 01:17:12 +00:00
}
2022-10-25 16:25:42 +00:00
}
})
2023-12-18 07:52:52 +00:00
createEffect(() => {
const confirmed = session()?.user?.email_verified
if (confirmed) {
console.debug(`[EmailConfirm] email successfully verified`)
setConfirmedEmail(confirmed)
}
})
const email = createMemo(() => session()?.user?.email)
2023-12-17 12:36:47 +00:00
2022-10-25 16:25:42 +00:00
return (
<div>
2022-11-14 01:17:12 +00:00
{/* TODO: texts */}
<Show when={isTokenExpired()}>
<div class={styles.title}>Ссылка больше не действительна</div>
<div class={styles.text}>
2023-02-17 09:21:02 +00:00
<a href="/?modal=auth&mode=login">
2023-12-18 07:52:52 +00:00
{/*TODO: temp solution, should be send link again */}
2022-11-14 01:17:12 +00:00
Вход
</a>
</div>
</Show>
<Show when={isTokenInvalid()}>
<div class={styles.title}>Неправильная ссылка</div>
<div class={styles.text}>
2023-02-17 09:21:02 +00:00
<a href="/?modal=auth&mode=login">
2023-12-18 07:52:52 +00:00
{/*TODO: temp solution, should be send link again */}
2022-11-14 01:17:12 +00:00
Вход
</a>
</div>
</Show>
2023-12-18 07:52:52 +00:00
<Show when={confirmedEmail()}>
2022-11-14 01:17:12 +00:00
<div class={styles.title}>{t('Hooray! Welcome!')}</div>
2022-10-25 16:25:42 +00:00
<div class={styles.text}>
2023-12-18 07:52:52 +00:00
{t("You've confirmed email")} {email()}
2022-10-25 16:25:42 +00:00
</div>
2022-11-14 01:17:12 +00:00
<div>
<button class={clsx('button', styles.submitButton)} onClick={() => hideModal()}>
{t('Go to main page')}
</button>
</div>
2022-10-25 16:25:42 +00:00
</Show>
</div>
)
}