stacker.news/components/lightning-auth.js

109 lines
3.3 KiB
JavaScript
Raw Normal View History

2022-06-02 22:55:23 +00:00
import { gql, useMutation, useQuery } from '@apollo/client'
import { signIn } from 'next-auth/client'
import { useEffect } from 'react'
2023-01-10 18:55:17 +00:00
import { Col, Container, Row } from 'react-bootstrap'
import AccordianItem from './accordian-item'
2022-06-02 22:55:23 +00:00
import LnQR, { LnQRSkeleton } from './lnqr'
2023-01-10 18:55:17 +00:00
import styles from './lightning-auth.module.css'
import BackIcon from '../svgs/arrow-left-line.svg'
import { useRouter } from 'next/router'
2022-06-02 22:55:23 +00:00
function LnQRAuth ({ k1, encodedUrl, callbackUrl }) {
const query = gql`
{
lnAuth(k1: "${k1}") {
pubkey
k1
}
}`
const { data } = useQuery(query, { pollInterval: 1000 })
if (data && data.lnAuth.pubkey) {
signIn('credentials', { ...data.lnAuth, callbackUrl })
}
// output pubkey and k1
return (
2023-01-10 18:55:17 +00:00
<LnQR value={encodedUrl} status='waiting for you' />
2022-06-02 22:55:23 +00:00
)
}
2023-01-10 18:55:17 +00:00
function LightningExplainer ({ text, children }) {
const router = useRouter()
return (
<Container sm>
<div className={styles.login}>
<div className='w-100 mb-3 text-muted pointer' onClick={() => router.back()}><BackIcon /></div>
<h3 className='w-100 pb-2'>
{text || 'Login'} with Lightning
</h3>
<div className='font-weight-bold text-muted pb-4'>This is the most private way to use Stacker News. Just open your Lightning wallet and scan the QR code.</div>
<Row className='w-100 text-muted'>
<Col className='pl-0 mb-4' md>
<AccordianItem
header={`Which wallets can I use to ${(text || 'Login').toLowerCase()}?`}
body={
<>
<Row className='mb-3 no-gutters'>
2023-01-10 23:55:11 +00:00
You can use any wallet that supports lnurl-auth. These are some wallets you can use:
2023-01-10 18:55:17 +00:00
</Row>
<Row>
<Col xs>
<ul className='mb-0'>
<li>Alby</li>
<li>Balance of Satoshis</li>
<li>Blixt</li>
<li>Breez</li>
<li>Blue Wallet</li>
<li>Coinos</li>
<li>LNBits</li>
<li>LNtxtbot</li>
</ul>
</Col>
<Col xs>
<ul>
<li>Phoenix</li>
<li>Simple Bitcoin Wallet</li>
<li>Sparrow Wallet</li>
<li>ThunderHub</li>
<li>Zap Desktop</li>
<li>Zeus</li>
</ul>
</Col>
</Row>
</>
}
/>
</Col>
<Col md className='mx-auto' style={{ maxWidth: '300px' }}>
{children}
</Col>
</Row>
</div>
</Container>
)
}
export function LightningAuth ({ text, callbackUrl }) {
2022-06-02 22:55:23 +00:00
// query for challenge
const [createAuth, { data, error }] = useMutation(gql`
mutation createAuth {
createAuth {
k1
encodedUrl
}
}`)
2022-11-06 17:28:58 +00:00
useEffect(() => {
createAuth()
}, [])
2022-06-02 22:55:23 +00:00
if (error) return <div>error</div>
2023-01-10 18:55:17 +00:00
return (
<LightningExplainer text={text}>
{data ? <LnQRAuth {...data.createAuth} callbackUrl={callbackUrl} /> : <LnQRSkeleton status='generating' />}
</LightningExplainer>
)
2022-06-02 22:55:23 +00:00
}