import { Checkbox, Form, Input, SubmitButton, Select, VariableInput } from '../components/form'
import Alert from 'react-bootstrap/Alert'
import Button from 'react-bootstrap/Button'
import InputGroup from 'react-bootstrap/InputGroup'
import { CenterLayout } from '../components/layout'
import { useState } from 'react'
import { gql, useMutation, useQuery } from '@apollo/client'
import { getGetServerSideProps } from '../api/ssrApollo'
import LoginButton from '../components/login-button'
import { signIn } from 'next-auth/react'
import { LightningAuth } from '../components/lightning-auth'
import { SETTINGS, SET_SETTINGS } from '../fragments/users'
import { useRouter } from 'next/router'
import Info from '../components/info'
import Link from 'next/link'
import AccordianItem from '../components/accordian-item'
import { bech32 } from 'bech32'
import { NOSTR_MAX_RELAY_NUM, NOSTR_PUBKEY_BECH32 } from '../lib/nostr'
import { emailSchema, lastAuthRemovalSchema, settingsSchema } from '../lib/validate'
import { SUPPORTED_CURRENCIES } from '../lib/currency'
import PageLoading from '../components/page-loading'
import { useShowModal } from '../components/modal'
import { authErrorMessage } from '../components/login'
import { NostrAuth } from '../components/nostr-auth'
import { useToast } from '../components/toast'
import { useLogger } from '../components/logger'
import { useMe } from '../components/me'
export const getServerSideProps = getGetServerSideProps({ query: SETTINGS, authRequired: true })
function bech32encode (hexString) {
return bech32.encode('npub', bech32.toWords(Buffer.from(hexString, 'hex')))
}
export default function Settings ({ ssrData }) {
const toaster = useToast()
const me = useMe()
const [setSettings] = useMutation(SET_SETTINGS, {
update (cache, { data: { setSettings } }) {
cache.modify({
id: 'ROOT_QUERY',
fields: {
settings () {
return setSettings
}
}
})
}
}
)
const logger = useLogger()
const { data } = useQuery(SETTINGS)
const { settings } = data || ssrData
if (!data && !ssrData) return
return (
}
/>}
/>
notify me when ...
privacy
hide invoice descriptions
Use this if you don't want funding sources to be linkable to your SN identity.
It makes your invoice descriptions blank.
This only applies to invoices you create
lnurl-pay and lightning addresses still reference your nym
}
name='hideInvoiceDesc'
groupClassName='mb-0'
/>
hide me from top stackers>}
name='hideFromTopUsers'
groupClassName='mb-0'
/>
hide my cowboy hat>}
name='hideCowboyHat'
groupClassName='mb-0'
/>
hide my wallet balance>}
name='hideWalletBalance'
groupClassName='mb-0'
/>
hide my bookmarks from other stackers>}
name='hideBookmarks'
groupClassName='mb-0'
/>
{me.isContributor &&
hide that I'm a stacker.news contributor>}
name='hideIsContributor'
groupClassName='mb-0'
/>}
click to load external images>}
name='clickToLoadImg'
groupClassName='mb-0'
/>
allow anonymous diagnostics
collect and send back anonymous diagnostics data
this information is used to fix bugs
this information includes:
a randomly generated fancy name
this information can not be traced back to you without your fancy name
fancy names are generated in your browser
your fancy name: {logger.name}
}
name='diagnostics'
/>
content
wild west mode
don't hide flagged content
don't down rank flagged content
}
name='wildWestMode'
groupClassName='mb-0'
/>
greeter mode
see and screen free posts and comments
help onboard new stackers to SN and Lightning
you might be subject to more spam
}
name='greeterMode'
/>
nostr NIP-05 }
body={
<>
pubkey optional >}
name='nostrPubkey'
clear
/>
relays optional >}
name='nostrRelays'
clear
min={0}
max={NOSTR_MAX_RELAY_NUM}
/>
>
}
/>
save
saturday newsletter
(re)subscribe
{settings?.authMethods &&
}
)
}
function QRLinkButton ({ provider, unlink, status }) {
const showModal = useShowModal()
const text = status ? 'Unlink' : 'Link'
const onClick = status
? unlink
: () => showModal(onClose =>
)
return (
)
}
function NostrLinkButton ({ unlink, status }) {
const showModal = useShowModal()
const text = status ? 'Unlink' : 'Link'
const onClick = status
? unlink
: () => showModal(onClose =>
)
return (
)
}
function UnlinkObstacle ({ onClose, type, unlinkAuth }) {
const router = useRouter()
const toaster = useToast()
return (
You are removing your last auth method. It is recommended you link another auth method before removing
your last auth method. If you'd like to proceed anyway, type the following below
If I logout, even accidentally, I will never be able to access my account again
)
}
function AuthMethods ({ methods }) {
const showModal = useShowModal()
const router = useRouter()
const toaster = useToast()
const [err, setErr] = useState(authErrorMessage(router.query.error))
const [unlinkAuth] = useMutation(
gql`
mutation unlinkAuth($authType: String!) {
unlinkAuth(authType: $authType) {
lightning
email
twitter
github
nostr
}
}`, {
update (cache, { data: { unlinkAuth } }) {
cache.modify({
id: 'ROOT_QUERY',
fields: {
settings (existing) {
return { ...existing, authMethods: { ...unlinkAuth } }
}
}
})
}
}
)
// sort to prevent hydration mismatch
const providers = Object.keys(methods).filter(k => k !== '__typename').sort()
const unlink = async type => {
// if there's only one auth method left
const links = providers.reduce((t, p) => t + (methods[p] ? 1 : 0), 0)
if (links === 1) {
showModal(onClose => ( ))
} else {
try {
await unlinkAuth({ variables: { authType: type } })
toaster.success('unlinked auth method')
} catch (err) {
console.error(err)
toaster.danger('failed to unlink auth method')
}
}
}
return (
<>
auth methods
{err && (
{
const { pathname, query: { error, nodata, ...rest } } = router
router.replace({
pathname,
query: { nodata, ...rest }
}, { pathname, query: { ...rest } }, { shallow: true })
setErr(undefined)
}} dismissible
>{err}
)}
{providers?.map(provider => {
if (provider === 'email') {
return methods.email
? (
{
await unlink('email')
}
}
>Unlink Email
)
:
} else if (provider === 'lightning') {
return (
await unlink(provider)}
/>
)
} else if (provider === 'nostr') {
return await unlink(provider)} />
} else {
return (
{
if (methods[provider]) {
await unlink(provider)
} else {
signIn(provider)
}
}}
text={methods[provider] ? 'Unlink' : 'Link'}
/>
)
}
})}
>
)
}
export function EmailLinkForm ({ callbackUrl }) {
const [linkUnverifiedEmail] = useMutation(
gql`
mutation linkUnverifiedEmail($email: String!) {
linkUnverifiedEmail(email: $email)
}`
)
return (
)
}