feat: advanced wallet settings up to spec
This commit is contained in:
parent
45173e7c0e
commit
4120d58a1b
6 changed files with 246 additions and 123 deletions
|
|
@ -2,27 +2,28 @@ import { useQuery, useMutation } from '@apollo/react-hooks'
|
|||
import gql from 'graphql-tag'
|
||||
import { utils as coinUtils } from 'lamassu-coins'
|
||||
import * as R from 'ramda'
|
||||
import React from 'react'
|
||||
import React, { useState } from 'react'
|
||||
|
||||
import { NamespacedTable as EditableTable } from 'src/components/editableTable'
|
||||
import { Table as EditableTable } from 'src/components/editableTable'
|
||||
import Section from 'src/components/layout/Section'
|
||||
import { fromNamespace, toNamespace, namespaces } from 'src/utils/config'
|
||||
|
||||
import {
|
||||
WalletSchema,
|
||||
AdvancedWalletSchema,
|
||||
getAdvancedWalletElements
|
||||
getAdvancedWalletElements,
|
||||
getAdvancedWalletElementsOverrides,
|
||||
OverridesDefaults,
|
||||
OverridesSchema
|
||||
} from './helper'
|
||||
|
||||
const SAVE_CONFIG = gql`
|
||||
mutation Save($config: JSONObject, $accounts: JSONObject) {
|
||||
mutation Save($config: JSONObject) {
|
||||
saveConfig(config: $config)
|
||||
saveAccounts(accounts: $accounts)
|
||||
}
|
||||
`
|
||||
const GET_INFO = gql`
|
||||
query getData {
|
||||
config
|
||||
accounts
|
||||
cryptoCurrencies {
|
||||
code
|
||||
display
|
||||
|
|
@ -31,34 +32,112 @@ const GET_INFO = gql`
|
|||
`
|
||||
|
||||
const AdvancedWallet = () => {
|
||||
const ADVANCED = 'advanced'
|
||||
const CRYPTOCURRENCY_KEY = 'cryptoCurrency'
|
||||
const SCREEN_KEY = namespaces.WALLETS
|
||||
const { data } = useQuery(GET_INFO)
|
||||
|
||||
const [isEditingDefault, setEditingDefault] = useState(false)
|
||||
const [isEditingOverrides, setEditingOverrides] = useState(false)
|
||||
|
||||
const [saveConfig, { error }] = useMutation(SAVE_CONFIG, {
|
||||
refetchQueries: () => ['getData']
|
||||
})
|
||||
|
||||
const save = (rawConfig, accounts) => {
|
||||
const config = toNamespace(SCREEN_KEY)(rawConfig)
|
||||
return saveConfig({ variables: { config, accounts } })
|
||||
const mapConfigKeys = R.curry((fn, obj) =>
|
||||
R.zipObj(R.map(fn, R.keys(obj)), R.values(obj))
|
||||
)
|
||||
|
||||
const save = rawConfig => {
|
||||
const config = toNamespace(SCREEN_KEY)(
|
||||
mapConfigKeys(it => `${ADVANCED}_` + it, rawConfig.wallets[0])
|
||||
)
|
||||
|
||||
return saveConfig({ variables: { config } })
|
||||
}
|
||||
|
||||
const config = data?.config && fromNamespace(SCREEN_KEY)(data.config)
|
||||
const saveOverrides = rawConfig => {
|
||||
const config = toNamespace(SCREEN_KEY)(
|
||||
mapConfigKeys(it => `${ADVANCED}_` + it, rawConfig)
|
||||
)
|
||||
return saveConfig({ variables: { config } })
|
||||
}
|
||||
|
||||
const onEditingDefault = (it, editing) => setEditingDefault(editing)
|
||||
const onEditingOverrides = (it, editing) => setEditingOverrides(editing)
|
||||
|
||||
const cryptoCurrencies = data?.cryptoCurrencies ?? []
|
||||
|
||||
const AdvancedWalletSettings = mapConfigKeys(
|
||||
it => R.tail(R.split('_', it)),
|
||||
R.pickBy(
|
||||
(val, key) => R.head(R.split('_', key)) === ADVANCED,
|
||||
data?.config && fromNamespace(SCREEN_KEY)(data.config)
|
||||
)
|
||||
)
|
||||
|
||||
const AdvancedWalletSettingsOverrides = AdvancedWalletSettings.overrides ?? []
|
||||
|
||||
const overridenCryptos = R.map(R.prop(CRYPTOCURRENCY_KEY))(
|
||||
AdvancedWalletSettingsOverrides
|
||||
)
|
||||
const suggestionFilter = R.filter(
|
||||
it => !R.contains(it.code, overridenCryptos)
|
||||
)
|
||||
const coinSuggestions = suggestionFilter(cryptoCurrencies)
|
||||
|
||||
const findSuggestion = it => {
|
||||
const coin = R.compose(R.find(R.propEq('code', it?.cryptoCurrency)))(
|
||||
cryptoCurrencies
|
||||
)
|
||||
return coin ? [coin] : []
|
||||
}
|
||||
|
||||
return (
|
||||
<EditableTable
|
||||
name="advancedWallet"
|
||||
namespaces={R.map(R.path(['code']))(cryptoCurrencies)}
|
||||
data={config}
|
||||
error={error?.message}
|
||||
enableEdit
|
||||
editWidth={174}
|
||||
save={save}
|
||||
stripeWhen={it => !WalletSchema.isValidSync(it)}
|
||||
validationSchema={AdvancedWalletSchema}
|
||||
elements={getAdvancedWalletElements(cryptoCurrencies, coinUtils, config)}
|
||||
/>
|
||||
<>
|
||||
<Section>
|
||||
<EditableTable
|
||||
name="wallets"
|
||||
data={R.of(AdvancedWalletSettings)}
|
||||
error={error?.message}
|
||||
enableEdit
|
||||
editWidth={174}
|
||||
save={save}
|
||||
stripeWhen={it => !AdvancedWalletSchema.isValidSync(it)}
|
||||
inialValues={R.of(AdvancedWalletSettings)}
|
||||
validationSchema={AdvancedWalletSchema}
|
||||
elements={getAdvancedWalletElements(
|
||||
coinUtils,
|
||||
AdvancedWalletSettings
|
||||
)}
|
||||
setEditing={onEditingDefault}
|
||||
forceDisable={isEditingOverrides}
|
||||
/>
|
||||
</Section>
|
||||
<Section>
|
||||
<EditableTable
|
||||
error={error?.message}
|
||||
title="Overrides"
|
||||
titleLg
|
||||
name="overrides"
|
||||
enableDelete
|
||||
enableEdit
|
||||
enableCreate
|
||||
inialValues={OverridesDefaults}
|
||||
save={saveOverrides}
|
||||
validationSchema={OverridesSchema}
|
||||
data={AdvancedWalletSettingsOverrides ?? []}
|
||||
elements={getAdvancedWalletElementsOverrides(
|
||||
coinSuggestions,
|
||||
findSuggestion,
|
||||
coinUtils
|
||||
)}
|
||||
disableAdd={!coinSuggestions?.length}
|
||||
setEditing={onEditingOverrides}
|
||||
forceDisable={isEditingDefault}
|
||||
/>
|
||||
</Section>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue