diff --git a/packages/blockchain-wallet-v4-frontend/src/assets/locales/en.json b/packages/blockchain-wallet-v4-frontend/src/assets/locales/en.json index ecf8f483682..2d2ab1c923d 100644 --- a/packages/blockchain-wallet-v4-frontend/src/assets/locales/en.json +++ b/packages/blockchain-wallet-v4-frontend/src/assets/locales/en.json @@ -101,7 +101,7 @@ "components.alerts.wallet_upgrade_error": "Failed to upgrade to HD and save wallet.", "components.alerts.yubikey_verify_error": "Failed to verify Yubikey", "components.alerts.yubikey_verify_success": "Yubikey verified", - "components.alerts.uknown_error": "An error has occured.", + "components.alerts.unknown_error": "An error has occurred.", "coinify.banktransferdetails.header": "Bank Transfer Order Details", "coinify.banktransferdetails.directions": "Funds must come from your bank account, which needs to be in the same name as your government issued ID. Coinify will reject any transfers from third party accounts not in your name.", "coinify.banktransferdetails.recipientname": "Recipient Name:", diff --git a/packages/blockchain-wallet-v4-frontend/src/components/Alerts/template.js b/packages/blockchain-wallet-v4-frontend/src/components/Alerts/template.js index 612469ff589..6b27d733f79 100644 --- a/packages/blockchain-wallet-v4-frontend/src/components/Alerts/template.js +++ b/packages/blockchain-wallet-v4-frontend/src/components/Alerts/template.js @@ -37,10 +37,11 @@ const selectHeader = nature => { const selectMessage = (message, data = undefined) => { switch (message) { case C.ADDRESS_ADD_ERROR: return + case C.ADDRESS_DELETE_ERROR: return + case C.ADDRESS_DELETE_SUCCESS: return case C.ADDRESS_DOES_NOT_EXIST_ERROR: return case C.ADDRESS_FORMAT_NOT_SUPPORTED_ERROR: return case C.ADDRESS_LABEL_MAXIMUM_ERROR: return - case C.ADDRESS_LABEL_UPDATE_SUCCESS: return case C.AUTHORIZATION_REQUIRED_INFO: return case C.AUTOLOGOUT_UPDATE_ERROR: return case C.AUTOLOGOUT_UPDATE_SUCCESS: return @@ -58,6 +59,8 @@ const selectMessage = (message, data = undefined) => { case C.EXCHANGE_REFRESH_TRADES_ERROR: return case C.EXCHANGE_REFRESH_TRADE_ERROR: return case C.EXCHANGE_TRANSACTION_ERROR: return + case C.FETCH_USED_ADDRESSES_ERROR: return + case C.FETCH_UNUSED_ADDRESSES_ERROR: return case C.GET_GOOGLEAUTH_SECRET_ERROR: return case C.GOOGLE_AUTH_VERIFY_ERROR: return case C.GOOGLE_AUTH_VERIFY_SUCCESS: return @@ -89,6 +92,7 @@ const selectMessage = (message, data = undefined) => { case C.MOBILE_VERIFY_ERROR: return case C.MOBILE_VERIFY_SUCCESS: return case C.NEW_WALLET_CREATE_ERROR: return + case C.NEW_ADDRESS_GENERATE_ERROR: return case C.NEW_WALLET_CREATE_SUCCESS: return case C.PBKDF2_UPDATE_SUCCESS: return case C.REGISTER_ERROR: return @@ -130,12 +134,14 @@ const selectMessage = (message, data = undefined) => { case C.TWOFA_UPDATE_SUCCESS: return case C.TWOFA_YUBIKEY_ENABLE_ERROR: return case C.TWOFA_YUBIKEY_ENABLE_SUCCESS: return + case C.UPDATE_ADDRESS_LABEL_SUCCESS: return + case C.UPDATE_ADDRESS_LABEL_ERROR: return case C.WALLET_LOADING_ERROR: return case C.WALLET_SESSION_ERROR: return case C.WALLET_UPGRADE_ERROR: return case C.YUBIKEY_VERIFY_ERROR: return case C.YUBIKEY_VERIFY_SUCCESS: return - default: return + default: return } } diff --git a/packages/blockchain-wallet-v4-frontend/src/data/components/manageAddresses/sagas.js b/packages/blockchain-wallet-v4-frontend/src/data/components/manageAddresses/sagas.js index d4193e38061..762b06d982d 100644 --- a/packages/blockchain-wallet-v4-frontend/src/data/components/manageAddresses/sagas.js +++ b/packages/blockchain-wallet-v4-frontend/src/data/components/manageAddresses/sagas.js @@ -43,7 +43,7 @@ export default ({ api }) => { } catch (e) { yield put(A.generateNextReceiveAddressError(walletIndex, e)) yield put(actions.logs.logErrorMessage(logLocation, 'generateNextReceiveAddress', e)) - yield put(actions.alerts.displayError('Failed to generate new address.')) + yield put(actions.alerts.displayError(C.NEW_ADDRESS_GENERATE_ERROR)) } } @@ -54,13 +54,18 @@ export default ({ api }) => { yield put(A.fetchUnusedAddressesLoading(walletIndex)) const wallet = yield select(selectors.core.wallet.getWallet) const account = Types.Wallet.selectHDAccounts(wallet).get(walletIndex) + // get all indexes for labeled addresses const labels = Types.HDAccount.selectAddressLabels(account).reverse().toArray() + // derive addresses from label indexes const labeledAddrs = labels.map(la => ({ address: Types.HDAccount.getReceiveAddress(account, la.index, settings.NETWORK_BITCOIN), index: la.index, label: la.label })) + // fetch blockchain data for each address const labeledAddrsFull = yield call(api.fetchBlockchainData, pluck('address', labeledAddrs)) + // filter only addresses with 0 txs const unusedAddresses = filter(a => a.n_tx === 0, labeledAddrsFull.addresses) + // map labels back to unused addresses forEach((labeledAddr) => { let idx = findIndex(propEq('address', labeledAddr.address))(unusedAddresses) if (idx !== -1) { @@ -68,11 +73,12 @@ export default ({ api }) => { unusedAddresses[idx].label = labeledAddr.label } }, labeledAddrs) + yield put(A.fetchUnusedAddressesSuccess(walletIndex, sort((a, b) => { return a.derivationIndex - b.derivationIndex }, unusedAddresses))) } catch (e) { yield put(A.fetchUnusedAddressesError(walletIndex, e)) yield put(actions.logs.logErrorMessage(logLocation, 'fetchUnusedAddresses', e)) - yield put(actions.alerts.displayError('Failed to retrieve unused addresses.')) + yield put(actions.alerts.displayError(C.FETCH_UNUSED_ADDRESSES_ERROR)) } } @@ -98,7 +104,7 @@ export default ({ api }) => { // filter only addresses with tx's const usedAddresses = filter(a => a.n_tx > 0, derivedAddrsFull.addresses) - // match labels with addresses + // map labels back to used addresses forEach((labeledAddr) => { let idx = findIndex(propEq('address', labeledAddr.address))(usedAddresses) if (idx !== -1) { @@ -110,7 +116,7 @@ export default ({ api }) => { } catch (e) { yield put(A.fetchUsedAddressesError(walletIndex, e)) yield put(actions.logs.logErrorMessage(logLocation, 'fetchUsedAddresses', e)) - yield put(actions.alerts.displayError('Failed to retrieve used addresses.')) + yield put(actions.alerts.displayError(C.FETCH_USED_ADDRESSES_ERROR)) } } @@ -121,13 +127,13 @@ export default ({ api }) => { yield put(A.editAddressLabelLoading(accountIndex)) let newLabel = yield call(promptForInput, { title: 'Rename Address Label' }) yield put(actions.core.wallet.setHdAddressLabel(accountIndex, addressIndex, newLabel)) - yield put(actions.alerts.displaySuccess(C.ADDRESS_LABEL_UPDATE_SUCCESS)) yield put(A.fetchUnusedAddresses(walletIndex)) yield put(A.editAddressLabelSuccess(walletIndex)) + yield put(actions.alerts.displaySuccess(C.UPDATE_ADDRESS_LABEL_SUCCESS)) } catch (e) { yield put(A.editAddressLabelError(walletIndex, e)) yield put(actions.logs.logErrorMessage(logLocation, 'editAddressLabel', e)) - yield put(actions.alerts.displayError('Failed to update address label.')) + yield put(actions.alerts.displayError(C.UPDATE_ADDRESS_LABEL_ERROR)) } } @@ -136,19 +142,16 @@ export default ({ api }) => { try { yield put(A.deleteAddressLabelLoading(accountIdx)) - // yield put(actions.core.wallet.deleteHdAddressLabel(accountIdx, addressIdx)) yield call(function * () { yield put(actions.core.wallet.deleteHdAddressLabel(accountIdx, addressIdx, walletIdx)) }, accountIdx, addressIdx) - // let t = yield call(actions.core.wallet.deleteHdAddressLabel, {accountIdx}, {addressIdx}) - // console.log('123') - yield put(actions.alerts.displaySuccess('Address was deleted successfully.')) yield put(A.deleteAddressLabelSuccess(walletIdx)) yield put(A.fetchUnusedAddresses(walletIdx)) + yield put(actions.alerts.displaySuccess(C.ADDRESS_DELETE_SUCCESS)) } catch (e) { yield put(A.deleteAddressLabelError(walletIdx, e)) yield put(actions.logs.logErrorMessage(logLocation, 'deleteAddressLabel', e)) - yield put(actions.alerts.displayError('Failed to delete address label.')) + yield put(actions.alerts.displayError(C.ADDRESS_DELETE_ERROR)) } } diff --git a/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UnusedAddresses/template.success.js b/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UnusedAddresses/template.success.js index c4e517f5a87..090d6a2e842 100644 --- a/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UnusedAddresses/template.success.js +++ b/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UnusedAddresses/template.success.js @@ -17,7 +17,7 @@ const UnusedAddressesTemplate = ({ account, currentReceiveIndex, unusedAddresses {entry.label} - + onEditLabel(entry.derivationIndex)} style={{ marginRight: 10 }} /> onDeleteLabel(entry.derivationIndex)} /> @@ -26,7 +26,9 @@ const UnusedAddressesTemplate = ({ account, currentReceiveIndex, unusedAddresses }) return unusedAddresses.length === 0 - ? + ? ( + + ) : ( diff --git a/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UsedAddresses/Table/template.js b/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UsedAddresses/Table/template.js index 6ada0073600..d3edcbb43ce 100644 --- a/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UsedAddresses/Table/template.js +++ b/packages/blockchain-wallet-v4-frontend/src/scenes/Settings/Addresses/Btc/ManageAddresses/UsedAddresses/Table/template.js @@ -36,35 +36,37 @@ const UsedTableEntry = ({ address, search }) => { return !isMatch() ? null - : ( - - - - {address.address} - - - - - {address.label} - - - - - {address.final_balance} - - - - ) + : ( + + + {address.address} + + + + + {address.label} + + + + + {address.final_balance} + + + ) } -const UsedAddressesTable = ({ usedAddresses, search }) => ( +const UsedAddressesTable = ({ usedAddresses, search, onEditLabel }) => ( { usedAddresses.length - ? {usedAddresses.map((address, i) => ())} - : + ? ({usedAddresses.map((address, i) => ( + ))} + ) + : ( + + ) } )