stacker.news/components/login.js

114 lines
3.6 KiB
JavaScript
Raw Normal View History

2021-10-15 18:05:34 +00:00
import { signIn } from 'next-auth/client'
import Button from 'react-bootstrap/Button'
import styles from './login.module.css'
import GithubIcon from '../svgs/github-fill.svg'
import TwitterIcon from '../svgs/twitter-fill.svg'
2021-12-06 16:32:06 +00:00
import LightningIcon from '../svgs/bolt.svg'
2021-10-15 18:05:34 +00:00
import { Form, Input, SubmitButton } from '../components/form'
import * as Yup from 'yup'
2022-06-02 22:55:23 +00:00
import { useState } from 'react'
2021-10-15 18:05:34 +00:00
import Alert from 'react-bootstrap/Alert'
import { useRouter } from 'next/router'
2022-06-02 22:55:23 +00:00
import { LightningAuth } from './lightning-auth'
2021-10-15 18:05:34 +00:00
export const EmailSchema = Yup.object({
email: Yup.string().email('email is no good').required('required')
2021-10-15 18:05:34 +00:00
})
2023-01-10 00:33:44 +00:00
export function EmailLoginForm ({ text, callbackUrl }) {
2022-06-02 22:55:23 +00:00
return (
<Form
initial={{
email: ''
}}
schema={EmailSchema}
onSubmit={async ({ email }) => {
signIn('email', { email, callbackUrl })
}}
>
<Input
label='Email'
name='email'
placeholder='email@example.com'
required
autoFocus
/>
2023-01-10 00:33:44 +00:00
<SubmitButton variant='secondary' className={styles.providerButton}>{text || 'Login'} with Email</SubmitButton>
2022-06-02 22:55:23 +00:00
</Form>
)
}
2023-01-10 00:33:44 +00:00
export default function Login ({ providers, callbackUrl, error, text, Header, Footer }) {
2021-10-15 18:05:34 +00:00
const errors = {
Signin: 'Try signing with a different account.',
OAuthSignin: 'Try signing with a different account.',
OAuthCallback: 'Try signing with a different account.',
OAuthCreateAccount: 'Try signing with a different account.',
EmailCreateAccount: 'Try signing with a different account.',
Callback: 'Try signing with a different account.',
OAuthAccountNotLinked: 'To confirm your identity, sign in with the same account you used originally.',
EmailSignin: 'Check your email address.',
CredentialsSignin: 'Lightning auth failed.',
default: 'Unable to sign in.'
}
const [errorMessage, setErrorMessage] = useState(error && (errors[error] ?? errors.default))
const router = useRouter()
if (router.query.type === 'lightning') {
return <LightningAuth callbackUrl={callbackUrl} text={text} />
}
2021-10-15 18:05:34 +00:00
return (
<div className={styles.login}>
{Header && <Header />}
{errorMessage &&
<Alert
variant='danger'
onClose={() => setErrorMessage(undefined)}
dismissible
>{errorMessage}
</Alert>}
<Button
className={`mt-2 ${styles.providerButton}`}
variant='primary'
onClick={() => router.push({
pathname: router.pathname,
query: { ...router.query, type: 'lightning' }
})}
>
<LightningIcon
width={20}
height={20}
className='mr-3'
/>{text || 'Login'} with Lightning
</Button>
{providers && Object.values(providers).map(provider => {
if (provider.name === 'Email' || provider.name === 'Lightning') {
return null
}
const [variant, Icon] =
2021-10-15 18:05:34 +00:00
provider.name === 'Twitter'
? ['twitter', TwitterIcon]
: ['dark', GithubIcon]
return (
<Button
className={`mt-2 ${styles.providerButton}`}
key={provider.name}
variant={variant}
onClick={() => signIn(provider.id, { callbackUrl })}
>
<Icon
className='mr-3'
/>{text || 'Login'} with {provider.name}
</Button>
)
})}
<div className='mt-2 text-center text-muted font-weight-bold'>or</div>
<EmailLoginForm text={text} callbackUrl={callbackUrl} />
{Footer && <Footer />}
</div>
2021-10-15 18:05:34 +00:00
)
}