From b53441b5a70c5528088d5da8e93d2b6b95a9b2e1 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Mon, 9 Sep 2019 18:36:29 +0400 Subject: [PATCH 1/6] Manage owners responsiveness fix --- src/routes/safe/components/Settings/ManageOwners/index.jsx | 2 +- src/routes/safe/components/Settings/ManageOwners/style.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/safe/components/Settings/ManageOwners/index.jsx b/src/routes/safe/components/Settings/ManageOwners/index.jsx index 6630ce43..5ca2f0b4 100644 --- a/src/routes/safe/components/Settings/ManageOwners/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/index.jsx @@ -145,7 +145,7 @@ class ManageOwners extends React.Component { defaultFixed noBorder > - {(sortedData: Array) => sortedData.map((row: any, index: number) => ( + {(sortedData: List) => sortedData.map((row: any, index: number) => ( ({ actions: { justifyContent: 'flex-end', visibility: 'hidden', + minWidth: '100px', }, noBorderBottom: { '& > td': { From 414e9ecd88d5d681b849f58e7410af62166e918f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADnez?= Date: Tue, 10 Sep 2019 08:41:25 +0200 Subject: [PATCH 2/6] Update owners description --- src/routes/safe/components/Settings/ManageOwners/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/safe/components/Settings/ManageOwners/index.jsx b/src/routes/safe/components/Settings/ManageOwners/index.jsx index 5ca2f0b4..21aeaa01 100644 --- a/src/routes/safe/components/Settings/ManageOwners/index.jsx +++ b/src/routes/safe/components/Settings/ManageOwners/index.jsx @@ -133,7 +133,7 @@ class ManageOwners extends React.Component { Add, remove and replace owners or rename existing owners. Owner names are only stored locally and never - shared with Gnosis or any third parties + shared with Gnosis or any third parties. Date: Tue, 10 Sep 2019 13:08:32 +0200 Subject: [PATCH 3/6] Update transaction history endpoints --- src/config/development.js | 2 +- src/config/production.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/development.js b/src/config/development.js index f09591a8..97867457 100644 --- a/src/config/development.js +++ b/src/config/development.js @@ -6,7 +6,7 @@ import { } from '~/config/names' const devConfig = { - [TX_SERVICE_HOST]: 'https://safe-transaction-service.staging.gnosisdev.com/api/v1/', + [TX_SERVICE_HOST]: 'https://safe-transaction.staging.gnosisdev.com/api/v1/', [SIGNATURES_VIA_METAMASK]: false, [RELAY_API_URL]: 'https://safe-relay.staging.gnosisdev.com/api/v1/', } diff --git a/src/config/production.js b/src/config/production.js index e1d063d4..5a0eab77 100644 --- a/src/config/production.js +++ b/src/config/production.js @@ -6,7 +6,7 @@ import { } from '~/config/names' const prodConfig = { - [TX_SERVICE_HOST]: 'https://safe-transaction-service.staging.gnosisdev.com/api/v1/', + [TX_SERVICE_HOST]: 'https://safe-transaction.staging.gnosisdev.com/api/v1/', [SIGNATURES_VIA_METAMASK]: false, [RELAY_API_URL]: 'https://safe-relay.staging.gnosisdev.com/api/v1/', } From f8db1e1e9acec327dbc9a6a6804d8aea1af3c466 Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Tue, 10 Sep 2019 15:25:07 +0400 Subject: [PATCH 4/6] create an action to fetch ether balance, add it to checkForUpdates func in safe container --- src/routes/safe/container/actions.js | 3 +++ src/routes/safe/container/index.jsx | 4 +++- .../safe/store/actions/fetchEtherBalance.js | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/routes/safe/store/actions/fetchEtherBalance.js diff --git a/src/routes/safe/container/actions.js b/src/routes/safe/container/actions.js index a51fb28e..2dc0c895 100644 --- a/src/routes/safe/container/actions.js +++ b/src/routes/safe/container/actions.js @@ -1,6 +1,7 @@ // @flow import fetchSafe from '~/routes/safe/store/actions/fetchSafe' import fetchTokenBalances from '~/routes/safe/store/actions/fetchTokenBalances' +import fetchEtherBalance from '~/routes/safe/store/actions/fetchEtherBalance' import createTransaction from '~/routes/safe/store/actions/createTransaction' import processTransaction from '~/routes/safe/store/actions/processTransaction' import fetchTransactions from '~/routes/safe/store/actions/fetchTransactions' @@ -15,6 +16,7 @@ export type Actions = { updateSafe: typeof updateSafe, fetchTokens: typeof fetchTokens, processTransaction: typeof processTransaction, + fetchEtherBalance: typeof fetchEtherBalance, } export default { @@ -25,4 +27,5 @@ export default { fetchTokens, fetchTransactions, updateSafe, + fetchEtherBalance, } diff --git a/src/routes/safe/container/index.jsx b/src/routes/safe/container/index.jsx index 322c1e1b..e6d0f2d3 100644 --- a/src/routes/safe/container/index.jsx +++ b/src/routes/safe/container/index.jsx @@ -23,6 +23,7 @@ class SafeView extends React.Component { fetchSafe(safeUrl) fetchTokenBalances(safeUrl, activeTokens) + // fetch tokens there to get symbols for tokens in TXs list fetchTokens() @@ -46,10 +47,11 @@ class SafeView extends React.Component { checkForUpdates() { const { - safeUrl, activeTokens, fetchTokenBalances, + safeUrl, activeTokens, fetchTokenBalances, fetchEtherBalance, } = this.props fetchTokenBalances(safeUrl, activeTokens) + fetchEtherBalance(safeUrl) } render() { diff --git a/src/routes/safe/store/actions/fetchEtherBalance.js b/src/routes/safe/store/actions/fetchEtherBalance.js new file mode 100644 index 00000000..23f32b44 --- /dev/null +++ b/src/routes/safe/store/actions/fetchEtherBalance.js @@ -0,0 +1,18 @@ +// @flow +import type { Dispatch as ReduxDispatch } from 'redux' +import { type GlobalState } from '~/store/index' +import updateSafe from '~/routes/safe/store/actions/updateSafe' +import { getBalanceInEtherOf } from '~/logic/wallets/getWeb3' + +const fetchEtherBalance = (safeAddress: string) => async (dispatch: ReduxDispatch) => { + try { + const ethBalance = await getBalanceInEtherOf(safeAddress) + + dispatch(updateSafe({ address: safeAddress, ethBalance })) + } catch (err) { + // eslint-disable-next-line + console.error('Error while loading active tokens from storage:', err) + } +} + +export default fetchEtherBalance From ef32d1e78f938c9e66797ebd5f2b3d35c520d8ea Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Tue, 10 Sep 2019 15:27:03 +0400 Subject: [PATCH 5/6] fix error messages --- src/routes/safe/store/actions/fetchEtherBalance.js | 2 +- src/routes/safe/store/actions/fetchTokenBalances.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/safe/store/actions/fetchEtherBalance.js b/src/routes/safe/store/actions/fetchEtherBalance.js index 23f32b44..47c4a6d5 100644 --- a/src/routes/safe/store/actions/fetchEtherBalance.js +++ b/src/routes/safe/store/actions/fetchEtherBalance.js @@ -11,7 +11,7 @@ const fetchEtherBalance = (safeAddress: string) => async (dispatch: ReduxDispatc dispatch(updateSafe({ address: safeAddress, ethBalance })) } catch (err) { // eslint-disable-next-line - console.error('Error while loading active tokens from storage:', err) + console.error('Error when fetching Ether balance:', err) } } diff --git a/src/routes/safe/store/actions/fetchTokenBalances.js b/src/routes/safe/store/actions/fetchTokenBalances.js index d9dbcd91..26501fbe 100644 --- a/src/routes/safe/store/actions/fetchTokenBalances.js +++ b/src/routes/safe/store/actions/fetchTokenBalances.js @@ -45,7 +45,7 @@ const fetchTokenBalances = (safeAddress: string, tokens: List) => async ( dispatch(updateSafe({ address: safeAddress, balances: List(withBalances) })) } catch (err) { // eslint-disable-next-line - console.error('Error while loading active tokens from storage:', err) + console.error('Error when fetching token balances:', err) } } From e4217ebbaf67beef9ebbdefdeb017e13f9a0789e Mon Sep 17 00:00:00 2001 From: Mikhail Mikheev Date: Tue, 10 Sep 2019 17:31:02 +0400 Subject: [PATCH 6/6] Fix condition for recalculating active tokens --- src/logic/tokens/utils/tokensStorage.js | 2 +- .../safe/store/middleware/safeStorage.js | 45 ++++++++++--------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/logic/tokens/utils/tokensStorage.js b/src/logic/tokens/utils/tokensStorage.js index b2b4a3b0..7cd06968 100644 --- a/src/logic/tokens/utils/tokensStorage.js +++ b/src/logic/tokens/utils/tokensStorage.js @@ -56,7 +56,7 @@ export const removeTokenFromStorage = async (safeAddress: string, token: Token) export const removeFromActiveTokens = async (safeAddress: string, token: Token) => { const activeTokens = await getActiveTokens() - const index = activeTokens.findIndex(activeToken => activeToken.name === token.name) + const index = activeTokens.findIndex((activeToken) => activeToken.name === token.name) if (index !== -1) { await saveActiveTokens(safeAddress, activeTokens.delete(index)) diff --git a/src/routes/safe/store/middleware/safeStorage.js b/src/routes/safe/store/middleware/safeStorage.js index c26a8837..3a3e8766 100644 --- a/src/routes/safe/store/middleware/safeStorage.js +++ b/src/routes/safe/store/middleware/safeStorage.js @@ -1,5 +1,6 @@ // @flow import type { Store, AnyAction } from 'redux' +import { List } from 'immutable' import { ADD_SAFE } from '~/routes/safe/store/actions/addSafe' import { UPDATE_SAFE } from '~/routes/safe/store/actions/updateSafe' import { REMOVE_SAFE } from '~/routes/safe/store/actions/removeSafe' @@ -28,6 +29,21 @@ const watchedActions = [ ACTIVATE_TOKEN_FOR_ALL_SAFES, ] +const recalculateActiveTokens = (state: GlobalState): void => { + const tokens = tokensSelector(state) + const activeTokenAddresses = getActiveTokensAddressesForAllSafes(state) + + const activeTokens: List = tokens.withMutations((map) => { + map.forEach((token: Token) => { + if (!activeTokenAddresses.has(token.address)) { + map.remove(token.address) + } + }) + }) + + saveActiveTokens(activeTokens) +} + const safeStorageMware = (store: Store) => (next: Function) => async (action: AnyAction) => { const handledAction = next(action) @@ -38,21 +54,7 @@ const safeStorageMware = (store: Store) => (next: Function) => asyn switch (action.type) { case ACTIVATE_TOKEN_FOR_ALL_SAFES: { - let { activeTokens } = action.payload - if (activeTokens) { - const tokens = tokensSelector(state) - const activeTokenAddresses = getActiveTokensAddressesForAllSafes(state) - - activeTokens = tokens.withMutations((map) => { - map.forEach((token: Token) => { - if (!activeTokenAddresses.has(token.address)) { - map.remove(token.address) - } - }) - }) - - saveActiveTokens(activeTokens) - } + recalculateActiveTokens(state) break } case ADD_SAFE: { @@ -61,10 +63,13 @@ const safeStorageMware = (store: Store) => (next: Function) => asyn break } case UPDATE_SAFE: { - const { safeAddress, owners } = action.payload + const { safeAddress, owners, activeTokens } = action.payload if (safeAddress && owners) { setOwners(safeAddress, owners) } + if (activeTokens) { + recalculateActiveTokens(state) + } break } case REMOVE_SAFE: { @@ -81,7 +86,7 @@ const safeStorageMware = (store: Store) => (next: Function) => asyn case REMOVE_SAFE_OWNER: { const { safeAddress, ownerAddress } = action.payload const { owners } = safes.get(safeAddress) - setOwners(safeAddress, owners.filter(o => o.address.toLowerCase() !== ownerAddress.toLowerCase())) + setOwners(safeAddress, owners.filter((o) => o.address.toLowerCase() !== ownerAddress.toLowerCase())) break } case REPLACE_SAFE_OWNER: { @@ -92,7 +97,7 @@ const safeStorageMware = (store: Store) => (next: Function) => asyn setOwners( safeAddress, owners - .filter(o => o.address.toLowerCase() !== oldOwnerAddress.toLowerCase()) + .filter((o) => o.address.toLowerCase() !== oldOwnerAddress.toLowerCase()) .push(makeOwner({ address: ownerAddress, name: ownerName })), ) break @@ -100,8 +105,8 @@ const safeStorageMware = (store: Store) => (next: Function) => asyn case EDIT_SAFE_OWNER: { const { safeAddress, ownerAddress, ownerName } = action.payload const { owners } = safes.get(safeAddress) - const ownerToUpdateIndex = owners.findIndex(o => o.address.toLowerCase() === ownerAddress.toLowerCase()) - setOwners(safeAddress, owners.update(ownerToUpdateIndex, owner => owner.set('name', ownerName))) + const ownerToUpdateIndex = owners.findIndex((o) => o.address.toLowerCase() === ownerAddress.toLowerCase()) + setOwners(safeAddress, owners.update(ownerToUpdateIndex, (owner) => owner.set('name', ownerName))) break } default: