import { useQuery, useMutation } from '@apollo/react-hooks' import gql from 'graphql-tag' import * as R from 'ramda' import React, { useState } from 'react' import Modal from 'src/components/Modal' 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' const SAVE_CONFIG = gql` mutation Save($config: JSONObject, $accounts: JSONObject) { saveConfig(config: $config) saveAccounts(accounts: $accounts) } ` const SAVE_ACCOUNT = gql` mutation Save($accounts: JSONObject) { saveAccounts(accounts: $accounts) } ` const GET_INFO = gql` query getData { config accounts accountsConfig { code display class cryptos deprecated } cryptoCurrencies { code display } } ` 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, { onCompleted: () => setWizard(false), refetchQueries: () => ['getData'] }) const [saveAccount] = useMutation(SAVE_ACCOUNT, { onCompleted: () => setEditingSchema(null), 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 accountsConfig = data?.accountsConfig const cryptoCurrencies = data?.cryptoCurrencies ?? [] const accounts = data?.accounts ?? [] const onChange = (previous, current, setValue) => { if (!current) return setValue(current) if (!accounts[current] && schemas[current]) { setEditingSchema(schemas[current]) setOnChangeFunction(() => () => setValue(current)) return } setValue(current) } const shouldOverrideEdit = it => { const namespaced = fromNamespace(it)(config) return !WalletSchema.isValidSync(namespaced) } const wizardSave = it => saveAccount({ variables: { accounts: { [editingSchema.code]: it } } }).then(it => { onChangeFunction() setOnChangeFunction(null) return it }) return ( <> {!advancedSettings && ( <> !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 && } ) } export default Wallet