import { Checkbox, Form, Input, SubmitButton } from '../components/form' import * as Yup from 'yup' import { Alert, Button, InputGroup, Modal } from 'react-bootstrap' import LayoutCenter from '../components/layout-center' 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/client' import ModalButton from '../components/modal-button' import { LightningAuth } from '../components/lightning-auth' import { SETTINGS } from '../fragments/users' import { useRouter } from 'next/router' export const getServerSideProps = getGetServerSideProps(SETTINGS) export const SettingsSchema = Yup.object({ tipDefault: Yup.number().typeError('must be a number').required('required') .positive('must be positive').integer('must be whole') }) const warningMessage = 'If I logout, even accidentally, I will never be able to access my account again' export const WarningSchema = Yup.object({ warning: Yup.string().matches(warningMessage, 'does not match').required('required') }) export default function Settings ({ data: { settings } }) { const [success, setSuccess] = useState() const [setSettings] = useMutation( gql` mutation setSettings($tipDefault: Int!, $noteItemSats: Boolean!, $noteEarning: Boolean!, $noteAllDescendants: Boolean!, $noteMentions: Boolean!, $noteDeposits: Boolean!, $noteInvites: Boolean!, $noteJobIndicator: Boolean!) { setSettings(tipDefault: $tipDefault, noteItemSats: $noteItemSats, noteEarning: $noteEarning, noteAllDescendants: $noteAllDescendants, noteMentions: $noteMentions, noteDeposits: $noteDeposits, noteInvites: $noteInvites, noteJobIndicator: $noteJobIndicator) }` ) const { data } = useQuery(SETTINGS) if (data) { ({ settings } = data) } return (

settings

{ await setSettings({ variables: { tipDefault: Number(tipDefault), ...values } }) setSuccess('settings saved') }} > {success && setSuccess(undefined)} dismissible>{success}} sats} />
notify me when ...
save
saturday newsletter
{settings?.authMethods && }
) } function AuthMethods ({ methods }) { const router = useRouter() const [unlinkAuth] = useMutation( gql` mutation unlinkAuth($authType: String!) { unlinkAuth(authType: $authType) { lightning email twitter github } }`, { update (cache, { data: { unlinkAuth } }) { cache.modify({ id: 'ROOT_QUERY', fields: { settings (existing) { return { ...existing, authMethods: { ...unlinkAuth } } } } }) } } ) const [obstacle, setObstacle] = useState() const unlink = async type => { // if there's only one auth method left let links = 0 links += methods.lightning ? 1 : 0 links += methods.email ? 1 : 0 links += methods.twitter ? 1 : 0 links += methods.github ? 1 : 0 if (links === 1) { setObstacle(type) } else { await unlinkAuth({ variables: { authType: type } }) } } return ( <> setObstacle(null)} >
setObstacle(null)}>X
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
{ await unlinkAuth({ variables: { authType: obstacle } }) router.push('/settings') setObstacle(null) }} > do it
auth methods
{methods.lightning ? { await unlink('lightning') } } /> : ( }>
)} { if (methods.twitter) { await unlink('twitter') } else { signIn('twitter') } } } /> { if (methods.github) { await unlink('github') } else { signIn('github') } } } /> {methods.email ? (
) :
} ) } export const EmailSchema = Yup.object({ email: Yup.string().email('email is no good').required('required') }) export function EmailLinkForm ({ callbackUrl }) { const [linkUnverifiedEmail] = useMutation( gql` mutation linkUnverifiedEmail($email: String!) { linkUnverifiedEmail(email: $email) }` ) return (
{ // add email to user's account // then call signIn const { data } = await linkUnverifiedEmail({ variables: { email } }) if (data.linkUnverifiedEmail) { signIn('email', { email, callbackUrl }) } }} >
Link Email
) }