2023-11-14 15:10:00 +00:00
import { clsx } from 'clsx'
2024-02-04 11:25:21 +00:00
import { Component , Show , createEffect , createMemo } from 'solid-js'
2023-11-14 15:10:00 +00:00
import { Dynamic } from 'solid-js/web'
2024-06-25 19:10:00 +00:00
import { AuthModalSource , useUI } from '~/context/ui'
2023-11-14 15:10:00 +00:00
import { useLocalize } from '../../../context/localize'
2023-06-14 17:19:30 +00:00
import { isMobile } from '../../../utils/media-query'
2023-12-21 10:02:28 +00:00
import { ChangePasswordForm } from './ChangePasswordForm'
2022-10-25 16:25:42 +00:00
import { EmailConfirm } from './EmailConfirm'
2023-11-14 15:10:00 +00:00
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'
2023-11-14 15:10:00 +00:00
2024-06-24 17:50:27 +00:00
import { useSearchParams } from '@solidjs/router'
2023-11-14 15:10:00 +00:00
import styles from './AuthModal.module.scss'
2024-06-25 19:10:00 +00:00
export type AuthModalMode =
| 'login'
| 'register'
| 'confirm-email'
| 'send-confirm-email'
| 'send-reset-link'
| 'change-password'
export type AuthModalSearchParams = {
mode : AuthModalMode
source? : AuthModalSource
token? : string
}
2022-10-25 16:25:42 +00:00
const AUTH_MODAL_MODES : Record < AuthModalMode , Component > = {
2024-06-25 19:56:42 +00:00
login : LoginForm ,
register : RegisterForm ,
2024-02-06 15:02:57 +00:00
'send-reset-link' : SendResetLinkForm ,
2023-11-14 15:10:00 +00:00
'confirm-email' : EmailConfirm ,
2024-03-07 08:07:46 +00:00
'send-confirm-email' : SendEmailConfirm ,
2023-12-21 10:02:28 +00:00
'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 ) = > {
2023-06-14 17:19:30 +00:00
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 ) }
2023-07-30 12:31:54 +00:00
class = { clsx ( styles . view , {
2024-06-24 17:50:27 +00:00
row : ! searchParams ? . source ,
2023-12-21 10:02:28 +00:00
[ styles . signUp ] : mode ( ) === 'register' || mode ( ) === 'confirm-email' ,
2023-07-30 12:31:54 +00:00
} ) }
2022-10-25 16:25:42 +00:00
>
2024-06-24 17:50:27 +00:00
< Show when = { ! searchParams ? . source } >
2023-07-30 12:31:54 +00:00
< 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 >
2023-07-30 12:31:54 +00:00
< p class = { styles . authBenefits } >
{ t (
2023-11-14 15:10:00 +00:00
'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' ,
2023-07-30 12:31:54 +00:00
) }
. & 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 >
2023-07-30 12:31:54 +00:00
< / div > { ' ' }
< / Show >
< div
class = { clsx ( styles . auth , {
2024-06-24 17:50:27 +00:00
'col-md-12' : ! searchParams ? . source ,
2023-07-30 12:31:54 +00:00
} ) }
>
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 >
)
}