diff --git a/lib/new-config-manager.js b/lib/new-config-manager.js index 6f01b1ee..729542fc 100644 --- a/lib/new-config-manager.js +++ b/lib/new-config-manager.js @@ -113,6 +113,10 @@ const getCryptosFromWalletNamespace = config => { const getCashInSettings = config => fromNamespace(namespaces.CASH_IN)(config) +const getCryptoUnits = (crypto, config) => { + return getWalletSettings(crypto, config).cryptoUnits +} + module.exports = { getWalletSettings, getCashInSettings, @@ -129,5 +133,6 @@ module.exports = { getAllCryptoCurrencies, getTriggers, getCashOut, - getCryptosFromWalletNamespace + getCryptosFromWalletNamespace, + getCryptoUnits } diff --git a/lib/plugins.js b/lib/plugins.js index 985f7365..7cbaa6d0 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -205,6 +205,7 @@ function plugins (settings, deviceId) { const cashInCommission = new BN(commissions.cashIn) const cashOutCommission = _.isNumber(commissions.cashOut) ? new BN(commissions.cashOut) : null const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode) + const cryptoUnits = configManager.getCryptoUnits(cryptoCode, settings.config) return { cryptoCode, @@ -213,13 +214,13 @@ function plugins (settings, deviceId) { cashInFee, cashInCommission, cashOutCommission, - cryptoNetwork + cryptoNetwork, + cryptoUnits } } function pollQueries (serialNumber, deviceTime, deviceRec, machineVersion, machineModel) { const localeConfig = configManager.getLocale(deviceId, settings.config) - const fiatCode = localeConfig.fiatCurrency const cryptoCodes = localeConfig.cryptoCurrencies const timezone = localeConfig.timezone.split(':') diff --git a/migrations/1623975493095-add-crypto-units-to-config.js b/migrations/1623975493095-add-crypto-units-to-config.js new file mode 100644 index 00000000..5c398d36 --- /dev/null +++ b/migrations/1623975493095-add-crypto-units-to-config.js @@ -0,0 +1,22 @@ +const { saveConfig } = require('../lib/new-settings-loader') + +exports.up = function (next) { + const cryptoUnits = { + wallets_BTC_cryptoUnits: 'mUnits', + wallets_ETH_cryptoUnits: 'mUnits', + wallets_LTC_cryptoUnits: 'mUnits', + wallets_ZEC_cryptoUnits: 'mUnits', + wallets_BCH_cryptoUnits: 'mUnits' + } + + return saveConfig(cryptoUnits) + .then(() => next()) + .catch(err => { + console.log(err.message) + return next(err) + }) +} + +exports.down = function (next) { + next() +} diff --git a/new-lamassu-admin/src/pages/Wallet/AdvancedWallet.js b/new-lamassu-admin/src/pages/Wallet/AdvancedWallet.js new file mode 100644 index 00000000..993bcfc5 --- /dev/null +++ b/new-lamassu-admin/src/pages/Wallet/AdvancedWallet.js @@ -0,0 +1,61 @@ +import { useQuery, useMutation } from '@apollo/react-hooks' +import gql from 'graphql-tag' +import * as R from 'ramda' +import React from 'react' + +import { NamespacedTable as EditableTable } from 'src/components/editableTable' +import { fromNamespace, toNamespace, namespaces } from 'src/utils/config' + +import { AdvancedWalletSchema, getAdvancedWalletElements } from './helper' + +const SAVE_CONFIG = gql` + mutation Save($config: JSONObject, $accounts: JSONObject) { + saveConfig(config: $config) + saveAccounts(accounts: $accounts) + } +` +const GET_INFO = gql` + query getData { + config + accounts + cryptoCurrencies { + code + display + } + } +` + +const AdvancedWallet = () => { + const SCREEN_KEY = namespaces.WALLETS + const { data } = useQuery(GET_INFO) + + const [saveConfig, { error }] = useMutation(SAVE_CONFIG, { + refetchQueries: () => ['getData'] + }) + + const save = (rawConfig, accounts) => { + const config = toNamespace(SCREEN_KEY)(rawConfig) + return saveConfig({ variables: { config, accounts } }) + } + + const config = data?.config && fromNamespace(SCREEN_KEY)(data.config) + const cryptoCurrencies = data?.cryptoCurrencies ?? [] + + return ( + <> + + + ) +} + +export default AdvancedWallet diff --git a/new-lamassu-admin/src/pages/Wallet/Wallet.js b/new-lamassu-admin/src/pages/Wallet/Wallet.js index 1844dd07..f9a3514f 100644 --- a/new-lamassu-admin/src/pages/Wallet/Wallet.js +++ b/new-lamassu-admin/src/pages/Wallet/Wallet.js @@ -8,8 +8,11 @@ import { NamespacedTable as EditableTable } from 'src/components/editableTable' import TitleSection from 'src/components/layout/TitleSection' import FormRenderer from 'src/pages/Services/FormRenderer' import schemas from 'src/pages/Services/schemas' +import { ReactComponent as ReverseSettingsIcon } from 'src/styling/icons/circle buttons/settings/white.svg' +import { ReactComponent as SettingsIcon } from 'src/styling/icons/circle buttons/settings/zodiac.svg' import { fromNamespace, toNamespace } from 'src/utils/config' +import AdvancedWallet from './AdvancedWallet' import Wizard from './Wizard' import { WalletSchema, getElements } from './helper' @@ -48,6 +51,7 @@ const Wallet = ({ name: SCREEN_KEY }) => { const [editingSchema, setEditingSchema] = useState(null) const [onChangeFunction, setOnChangeFunction] = useState(null) const [wizard, setWizard] = useState(false) + const [advancedSettings, setAdvancedSettings] = useState(false) const { data } = useQuery(GET_INFO) const [saveConfig, { error }] = useMutation(SAVE_CONFIG, { @@ -99,47 +103,60 @@ const Wallet = ({ name: SCREEN_KEY }) => { return ( <> - - !WalletSchema.isValidSync(it)} - enableEdit - shouldOverrideEdit={shouldOverrideEdit} - editOverride={setWizard} - editWidth={174} - save={save} - validationSchema={WalletSchema} - elements={getElements(cryptoCurrencies, accountsConfig, onChange)} + - {wizard && ( - setWizard(false)} - save={save} - error={error?.message} - cryptoCurrencies={cryptoCurrencies} - userAccounts={data?.config?.accounts} - accounts={accounts} - accountsConfig={accountsConfig} - /> - )} - {editingSchema && ( - setEditingSchema(null)} - open={true}> - + !WalletSchema.isValidSync(it)} + enableEdit + shouldOverrideEdit={shouldOverrideEdit} + editOverride={setWizard} + editWidth={174} + save={save} + validationSchema={WalletSchema} + elements={getElements(cryptoCurrencies, accountsConfig, onChange)} /> - + {wizard && ( + setWizard(false)} + save={save} + error={error?.message} + cryptoCurrencies={cryptoCurrencies} + userAccounts={data?.config?.accounts} + accounts={accounts} + accountsConfig={accountsConfig} + /> + )} + {editingSchema && ( + setEditingSchema(null)} + open={true}> + + + )} + )} + {advancedSettings && } ) } diff --git a/new-lamassu-admin/src/pages/Wallet/helper.js b/new-lamassu-admin/src/pages/Wallet/helper.js index 47da3841..8f8521cb 100644 --- a/new-lamassu-admin/src/pages/Wallet/helper.js +++ b/new-lamassu-admin/src/pages/Wallet/helper.js @@ -28,6 +28,45 @@ const WalletSchema = Yup.object().shape({ .transform(transformNumber) }) +const AdvancedWalletSchema = Yup.object().shape({ + cryptoUnits: Yup.string().required() +}) + +const getAdvancedWalletElements = (cryptoCurrencies, config) => { + const viewCryptoCurrency = it => + R.compose( + R.prop(['display']), + R.find(R.propEq('code', it)) + )(cryptoCurrencies) + + return [ + { + name: 'id', + header: 'Cryptocurrency', + width: 180, + view: viewCryptoCurrency, + size: 'sm', + editable: false + }, + { + name: 'cryptoUnits', + size: 'sm', + stripe: true, + view: it => it, + width: 190, + input: Autocomplete, + inputProps: { + options: [ + { code: 'mUnits', display: 'mUnits' }, + { code: 'fUnits', display: 'fUnits' } + ], + valueProp: 'code', + labelProp: 'display' + } + } + ] +} + const getElements = (cryptoCurrencies, accounts, onChange, wizard = false) => { const widthAdjust = wizard ? 11 : 0 const viewCryptoCurrency = it => { @@ -133,4 +172,10 @@ const getElements = (cryptoCurrencies, accounts, onChange, wizard = false) => { ] } -export { WalletSchema, getElements, filterClass } +export { + WalletSchema, + AdvancedWalletSchema, + getElements, + filterClass, + getAdvancedWalletElements +}