From 8d58abc29f0005b387a3ae7410b7983f73fa849d Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 8 Nov 2019 14:06:09 +0800 Subject: [PATCH 01/15] feat(neuron-ui): adjust the layout of receive view to vertical aglinment. --- .../src/components/Receive/index.tsx | 60 +++++++++++-------- packages/neuron-ui/src/locales/en.json | 3 +- packages/neuron-ui/src/locales/zh.json | 3 +- .../neuron-ui/src/widgets/QRCode/index.tsx | 5 +- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/neuron-ui/src/components/Receive/index.tsx b/packages/neuron-ui/src/components/Receive/index.tsx index 9c99c7cd8b..4ff1032878 100644 --- a/packages/neuron-ui/src/components/Receive/index.tsx +++ b/packages/neuron-ui/src/components/Receive/index.tsx @@ -1,7 +1,7 @@ import React, { useState, useCallback, useMemo } from 'react' import { RouteComponentProps } from 'react-router-dom' import { useTranslation } from 'react-i18next' -import { Stack, Text, TextField, TooltipHost, Modal, FontSizes, IconButton } from 'office-ui-fabric-react' +import { Stack, Text, TextField, TooltipHost, Modal, IconButton } from 'office-ui-fabric-react' import { StateWithDispatch } from 'states/stateProvider/reducer' import QRCode from 'widgets/QRCode' @@ -28,35 +28,43 @@ const Receive = ({ addPopup('addr-copied')(dispatch) }, [accountAddress, dispatch]) + const Address = useMemo( + () => ( + + + + + + + + + ), + [copyAddress, accountAddress, t] + ) + if (!accountAddress) { return
{t('receive.address-not-found')}
} return ( <> - - - - - - - - - - + + + {`${t('receive.address', { network: accountAddress.startsWith('ckb') ? 'CKB Mainnet' : 'CKB Testnet' })}`} + + + {t('receive.prompt')} + setShowLargeQRCode(false)}> diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index 4dbcb0152f..679aaad4de 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -106,7 +106,8 @@ "click-to-copy": "Click to copy the address", "address-not-found": "Address not found", "prompt": "Neuron picks a new receiving address for better privacy. Please go to the Address Book if you want to use a previously used receiving address.", - "address-qrcode": "Address QR Code" + "address-qrcode": "Address QR Code", + "address": "{{network}} Address" }, "history": { "meta": "Meta", diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index c8dd4d46f7..05e9e488b4 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -106,7 +106,8 @@ "click-to-copy": "点击复制地址", "address-not-found": "未找到地址", "prompt": "为了保护隐私,Neuron 会自动选择一个新收款地址。如果您想使用旧的收款地址,请访问地址管理页面。", - "address-qrcode": "地址二维码" + "address-qrcode": "地址二维码", + "address": "{{network}} 地址" }, "history": { "meta": "元信息", diff --git a/packages/neuron-ui/src/widgets/QRCode/index.tsx b/packages/neuron-ui/src/widgets/QRCode/index.tsx index af5ce69a19..7ef814096d 100644 --- a/packages/neuron-ui/src/widgets/QRCode/index.tsx +++ b/packages/neuron-ui/src/widgets/QRCode/index.tsx @@ -82,6 +82,7 @@ const QRCode = ({ includeMargin = false, exportable = false, dispatch, + remark, }: { value: string size: number @@ -93,6 +94,7 @@ const QRCode = ({ includeMargin?: boolean exportable?: boolean dispatch: StateDispatch + remark?: JSX.Element }) => { const [t] = useTranslation() const qrcode = new QRCodeImpl(-1, level) @@ -156,8 +158,9 @@ const QRCode = ({ + {remark || null} {exportable ? ( - + {t('qrcode.copy')} {t('qrcode.save')} From 2990891a1c3419f35f53cbdab19adb5911514267 Mon Sep 17 00:00:00 2001 From: James Chen Date: Fri, 8 Nov 2019 15:46:46 +0900 Subject: [PATCH 02/15] fix: I18n for pending confirmations count --- packages/neuron-ui/src/locales/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index 05e9e488b4..2046f8c097 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -27,7 +27,7 @@ "difficulty": "难度", "address": "地址", "confirmation": "{{confirmationCount}}/{{threshold}} 个确认", - "confirmations": "{{confirmationCount}}{{threshold}} 个确认", + "confirmations": "{{confirmationCount}}/{{threshold}} 个确认", "sent": "已发送", "sending": "正在发送", "received": "已收款", From 67be6889d1d62cbc3115fece6f25f0351f41b790 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 8 Nov 2019 17:41:43 +0800 Subject: [PATCH 03/15] feat(neuron-ui): only addresses start with 0x0100 are valid --- packages/neuron-ui/src/utils/validators.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/neuron-ui/src/utils/validators.ts b/packages/neuron-ui/src/utils/validators.ts index bf1c0a26ad..76fe96afe6 100644 --- a/packages/neuron-ui/src/utils/validators.ts +++ b/packages/neuron-ui/src/utils/validators.ts @@ -4,8 +4,7 @@ import { MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH, MIN_AMOUNT, MAX_DECIMAL_DIGIT export const verifyAddress = (address: string): boolean => { try { - ckbCore.utils.parseAddress(address) - return true + return ckbCore.utils.parseAddress(address, 'hex').startsWith('0x0100') } catch (err) { return false } From 2d80fa8dee9b84d13f5b13d09403e357b9134e51 Mon Sep 17 00:00:00 2001 From: classicalliu Date: Fri, 8 Nov 2019 18:04:17 +0800 Subject: [PATCH 04/15] fix: input capacity can be null --- packages/neuron-wallet/src/services/tx/transaction-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/neuron-wallet/src/services/tx/transaction-service.ts b/packages/neuron-wallet/src/services/tx/transaction-service.ts index c16d79de40..7553d40c87 100644 --- a/packages/neuron-wallet/src/services/tx/transaction-service.ts +++ b/packages/neuron-wallet/src/services/tx/transaction-service.ts @@ -184,7 +184,7 @@ export class TransactionsService { } return false }) - .map(i => BigInt(i.capacity)) + .map(i => BigInt(i.capacity || 0)) .reduce((result, c) => result + c, BigInt(0)) const value: bigint = outputCapacities - inputCapacities return { From b0e38556d9614a84c33d479a6b85a7180158c5f4 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 8 Nov 2019 23:15:48 +0800 Subject: [PATCH 05/15] fix(neuron-wallet): order inputs in a tx --- .../neuron-wallet/src/services/tx/transaction-service.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/neuron-wallet/src/services/tx/transaction-service.ts b/packages/neuron-wallet/src/services/tx/transaction-service.ts index 7553d40c87..aa87d06398 100644 --- a/packages/neuron-wallet/src/services/tx/transaction-service.ts +++ b/packages/neuron-wallet/src/services/tx/transaction-service.ts @@ -259,7 +259,14 @@ export class TransactionsService { const tx = await getConnection() .getRepository(TransactionEntity) - .findOne(hash, { relations: ['inputs', 'outputs'] }) + .createQueryBuilder('transaction') + .where('transaction.hash is :hash', {hash}) + .leftJoinAndSelect('transaction.inputs', 'input') + .leftJoinAndSelect('transaction.outputs', 'output') + .orderBy({ + 'input.id': "ASC" + }) + .getOne() if (!tx) { return undefined From 848fe7b7600250eb3196c67d36d19e98c6f042a1 Mon Sep 17 00:00:00 2001 From: James Chen Date: Sat, 9 Nov 2019 20:23:38 +0900 Subject: [PATCH 06/15] feat: Finalize testnet explorer URL --- packages/neuron-ui/src/components/Transaction/index.tsx | 5 +++-- packages/neuron-wallet/src/models/chain-info.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/neuron-ui/src/components/Transaction/index.tsx b/packages/neuron-ui/src/components/Transaction/index.tsx index 54b83c0b54..b14dae6c1b 100644 --- a/packages/neuron-ui/src/components/Transaction/index.tsx +++ b/packages/neuron-ui/src/components/Transaction/index.tsx @@ -246,9 +246,10 @@ const Transaction = () => { }) }, []) - // TODO: add conditional branch on mainnet and testnet const onExplorerBtnClick = useCallback(() => { - openExternal(`https://explorer.nervos.org/transaction/${transaction.hash}`) + const isMainnet = false // TODO: add conditional branch on mainnet and testnet + const explorerUrl = isMainnet ? 'https://explorer.nervos.org' : 'https://explorer.nervos.org/testnet' + openExternal(`${explorerUrl}/transaction/${transaction.hash}`) }, [transaction.hash]) const basicInfoItems = useMemo( diff --git a/packages/neuron-wallet/src/models/chain-info.ts b/packages/neuron-wallet/src/models/chain-info.ts index d5fbf6394b..630fc3ac22 100644 --- a/packages/neuron-wallet/src/models/chain-info.ts +++ b/packages/neuron-wallet/src/models/chain-info.ts @@ -27,6 +27,6 @@ export default class ChainInfo { if (this.isMainnet()) { return "https://explorer.nervos.org" } - return "https://explorer.nervos.org" // TODO: change this to proper testnet explorer URL + return "https://explorer.nervos.org/testnet" } } From ffedca73da62d6640111ba412c74bcf988c581ad Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 Nov 2019 13:35:51 +0800 Subject: [PATCH 07/15] fix(neuron-ui): fix the address prefix on tx view according to the chain type. --- packages/neuron-ui/src/components/Addresses/index.tsx | 4 ++-- packages/neuron-ui/src/components/Transaction/index.tsx | 6 ++---- packages/neuron-ui/src/utils/const.ts | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/neuron-ui/src/components/Addresses/index.tsx b/packages/neuron-ui/src/components/Addresses/index.tsx index 2ef12764cb..0afdffb770 100644 --- a/packages/neuron-ui/src/components/Addresses/index.tsx +++ b/packages/neuron-ui/src/components/Addresses/index.tsx @@ -20,6 +20,7 @@ import { StateWithDispatch } from 'states/stateProvider/reducer' import { useLocalDescription } from 'utils/hooks' import { localNumberFormatter, shannonToCKBFormatter } from 'utils/formatters' import { onRenderRow } from 'utils/fabricUIRender' +import { MAINNET_TAG } from 'utils/const' const Addresses = ({ app: { @@ -30,8 +31,7 @@ const Addresses = ({ settings: { networks = [] }, dispatch, }: React.PropsWithoutRef) => { - const isMainnet = - (networks.find(n => n.id === networkID) || {}).chain === (process.env.REACT_APP_MAINNET_TAG || 'ckb') + const isMainnet = (networks.find(n => n.id === networkID) || {}).chain === MAINNET_TAG const [showMainnetAddress, setShowMainnetAddress] = useState(false) const [t] = useTranslation() diff --git a/packages/neuron-ui/src/components/Transaction/index.tsx b/packages/neuron-ui/src/components/Transaction/index.tsx index 54b83c0b54..7e8287d8a0 100644 --- a/packages/neuron-ui/src/components/Transaction/index.tsx +++ b/packages/neuron-ui/src/components/Transaction/index.tsx @@ -8,7 +8,7 @@ import { ckbCore } from 'services/chain' import { transactionState } from 'states/initStates/chain' import { localNumberFormatter, uniformTimeFormatter, shannonToCKBFormatter } from 'utils/formatters' -import { ErrorCode } from 'utils/const' +import { ErrorCode, MAINNET_TAG } from 'utils/const' import { explorerNavButton } from './style.module.scss' const MIN_CELL_WIDTH = 70 @@ -199,9 +199,7 @@ const Transaction = () => { } setAddressPrefix( - network.chain === process.env.REACT_APP_MAINNET_TAG - ? ckbCore.utils.AddressPrefix.Mainnet - : ckbCore.utils.AddressPrefix.Testnet + network.chain === MAINNET_TAG ? ckbCore.utils.AddressPrefix.Mainnet : ckbCore.utils.AddressPrefix.Testnet ) } }) diff --git a/packages/neuron-ui/src/utils/const.ts b/packages/neuron-ui/src/utils/const.ts index 135ae4ab4f..f6d812a7d7 100644 --- a/packages/neuron-ui/src/utils/const.ts +++ b/packages/neuron-ui/src/utils/const.ts @@ -10,6 +10,7 @@ export const UNREMOVABLE_NETWORK_ID = '0' export const CONFIRMATION_THRESHOLD = 30 export const MAX_DECIMAL_DIGITS = 8 +export const MAINNET_TAG = 'ckb' export enum ConnectionStatus { Online = 'online', From 67aceb8ebf24fabf43bb32e4fdc6d7297ecae52d Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 Nov 2019 13:53:45 +0800 Subject: [PATCH 08/15] feat(neuron-ui): update the explorer url according to chain type. --- .../neuron-ui/src/components/Transaction/index.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/neuron-ui/src/components/Transaction/index.tsx b/packages/neuron-ui/src/components/Transaction/index.tsx index e822936eff..8aa66a5740 100644 --- a/packages/neuron-ui/src/components/Transaction/index.tsx +++ b/packages/neuron-ui/src/components/Transaction/index.tsx @@ -30,9 +30,11 @@ const CompactAddress = ({ address }: { address: string }) => ( const Transaction = () => { const [t] = useTranslation() const [transaction, setTransaction] = useState(transactionState) - const [addressPrefix, setAddressPrefix] = useState(ckbCore.utils.AddressPrefix.Mainnet) + const [isMainnet, setIsMainnet] = useState(false) const [error, setError] = useState({ code: '', message: '' }) + const addressPrefix = isMainnet ? ckbCore.utils.AddressPrefix.Mainnet : ckbCore.utils.AddressPrefix.Testnet + const inputColumns: IColumn[] = useMemo( () => [ @@ -198,9 +200,7 @@ const Transaction = () => { throw new Error('Cannot find current network in the network list') } - setAddressPrefix( - network.chain === MAINNET_TAG ? ckbCore.utils.AddressPrefix.Mainnet : ckbCore.utils.AddressPrefix.Testnet - ) + setIsMainnet(network.chain === MAINNET_TAG) } }) .catch(err => console.warn(err)) @@ -245,10 +245,9 @@ const Transaction = () => { }, []) const onExplorerBtnClick = useCallback(() => { - const isMainnet = false // TODO: add conditional branch on mainnet and testnet const explorerUrl = isMainnet ? 'https://explorer.nervos.org' : 'https://explorer.nervos.org/testnet' openExternal(`${explorerUrl}/transaction/${transaction.hash}`) - }, [transaction.hash]) + }, [transaction.hash, isMainnet]) const basicInfoItems = useMemo( () => [ From 1bc213a772a729d89669d6aec8bf1b63f07f77f4 Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 Nov 2019 23:22:29 +0800 Subject: [PATCH 09/15] feat: strengthen address validation --- packages/neuron-ui/src/utils/validators.ts | 3 +++ .../neuron-wallet/src/controllers/wallets.ts | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/neuron-ui/src/utils/validators.ts b/packages/neuron-ui/src/utils/validators.ts index 76fe96afe6..3d6a5312fc 100644 --- a/packages/neuron-ui/src/utils/validators.ts +++ b/packages/neuron-ui/src/utils/validators.ts @@ -3,6 +3,9 @@ import { ckbCore } from 'services/chain' import { MIN_PASSWORD_LENGTH, MAX_PASSWORD_LENGTH, MIN_AMOUNT, MAX_DECIMAL_DIGITS, ErrorCode } from './const' export const verifyAddress = (address: string): boolean => { + if (typeof address !== 'string' || address.length !== 46) { + return false + } try { return ckbCore.utils.parseAddress(address, 'hex').startsWith('0x0100') } catch (err) { diff --git a/packages/neuron-wallet/src/controllers/wallets.ts b/packages/neuron-wallet/src/controllers/wallets.ts index 4a9c8a7ba9..0434ab152e 100644 --- a/packages/neuron-wallet/src/controllers/wallets.ts +++ b/packages/neuron-wallet/src/controllers/wallets.ts @@ -1,4 +1,5 @@ import fs from 'fs' +import { parseAddress } from '@nervosnetwork/ckb-sdk-utils' import { dialog, SaveDialogReturnValue, BrowserWindow } from 'electron' import WalletsService, { Wallet, WalletProperties, FileKeystoreWallet } from 'services/wallets' import Keystore from 'models/keys/keystore' @@ -15,6 +16,7 @@ import { EmptyPassword, IncorrectPassword, InvalidJSON, + InvalidAddress, } from 'exceptions' import i18n from 'utils/i18n' import AddressService from 'services/addresses' @@ -338,6 +340,13 @@ export default class WalletsController { if (!params.fee || params.fee === '0') { feeRate = '1000' } + + params.items.forEach(item => { + if (!this.verifyAddress(item.address)) { + throw new InvalidAddress(item.address) + } + }) + const walletsService = WalletsService.getInstance() const hash = await walletsService.sendCapacity( params.walletID, @@ -435,4 +444,15 @@ export default class WalletsController { }, } } + + private static verifyAddress = (address: string): boolean => { + if (typeof address !== 'string' || address.length !== 46) { + return false + } + try { + return parseAddress(address, 'hex').startsWith('0x0100') + } catch (err) { + return false + } + } } From 8ed55018bdc3eabe34c370634ed1eea5e5f38df3 Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 11 Nov 2019 00:08:47 +0800 Subject: [PATCH 10/15] feat(neuron-wallet): trim the keywords on searching txs --- packages/neuron-wallet/src/controllers/transactions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/neuron-wallet/src/controllers/transactions.ts b/packages/neuron-wallet/src/controllers/transactions.ts index b2e1a0a18c..c48786676d 100644 --- a/packages/neuron-wallet/src/controllers/transactions.ts +++ b/packages/neuron-wallet/src/controllers/transactions.ts @@ -33,7 +33,7 @@ export default class TransactionsController { const addresses = (await AddressesService.allAddressesByWalletId(walletID)).map(addr => addr.address) - const transactions = await TransactionsService.getAllByAddresses({ pageNo, pageSize, addresses }, keywords) + const transactions = await TransactionsService.getAllByAddresses({ pageNo, pageSize, addresses }, keywords.trim()) if (!transactions) { throw new ServiceHasNoResponse('Transactions') From 7bf6dbc5c2644c4ac10f2fbb3de352e1284f35e2 Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 11 Nov 2019 01:07:51 +0800 Subject: [PATCH 11/15] feat(neuron-ui): show the error message from api controller on send view. --- .../neuron-ui/src/components/Send/hooks.ts | 27 ++++++++++++------- .../neuron-ui/src/components/Send/index.tsx | 17 +++++++----- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/neuron-ui/src/components/Send/hooks.ts b/packages/neuron-ui/src/components/Send/hooks.ts index 58bd0731b7..e8b0cd3adc 100644 --- a/packages/neuron-ui/src/components/Send/hooks.ts +++ b/packages/neuron-ui/src/components/Send/hooks.ts @@ -52,18 +52,18 @@ const useOnTransactionChange = ( items: TransactionOutput[], price: string, dispatch: StateDispatch, - setIsTransactionValid: Function, - setTotalAmount: Function + setTotalAmount: Function, + setErrorMessage: Function ) => { useEffect(() => { clearTimeout(generateTxTimer) + setErrorMessage('') generateTxTimer = setTimeout(() => { dispatch({ type: AppActions.UpdateGeneratedTx, payload: null, }) if (verifyTransactionOutputs(items)) { - setIsTransactionValid(true) const totalAmount = outputsToTotalAmount(items) setTotalAmount(totalAmount) const realParams = { @@ -81,16 +81,25 @@ const useOnTransactionChange = ( type: AppActions.UpdateGeneratedTx, payload: res.result, }) + } else { + throw new Error(res.message.content) } }) .catch((err: Error) => { - console.error(err) + dispatch({ + type: AppActions.UpdateGeneratedTx, + payload: '', + }) + setErrorMessage(err.message) }) } else { - setIsTransactionValid(false) + dispatch({ + type: AppActions.UpdateGeneratedTx, + payload: '', + }) } }, 300) - }, [walletID, items, price, dispatch, setIsTransactionValid, setTotalAmount]) + }, [walletID, items, price, dispatch, setTotalAmount]) } const useOnSubmit = (items: TransactionOutput[], dispatch: StateDispatch) => @@ -176,8 +185,8 @@ export const useInitialize = ( ) => { const fee = useMemo(() => calculateFee(generatedTx), [generatedTx]) - const [isTransactionValid, setIsTransactionValid] = useState(false) const [totalAmount, setTotalAmount] = useState('0') + const [errorMessage, setErrorMessage] = useState('') const updateTransactionOutput = useUpdateTransactionOutput(dispatch) const onItemChange = useOnItemChange(updateTransactionOutput) @@ -235,8 +244,6 @@ export const useInitialize = ( fee, totalAmount, setTotalAmount, - isTransactionValid, - setIsTransactionValid, useOnTransactionChange, onItemChange, addTransactionOutput, @@ -247,6 +254,8 @@ export const useInitialize = ( onGetAmountErrorMessage, onSubmit, onClear, + errorMessage, + setErrorMessage, } } diff --git a/packages/neuron-ui/src/components/Send/index.tsx b/packages/neuron-ui/src/components/Send/index.tsx index 80dcf6f9fa..b3ba259a8f 100644 --- a/packages/neuron-ui/src/components/Send/index.tsx +++ b/packages/neuron-ui/src/components/Send/index.tsx @@ -45,8 +45,6 @@ const Send = ({ fee, totalAmount, setTotalAmount, - isTransactionValid, - setIsTransactionValid, useOnTransactionChange, onItemChange, onSubmit, @@ -57,12 +55,17 @@ const Send = ({ onGetAddressErrorMessage, onGetAmountErrorMessage, onClear, + errorMessage, + setErrorMessage, } = useInitialize(walletID, send.outputs, send.generatedTx, dispatch, t) - useOnTransactionChange(walletID, send.outputs, send.price, dispatch, setIsTransactionValid, setTotalAmount) + useOnTransactionChange(walletID, send.outputs, send.price, dispatch, setTotalAmount, setErrorMessage) const leftStackWidth = '70%' const labelWidth = '140px' - const isAffordable = verifyTotalAmount(totalAmount, fee, balance) + let errorMessageUnderTotal = errorMessage + if (!errorMessageUnderTotal && !verifyTotalAmount(totalAmount, fee, balance)) { + errorMessageUnderTotal = t(`messages.codes.${ErrorCode.AmountNotEnough}`) + } return ( @@ -178,7 +181,7 @@ const Send = ({ styles={{ root: { width: leftStackWidth, - display: send.outputs.length > 1 || !isAffordable ? 'flex' : 'none', + display: send.outputs.length > 1 || errorMessageUnderTotal ? 'flex' : 'none', }, }} tokens={{ childrenGap: 20 }} @@ -192,7 +195,7 @@ const Send = ({ alt={t('send.total-amount')} value={`${shannonToCKBFormatter(totalAmount)} CKB`} readOnly - errorMessage={isAffordable ? '' : t(`messages.codes.${ErrorCode.AmountNotEnough}`)} + errorMessage={errorMessageUnderTotal} /> @@ -232,7 +235,7 @@ const Send = ({ )} From 21fd5b1631ceae2ca54df63ec8dc62579c788a97 Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 11 Nov 2019 09:35:07 +0800 Subject: [PATCH 12/15] feat(neuron-ui): show local error message ahead of remote error message --- packages/neuron-ui/src/components/Send/hooks.ts | 2 +- packages/neuron-ui/src/components/Send/index.tsx | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/neuron-ui/src/components/Send/hooks.ts b/packages/neuron-ui/src/components/Send/hooks.ts index e8b0cd3adc..03f99089ee 100644 --- a/packages/neuron-ui/src/components/Send/hooks.ts +++ b/packages/neuron-ui/src/components/Send/hooks.ts @@ -99,7 +99,7 @@ const useOnTransactionChange = ( }) } }, 300) - }, [walletID, items, price, dispatch, setTotalAmount]) + }, [walletID, items, price, dispatch, setTotalAmount, setErrorMessage]) } const useOnSubmit = (items: TransactionOutput[], dispatch: StateDispatch) => diff --git a/packages/neuron-ui/src/components/Send/index.tsx b/packages/neuron-ui/src/components/Send/index.tsx index b3ba259a8f..79447fbaf6 100644 --- a/packages/neuron-ui/src/components/Send/index.tsx +++ b/packages/neuron-ui/src/components/Send/index.tsx @@ -62,10 +62,9 @@ const Send = ({ const leftStackWidth = '70%' const labelWidth = '140px' - let errorMessageUnderTotal = errorMessage - if (!errorMessageUnderTotal && !verifyTotalAmount(totalAmount, fee, balance)) { - errorMessageUnderTotal = t(`messages.codes.${ErrorCode.AmountNotEnough}`) - } + const errorMessageUnderTotal = verifyTotalAmount(totalAmount, fee, balance) + ? errorMessage + : t(`messages.codes.${ErrorCode.AmountNotEnough}`) return ( From 2d6283d1cd148a94873fd0f97bfd5f748a3e6a68 Mon Sep 17 00:00:00 2001 From: Chen Yu Date: Mon, 11 Nov 2019 10:49:23 +0800 Subject: [PATCH 13/15] feat(neuron-ui): remove input truncation on importing keystore. (#1068) * feat(neuron-ui): remove input truncation on importing keystore. * refactor(neuron-ui): hide the password in error message --- .../neuron-ui/src/components/ImportKeystore/index.tsx | 8 +++++++- packages/neuron-ui/src/locales/en.json | 1 + packages/neuron-ui/src/locales/zh.json | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/neuron-ui/src/components/ImportKeystore/index.tsx b/packages/neuron-ui/src/components/ImportKeystore/index.tsx index 3217bb9a17..e1c908c4a0 100644 --- a/packages/neuron-ui/src/components/ImportKeystore/index.tsx +++ b/packages/neuron-ui/src/components/ImportKeystore/index.tsx @@ -98,7 +98,6 @@ const ImportKeystore = (props: React.PropsWithoutRef { @@ -108,6 +107,13 @@ const ImportKeystore = (props: React.PropsWithoutRef maxLength) { + return t(`messages.codes.${ErrorCode.FieldTooLong}`, { + fieldName: key, + fieldValue: key === 'password' ? '' : text, + length: maxLength, + }) + } return '' }} onChange={(_e: React.FormEvent, newValue?: string) => { diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index 679aaad4de..ca5d51d297 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -259,6 +259,7 @@ "fields": { "wallet": "Wallet", "name": "Name", + "password": "Password", "remote": "RPC URL", "network": "Network", "address": "Address", diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index 2046f8c097..fd69af80e9 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -259,6 +259,7 @@ "fields": { "wallet": "钱包", "name": "名称", + "password": "密码", "remote": "RPC URL", "network": "网络", "address": "地址", From 43cb7a6ba8096eb952542a5bb0c626901f37c479 Mon Sep 17 00:00:00 2001 From: James Chen Date: Mon, 11 Nov 2019 13:44:40 +0900 Subject: [PATCH 14/15] chore: Bump to v0.24.3 --- lerna.json | 2 +- package.json | 2 +- packages/neuron-ui/package.json | 2 +- packages/neuron-wallet/package.json | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lerna.json b/lerna.json index 110180cdb8..e8ca78e140 100644 --- a/lerna.json +++ b/lerna.json @@ -2,7 +2,7 @@ "packages": [ "packages/*" ], - "version": "0.24.2", + "version": "0.24.3", "npmClient": "yarn", "useWorkspaces": true } diff --git a/package.json b/package.json index 845830554b..dd09e01464 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "neuron", "productName": "Neuron", "description": "CKB Neuron Wallet", - "version": "0.24.2", + "version": "0.24.3", "private": true, "author": { "name": "Nervos Core Dev", diff --git a/packages/neuron-ui/package.json b/packages/neuron-ui/package.json index 335ac2a91f..f68e8b2189 100644 --- a/packages/neuron-ui/package.json +++ b/packages/neuron-ui/package.json @@ -1,6 +1,6 @@ { "name": "neuron-ui", - "version": "0.24.2", + "version": "0.24.3", "private": true, "author": { "name": "Nervos Core Dev", diff --git a/packages/neuron-wallet/package.json b/packages/neuron-wallet/package.json index 429f913134..1c42e32132 100644 --- a/packages/neuron-wallet/package.json +++ b/packages/neuron-wallet/package.json @@ -3,7 +3,7 @@ "productName": "Neuron", "description": "CKB Neuron Wallet", "homepage": "https://www.nervos.org/", - "version": "0.24.2", + "version": "0.24.3", "private": true, "author": { "name": "Nervos Core Dev", @@ -64,7 +64,7 @@ "electron-devtools-installer": "2.2.4", "electron-notarize": "0.1.1", "lint-staged": "9.2.5", - "neuron-ui": "0.24.2", + "neuron-ui": "0.24.3", "rimraf": "3.0.0", "spectron": "8.0.0", "ts-transformer-imports": "0.4.3", From 5efec501ef8c40522b8605cda244884a864c474e Mon Sep 17 00:00:00 2001 From: James Chen Date: Mon, 11 Nov 2019 13:45:20 +0900 Subject: [PATCH 15/15] docs: Update changelog for v0.24.3 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a23513091..d21a5b4ee7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +## [0.24.3](https://github.com/nervosnetwork/neuron/compare/v0.24.2...v0.24.3) (2019-11-11) + + +### Bug Fixes + +* **neuron-ui:** fix the address prefix on tx view according to the chain type. ([ffedca7](https://github.com/nervosnetwork/neuron/commit/ffedca7)) +* **neuron-wallet:** order inputs in a tx ([b0e3855](https://github.com/nervosnetwork/neuron/commit/b0e3855)) +* I18n for pending confirmations count ([2990891](https://github.com/nervosnetwork/neuron/commit/2990891)) +* input capacity can be null ([2d80fa8](https://github.com/nervosnetwork/neuron/commit/2d80fa8)) + + +### Features + +* **neuron-ui:** remove input truncation on importing keystore. ([#1068](https://github.com/nervosnetwork/neuron/issues/1068)) ([2d6283d](https://github.com/nervosnetwork/neuron/commit/2d6283d)) +* **neuron-ui:** show local error message ahead of remote error message ([21fd5b1](https://github.com/nervosnetwork/neuron/commit/21fd5b1)) +* **neuron-ui:** show the error message from api controller on send view. ([7bf6dbc](https://github.com/nervosnetwork/neuron/commit/7bf6dbc)) +* **neuron-wallet:** trim the keywords on searching txs ([8ed5501](https://github.com/nervosnetwork/neuron/commit/8ed5501)) +* strengthen address validation ([1bc213a](https://github.com/nervosnetwork/neuron/commit/1bc213a)) +* **neuron-ui:** update the explorer url according to chain type. ([67aceb8](https://github.com/nervosnetwork/neuron/commit/67aceb8)) +* Finalize testnet explorer URL ([848fe7b](https://github.com/nervosnetwork/neuron/commit/848fe7b)) +* **neuron-ui:** adjust the layout of receive view to vertical aglinment. ([8d58abc](https://github.com/nervosnetwork/neuron/commit/8d58abc)) +* **neuron-ui:** only addresses start with 0x0100 are valid ([67be688](https://github.com/nervosnetwork/neuron/commit/67be688)) + + + ## [0.24.2](https://github.com/nervosnetwork/neuron/compare/v0.24.1...v0.24.2) (2019-11-08)