stacker.news/pages/settings/wallets/[wallet].js

132 lines
4.2 KiB
JavaScript
Raw Normal View History

2024-06-03 22:41:15 +00:00
import { getGetServerSideProps } from '@/api/ssrApollo'
import { Form, ClientInput, ClientCheckbox, PasswordInput } from '@/components/form'
import { CenterLayout } from '@/components/layout'
import { WalletSecurityBanner } from '@/components/banners'
2024-06-20 14:48:46 +00:00
import { WalletLogs } from '@/components/wallet-logger'
2024-06-03 22:41:15 +00:00
import { useToast } from '@/components/toast'
import { useRouter } from 'next/router'
import { useWallet, Status } from '@/components/wallet'
import Info from '@/components/info'
import Text from '@/components/text'
import { AutowithdrawSettings } from '@/components/autowithdraw-shared'
import dynamic from 'next/dynamic'
const WalletButtonBar = dynamic(() => import('@/components/wallet-buttonbar.js'), { ssr: false })
2024-06-03 22:41:15 +00:00
export const getServerSideProps = getGetServerSideProps({ authRequired: true })
export default function WalletSettings () {
const toaster = useToast()
const router = useRouter()
const { wallet: name } = router.query
const wallet = useWallet(name)
const initial = wallet.fields.reduce((acc, field) => {
return {
...acc,
[field.name]: wallet.config?.[field.name] || ''
}
}, wallet.server ? wallet.config.autowithdrawSettings : {})
2024-06-03 22:41:15 +00:00
return (
<CenterLayout>
<h2 className='pb-2'>{wallet.card.title}</h2>
2024-06-20 19:52:07 +00:00
<h6 className='text-muted text-center pb-3'>{wallet.card.subtitle}</h6>
2024-06-03 22:41:15 +00:00
<WalletSecurityBanner />
<Form
initial={initial}
2024-06-20 18:43:55 +00:00
schema={wallet.schema}
onSubmit={async ({ enabled, ...values }) => {
2024-06-03 22:41:15 +00:00
try {
2024-06-20 18:16:47 +00:00
const newConfig = !wallet.isConfigured
2024-07-04 19:34:36 +00:00
// enable wallet if wallet was just configured
// local wallets use 'enabled' property
// server wallets use 'priority' property
// TODO: make both wallet types use 'priority' property
if (newConfig) {
values.priority = true
enabled = true
}
2024-06-21 20:32:06 +00:00
await wallet.save(values)
2024-07-04 19:34:36 +00:00
if (enabled) wallet.enable()
else wallet.disable()
2024-07-04 19:34:36 +00:00
2024-06-03 22:41:15 +00:00
toaster.success('saved settings')
router.push('/settings/wallets')
} catch (err) {
console.error(err)
const message = 'failed to attach: ' + err.message || err.toString?.()
toaster.danger(message)
2024-06-03 22:41:15 +00:00
}
}}
>
<WalletFields wallet={wallet} />
{wallet.server
2024-07-04 19:38:54 +00:00
? <AutowithdrawSettings wallet={wallet} />
: (
<ClientCheckbox
2024-07-04 19:38:54 +00:00
disabled={!wallet.isConfigured}
initialValue={wallet.status === Status.Enabled}
label='enabled'
name='enabled'
/>
)}
2024-06-03 22:41:15 +00:00
<WalletButtonBar
wallet={wallet} onDelete={async () => {
try {
2024-06-20 18:34:09 +00:00
wallet.delete()
2024-06-03 22:41:15 +00:00
toaster.success('saved settings')
router.push('/settings/wallets')
} catch (err) {
console.error(err)
const message = 'failed to detach: ' + err.message || err.toString?.()
toaster.danger(message)
2024-06-03 22:41:15 +00:00
}
}}
/>
</Form>
<div className='mt-3 w-100'>
<WalletLogs wallet={wallet} embedded />
</div>
</CenterLayout>
)
}
function WalletFields ({ wallet: { config, fields } }) {
return fields.map(({ name, label, type, help, optional, hint, ...props }, i) => {
const rawProps = {
...props,
name,
2024-06-03 22:41:15 +00:00
initialValue: config?.[name],
label: (
<div className='d-flex align-items-center'>
{label}
{/* help can be a string or object to customize the label */}
{help && (
<Info label={help.label || 'help'}>
<Text>{help.text || help}</Text>
</Info>
)}
{optional && (
<small className='text-muted ms-2'>
{typeof optional === 'boolean' ? 'optional' : optional}
</small>
)}
</div>
),
required: !optional,
autoFocus: i === 0
2024-06-03 22:41:15 +00:00
}
if (type === 'text') {
return <ClientInput key={i} {...rawProps} />
2024-06-03 22:41:15 +00:00
}
if (type === 'password') {
return <PasswordInput key={i} {...rawProps} newPass />
2024-06-03 22:41:15 +00:00
}
return null
})
}