Use validation for WebLN wallet (#1277)
* remove available prop * 'enabled' checkbox is now always enabled but uses validation * CheckboxGroup was missing to show error message
This commit is contained in:
parent
d3ca87a78b
commit
628a0466fd
|
@ -1,5 +1,5 @@
|
||||||
import { getGetServerSideProps } from '@/api/ssrApollo'
|
import { getGetServerSideProps } from '@/api/ssrApollo'
|
||||||
import { Form, ClientInput, ClientCheckbox, PasswordInput } from '@/components/form'
|
import { Form, ClientInput, ClientCheckbox, PasswordInput, CheckboxGroup } from '@/components/form'
|
||||||
import { CenterLayout } from '@/components/layout'
|
import { CenterLayout } from '@/components/layout'
|
||||||
import { WalletSecurityBanner } from '@/components/banners'
|
import { WalletSecurityBanner } from '@/components/banners'
|
||||||
import { WalletLogs } from '@/components/wallet-logger'
|
import { WalletLogs } from '@/components/wallet-logger'
|
||||||
|
@ -10,7 +10,6 @@ import Info from '@/components/info'
|
||||||
import Text from '@/components/text'
|
import Text from '@/components/text'
|
||||||
import { AutowithdrawSettings } from '@/components/autowithdraw-shared'
|
import { AutowithdrawSettings } from '@/components/autowithdraw-shared'
|
||||||
import dynamic from 'next/dynamic'
|
import dynamic from 'next/dynamic'
|
||||||
import { useEffect, useState } from 'react'
|
|
||||||
|
|
||||||
const WalletButtonBar = dynamic(() => import('@/components/wallet-buttonbar.js'), { ssr: false })
|
const WalletButtonBar = dynamic(() => import('@/components/wallet-buttonbar.js'), { ssr: false })
|
||||||
|
|
||||||
|
@ -22,14 +21,6 @@ export default function WalletSettings () {
|
||||||
const { wallet: name } = router.query
|
const { wallet: name } = router.query
|
||||||
const wallet = useWallet(name)
|
const wallet = useWallet(name)
|
||||||
|
|
||||||
const [mounted, setMounted] = useState(false)
|
|
||||||
useEffect(() => {
|
|
||||||
// mounted is required since available might depend
|
|
||||||
// on values that are only available on the client (and not during SSR)
|
|
||||||
// and thus we need to render the component again on the client
|
|
||||||
setMounted(true)
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
const initial = wallet.fields.reduce((acc, field) => {
|
const initial = wallet.fields.reduce((acc, field) => {
|
||||||
// We still need to run over all wallet fields via reduce
|
// We still need to run over all wallet fields via reduce
|
||||||
// even though we use wallet.config as the initial value
|
// even though we use wallet.config as the initial value
|
||||||
|
@ -47,8 +38,6 @@ export default function WalletSettings () {
|
||||||
? { validate: wallet.fieldValidation }
|
? { validate: wallet.fieldValidation }
|
||||||
: { schema: wallet.fieldValidation }
|
: { schema: wallet.fieldValidation }
|
||||||
|
|
||||||
const available = mounted && wallet.available !== undefined ? wallet.available : wallet.isConfigured
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CenterLayout>
|
<CenterLayout>
|
||||||
<h2 className='pb-2'>{wallet.card.title}</h2>
|
<h2 className='pb-2'>{wallet.card.title}</h2>
|
||||||
|
@ -84,12 +73,15 @@ export default function WalletSettings () {
|
||||||
{wallet.walletType
|
{wallet.walletType
|
||||||
? <AutowithdrawSettings wallet={wallet} />
|
? <AutowithdrawSettings wallet={wallet} />
|
||||||
: (
|
: (
|
||||||
|
<CheckboxGroup name='enabled'>
|
||||||
<ClientCheckbox
|
<ClientCheckbox
|
||||||
disabled={!available}
|
disabled={!wallet.isConfigured}
|
||||||
initialValue={wallet.status === Status.Enabled}
|
initialValue={wallet.status === Status.Enabled}
|
||||||
label='enabled'
|
label='enabled'
|
||||||
name='enabled'
|
name='enabled'
|
||||||
|
groupClassName='mb-0'
|
||||||
/>
|
/>
|
||||||
|
</CheckboxGroup>
|
||||||
)}
|
)}
|
||||||
<WalletButtonBar
|
<WalletButtonBar
|
||||||
wallet={wallet} onDelete={async () => {
|
wallet={wallet} onDelete={async () => {
|
||||||
|
|
|
@ -64,10 +64,6 @@ Since `name` will also be used in [wallet logs](https://stacker.news/wallet/logs
|
||||||
|
|
||||||
Wallet fields define what this wallet requires for configuration and thus are used to construct the forms like the one you can see at [/settings/wallets/lnbits](https://stacker.news/settings/walletslnbits).
|
Wallet fields define what this wallet requires for configuration and thus are used to construct the forms like the one you can see at [/settings/wallets/lnbits](https://stacker.news/settings/walletslnbits).
|
||||||
|
|
||||||
- `available?: boolean`
|
|
||||||
|
|
||||||
This property can be used to override the default behavior of the `enabled` checkbox in the wallet configuration form. By default, it will be clickable when a wallet is configured. However, if a wallet does not have any configuration, this checkbox will always be disabled. You can set `available` to an expression that will determine when a wallet can be enabled.
|
|
||||||
|
|
||||||
- `card: WalletCard`
|
- `card: WalletCard`
|
||||||
|
|
||||||
Wallet cards are the components you can see at [/settings/wallets](https://stacker.news/settings/wallets). This property customizes this card for this wallet.
|
Wallet cards are the components you can see at [/settings/wallets](https://stacker.news/settings/wallets). This property customizes this card for this wallet.
|
||||||
|
|
|
@ -137,11 +137,6 @@ function useConfig (wallet) {
|
||||||
...(hasServerConfig ? serverConfig : {})
|
...(hasServerConfig ? serverConfig : {})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wallet?.available !== undefined && config.enabled !== undefined) {
|
|
||||||
// wallet must be available to be enabled
|
|
||||||
config.enabled &&= wallet.available
|
|
||||||
}
|
|
||||||
|
|
||||||
const saveConfig = useCallback(async (config) => {
|
const saveConfig = useCallback(async (config) => {
|
||||||
if (hasLocalConfig) setLocalConfig(config)
|
if (hasLocalConfig) setLocalConfig(config)
|
||||||
if (hasServerConfig) await setServerConfig(config)
|
if (hasServerConfig) await setServerConfig(config)
|
||||||
|
@ -265,13 +260,7 @@ export function getEnabledWallet (me) {
|
||||||
const priority = config?.priority
|
const priority = config?.priority
|
||||||
return { ...def, config, priority }
|
return { ...def, config, priority }
|
||||||
})
|
})
|
||||||
.filter(({ available, config }) => {
|
.filter(({ config }) => config?.enabled)
|
||||||
if (available !== undefined && config?.enabled !== undefined) {
|
|
||||||
// wallet must be available to be enabled
|
|
||||||
config.enabled &&= available
|
|
||||||
}
|
|
||||||
return config?.enabled
|
|
||||||
})
|
|
||||||
.sort(walletPrioritySort)[0]
|
.sort(walletPrioritySort)[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
import { SSR } from '@/lib/constants'
|
|
||||||
|
|
||||||
export const name = 'webln'
|
export const name = 'webln'
|
||||||
|
|
||||||
export const fields = []
|
export const fields = []
|
||||||
|
|
||||||
export const available = SSR ? false : typeof window.webln !== 'undefined'
|
export const fieldValidation = ({ enabled }) => {
|
||||||
|
if (typeof window.webln === 'undefined') {
|
||||||
|
// don't prevent disabling WebLN if no WebLN provider found
|
||||||
|
if (enabled) {
|
||||||
|
return {
|
||||||
|
enabled: 'no WebLN provider found'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
|
||||||
export const card = {
|
export const card = {
|
||||||
title: 'WebLN',
|
title: 'WebLN',
|
||||||
|
|
Loading…
Reference in New Issue