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

95 lines
3.1 KiB
TypeScript
Raw Normal View History

import { clsx } from 'clsx'
2024-02-04 11:25:21 +00:00
import { Component, Show, createEffect, createMemo } from 'solid-js'
import { Dynamic } from 'solid-js/web'
2024-06-24 17:50:27 +00:00
import { useUI } from '~/context/ui'
import type { AuthModalMode } from '~/context/ui'
import { useLocalize } from '../../../context/localize'
import { isMobile } from '../../../utils/media-query'
import { ChangePasswordForm } from './ChangePasswordForm'
2022-10-25 16:25:42 +00:00
import { EmailConfirm } from './EmailConfirm'
import { LoginForm } from './LoginForm'
import { RegisterForm } from './RegisterForm'
2024-06-24 17:50:27 +00:00
import { SendEmailConfirm } from './SendEmailConfirm'
2024-02-06 15:02:57 +00:00
import { SendResetLinkForm } from './SendResetLinkForm'
2024-06-24 17:50:27 +00:00
import { useSearchParams } from '@solidjs/router'
import styles from './AuthModal.module.scss'
2024-06-24 17:50:27 +00:00
import { AuthModalSearchParams } from './types'
2022-10-25 16:25:42 +00:00
const AUTH_MODAL_MODES: Record<AuthModalMode, Component> = {
login: LoginForm,
register: RegisterForm,
2024-02-06 15:02:57 +00:00
'send-reset-link': SendResetLinkForm,
'confirm-email': EmailConfirm,
'send-confirm-email': SendEmailConfirm,
'change-password': ChangePasswordForm,
2022-10-25 16:25:42 +00:00
}
export const AuthModal = () => {
2024-06-24 17:50:27 +00:00
let rootRef: HTMLDivElement | null
2023-02-17 09:21:02 +00:00
const { t } = useLocalize()
2024-06-24 17:50:27 +00:00
const [searchParams] = useSearchParams<AuthModalSearchParams>()
const { hideModal } = useUI()
const mode = createMemo(() => {
return (
AUTH_MODAL_MODES[searchParams?.mode as AuthModalMode] ? searchParams?.mode : 'login'
) as AuthModalMode
2022-10-25 16:25:42 +00:00
})
createEffect((oldMode) => {
if (oldMode !== mode() && !isMobile()) {
2024-06-24 17:50:27 +00:00
rootRef?.querySelector('input')?.focus()
2022-10-25 16:25:42 +00:00
}
}, null)
return (
<div
2024-06-24 17:50:27 +00:00
ref={(el) => (rootRef = el)}
class={clsx(styles.view, {
2024-06-24 17:50:27 +00:00
row: !searchParams?.source,
[styles.signUp]: mode() === 'register' || mode() === 'confirm-email',
})}
2022-10-25 16:25:42 +00:00
>
2024-06-24 17:50:27 +00:00
<Show when={!searchParams?.source}>
<div class={clsx('col-md-12 d-none d-md-flex', styles.authImage)}>
<div
class={styles.authImageText}
classList={{ [styles.hidden]: mode() !== 'register' && mode() !== 'confirm-email' }}
>
<div>
2024-02-05 15:04:23 +00:00
<h4>{t('Join the global community of authors!')}</h4>
<p class={styles.authBenefits}>
{t(
'Get to know the most intelligent people of our time, edit and discuss the articles, share your expertise, rate and decide what to publish in the magazine',
)}
.&nbsp;
{t('New stories every day and even more!')}
</p>
</div>
<p class={styles.disclaimer}>
{t('By signing up you agree with our')}{' '}
<a
href="/about/terms-of-use"
onClick={() => {
hideModal()
}}
>
{t('terms of use')}
</a>
, {t('personal data usage and email notifications')}.
2023-05-15 21:35:07 +00:00
</p>
</div>
</div>{' '}
</Show>
<div
class={clsx(styles.auth, {
2024-06-24 17:50:27 +00:00
'col-md-12': !searchParams?.source,
})}
>
2024-06-24 17:50:27 +00:00
<Dynamic component={AUTH_MODAL_MODES[mode() as AuthModalMode]} />
2022-10-25 16:25:42 +00:00
</div>
</div>
)
}