fix: No reason for 'Enable' switch on 'Wallet Settings' panel (#439)
* fix: remove the "enable" toggle fix: make edit available at all times and make it toggle the wizard if the coin config is empty fix: disable focus on the first edit feat: open the coin config wizard when adding a not configured coin on locales * fix: set default value for focusOnEditWhen to avoid breaking tables first field focus refactor: replaced relative path imports from outside the module with full paths fix: removed console.log * fix: changed the edit override logic to a cleaner one * fix: trigger the wizard only when the coin isn't configured
This commit is contained in:
parent
363e69402d
commit
92eebd630e
5 changed files with 67 additions and 26 deletions
|
|
@ -46,6 +46,8 @@ const ETable = ({
|
||||||
disableAdd,
|
disableAdd,
|
||||||
initialValues,
|
initialValues,
|
||||||
setEditing,
|
setEditing,
|
||||||
|
shouldOverrideEdit,
|
||||||
|
editOverride,
|
||||||
stripeWhen,
|
stripeWhen,
|
||||||
disableRowEdit,
|
disableRowEdit,
|
||||||
groupBy,
|
groupBy,
|
||||||
|
|
@ -93,6 +95,7 @@ const ETable = ({
|
||||||
}
|
}
|
||||||
|
|
||||||
const onEdit = it => {
|
const onEdit = it => {
|
||||||
|
if (shouldOverrideEdit && shouldOverrideEdit(it)) return editOverride(it)
|
||||||
setEditingId(it)
|
setEditingId(it)
|
||||||
setEditing && setEditing(it, true)
|
setEditing && setEditing(it, true)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import React, { useState } from 'react'
|
||||||
|
|
||||||
import { Autocomplete } from '../base'
|
import { Autocomplete } from '../base'
|
||||||
|
|
||||||
const AutocompleteFormik = ({ options, ...props }) => {
|
const AutocompleteFormik = ({ options, onChange, ...props }) => {
|
||||||
const [open, setOpen] = useState(false)
|
const [open, setOpen] = useState(false)
|
||||||
|
|
||||||
const { name, onBlur, value } = props.field
|
const { name, onBlur, value } = props.field
|
||||||
|
|
@ -23,7 +23,10 @@ const AutocompleteFormik = ({ options, ...props }) => {
|
||||||
return (
|
return (
|
||||||
<Autocomplete
|
<Autocomplete
|
||||||
name={name}
|
name={name}
|
||||||
onChange={(event, item) => setFieldValue(name, item)}
|
onChange={(event, item) => {
|
||||||
|
onChange && onChange(value, item)
|
||||||
|
setFieldValue(name, item)
|
||||||
|
}}
|
||||||
onBlur={innerOnBlur}
|
onBlur={innerOnBlur}
|
||||||
value={value}
|
value={value}
|
||||||
error={error}
|
error={error}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,9 @@ import { Table as EditableTable } from 'src/components/editableTable'
|
||||||
import Section from 'src/components/layout/Section'
|
import Section from 'src/components/layout/Section'
|
||||||
import TitleSection from 'src/components/layout/TitleSection'
|
import TitleSection from 'src/components/layout/TitleSection'
|
||||||
import { P } from 'src/components/typography'
|
import { P } from 'src/components/typography'
|
||||||
import { fromNamespace, toNamespace } from 'src/utils/config'
|
import Wizard from 'src/pages/Wallet/Wizard'
|
||||||
|
import { WalletSchema } from 'src/pages/Wallet/helper'
|
||||||
|
import { fromNamespace, toNamespace, namespaces } from 'src/utils/config'
|
||||||
|
|
||||||
import { styles } from './Locales.styles'
|
import { styles } from './Locales.styles'
|
||||||
import {
|
import {
|
||||||
|
|
@ -27,6 +29,13 @@ const useStyles = makeStyles(styles)
|
||||||
const GET_DATA = gql`
|
const GET_DATA = gql`
|
||||||
query getData {
|
query getData {
|
||||||
config
|
config
|
||||||
|
accounts
|
||||||
|
accountsConfig {
|
||||||
|
code
|
||||||
|
display
|
||||||
|
class
|
||||||
|
cryptos
|
||||||
|
}
|
||||||
currencies {
|
currencies {
|
||||||
code
|
code
|
||||||
display
|
display
|
||||||
|
|
@ -89,17 +98,25 @@ const FiatCurrencyChangeAlert = ({ open, close, save }) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const Locales = ({ name: SCREEN_KEY }) => {
|
const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
|
const [wizard, setWizard] = useState(false)
|
||||||
|
const [error, setError] = useState(false)
|
||||||
const [isEditingDefault, setEditingDefault] = useState(false)
|
const [isEditingDefault, setEditingDefault] = useState(false)
|
||||||
const [isEditingOverrides, setEditingOverrides] = useState(false)
|
const [isEditingOverrides, setEditingOverrides] = useState(false)
|
||||||
const { data } = useQuery(GET_DATA)
|
const { data } = useQuery(GET_DATA)
|
||||||
const [saveConfig] = useMutation(SAVE_CONFIG, {
|
const [saveConfig] = useMutation(SAVE_CONFIG, {
|
||||||
|
onCompleted: () => setWizard(false),
|
||||||
|
onError: () => setError(true),
|
||||||
refetchQueries: () => ['getData']
|
refetchQueries: () => ['getData']
|
||||||
})
|
})
|
||||||
|
|
||||||
const [dataToSave, setDataToSave] = useState(null)
|
const [dataToSave, setDataToSave] = useState(null)
|
||||||
|
|
||||||
const config = data?.config && fromNamespace(SCREEN_KEY)(data.config)
|
const config = data?.config && fromNamespace(SCREEN_KEY)(data.config)
|
||||||
|
const wallets = data?.config && fromNamespace(namespaces.WALLETS)(data.config)
|
||||||
|
|
||||||
|
const accountsConfig = data?.accountsConfig
|
||||||
|
const accounts = data?.accounts ?? []
|
||||||
|
const cryptoCurrencies = data?.cryptoCurrencies ?? []
|
||||||
const locale = config && !R.isEmpty(config) ? config : localeDefaults
|
const locale = config && !R.isEmpty(config) ? config : localeDefaults
|
||||||
const localeOverrides = locale.overrides ?? []
|
const localeOverrides = locale.overrides ?? []
|
||||||
|
|
||||||
|
|
@ -116,6 +133,7 @@ const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
|
|
||||||
const save = config => {
|
const save = config => {
|
||||||
setDataToSave(null)
|
setDataToSave(null)
|
||||||
|
setError(false)
|
||||||
saveConfig({ variables: { config } })
|
saveConfig({ variables: { config } })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,6 +142,13 @@ const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
return saveConfig({ variables: { config } })
|
return saveConfig({ variables: { config } })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const enableCoin = it => {
|
||||||
|
if (!it) return
|
||||||
|
|
||||||
|
const namespaced = fromNamespace(it)(wallets)
|
||||||
|
if (!WalletSchema.isValidSync(namespaced)) return setWizard(it)
|
||||||
|
}
|
||||||
|
|
||||||
const onEditingDefault = (it, editing) => setEditingDefault(editing)
|
const onEditingDefault = (it, editing) => setEditingDefault(editing)
|
||||||
const onEditingOverrides = (it, editing) => setEditingOverrides(editing)
|
const onEditingOverrides = (it, editing) => setEditingOverrides(editing)
|
||||||
|
|
||||||
|
|
@ -145,7 +170,7 @@ const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
save={handleSave}
|
save={handleSave}
|
||||||
validationSchema={LocaleSchema}
|
validationSchema={LocaleSchema}
|
||||||
data={R.of(locale)}
|
data={R.of(locale)}
|
||||||
elements={mainFields(data)}
|
elements={mainFields(data, enableCoin)}
|
||||||
setEditing={onEditingDefault}
|
setEditing={onEditingDefault}
|
||||||
forceDisable={isEditingOverrides}
|
forceDisable={isEditingOverrides}
|
||||||
/>
|
/>
|
||||||
|
|
@ -162,7 +187,7 @@ const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
save={saveOverrides}
|
save={saveOverrides}
|
||||||
validationSchema={OverridesSchema}
|
validationSchema={OverridesSchema}
|
||||||
data={localeOverrides ?? []}
|
data={localeOverrides ?? []}
|
||||||
elements={overrides(data, localeOverrides)}
|
elements={overrides(data, localeOverrides, enableCoin)}
|
||||||
disableAdd={R.compose(R.isEmpty, R.difference)(
|
disableAdd={R.compose(R.isEmpty, R.difference)(
|
||||||
data?.machines.map(m => m.deviceId) ?? [],
|
data?.machines.map(m => m.deviceId) ?? [],
|
||||||
localeOverrides?.map(o => o.machine) ?? []
|
localeOverrides?.map(o => o.machine) ?? []
|
||||||
|
|
@ -171,6 +196,18 @@ const Locales = ({ name: SCREEN_KEY }) => {
|
||||||
forceDisable={isEditingDefault}
|
forceDisable={isEditingDefault}
|
||||||
/>
|
/>
|
||||||
</Section>
|
</Section>
|
||||||
|
{wizard && (
|
||||||
|
<Wizard
|
||||||
|
coin={R.find(R.propEq('code', wizard))(cryptoCurrencies)}
|
||||||
|
onClose={() => setWizard(false)}
|
||||||
|
save={rawConfig => save(toNamespace(namespaces.WALLETS)(rawConfig))}
|
||||||
|
error={error}
|
||||||
|
cryptoCurrencies={cryptoCurrencies}
|
||||||
|
userAccounts={data?.config?.accounts}
|
||||||
|
accounts={accounts}
|
||||||
|
accountsConfig={accountsConfig}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,14 +5,14 @@ import Autocomplete from 'src/components/inputs/formik/Autocomplete.js'
|
||||||
|
|
||||||
const LANGUAGE_SELECTION_LIMIT = 4
|
const LANGUAGE_SELECTION_LIMIT = 4
|
||||||
|
|
||||||
const getFields = (getData, names, auxElements = []) => {
|
const getFields = (getData, names, enableCoin, auxElements = []) => {
|
||||||
return R.filter(
|
return R.filter(
|
||||||
it => R.includes(it.name, names),
|
it => R.includes(it.name, names),
|
||||||
allFields(getData, auxElements)
|
allFields(getData, enableCoin, auxElements)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const allFields = (getData, auxElements = []) => {
|
const allFields = (getData, enableCoin, auxElements = []) => {
|
||||||
const getView = (data, code, compare) => it => {
|
const getView = (data, code, compare) => it => {
|
||||||
if (!data) return ''
|
if (!data) return ''
|
||||||
|
|
||||||
|
|
@ -103,29 +103,30 @@ const allFields = (getData, auxElements = []) => {
|
||||||
valueProp: 'code',
|
valueProp: 'code',
|
||||||
getLabel: R.path(['code']),
|
getLabel: R.path(['code']),
|
||||||
multiple: true,
|
multiple: true,
|
||||||
optionsLimit: null
|
optionsLimit: null,
|
||||||
|
onChange: (prev, curr) => enableCoin(R.difference(curr, prev)[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
const mainFields = auxData => {
|
const mainFields = (auxData, enableCoin) => {
|
||||||
const getData = R.path(R.__, auxData)
|
const getData = R.path(R.__, auxData)
|
||||||
|
|
||||||
return getFields(getData, [
|
return getFields(
|
||||||
'country',
|
getData,
|
||||||
'fiatCurrency',
|
['country', 'fiatCurrency', 'languages', 'cryptoCurrencies'],
|
||||||
'languages',
|
enableCoin
|
||||||
'cryptoCurrencies'
|
)
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const overrides = (auxData, auxElements) => {
|
const overrides = (auxData, auxElements, enableCoin) => {
|
||||||
const getData = R.path(R.__, auxData)
|
const getData = R.path(R.__, auxData)
|
||||||
|
|
||||||
return getFields(
|
return getFields(
|
||||||
getData,
|
getData,
|
||||||
['machine', 'country', 'languages', 'cryptoCurrencies'],
|
['machine', 'country', 'languages', 'cryptoCurrencies'],
|
||||||
|
enableCoin,
|
||||||
auxElements
|
auxElements
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,9 @@ const Wallet = ({ name: SCREEN_KEY }) => {
|
||||||
const cryptoCurrencies = data?.cryptoCurrencies ?? []
|
const cryptoCurrencies = data?.cryptoCurrencies ?? []
|
||||||
const accounts = data?.accounts ?? []
|
const accounts = data?.accounts ?? []
|
||||||
|
|
||||||
const onToggle = id => {
|
const shouldOverrideEdit = it => {
|
||||||
const namespaced = fromNamespace(id)(config)
|
const namespaced = fromNamespace(it)(config)
|
||||||
if (!WalletSchema.isValidSync(namespaced)) return setWizard(id)
|
return !WalletSchema.isValidSync(namespaced)
|
||||||
save(toNamespace(id, { active: !namespaced?.active }))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
@ -71,13 +70,11 @@ const Wallet = ({ name: SCREEN_KEY }) => {
|
||||||
data={config}
|
data={config}
|
||||||
stripeWhen={it => !WalletSchema.isValidSync(it)}
|
stripeWhen={it => !WalletSchema.isValidSync(it)}
|
||||||
enableEdit
|
enableEdit
|
||||||
editWidth={134}
|
shouldOverrideEdit={shouldOverrideEdit}
|
||||||
enableToggle
|
editOverride={setWizard}
|
||||||
toggleWidth={109}
|
editWidth={174}
|
||||||
onToggle={onToggle}
|
|
||||||
save={save}
|
save={save}
|
||||||
validationSchema={WalletSchema}
|
validationSchema={WalletSchema}
|
||||||
disableRowEdit={R.compose(R.not, R.path(['active']))}
|
|
||||||
elements={getElements(cryptoCurrencies, accountsConfig)}
|
elements={getElements(cryptoCurrencies, accountsConfig)}
|
||||||
/>
|
/>
|
||||||
{wizard && (
|
{wizard && (
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue