feat: advanced wallet settings up to spec

This commit is contained in:
José Oliveira 2022-02-17 01:40:02 +00:00
parent 45173e7c0e
commit 4120d58a1b
6 changed files with 246 additions and 123 deletions

View file

@ -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>
</>
)
}