From 4a0474b27aae658b52505042a2550d8879ad4636 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Wed, 12 May 2021 11:19:38 -0300 Subject: [PATCH 01/16] [DDW-663] Mapping where to change --- source/renderer/app/actions/wallets-actions.js | 1 + source/renderer/app/components/wallet/WalletSendForm.js | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/source/renderer/app/actions/wallets-actions.js b/source/renderer/app/actions/wallets-actions.js index 8cb6807446..e19c80f302 100644 --- a/source/renderer/app/actions/wallets-actions.js +++ b/source/renderer/app/actions/wallets-actions.js @@ -89,6 +89,7 @@ export default class WalletsActions { finishRewardsCsv: Action = new Action(); /* ---------- Transfer Funds ---------- */ + // @FINGERPRINT TODO setActiveAssetFingerprint: Action<{ fingerprint: ?string, }> = new Action(); diff --git a/source/renderer/app/components/wallet/WalletSendForm.js b/source/renderer/app/components/wallet/WalletSendForm.js index 121bf02064..4ff4d3634b 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.js +++ b/source/renderer/app/components/wallet/WalletSendForm.js @@ -65,6 +65,7 @@ type Props = { isHardwareWallet: boolean, hwDeviceStatus: HwDeviceStatus, onOpenDialogAction: Function, + // @FINGERPRINT TODO onUnsetActiveAssetFingerprint: Function, onExternalLinkClick: Function, isAddressFromSameWallet: boolean, @@ -75,9 +76,11 @@ type State = { receiver: { receiver: Field, adaAmount: Field, + // @FINGERPRINT TODO assetFields: { [fingerprint: string]: Field, }, + // @FINGERPRINT TODO assetsDropdown: { [fingerprint: string]: Field, }, @@ -87,6 +90,7 @@ type State = { feeCalculationRequestQue: number, transactionFee: BigNumber, transactionFeeError: ?string | ?Node, + // @FINGERPRINT TODO showRemoveAssetButton: { [fingerprint: string]: boolean }, selectedAssetFingerprints: Array, isResetButtonDisabled: boolean, @@ -107,6 +111,7 @@ export default class WalletSendForm extends Component { transactionFee: new BigNumber(0), transactionFeeError: null, showRemoveAssetButton: {}, + // @FINGERPRINT TODO selectedAssetFingerprints: [], isResetButtonDisabled: true, isReceiverAddressValid: false, @@ -136,6 +141,7 @@ export default class WalletSendForm extends Component { if (selectedAsset) { setTimeout(() => { if (this._isMounted) { + // @FINGERPRINT TODO this.addAssetRow(selectedAsset.fingerprint); } }); @@ -144,6 +150,7 @@ export default class WalletSendForm extends Component { componentWillUnmount() { this._isMounted = false; + // @FINGERPRINT TODO this.props.onUnsetActiveAssetFingerprint(); } @@ -151,6 +158,7 @@ export default class WalletSendForm extends Component { return NUMBER_FORMATS[this.props.currentNumberFormat]; } + // @FINGERPRINT TODO get selectedAssets(): Array { const { selectedAssetFingerprints } = this.state; const { assets: allAssets } = this.props; From 445565bdee46a1ac47ce5c93c2e1d68f62f9fd94 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Wed, 12 May 2021 11:23:21 -0300 Subject: [PATCH 02/16] [DDW-663] CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccf6cba5f0..55c52fa1aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Changelog ### Chores +- Changed the assets identifiers from fingerprint to policyId+name ([PR 2562](https://github.com/input-output-hk/daedalus/pull/2562)) - Updated `react-polymorph` to version `1.0.0` ([PR 2549](https://github.com/input-output-hk/daedalus/pull/2549)) - Updated `cardano-wallet` to version `2021-04-28` and `cardano-node` to version `1.26.2` ([PR 2551](https://github.com/input-output-hk/daedalus/pull/2551)) - Updated Catalyst voting registration to include rewards address instead of the payment one ([PR 2550](https://github.com/input-output-hk/daedalus/pull/2550)) From 0ebe61567b32ea369b2f61afd80b9deeadce80b4 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Wed, 12 May 2021 12:12:40 -0300 Subject: [PATCH 03/16] [DDW-663] Asset selection in the Wallet Summary and Send form --- .../renderer/app/actions/wallets-actions.js | 8 ++--- source/renderer/app/api/assets/types.js | 14 ++++---- .../app/components/wallet/WalletSendForm.js | 5 ++- .../app/containers/wallet/WalletSendPage.js | 33 +++++++++---------- .../containers/wallet/WalletSummaryPage.js | 8 ++--- source/renderer/app/stores/AssetsStore.js | 17 ++++++---- .../wallets/send/WalletSend.stories.js | 10 +++--- 7 files changed, 45 insertions(+), 50 deletions(-) diff --git a/source/renderer/app/actions/wallets-actions.js b/source/renderer/app/actions/wallets-actions.js index e19c80f302..872a23a21c 100644 --- a/source/renderer/app/actions/wallets-actions.js +++ b/source/renderer/app/actions/wallets-actions.js @@ -7,7 +7,7 @@ import type { } from '../../../common/types/hardware-wallets.types'; import type { CsvFileContent } from '../../../common/types/csv-request.types'; import type { QuitStakePoolRequest } from '../api/staking/types'; -import type { WalletSummaryAsset } from '../api/assets/types'; +import type { WalletSummaryAsset, AssetUniqueId } from '../api/assets/types'; export type WalletImportFromFileParams = { filePath: string, @@ -89,10 +89,8 @@ export default class WalletsActions { finishRewardsCsv: Action = new Action(); /* ---------- Transfer Funds ---------- */ - // @FINGERPRINT TODO - setActiveAssetFingerprint: Action<{ - fingerprint: ?string, - }> = new Action(); + setActiveAsset: Action = new Action(); + unsetActiveAsset: Action = new Action(); transferFundsNextStep: Action = new Action(); transferFundsPrevStep: Action = new Action(); transferFundsSetSourceWalletId: Action<{ diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 921c91bd74..d1b0fc98c1 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -3,13 +3,6 @@ import BigNumber from 'bignumber.js'; import Asset from '../../domains/Asset'; -export type SingleAsset = { - policy_id: string, - asset_name: string, - fingerprint: string, - metadata?: ?AssetMetadata, -}; - export type ApiAsset = { policy_id: string, asset_name: string, @@ -42,7 +35,7 @@ export type WalletAssetItem = { address?: ?string, }; -export type Assets = Array; +export type Assets = Array; export type AssetItems = Array; @@ -87,3 +80,8 @@ export type GetAssetsResponse = { assets: Array, total: number, }; + +export type AssetUniqueId = { + policyId: string, + assetName: string, +}; diff --git a/source/renderer/app/components/wallet/WalletSendForm.js b/source/renderer/app/components/wallet/WalletSendForm.js index 4ff4d3634b..ded91d399a 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.js +++ b/source/renderer/app/components/wallet/WalletSendForm.js @@ -65,8 +65,7 @@ type Props = { isHardwareWallet: boolean, hwDeviceStatus: HwDeviceStatus, onOpenDialogAction: Function, - // @FINGERPRINT TODO - onUnsetActiveAssetFingerprint: Function, + onUnsetActiveAsset: Function, onExternalLinkClick: Function, isAddressFromSameWallet: boolean, }; @@ -151,7 +150,7 @@ export default class WalletSendForm extends Component { componentWillUnmount() { this._isMounted = false; // @FINGERPRINT TODO - this.props.onUnsetActiveAssetFingerprint(); + this.props.onUnsetActiveAsset(); } getCurrentNumberFormat() { diff --git a/source/renderer/app/containers/wallet/WalletSendPage.js b/source/renderer/app/containers/wallet/WalletSendPage.js index 6427ce925d..d81a99feda 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.js +++ b/source/renderer/app/containers/wallet/WalletSendPage.js @@ -14,6 +14,7 @@ import Asset from '../../domains/Asset'; import type { AssetItems, WalletTransactionAsset, + AssetUniqueId, } from '../../api/assets/types'; type Props = InjectedProps; @@ -81,19 +82,18 @@ export default class WalletSendPage extends Component { } }; - getAssetByFingerprint = (fingerprint: string, allAssets: Array) => { - return allAssets.find((asset) => asset.fingerprint === fingerprint); - }; - - handleUnsetActiveAssetFingerprint = () => { - const { wallets: walletActions } = this.props.actions; - walletActions.setActiveAssetFingerprint.trigger({ - fingerprint: null, - }); + getAssetByUniqueId = ( + { policyId, assetName }: AssetUniqueId, + allAssets: Array + ) => { + return allAssets.find( + (asset) => asset.policyId === policyId && asset.assetName === assetName + ); }; render() { const { intl } = this.context; + const { stores, actions } = this.props; const { uiDialogs, wallets, @@ -102,19 +102,16 @@ export default class WalletSendPage extends Component { profile, hardwareWallets, assets: assetsStore, - } = this.props.stores; + } = stores; const { isValidAddress, isAddressFromSameWallet } = wallets; const { validateAmount } = transactions; const { hwDeviceStatus } = hardwareWallets; const hasAssetsEnabled = WALLET_ASSETS_ENABLED; - const { - all: allAssets, - activeAssetFingerprint, - getAssetDetails, - } = assetsStore; + const { all: allAssets, activeAsset, getAssetDetails } = assetsStore; + const { unsetActiveAsset } = actions.wallets; - const selectedAsset = activeAssetFingerprint - ? this.getAssetByFingerprint(activeAssetFingerprint, allAssets) + const selectedAsset = activeAsset + ? this.getAssetByUniqueId(activeAsset, allAssets) : null; // Guard against potential null values @@ -180,7 +177,7 @@ export default class WalletSendPage extends Component { onOpenDialogAction={(params) => this.openDialog(params.dialog, isHardwareWallet, wallet.id) } - onUnsetActiveAssetFingerprint={this.handleUnsetActiveAssetFingerprint} + onUnsetActiveAsset={unsetActiveAsset.trigger} onExternalLinkClick={app.openExternalLink} isAddressFromSameWallet={isAddressFromSameWallet} /> diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.js b/source/renderer/app/containers/wallet/WalletSummaryPage.js index 606d8e5224..10659b0745 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.js +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.js @@ -14,7 +14,7 @@ import { getNetworkExplorerUrlByType } from '../../utils/network'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import { ellipsis } from '../../utils/strings'; import type { InjectedProps } from '../../types/injectedPropsType'; -import type { WalletSummaryAsset } from '../../api/assets/types'; +import type { WalletSummaryAsset, AssetUniqueId } from '../../api/assets/types'; export const messages = defineMessages({ noTransactions: { @@ -49,16 +49,14 @@ export default class WalletSummaryPage extends Component { }); }; - handleOpenAssetSend = ({ fingerprint }: WalletSummaryAsset) => { + handleOpenAssetSend = (asset: WalletSummaryAsset) => { const { stores } = this.props; const { wallets } = stores; const { active } = wallets; if (active) { const { id } = active; const { wallets: walletActions, router } = this.props.actions; - walletActions.setActiveAssetFingerprint.trigger({ - fingerprint, - }); + walletActions.setActiveAsset.trigger(asset); router.goToRoute.trigger({ route: ROUTES.WALLETS.PAGE, params: { id, page: 'send' }, diff --git a/source/renderer/app/stores/AssetsStore.js b/source/renderer/app/stores/AssetsStore.js index 4677f1aaeb..02d6a3e25c 100644 --- a/source/renderer/app/stores/AssetsStore.js +++ b/source/renderer/app/stores/AssetsStore.js @@ -8,6 +8,7 @@ import { requestGetter } from '../utils/storesUtils'; import type { GetAssetsResponse, WalletSummaryAsset, + AssetUniqueId, } from '../api/assets/types'; type WalletId = string; @@ -15,7 +16,8 @@ type WalletId = string; export default class AssetsStore extends Store { ASSETS_REFRESH_INTERVAL: number = 1 * 60 * 1000; // 1 minute | unit: milliseconds - @observable activeAssetFingerprint: ?string = null; + // @FINGERPRINT TODO + @observable activeAsset: ?AssetUniqueId = null; @observable editingsAsset: ?WalletSummaryAsset = null; @observable assetsRequests: { [key: WalletId]: Request, @@ -35,9 +37,8 @@ export default class AssetsStore extends Store { assetsActions.onAssetSettingsCancel.listen(this._onAssetSettingsCancel); walletsActions.refreshWalletsDataSuccess.once(this._refreshAssetsData); - walletsActions.setActiveAssetFingerprint.listen( - this._setActiveAssetFingerprint - ); + walletsActions.setActiveAsset.listen(this._setActiveAsset); + walletsActions.unsetActiveAsset.listen(this._unsetActiveAsset); } // ==================== PUBLIC ================== @@ -111,8 +112,12 @@ export default class AssetsStore extends Store { } }; - @action _setActiveAssetFingerprint = (params: { fingerprint: ?string }) => { - this.activeAssetFingerprint = params.fingerprint; + @action _setActiveAsset = (assetUniqueId: AssetUniqueId) => { + this.activeAsset = assetUniqueId; + }; + + @action _unsetActiveAsset = () => { + this.activeAsset = null; }; @action _createWalletAssetsRequest = ( diff --git a/storybook/stories/wallets/send/WalletSend.stories.js b/storybook/stories/wallets/send/WalletSend.stories.js index 66f3968223..c50bcada66 100644 --- a/storybook/stories/wallets/send/WalletSend.stories.js +++ b/storybook/stories/wallets/send/WalletSend.stories.js @@ -221,7 +221,7 @@ storiesOf('Wallets|Send', module) onExternalLinkClick={action('onExternalLinkClick')} hasAssets={boolean('hasAssets', false)} selectedAsset={null} - onUnsetActiveAssetFingerprint={() => {}} + onUnsetActiveAsset={() => {}} isAddressFromSameWallet={boolean('isAddressFromSameWallet', false)} /> )) @@ -245,7 +245,7 @@ storiesOf('Wallets|Send', module) onExternalLinkClick={action('onExternalLinkClick')} hasAssets={boolean('hasAssets', false)} selectedAsset={null} - onUnsetActiveAssetFingerprint={() => {}} + onUnsetActiveAsset={() => {}} isAddressFromSameWallet={boolean('isAddressFromSameWallet', false)} /> )) @@ -269,7 +269,7 @@ storiesOf('Wallets|Send', module) onExternalLinkClick={action('onExternalLinkClick')} hasAssets={boolean('hasAssets', false)} selectedAsset={null} - onUnsetActiveAssetFingerprint={() => {}} + onUnsetActiveAsset={() => {}} isAddressFromSameWallet={boolean('isAddressFromSameWallet', false)} /> )) @@ -293,7 +293,7 @@ storiesOf('Wallets|Send', module) onExternalLinkClick={action('onExternalLinkClick')} hasAssets={boolean('hasAssets', false)} selectedAsset={null} - onUnsetActiveAssetFingerprint={() => {}} + onUnsetActiveAsset={() => {}} isAddressFromSameWallet={boolean('isAddressFromSameWallet', false)} /> )) @@ -320,7 +320,7 @@ storiesOf('Wallets|Send', module) onExternalLinkClick={action('onExternalLinkClick')} hasAssets={boolean('hasAssets', true)} selectedAsset={null} - onUnsetActiveAssetFingerprint={() => {}} + onUnsetActiveAsset={() => {}} isAddressFromSameWallet={boolean('isAddressFromSameWallet', false)} /> )) From 57a1321367509dd2bbfd9b9524f50d387c1464eb Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Fri, 14 May 2021 15:45:04 -0300 Subject: [PATCH 04/16] [DDW-663] Include uniqueId to Asset domain --- source/renderer/app/api/assets/types.js | 1 + .../components/wallet/send-form/AssetInput.js | 9 +++++---- .../components/widgets/forms/AssetsDropdown.js | 2 +- source/renderer/app/domains/Asset.js | 16 +++++++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index d1b0fc98c1..f5366facd7 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -49,6 +49,7 @@ export type WalletAssets = { export type WalletSummaryAsset = { policyId: string, assetName: string, + uniqueId: string, fingerprint: string, quantity: BigNumber, metadata: ?AssetMetadata, diff --git a/source/renderer/app/components/wallet/send-form/AssetInput.js b/source/renderer/app/components/wallet/send-form/AssetInput.js index 5d3af7efe1..a05c421e11 100644 --- a/source/renderer/app/components/wallet/send-form/AssetInput.js +++ b/source/renderer/app/components/wallet/send-form/AssetInput.js @@ -204,10 +204,11 @@ export default class AssetInput extends Component { className={styles.assetsDropdown} {...assetsDropdownField.bind()} assets={sortedAssets} - onChange={(newFingerprint) => { - if (newFingerprint !== fingerprint) { - onChangeAsset(fingerprint, newFingerprint); - } + onChange={(newAsset) => { + console.log('AssetInput.js'); + console.log('asset', asset); + console.log('newAsset', newAsset); + return onChangeAsset(asset, newAsset); }} value={fingerprint} hasSearch diff --git a/source/renderer/app/components/widgets/forms/AssetsDropdown.js b/source/renderer/app/components/widgets/forms/AssetsDropdown.js index 164380fe78..aa025ca061 100644 --- a/source/renderer/app/components/widgets/forms/AssetsDropdown.js +++ b/source/renderer/app/components/widgets/forms/AssetsDropdown.js @@ -50,7 +50,7 @@ export default class AssetsDropdown extends Component { const { assets = [] } = this.props; const props = omit(this.props, ['wallets', 'options']); const formattedOptions = assets.map((asset) => { - const { fingerprint: value, metadata, quantity, decimals } = asset; + const { uniqueId: value, metadata, quantity, decimals } = asset; const detail = formattedTokenWalletAmount(quantity, metadata, decimals); return { label: ( diff --git a/source/renderer/app/domains/Asset.js b/source/renderer/app/domains/Asset.js index 93c3ac79ff..ac1950a622 100644 --- a/source/renderer/app/domains/Asset.js +++ b/source/renderer/app/domains/Asset.js @@ -15,26 +15,32 @@ export type AssetProps = { export default class Asset { @observable policyId: string = ''; @observable assetName: string = ''; + @observable uniqueId: string = ''; @observable fingerprint: string = ''; @observable metadata: ?AssetMetadata; @observable decimals: ?number; @observable recommendedDecimals: ?number; - constructor(data: AssetProps) { - Object.assign(this, data); + constructor(props: AssetProps) { + const { policyId, assetName } = props; + const uniqueId = policyId + assetName; + Object.assign(this, props, { uniqueId }); } - @action update(other: $Shape) { + @action update(props: $Shape) { + const { policyId, assetName } = props; + const uniqueId = policyId + assetName; Object.assign( this, - pick(other, [ + pick(props, [ 'policyId', 'assetName', 'fingerprint', 'metadata', 'decimals', 'recommendedDecimals', - ]) + ]), + { uniqueId } ); } } From 34aa0e6af2da1e7ddbcd4df8e512c976f316124a Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Fri, 14 May 2021 15:51:05 -0300 Subject: [PATCH 05/16] [DDW-663] Remove previous composed AssetUniqueId --- source/renderer/app/actions/wallets-actions.js | 4 ++-- source/renderer/app/api/assets/types.js | 5 ----- .../renderer/app/containers/wallet/WalletSendPage.js | 10 ++-------- .../app/containers/wallet/WalletSummaryPage.js | 6 +++--- source/renderer/app/stores/AssetsStore.js | 7 +++---- 5 files changed, 10 insertions(+), 22 deletions(-) diff --git a/source/renderer/app/actions/wallets-actions.js b/source/renderer/app/actions/wallets-actions.js index 872a23a21c..f5c80c8635 100644 --- a/source/renderer/app/actions/wallets-actions.js +++ b/source/renderer/app/actions/wallets-actions.js @@ -7,7 +7,7 @@ import type { } from '../../../common/types/hardware-wallets.types'; import type { CsvFileContent } from '../../../common/types/csv-request.types'; import type { QuitStakePoolRequest } from '../api/staking/types'; -import type { WalletSummaryAsset, AssetUniqueId } from '../api/assets/types'; +import type { WalletSummaryAsset } from '../api/assets/types'; export type WalletImportFromFileParams = { filePath: string, @@ -89,7 +89,7 @@ export default class WalletsActions { finishRewardsCsv: Action = new Action(); /* ---------- Transfer Funds ---------- */ - setActiveAsset: Action = new Action(); + setActiveAsset: Action = new Action(); unsetActiveAsset: Action = new Action(); transferFundsNextStep: Action = new Action(); transferFundsPrevStep: Action = new Action(); diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index f5366facd7..1bf9082423 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -81,8 +81,3 @@ export type GetAssetsResponse = { assets: Array, total: number, }; - -export type AssetUniqueId = { - policyId: string, - assetName: string, -}; diff --git a/source/renderer/app/containers/wallet/WalletSendPage.js b/source/renderer/app/containers/wallet/WalletSendPage.js index d81a99feda..db187d758e 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.js +++ b/source/renderer/app/containers/wallet/WalletSendPage.js @@ -14,7 +14,6 @@ import Asset from '../../domains/Asset'; import type { AssetItems, WalletTransactionAsset, - AssetUniqueId, } from '../../api/assets/types'; type Props = InjectedProps; @@ -82,13 +81,8 @@ export default class WalletSendPage extends Component { } }; - getAssetByUniqueId = ( - { policyId, assetName }: AssetUniqueId, - allAssets: Array - ) => { - return allAssets.find( - (asset) => asset.policyId === policyId && asset.assetName === assetName - ); + getAssetByUniqueId = (uniqueId: string, allAssets: Array) => { + return allAssets.find((asset) => asset.uniqueId === uniqueId); }; render() { diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.js b/source/renderer/app/containers/wallet/WalletSummaryPage.js index 0e30588c86..f22e6443b7 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.js +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.js @@ -14,7 +14,7 @@ import { getNetworkExplorerUrlByType } from '../../utils/network'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import { ellipsis } from '../../utils/strings'; import type { InjectedProps } from '../../types/injectedPropsType'; -import type { WalletSummaryAsset, AssetUniqueId } from '../../api/assets/types'; +import type { WalletSummaryAsset } from '../../api/assets/types'; export const messages = defineMessages({ noTransactions: { @@ -49,14 +49,14 @@ export default class WalletSummaryPage extends Component { }); }; - handleOpenAssetSend = (asset: WalletSummaryAsset) => { + handleOpenAssetSend = ({ uniqueId }: WalletSummaryAsset) => { const { stores } = this.props; const { wallets } = stores; const { active } = wallets; if (active) { const { id } = active; const { wallets: walletActions, router } = this.props.actions; - walletActions.setActiveAsset.trigger(asset); + walletActions.setActiveAsset.trigger(uniqueId); router.goToRoute.trigger({ route: ROUTES.WALLETS.PAGE, params: { id, page: 'send' }, diff --git a/source/renderer/app/stores/AssetsStore.js b/source/renderer/app/stores/AssetsStore.js index 02d6a3e25c..17e17e6606 100644 --- a/source/renderer/app/stores/AssetsStore.js +++ b/source/renderer/app/stores/AssetsStore.js @@ -8,7 +8,6 @@ import { requestGetter } from '../utils/storesUtils'; import type { GetAssetsResponse, WalletSummaryAsset, - AssetUniqueId, } from '../api/assets/types'; type WalletId = string; @@ -17,7 +16,7 @@ export default class AssetsStore extends Store { ASSETS_REFRESH_INTERVAL: number = 1 * 60 * 1000; // 1 minute | unit: milliseconds // @FINGERPRINT TODO - @observable activeAsset: ?AssetUniqueId = null; + @observable activeAsset: ?string = null; @observable editingsAsset: ?WalletSummaryAsset = null; @observable assetsRequests: { [key: WalletId]: Request, @@ -112,8 +111,8 @@ export default class AssetsStore extends Store { } }; - @action _setActiveAsset = (assetUniqueId: AssetUniqueId) => { - this.activeAsset = assetUniqueId; + @action _setActiveAsset = (uniqueId: string) => { + this.activeAsset = uniqueId; }; @action _unsetActiveAsset = () => { From 88530c727acd97d8357c144a9e11bc03ead85c76 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Fri, 14 May 2021 18:55:13 -0300 Subject: [PATCH 06/16] [DDW-663] Organize Assets types and naming --- source/renderer/app/actions/assets-actions.js | 6 +- .../renderer/app/actions/wallets-actions.js | 4 +- source/renderer/app/api/assets/types.js | 64 +++---- source/renderer/app/api/transactions/types.js | 14 +- source/renderer/app/api/wallets/types.js | 6 +- .../components/assets/AssetSettingsDialog.js | 4 +- .../app/components/assets/AssetToken.js | 4 +- .../app/components/wallet/WalletSendForm.js | 178 ++++++++---------- .../components/wallet/send-form/AssetInput.js | 47 +++-- .../WalletSendAssetsConfirmationDialog.js | 10 +- .../wallet/summary/WalletSummary.js | 4 +- .../wallet/summary/WalletSummaryAssets.js | 14 +- .../wallet/transactions/Transaction.js | 15 +- .../wallet/transactions/WalletTransactions.js | 6 +- .../transactions/WalletTransactionsList.js | 13 +- .../widgets/forms/AssetsDropdown.js | 4 +- .../assets/AssetSettingsDialogContainer.js | 4 +- .../app/containers/wallet/WalletSendPage.js | 37 +--- .../containers/wallet/WalletSummaryPage.js | 12 +- .../wallet/WalletTransactionsPage.js | 4 +- .../WalletSendConfirmationDialogContainer.js | 4 +- source/renderer/app/domains/Asset.js | 11 +- source/renderer/app/domains/Wallet.js | 6 +- .../renderer/app/domains/WalletTransaction.js | 6 +- source/renderer/app/stores/AssetsStore.js | 20 +- .../renderer/app/stores/TransactionsStore.js | 8 +- source/renderer/app/stores/WalletsStore.js | 4 +- source/renderer/app/utils/assets.js | 72 +++---- .../app/utils/transactionsCsvGenerator.js | 9 +- storybook/stories/_support/utils.js | 18 +- .../assets/AssetSettingsDialog.stories.js | 2 + .../stories/assets/AssetToken.stories.js | 73 +++---- .../stories/common/ItemsDropdown.stories.js | 10 +- .../wallets/send/WalletSend.stories.js | 34 ++-- .../wallets/summary/WalletSummary.stories.js | 1 + .../transactions/Transaction.stories.js | 17 +- .../transactions/TransactionsList.stories.js | 6 +- 37 files changed, 360 insertions(+), 391 deletions(-) diff --git a/source/renderer/app/actions/assets-actions.js b/source/renderer/app/actions/assets-actions.js index 51da94371b..9894f94e8d 100644 --- a/source/renderer/app/actions/assets-actions.js +++ b/source/renderer/app/actions/assets-actions.js @@ -1,13 +1,13 @@ // @flow import Action from './lib/Action'; -import type { WalletSummaryAsset } from '../api/assets/types'; +import type { AssetTokenProps } from '../api/assets/types'; // ======= ASSETS ACTIONS ======= export default class AssetsActions { - onAssetSettingsOpen: Action<{ asset: WalletSummaryAsset }> = new Action(); + onAssetSettingsOpen: Action<{ asset: AssetTokenProps }> = new Action(); onAssetSettingsSubmit: Action<{ - asset: WalletSummaryAsset, + asset: AssetTokenProps, decimals: number, }> = new Action(); onAssetSettingsCancel: Action = new Action(); diff --git a/source/renderer/app/actions/wallets-actions.js b/source/renderer/app/actions/wallets-actions.js index f5c80c8635..fc8130ed1e 100644 --- a/source/renderer/app/actions/wallets-actions.js +++ b/source/renderer/app/actions/wallets-actions.js @@ -7,7 +7,7 @@ import type { } from '../../../common/types/hardware-wallets.types'; import type { CsvFileContent } from '../../../common/types/csv-request.types'; import type { QuitStakePoolRequest } from '../api/staking/types'; -import type { WalletSummaryAsset } from '../api/assets/types'; +import type { AssetTokenProps } from '../api/assets/types'; export type WalletImportFromFileParams = { filePath: string, @@ -55,7 +55,7 @@ export default class WalletsActions { receiver: string, amount: string, passphrase: string, - assets?: Array, + assets?: Array, assetsAmounts?: Array, }> = new Action(); chooseWalletExportType: Action<{ diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 1bf9082423..6073c5b387 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -2,7 +2,9 @@ import BigNumber from 'bignumber.js'; import Asset from '../../domains/Asset'; +import type { AssetDomainProps } from '../../domains/Asset'; +export type Assets = Array; export type ApiAsset = { policy_id: string, asset_name: string, @@ -10,62 +12,42 @@ export type ApiAsset = { metadata?: ?AssetMetadata, }; -export type AssetMetadata = { - name: string, - ticker: string, - description: string, - unit?: { - decimals: number, - name: string, - }, - url?: string, - logo?: string, -}; - -export type AssetItem = { +export type ApiToken = { policy_id: string, asset_name: string, quantity: number, + address?: ?string, }; +export type ApiTokens = Array; -export type WalletAssetItem = { +export type Token = { policyId: string, assetName: string, quantity: BigNumber, address?: ?string, }; +export type Tokens = Array; -export type Assets = Array; - -export type AssetItems = Array; - -export type WalletAssetItems = Array; - -export type WalletAssets = { - available: WalletAssetItems, - total: WalletAssetItems, +export type WalletTokens = { + available: Tokens, + total: Tokens, }; -export type WalletSummaryAsset = { - policyId: string, - assetName: string, - uniqueId: string, - fingerprint: string, - quantity: BigNumber, - metadata: ?AssetMetadata, - decimals: ?number, - recommendedDecimals: ?number, +export type AssetTokenProps = { + ...$Exact, + ...$Exact, }; -export type WalletTransactionAsset = { - policyId: string, - assetName: string, - quantity: BigNumber, - fingerprint: string, - metadata: ?AssetMetadata, - address?: ?string, - decimals: ?number, - recommendedDecimals: ?number, +export type AssetMetadata = { + name: string, + ticker: string, + description: string, + unit?: { + decimals: number, + name: string, + }, + url?: string, + logo?: string, }; export type GetUnknownAssetRequest = { diff --git a/source/renderer/app/api/transactions/types.js b/source/renderer/app/api/transactions/types.js index ce54234d4a..4fbe2dbae4 100644 --- a/source/renderer/app/api/transactions/types.js +++ b/source/renderer/app/api/transactions/types.js @@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js'; import { WalletTransaction } from '../../domains/WalletTransaction'; import { WalletUnits } from '../../domains/Wallet'; import type { DelegationAction } from '../../types/stakingTypes'; -import type { AssetItems } from '../assets/types'; +import type { ApiTokens, Tokens } from '../assets/types'; import type { TransactionMetadata } from '../../types/TransactionMetadata'; export type TransactionAmount = { @@ -60,7 +60,7 @@ export type Transactions = Array; export type TransactionInputs = { address: string, amount?: TransactionAmount, - assets?: AssetItems, + assets?: ApiTokens, id: string, index: number, }; @@ -68,7 +68,7 @@ export type TransactionInputs = { export type TransactionOutputs = { address: string, amount: TransactionAmount, - assets?: AssetItems, + assets?: ApiTokens, }; export type TransactionWithdrawals = { @@ -114,7 +114,7 @@ export type GetTransactionFeeRequest = { walletId: string, address: string, amount: number, - assets?: AssetItems, + assets?: ApiTokens, walletBalance: BigNumber, availableBalance: BigNumber, rewardsBalance: BigNumber, @@ -133,7 +133,7 @@ export type CreateTransactionRequest = { amount: number, passphrase: string, isLegacy: boolean, - assets?: AssetItems, + assets?: ApiTokens, withdrawal?: 'self' | Array, }; @@ -171,7 +171,7 @@ export type GetTransactionFeeParams = { export type TransactionPaymentData = { address: string, amount: TransactionFeeAmount, - assets?: AssetItems, + assets?: ApiTokens, }; export type TransactionFee = { @@ -238,7 +238,7 @@ export type CoinSelectionsPaymentRequestType = { walletId: string, address: string, amount: number, - assets?: AssetItems, + assets?: ApiTokens, }; export type CoinSelectionsRequest = diff --git a/source/renderer/app/api/wallets/types.js b/source/renderer/app/api/wallets/types.js index 169a1222bb..041ccf937a 100644 --- a/source/renderer/app/api/wallets/types.js +++ b/source/renderer/app/api/wallets/types.js @@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js'; import { WalletUnits } from '../../domains/Wallet'; import type { ExportedByronWallet } from '../../types/walletExportTypes'; import type { Currency, LocalizedCurrency } from '../../types/currencyTypes'; -import type { AssetItems } from '../assets/types'; +import type { ApiTokens } from '../assets/types'; export type Block = { slot_number: number, @@ -41,8 +41,8 @@ export type AdaWallet = { reward: WalletBalance, }, assets: { - available: AssetItems, - total: AssetItems, + available: ApiTokens, + total: ApiTokens, }, delegation: { active: WalletDelegation, diff --git a/source/renderer/app/components/assets/AssetSettingsDialog.js b/source/renderer/app/components/assets/AssetSettingsDialog.js index 7f7675a285..cb80b549e5 100644 --- a/source/renderer/app/components/assets/AssetSettingsDialog.js +++ b/source/renderer/app/components/assets/AssetSettingsDialog.js @@ -11,7 +11,7 @@ import DialogCloseButton from '../widgets/DialogCloseButton'; import Dialog from '../widgets/Dialog'; import styles from './AssetSettingsDialog.scss'; import globalMessages from '../../i18n/global-messages'; -import type { WalletSummaryAsset } from '../../api/assets/types'; +import type { AssetTokenProps } from '../../api/assets/types'; import { formattedTokenWalletAmount } from '../../utils/formatters'; import warningIcon from '../../assets/images/asset-token-warning-ic.inline.svg'; import { @@ -71,7 +71,7 @@ const messages = defineMessages({ }); type Props = { - asset: WalletSummaryAsset, + asset: AssetTokenProps, onSubmit: Function, onCancel: Function, }; diff --git a/source/renderer/app/components/assets/AssetToken.js b/source/renderer/app/components/assets/AssetToken.js index 9f6469639d..849d594ad5 100644 --- a/source/renderer/app/components/assets/AssetToken.js +++ b/source/renderer/app/components/assets/AssetToken.js @@ -8,7 +8,7 @@ import CopyToClipboard from 'react-copy-to-clipboard'; import { observer } from 'mobx-react'; import styles from './AssetToken.scss'; import { ellipsis, hexToString } from '../../utils/strings'; -import type { WalletSummaryAsset } from '../../api/assets/types'; +import type { AssetTokenProps } from '../../api/assets/types'; import copyIcon from '../../assets/images/copy-asset.inline.svg'; import settingsIcon from '../../assets/images/asset-token-settings-ic.inline.svg'; import warningIcon from '../../assets/images/asset-token-warning-ic.inline.svg'; @@ -75,7 +75,7 @@ const messages = defineMessages({ }); type Props = { - asset: WalletSummaryAsset, + asset: AssetTokenProps, small?: boolean, hidePopOver?: boolean, onCopyAssetItem?: Function, diff --git a/source/renderer/app/components/wallet/WalletSendForm.js b/source/renderer/app/components/wallet/WalletSendForm.js index ded91d399a..d0ac4f9a0c 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.js +++ b/source/renderer/app/components/wallet/WalletSendForm.js @@ -21,7 +21,6 @@ import questionMarkIcon from '../../assets/images/question-mark.inline.svg'; import closeIcon from '../../assets/images/close-cross.inline.svg'; import globalMessages from '../../i18n/global-messages'; import messages from './send-form/messages'; -/* eslint-disable consistent-return */ import { messages as apiErrorMessages } from '../../api/errors'; import ReactToolboxMobxForm from '../../utils/ReactToolboxMobxForm'; import { submitOnEnter } from '../../utils/form'; @@ -39,7 +38,7 @@ import WalletSendConfirmationDialogContainer from '../../containers/wallet/dialo import styles from './WalletSendForm.scss'; import Asset from '../../domains/Asset'; import type { HwDeviceStatus } from '../../domains/Wallet'; -import type { AssetItems, WalletSummaryAsset } from '../../api/assets/types'; +import type { AssetTokenProps, ApiTokens } from '../../api/assets/types'; messages.fieldIsRequired = globalMessages.fieldIsRequired; @@ -48,15 +47,11 @@ type Props = { currencyMaxIntegerDigits: number, currencyMaxFractionalDigits: number, currentNumberFormat: string, - calculateTransactionFee: ( - address: string, - amount: number, - assets: AssetItems - ) => Promise, + calculateTransactionFee: Function, walletAmount: BigNumber, validateAmount: (amountInNaturalUnits: string) => Promise, addressValidator: Function, - assets: Array, + assets: Array, hasAssets: boolean, selectedAsset: ?Asset, isLoadingAssets: boolean, @@ -75,13 +70,11 @@ type State = { receiver: { receiver: Field, adaAmount: Field, - // @FINGERPRINT TODO assetFields: { - [fingerprint: string]: Field, + [uniqueId: string]: Field, }, - // @FINGERPRINT TODO assetsDropdown: { - [fingerprint: string]: Field, + [uniqueId: string]: Field, }, }, }, @@ -89,9 +82,8 @@ type State = { feeCalculationRequestQue: number, transactionFee: BigNumber, transactionFeeError: ?string | ?Node, - // @FINGERPRINT TODO - showRemoveAssetButton: { [fingerprint: string]: boolean }, - selectedAssetFingerprints: Array, + showRemoveAssetButton: { [uniqueId: string]: boolean }, + selectedAssetUniqueIds: Array, isResetButtonDisabled: boolean, isReceiverAddressValid: boolean, isTransactionFeeCalculated: boolean, @@ -110,8 +102,7 @@ export default class WalletSendForm extends Component { transactionFee: new BigNumber(0), transactionFeeError: null, showRemoveAssetButton: {}, - // @FINGERPRINT TODO - selectedAssetFingerprints: [], + selectedAssetUniqueIds: [], isResetButtonDisabled: true, isReceiverAddressValid: false, isTransactionFeeCalculated: false, @@ -140,8 +131,7 @@ export default class WalletSendForm extends Component { if (selectedAsset) { setTimeout(() => { if (this._isMounted) { - // @FINGERPRINT TODO - this.addAssetRow(selectedAsset.fingerprint); + this.addAssetRow(selectedAsset.uniqueId); } }); } @@ -149,7 +139,6 @@ export default class WalletSendForm extends Component { componentWillUnmount() { this._isMounted = false; - // @FINGERPRINT TODO this.props.onUnsetActiveAsset(); } @@ -157,29 +146,28 @@ export default class WalletSendForm extends Component { return NUMBER_FORMATS[this.props.currentNumberFormat]; } - // @FINGERPRINT TODO - get selectedAssets(): Array { - const { selectedAssetFingerprints } = this.state; + get selectedAssets(): Array { + const { selectedAssetUniqueIds } = this.state; const { assets: allAssets } = this.props; - return map(selectedAssetFingerprints, (fingerprint) => - allAssets.find((asset) => asset.fingerprint === fingerprint) + return map(selectedAssetUniqueIds, (uniqueId) => + allAssets.find((asset) => asset.uniqueId === uniqueId) ); } get selectedAssetsAmounts(): Array { - const { selectedAssetFingerprints, formFields } = this.state; + const { selectedAssetUniqueIds, formFields } = this.state; const assetFields = get(formFields, 'receiver.assetFields'); - return map(selectedAssetFingerprints, (fingerprint) => - formattedAmountToNaturalUnits(assetFields[fingerprint].value) + return map(selectedAssetUniqueIds, (uniqueId) => + formattedAmountToNaturalUnits(assetFields[uniqueId].value) ); } - get availableAssets(): Array { + get availableAssets(): Array { const { assets: allAssets } = this.props; - const { selectedAssetFingerprints } = this.state; + const { selectedAssetUniqueIds } = this.state; return filter( allAssets, - ({ fingerprint }) => !selectedAssetFingerprints.includes(fingerprint) + ({ uniqueId }) => !selectedAssetUniqueIds.includes(uniqueId) ); } @@ -187,13 +175,13 @@ export default class WalletSendForm extends Component { return this.availableAssets.length > 0; } - getAssetByFingerprint = (fingerprint: string): ?WalletSummaryAsset => { + getAssetByUniqueId = (uniqueId: string): ?AssetTokenProps => { const { assets: allAssets } = this.props; - return allAssets.find((asset) => asset.fingerprint === fingerprint); + return allAssets.find((asset) => asset.uniqueId === uniqueId); }; focusableFields: { - [fingerprint: string]: Field, + [uniqueId: string]: Field, } = {}; addFocusableField = (field: ?Field) => { @@ -215,7 +203,7 @@ export default class WalletSendForm extends Component { handleOnSubmit = () => { if (this.isDisabled()) { - return false; + return; } this.props.onOpenDialogAction({ dialog: WalletSendAssetsConfirmationDialog, @@ -265,13 +253,13 @@ export default class WalletSendForm extends Component { this.resetTransactionFee(); }; - updateFormFields = (resetFormFields: boolean, fingerprint?: string) => { + updateFormFields = (resetFormFields: boolean, uniqueId?: string) => { const formFields = this.form.fields; const receiverField = formFields.get('receiver'); const adaAmountField = formFields.get('adaAmount'); if (resetFormFields) { this.setState({ - selectedAssetFingerprints: [], + selectedAssetUniqueIds: [], formFields: { receiver: { receiver: receiverField, @@ -281,17 +269,15 @@ export default class WalletSendForm extends Component { }, }, }); - } else if (fingerprint) { + } else if (uniqueId) { const { assetFields, assetsDropdown } = this.state.formFields.receiver; - const assetField = formFields.get(`asset_${fingerprint}`); + const assetField = formFields.get(`asset_${uniqueId}`); if (assetField) { - assetFields[fingerprint] = assetField; + assetFields[uniqueId] = assetField; } - const assetsDropdownField = formFields.get( - `assetsDropdown_${fingerprint}` - ); + const assetsDropdownField = formFields.get(`assetsDropdown_${uniqueId}`); if (assetsDropdownField) { - assetsDropdown[fingerprint] = assetsDropdownField; + assetsDropdown[uniqueId] = assetsDropdownField; } this.setState((prevState) => ({ formFields: { @@ -437,14 +423,14 @@ export default class WalletSendForm extends Component { ); if (!form.isValid || hasEmptyAssetFields) { form.showErrors(true); - return false; + return; } const receiverField = form.$('receiver'); const receiver = receiverField.value; const adaAmountField = form.$('adaAmount'); const adaAmount = formattedAmountToLovelace(adaAmountField.value); - const assets = filter( + const assets: ApiTokens = filter( this.selectedAssets.map(({ policyId, assetName }, index) => { const quantity = new BigNumber(this.selectedAssetsAmounts[index]); return { @@ -457,7 +443,7 @@ export default class WalletSendForm extends Component { ); const { - selectedAssetFingerprints, + selectedAssetUniqueIds, feeCalculationRequestQue: prevFeeCalculationRequestQue, } = this.state; this.setState((prevState) => ({ @@ -505,7 +491,7 @@ export default class WalletSendForm extends Component { if (error.id === 'api.errors.utxoTooSmall') { const minimumAda = get(error, 'values.minimumAda'); if (minimumAda && !Number.isNaN(Number(minimumAda))) { - localizableError = selectedAssetFingerprints.length + localizableError = selectedAssetUniqueIds.length ? messages.minAdaRequiredWithAssetTooltip : messages.minAdaRequiredWithNoAssetTooltip; values = { minimumAda }; @@ -547,44 +533,41 @@ export default class WalletSendForm extends Component { } } - showRemoveAssetButton = (fingerprint: string) => { + showRemoveAssetButton = (uniqueId: string) => { const { showRemoveAssetButton } = this.state; - showRemoveAssetButton[fingerprint] = true; + showRemoveAssetButton[uniqueId] = true; this.setState({ showRemoveAssetButton, }); }; - hideRemoveAssetButton = (fingerprint: string) => { + hideRemoveAssetButton = (uniqueId: string) => { const { showRemoveAssetButton } = this.state; - showRemoveAssetButton[fingerprint] = false; + showRemoveAssetButton[uniqueId] = false; this.setState({ showRemoveAssetButton, }); }; - addAssetRow = (fingerprint: string) => { - this.addAssetFields(fingerprint); - this.updateFormFields(false, fingerprint); - const { selectedAssetFingerprints } = this.state; - selectedAssetFingerprints.push(fingerprint); + addAssetRow = (uniqueId: string) => { + this.addAssetFields(uniqueId); + this.updateFormFields(false, uniqueId); + const { selectedAssetUniqueIds } = this.state; + selectedAssetUniqueIds.push(uniqueId); this.setState({ - selectedAssetFingerprints, + selectedAssetUniqueIds, }); this.resetTransactionFee(); this._isAutoFocusEnabled = true; }; - removeAssetRow = (fingerprint: string) => { - const { formFields, selectedAssetFingerprints } = this.state; + removeAssetRow = (uniqueId: string) => { + const { formFields, selectedAssetUniqueIds } = this.state; const { receiver } = formFields; - const assetFields = omit(receiver.assetFields, fingerprint); - const assetsDropdown = omit(receiver.assetsDropdown, fingerprint); + const assetFields = omit(receiver.assetFields, uniqueId); + const assetsDropdown = omit(receiver.assetsDropdown, uniqueId); this.setState({ - selectedAssetFingerprints: without( - selectedAssetFingerprints, - fingerprint - ), + selectedAssetUniqueIds: without(selectedAssetUniqueIds, uniqueId), formFields: { ...formFields, receiver: { @@ -594,14 +577,14 @@ export default class WalletSendForm extends Component { }, }, }); - this.removeAssetFields(fingerprint); + this.removeAssetFields(uniqueId); setTimeout(() => { this.calculateTransactionFee(); }); }; - addAssetFields = (fingerprint: string) => { - const newAsset = `asset_${fingerprint}`; + addAssetFields = (uniqueId: string) => { + const newAsset = `asset_${uniqueId}`; this.form.add({ name: newAsset, value: null, key: newAsset }); this.form .$(newAsset) @@ -628,7 +611,7 @@ export default class WalletSendForm extends Component { const isValidAmount = await this.props.validateAmount( formattedAmountToNaturalUnits(amountValue) ); - const asset = this.getAssetByFingerprint(fingerprint); + const asset = this.getAssetByUniqueId(uniqueId); if (!asset) { return false; } @@ -651,7 +634,7 @@ export default class WalletSendForm extends Component { }, ]); - const assetsDropdown = `assetsDropdown_${fingerprint}`; + const assetsDropdown = `assetsDropdown_${uniqueId}`; this.form.add({ name: assetsDropdown, value: null, @@ -660,31 +643,32 @@ export default class WalletSendForm extends Component { this.form.$(assetsDropdown).set('type', 'select'); }; - removeAssetFields = (fingerprint: string) => { - const assetFieldToDelete = `asset_${fingerprint}`; + removeAssetFields = (uniqueId: string) => { + const assetFieldToDelete = `asset_${uniqueId}`; this.form.del(assetFieldToDelete); - const assetsDropdownFieldToDelete = `assetsDropdown_${fingerprint}`; + const assetsDropdownFieldToDelete = `assetsDropdown_${uniqueId}`; this.form.del(assetsDropdownFieldToDelete); }; - onChangeAsset = (oldFingerprint: string, newFingerprint: string) => { - this.addAssetFields(newFingerprint); - this.updateFormFields(false, newFingerprint); - let { selectedAssetFingerprints } = this.state; - const index = indexOf(selectedAssetFingerprints, oldFingerprint); + onChangeAsset = (currentUniqueId: string, newUniqueId: string) => { + if (currentUniqueId === newUniqueId) return; + this.addAssetFields(newUniqueId); + this.updateFormFields(false, newUniqueId); + let { selectedAssetUniqueIds } = this.state; + const index = indexOf(selectedAssetUniqueIds, currentUniqueId); if (index > -1) { - selectedAssetFingerprints = selectedAssetFingerprints.splice( + selectedAssetUniqueIds = selectedAssetUniqueIds.splice( index, 1, - newFingerprint + newUniqueId ); } else { - selectedAssetFingerprints.push(newFingerprint); + selectedAssetUniqueIds.push(newUniqueId); } this.setState({ - selectedAssetFingerprints, + selectedAssetUniqueIds, }); - this.removeAssetRow(oldFingerprint); + this.removeAssetRow(currentUniqueId); this.resetTransactionFee(); }; @@ -694,7 +678,7 @@ export default class WalletSendForm extends Component { formFields, minimumAda, transactionFeeError, - selectedAssetFingerprints, + selectedAssetUniqueIds, isReceiverAddressValid, } = this.state; const { currencyMaxFractionalDigits, walletAmount } = this.props; @@ -707,9 +691,9 @@ export default class WalletSendForm extends Component { } = formFields.receiver; const assetsSeparatorBasicHeight = 140; - const assetsSeparatorCalculatedHeight = selectedAssetFingerprints.length - ? assetsSeparatorBasicHeight * (selectedAssetFingerprints.length + 1) - - 40 * selectedAssetFingerprints.length + const assetsSeparatorCalculatedHeight = selectedAssetUniqueIds.length + ? assetsSeparatorBasicHeight * (selectedAssetUniqueIds.length + 1) - + 40 * selectedAssetUniqueIds.length : assetsSeparatorBasicHeight; const minimumAdaValue = minimumAda.isZero() @@ -727,7 +711,7 @@ export default class WalletSendForm extends Component { this.isAddressFromSameWallet() ? styles.sameRecieverInput : null, ]); - const minAdaRequiredTooltip = selectedAssetFingerprints.length + const minAdaRequiredTooltip = selectedAssetUniqueIds.length ? messages.minAdaRequiredWithAssetTooltip : messages.minAdaRequiredWithNoAssetTooltip; @@ -846,13 +830,13 @@ export default class WalletSendForm extends Component { - {selectedAssetFingerprints.map( - (fingerprint: string, index: number) => ( + {selectedAssetUniqueIds.map( + (uniqueId: string, index: number) => ( { removeAssetRow={this.removeAssetRow} handleSubmitOnEnter={this.handleSubmitOnEnter} clearAssetFieldValue={this.clearAssetFieldValue} - onChangeAsset={this.onChangeAsset} + onChangeAsset={(newUniqueId) => + this.onChangeAsset(uniqueId, newUniqueId) + } autoFocus={this._isAutoFocusEnabled} /> ) @@ -877,7 +863,7 @@ export default class WalletSendForm extends Component { label={intl.formatMessage(messages.addAssetButtonLabel)} disabled={!this.hasAvailableAssets} onClick={() => { - this.addAssetRow(this.availableAssets[0].fingerprint); + this.addAssetRow(this.availableAssets[0].uniqueId); }} /> diff --git a/source/renderer/app/components/wallet/send-form/AssetInput.js b/source/renderer/app/components/wallet/send-form/AssetInput.js index a05c421e11..d635720990 100644 --- a/source/renderer/app/components/wallet/send-form/AssetInput.js +++ b/source/renderer/app/components/wallet/send-form/AssetInput.js @@ -13,23 +13,23 @@ import AssetsDropdown from '../../widgets/forms/AssetsDropdown'; import closeIcon from '../../../assets/images/close-cross.inline.svg'; import { formattedTokenWalletAmount } from '../../../utils/formatters'; import type { NumberFormat } from '../../../../../common/types/number.types'; -import type { WalletSummaryAsset } from '../../../api/assets/types'; +import type { AssetTokenProps } from '../../../api/assets/types'; import styles from './AssetInput.scss'; import messages from './messages'; type Props = { - fingerprint: string, + uniqueId: string, index: number, - getAssetByFingerprint: Function, - availableAssets: Array, + getAssetByUniqueId: Function, + availableAssets: Array, assetFields: { - [fingerprint: string]: Field, + [uniqueId: string]: Field, }, assetsDropdown: { - [fingerprint: string]: Field, + [uniqueId: string]: Field, }, addFocusableField: Function, - removeAssetButtonVisible: { [fingerprint: string]: boolean }, + removeAssetButtonVisible: { [uniqueId: string]: boolean }, showRemoveAssetButton: Function, hideRemoveAssetButton: Function, currentNumberFormat: NumberFormat, @@ -77,9 +77,9 @@ export default class AssetInput extends Component { render() { const { intl } = this.context; const { - fingerprint, + uniqueId, index, - getAssetByFingerprint, + getAssetByUniqueId, availableAssets, assetFields, assetsDropdown, @@ -94,7 +94,7 @@ export default class AssetInput extends Component { onChangeAsset, autoFocus, } = this.props; - const asset = getAssetByFingerprint(fingerprint); + const asset = getAssetByUniqueId(uniqueId); if (!asset) { return false; } @@ -103,19 +103,19 @@ export default class AssetInput extends Component { const ticker = get(metadata, 'ticker', null); const sortedAssets = orderBy( [asset, ...availableAssets], - 'fingerprint', + 'uniqueId', 'asc' ); - const assetField = assetFields[fingerprint]; - const assetsDropdownField = assetsDropdown[fingerprint]; + const assetField = assetFields[uniqueId]; + const assetsDropdownField = assetsDropdown[uniqueId]; const inputFieldStyle = this.generateInputFieldStyle(); return (
showRemoveAssetButton(fingerprint)} - onMouseLeave={() => hideRemoveAssetButton(fingerprint)} - onMouseEnter={() => showRemoveAssetButton(fingerprint)} + key={`receiver_asset_${uniqueId}`} + onMouseOver={() => showRemoveAssetButton(uniqueId)} + onMouseLeave={() => hideRemoveAssetButton(uniqueId)} + onMouseEnter={() => showRemoveAssetButton(uniqueId)} onFocus={() => { // jsx-a11y/mouse-events-have-key-events }} @@ -142,10 +142,10 @@ export default class AssetInput extends Component { label={ <> {`${intl.formatMessage(messages.assetLabel)} #${index + 1}`} - {removeAssetButtonVisible[fingerprint] && ( + {removeAssetButtonVisible[uniqueId] && ( removeAssetRow(fingerprint)} + onClick={() => removeAssetRow(uniqueId)} > {intl.formatMessage(messages.removeLabel)} @@ -204,13 +204,8 @@ export default class AssetInput extends Component { className={styles.assetsDropdown} {...assetsDropdownField.bind()} assets={sortedAssets} - onChange={(newAsset) => { - console.log('AssetInput.js'); - console.log('asset', asset); - console.log('newAsset', newAsset); - return onChangeAsset(asset, newAsset); - }} - value={fingerprint} + onChange={onChangeAsset} + value={uniqueId} hasSearch />
diff --git a/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js b/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js index 6879a6d668..4df3ef11c7 100644 --- a/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js +++ b/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js @@ -27,7 +27,7 @@ import LoadingSpinner from '../../widgets/LoadingSpinner'; import { HwDeviceStatuses } from '../../../domains/Wallet'; import AssetToken from '../../assets/AssetToken'; import type { HwDeviceStatus } from '../../../domains/Wallet'; -import type { WalletSummaryAsset } from '../../../api/assets/types'; +import type { AssetTokenProps } from '../../../api/assets/types'; const SHOW_TOTAL_AMOUNT = false; @@ -141,7 +141,7 @@ type Props = { amount: string, totalAmount: ?string, receiver: string, - assets: Array, + assets: Array, assetsAmounts: Array, transactionFee: ?string, onSubmit: Function, @@ -162,7 +162,7 @@ type Props = { }; type State = { - assets: Array, + assets: Array, assetsAmounts: Array, areTermsAccepted: boolean, }; @@ -314,7 +314,7 @@ export default class WalletSendAssetsConfirmationDialog extends Component< }; getFormattedAssetAmount = ( - { metadata, decimals }: WalletSummaryAsset, + { metadata, decimals }: AssetTokenProps, index: number ) => { const assetAmount = this.getAssetAmount(index); @@ -434,7 +434,7 @@ export default class WalletSendAssetsConfirmationDialog extends Component< assetIndex ); return ( - +

diff --git a/source/renderer/app/components/wallet/summary/WalletSummary.js b/source/renderer/app/components/wallet/summary/WalletSummary.js index e766741581..3a3f28841b 100644 --- a/source/renderer/app/components/wallet/summary/WalletSummary.js +++ b/source/renderer/app/components/wallet/summary/WalletSummary.js @@ -6,7 +6,7 @@ import type { Currency } from '../../../types/currencyTypes'; import WalletSummaryHeader from './WalletSummaryHeader'; import WalletSummaryAssets from './WalletSummaryAssets'; import WalletSummaryCurrency from './WalletSummaryCurrency'; -import type { WalletSummaryAsset } from '../../../api/assets/types'; +import type { AssetTokenProps } from '../../../api/assets/types'; import WalletSummaryNoTokens from './WalletSummaryNoTokens'; type Props = { @@ -21,7 +21,7 @@ type Props = { currencyRate: ?number, currencyLastFetched: ?Date, onCurrencySettingClick: Function, - assets: Array, + assets: Array, onOpenAssetSend: Function, onCopyAssetItem: Function, onAssetSettings: Function, diff --git a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js index 6c31a52cc4..4a5fa96eb1 100644 --- a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js +++ b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js @@ -9,7 +9,7 @@ import styles from './WalletSummaryAssets.scss'; import Wallet from '../../../domains/Wallet'; import AssetToken from '../../assets/AssetToken'; import AssetAmount from '../../assets/AssetAmount'; -import type { WalletSummaryAsset } from '../../../api/assets/types'; +import type { AssetTokenProps } from '../../../api/assets/types'; import LoadingSpinner from '../../widgets/LoadingSpinner'; const messages = defineMessages({ @@ -32,7 +32,7 @@ const messages = defineMessages({ type Props = { wallet: Wallet, - assets: Array, + assets: Array, onOpenAssetSend: Function, onCopyAssetItem: Function, onAssetSettings: Function, @@ -45,7 +45,7 @@ type State = { }; @observer -export default class WalletSummaryAssets extends Component { +export default class AssetTokens extends Component { static contextTypes = { intl: intlShape.isRequired, }; @@ -88,13 +88,13 @@ export default class WalletSummaryAssets extends Component {

) : (
- {assets.map((asset: WalletSummaryAsset, index: number) => ( + {assets.map((asset: AssetTokenProps, index: number) => ( - {asset.fingerprint && ( + {asset.uniqueId && (
{
)} - {asset.fingerprint && ( + {asset.uniqueId && (
diff --git a/storybook/stories/wallets/summary/WalletSummary.stories.js b/storybook/stories/wallets/summary/WalletSummary.stories.js index faf2f8b464..772d593f2d 100644 --- a/storybook/stories/wallets/summary/WalletSummary.stories.js +++ b/storybook/stories/wallets/summary/WalletSummary.stories.js @@ -134,6 +134,7 @@ const walletAssets = assets.total.map((assetTotal) => { return { policyId: assetTotal.policyId, assetName: assetTotal.assetName, + uniqueId: assetTotal.policyId + assetTotal.assetName, fingerprint, quantity: assetTotal.quantity, decimals: 0, diff --git a/storybook/stories/wallets/transactions/Transaction.stories.js b/storybook/stories/wallets/transactions/Transaction.stories.js index ded6c0bf56..b23a9aafe0 100644 --- a/storybook/stories/wallets/transactions/Transaction.stories.js +++ b/storybook/stories/wallets/transactions/Transaction.stories.js @@ -77,7 +77,7 @@ const assetsMetadata = [ }, ]; -const transactionAssets = [ +const transactionTokens = [ { policyId: generatePolicyIdHash(), assetName: '', @@ -126,19 +126,20 @@ storiesOf('Wallets|Transactions', module) }, 'incoming' ); - const assets = [ + const tokens = [ { - ...transactionAssets[0], + ...transactionTokens[0], quantity: new BigNumber(number('amount', 10, {}, 'First Asset')), }, - ...transactionAssets.slice(1), + ...transactionTokens.slice(1), ]; const decimals = number('decimals', 1, {}, 'First Asset'); const hasMetadata = boolean('hasMetadata', true, 'First Asset'); - const txAssets = assets.map((txAsset, index) => ({ - ...txAsset, + const assetTokens = tokens.map((token, index) => ({ + ...token, + uniqueId: token.policyId + token.assetName, decimals: 0, recommendedDecimals: null, metadata: @@ -178,7 +179,7 @@ storiesOf('Wallets|Transactions', module) deposit: new BigNumber(number('deposit', 1, {}, 'Transaction')).dividedBy( LOVELACES_PER_ADA ), - assets, + assets: tokens, date, description: '', addresses: { @@ -202,7 +203,7 @@ storiesOf('Wallets|Transactions', module) isLoadingAssets={boolean('isLoadingAssets', false)} currentTimeFormat="hh:mm:ss A" walletId={generateHash()} - txAssets={txAssets} + assetTokens={assetTokens} onShowMetadata={action('onShowMetadata')} getUrlByType={action('getUrlByType')} deletePendingTransaction={action('deletePendingTransaction')} diff --git a/storybook/stories/wallets/transactions/TransactionsList.stories.js b/storybook/stories/wallets/transactions/TransactionsList.stories.js index 3804bbbe6e..a9d68aba88 100644 --- a/storybook/stories/wallets/transactions/TransactionsList.stories.js +++ b/storybook/stories/wallets/transactions/TransactionsList.stories.js @@ -135,7 +135,7 @@ const assets = { ], }; -const getAssetDetails = (policyId: string, assetName: string): ?Asset => +const getAssetDomain = (policyId: string, assetName: string): ?Asset => assetDetails[policyId + assetName]; /* eslint-disable consistent-return */ @@ -202,7 +202,7 @@ storiesOf('Wallets|Transactions', module) totalAvailable={totalAvailable} transactions={transactions} hasAssetsEnabled={false} - getAssetDetails={getAssetDetails} + getAssetDomain={getAssetDomain} onCopyAssetItem={() => {}} /> ); @@ -244,7 +244,7 @@ storiesOf('Wallets|Transactions', module) totalAvailable={totalAvailable} transactions={transactions} hasAssetsEnabled={hasAssetsEnabled} - getAssetDetails={getAssetDetails} + getAssetDomain={getAssetDomain} onCopyAssetItem={() => {}} /> ); From 40c9eadf0e9b83a6614a3672b0a7f1a9f9ff0de0 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Fri, 14 May 2021 18:56:18 -0300 Subject: [PATCH 07/16] [DDW-663] Organize Assets types and naming --- source/renderer/app/api/api.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/renderer/app/api/api.js b/source/renderer/app/api/api.js index 0336ebb09a..3870dab538 100644 --- a/source/renderer/app/api/api.js +++ b/source/renderer/app/api/api.js @@ -2851,6 +2851,7 @@ const _createAssetFromServerData = action( fingerprint, metadata, } = data; + const uniqueId = policyId + assetName; const { decimals } = localData; const recommendedDecimals = ASSETS_PREDEFINED_DECIMALS[policyId + assetName]; @@ -2861,6 +2862,7 @@ const _createAssetFromServerData = action( metadata, decimals, recommendedDecimals, + uniqueId, }); } ); From d63fc8516ece8e0e6c693dd49b031aa692805629 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Mon, 17 May 2021 12:46:30 -0300 Subject: [PATCH 08/16] [DDW-663] Better documentation --- source/renderer/app/api/assets/types.js | 31 +++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 6073c5b387..b85ee52a49 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -4,6 +4,17 @@ import BigNumber from 'bignumber.js'; import Asset from '../../domains/Asset'; import type { AssetDomainProps } from '../../domains/Asset'; +/** + * + * ASSET + * Fetched from the Assets API endpoint + * It's not attached to a particular wallet or transaction + * Therefore, it doesn't have `quantity` nor `address` + * + * Exclusive data: fingerprint, metadata + * Missing data: quantity, address + * + */ export type Assets = Array; export type ApiAsset = { policy_id: string, @@ -12,6 +23,16 @@ export type ApiAsset = { metadata?: ?AssetMetadata, }; +/** + * + * TOKEN + * Asset that is attached to a particular wallet and/or transaction + * It doesn't have the Asset details (fingerprint, metadata) + * + * Exclusive data: quantity, address + * Missing data: fingerprint, metadata + * + */ export type ApiToken = { policy_id: string, asset_name: string, @@ -19,7 +40,6 @@ export type ApiToken = { address?: ?string, }; export type ApiTokens = Array; - export type Token = { policyId: string, assetName: string, @@ -27,12 +47,19 @@ export type Token = { address?: ?string, }; export type Tokens = Array; - export type WalletTokens = { available: Tokens, total: Tokens, }; +/** + * + * ASSET TOKEN + * Merged object from a Token and its relative Asset details + * + * It has all the data combined: quantity, address, fingerprint, metadata, etc. + * + */ export type AssetTokenProps = { ...$Exact, ...$Exact, From 15e119caa7dfb936a407054d5d0eff995c7df2c4 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Mon, 17 May 2021 13:07:05 -0300 Subject: [PATCH 09/16] [DDW-663] Better naming --- source/renderer/app/actions/assets-actions.js | 6 +++--- .../renderer/app/actions/wallets-actions.js | 4 ++-- source/renderer/app/api/assets/types.js | 2 +- .../assets/{AssetToken.js => Asset.js} | 8 +++---- .../assets/{AssetToken.scss => Asset.scss} | 0 .../app/components/assets/AssetAmount.js | 2 +- .../components/assets/AssetSettingsDialog.js | 8 +++---- .../app/components/wallet/WalletSendForm.js | 10 ++++----- .../components/wallet/send-form/AssetInput.js | 4 ++-- .../wallet/send-form/AssetInput.scss | 2 +- .../WalletSendAssetsConfirmationDialog.js | 12 +++++------ .../wallet/summary/WalletSummary.js | 4 ++-- .../wallet/summary/WalletSummaryAssets.js | 12 +++++------ .../wallet/transactions/Transaction.js | 10 ++++----- .../transactions/WalletTransactionsList.js | 4 ++-- .../widgets/forms/AssetsDropdown.js | 8 +++---- .../assets/AssetSettingsDialogContainer.js | 4 ++-- .../app/containers/wallet/WalletSendPage.js | 4 ++-- .../containers/wallet/WalletSummaryPage.js | 6 +++--- .../WalletSendConfirmationDialogContainer.js | 4 ++-- source/renderer/app/stores/AssetsStore.js | 8 +++---- source/renderer/app/stores/WalletsStore.js | 4 ++-- source/renderer/app/utils/assets.js | 21 +++++++------------ storybook/stories/_support/utils.js | 8 +++---- ...AssetToken.stories.js => Asset.stories.js} | 6 +++--- storybook/stories/index.js | 2 +- .../wallets/send/WalletSend.stories.js | 16 ++++++++------ .../wallets/summary/WalletSummary.stories.js | 18 +++++++++------- .../transactions/TransactionsList.stories.js | 14 ++++++++----- 29 files changed, 109 insertions(+), 102 deletions(-) rename source/renderer/app/components/assets/{AssetToken.js => Asset.js} (98%) rename source/renderer/app/components/assets/{AssetToken.scss => Asset.scss} (100%) rename storybook/stories/assets/{AssetToken.stories.js => Asset.stories.js} (92%) diff --git a/source/renderer/app/actions/assets-actions.js b/source/renderer/app/actions/assets-actions.js index 9894f94e8d..db00875f2d 100644 --- a/source/renderer/app/actions/assets-actions.js +++ b/source/renderer/app/actions/assets-actions.js @@ -1,13 +1,13 @@ // @flow import Action from './lib/Action'; -import type { AssetTokenProps } from '../api/assets/types'; +import type { AssetToken } from '../api/assets/types'; // ======= ASSETS ACTIONS ======= export default class AssetsActions { - onAssetSettingsOpen: Action<{ asset: AssetTokenProps }> = new Action(); + onAssetSettingsOpen: Action<{ asset: AssetToken }> = new Action(); onAssetSettingsSubmit: Action<{ - asset: AssetTokenProps, + asset: AssetToken, decimals: number, }> = new Action(); onAssetSettingsCancel: Action = new Action(); diff --git a/source/renderer/app/actions/wallets-actions.js b/source/renderer/app/actions/wallets-actions.js index fc8130ed1e..9c6e6735b9 100644 --- a/source/renderer/app/actions/wallets-actions.js +++ b/source/renderer/app/actions/wallets-actions.js @@ -7,7 +7,7 @@ import type { } from '../../../common/types/hardware-wallets.types'; import type { CsvFileContent } from '../../../common/types/csv-request.types'; import type { QuitStakePoolRequest } from '../api/staking/types'; -import type { AssetTokenProps } from '../api/assets/types'; +import type { AssetToken } from '../api/assets/types'; export type WalletImportFromFileParams = { filePath: string, @@ -55,7 +55,7 @@ export default class WalletsActions { receiver: string, amount: string, passphrase: string, - assets?: Array, + assets?: Array, assetsAmounts?: Array, }> = new Action(); chooseWalletExportType: Action<{ diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index b85ee52a49..13095da049 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -60,7 +60,7 @@ export type WalletTokens = { * It has all the data combined: quantity, address, fingerprint, metadata, etc. * */ -export type AssetTokenProps = { +export type AssetToken = { ...$Exact, ...$Exact, }; diff --git a/source/renderer/app/components/assets/AssetToken.js b/source/renderer/app/components/assets/Asset.js similarity index 98% rename from source/renderer/app/components/assets/AssetToken.js rename to source/renderer/app/components/assets/Asset.js index 849d594ad5..38d9ed38a5 100644 --- a/source/renderer/app/components/assets/AssetToken.js +++ b/source/renderer/app/components/assets/Asset.js @@ -6,9 +6,9 @@ import { PopOver } from 'react-polymorph/lib/components/PopOver'; import { defineMessages, intlShape } from 'react-intl'; import CopyToClipboard from 'react-copy-to-clipboard'; import { observer } from 'mobx-react'; -import styles from './AssetToken.scss'; +import styles from './Asset.scss'; import { ellipsis, hexToString } from '../../utils/strings'; -import type { AssetTokenProps } from '../../api/assets/types'; +import type { AssetDomainProps } from '../../domains/Asset'; import copyIcon from '../../assets/images/copy-asset.inline.svg'; import settingsIcon from '../../assets/images/asset-token-settings-ic.inline.svg'; import warningIcon from '../../assets/images/asset-token-warning-ic.inline.svg'; @@ -75,7 +75,7 @@ const messages = defineMessages({ }); type Props = { - asset: AssetTokenProps, + asset: AssetDomainProps, small?: boolean, hidePopOver?: boolean, onCopyAssetItem?: Function, @@ -95,7 +95,7 @@ type State = { }; @observer -export default class AssetToken extends Component { +export default class Asset extends Component { static contextTypes = { intl: intlShape.isRequired, }; diff --git a/source/renderer/app/components/assets/AssetToken.scss b/source/renderer/app/components/assets/Asset.scss similarity index 100% rename from source/renderer/app/components/assets/AssetToken.scss rename to source/renderer/app/components/assets/Asset.scss diff --git a/source/renderer/app/components/assets/AssetAmount.js b/source/renderer/app/components/assets/AssetAmount.js index ad07a7c52f..c2e4118c9f 100644 --- a/source/renderer/app/components/assets/AssetAmount.js +++ b/source/renderer/app/components/assets/AssetAmount.js @@ -26,7 +26,7 @@ type Props = { }; @observer -export default class AssetToken extends Component { +export default class Asset extends Component { static contextTypes = { intl: intlShape.isRequired, }; diff --git a/source/renderer/app/components/assets/AssetSettingsDialog.js b/source/renderer/app/components/assets/AssetSettingsDialog.js index cb80b549e5..2c008ccdf0 100644 --- a/source/renderer/app/components/assets/AssetSettingsDialog.js +++ b/source/renderer/app/components/assets/AssetSettingsDialog.js @@ -6,12 +6,12 @@ import { observer } from 'mobx-react'; import { Select } from 'react-polymorph/lib/components/Select'; import { PopOver } from 'react-polymorph/lib/components/PopOver'; import { defineMessages, intlShape, FormattedHTMLMessage } from 'react-intl'; -import AssetToken from './AssetToken'; +import Asset from './Asset'; import DialogCloseButton from '../widgets/DialogCloseButton'; import Dialog from '../widgets/Dialog'; import styles from './AssetSettingsDialog.scss'; import globalMessages from '../../i18n/global-messages'; -import type { AssetTokenProps } from '../../api/assets/types'; +import type { AssetToken } from '../../api/assets/types'; import { formattedTokenWalletAmount } from '../../utils/formatters'; import warningIcon from '../../assets/images/asset-token-warning-ic.inline.svg'; import { @@ -71,7 +71,7 @@ const messages = defineMessages({ }); type Props = { - asset: AssetTokenProps, + asset: AssetToken, onSubmit: Function, onCancel: Function, }; @@ -160,7 +160,7 @@ export default class AssetSettingsDialog extends Component { } + subtitle={} actions={actions} closeOnOverlayClick onClose={onCancel} diff --git a/source/renderer/app/components/wallet/WalletSendForm.js b/source/renderer/app/components/wallet/WalletSendForm.js index d0ac4f9a0c..16bac3d78d 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.js +++ b/source/renderer/app/components/wallet/WalletSendForm.js @@ -38,7 +38,7 @@ import WalletSendConfirmationDialogContainer from '../../containers/wallet/dialo import styles from './WalletSendForm.scss'; import Asset from '../../domains/Asset'; import type { HwDeviceStatus } from '../../domains/Wallet'; -import type { AssetTokenProps, ApiTokens } from '../../api/assets/types'; +import type { AssetToken, ApiTokens } from '../../api/assets/types'; messages.fieldIsRequired = globalMessages.fieldIsRequired; @@ -51,7 +51,7 @@ type Props = { walletAmount: BigNumber, validateAmount: (amountInNaturalUnits: string) => Promise, addressValidator: Function, - assets: Array, + assets: Array, hasAssets: boolean, selectedAsset: ?Asset, isLoadingAssets: boolean, @@ -146,7 +146,7 @@ export default class WalletSendForm extends Component { return NUMBER_FORMATS[this.props.currentNumberFormat]; } - get selectedAssets(): Array { + get selectedAssets(): Array { const { selectedAssetUniqueIds } = this.state; const { assets: allAssets } = this.props; return map(selectedAssetUniqueIds, (uniqueId) => @@ -162,7 +162,7 @@ export default class WalletSendForm extends Component { ); } - get availableAssets(): Array { + get availableAssets(): Array { const { assets: allAssets } = this.props; const { selectedAssetUniqueIds } = this.state; return filter( @@ -175,7 +175,7 @@ export default class WalletSendForm extends Component { return this.availableAssets.length > 0; } - getAssetByUniqueId = (uniqueId: string): ?AssetTokenProps => { + getAssetByUniqueId = (uniqueId: string): ?AssetToken => { const { assets: allAssets } = this.props; return allAssets.find((asset) => asset.uniqueId === uniqueId); }; diff --git a/source/renderer/app/components/wallet/send-form/AssetInput.js b/source/renderer/app/components/wallet/send-form/AssetInput.js index d635720990..4c3084742e 100644 --- a/source/renderer/app/components/wallet/send-form/AssetInput.js +++ b/source/renderer/app/components/wallet/send-form/AssetInput.js @@ -13,7 +13,7 @@ import AssetsDropdown from '../../widgets/forms/AssetsDropdown'; import closeIcon from '../../../assets/images/close-cross.inline.svg'; import { formattedTokenWalletAmount } from '../../../utils/formatters'; import type { NumberFormat } from '../../../../../common/types/number.types'; -import type { AssetTokenProps } from '../../../api/assets/types'; +import type { AssetToken } from '../../../api/assets/types'; import styles from './AssetInput.scss'; import messages from './messages'; @@ -21,7 +21,7 @@ type Props = { uniqueId: string, index: number, getAssetByUniqueId: Function, - availableAssets: Array, + availableAssets: Array, assetFields: { [uniqueId: string]: Field, }, diff --git a/source/renderer/app/components/wallet/send-form/AssetInput.scss b/source/renderer/app/components/wallet/send-form/AssetInput.scss index b196659fdb..336ab22933 100644 --- a/source/renderer/app/components/wallet/send-form/AssetInput.scss +++ b/source/renderer/app/components/wallet/send-form/AssetInput.scss @@ -123,7 +123,7 @@ .SimpleSelect_selectInput.SelectOverrides_selectInput .WalletsDropdownOption_label { - .AssetToken_content { + .Asset_content { margin-right: 24.5px; } } diff --git a/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js b/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js index 4df3ef11c7..fafb63b0d1 100644 --- a/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js +++ b/source/renderer/app/components/wallet/send-form/WalletSendAssetsConfirmationDialog.js @@ -25,9 +25,9 @@ import { FormattedHTMLMessageWithLink } from '../../widgets/FormattedHTMLMessage import HardwareWalletStatus from '../../hardware-wallet/HardwareWalletStatus'; import LoadingSpinner from '../../widgets/LoadingSpinner'; import { HwDeviceStatuses } from '../../../domains/Wallet'; -import AssetToken from '../../assets/AssetToken'; +import Asset from '../../assets/Asset'; import type { HwDeviceStatus } from '../../../domains/Wallet'; -import type { AssetTokenProps } from '../../../api/assets/types'; +import type { AssetToken } from '../../../api/assets/types'; const SHOW_TOTAL_AMOUNT = false; @@ -141,7 +141,7 @@ type Props = { amount: string, totalAmount: ?string, receiver: string, - assets: Array, + assets: Array, assetsAmounts: Array, transactionFee: ?string, onSubmit: Function, @@ -162,7 +162,7 @@ type Props = { }; type State = { - assets: Array, + assets: Array, assetsAmounts: Array, areTermsAccepted: boolean, }; @@ -314,7 +314,7 @@ export default class WalletSendAssetsConfirmationDialog extends Component< }; getFormattedAssetAmount = ( - { metadata, decimals }: AssetTokenProps, + { metadata, decimals }: AssetToken, index: number ) => { const assetAmount = this.getAssetAmount(index); @@ -441,7 +441,7 @@ export default class WalletSendAssetsConfirmationDialog extends Component< {intl.formatMessage(messages.assetLabel)}  #{assetIndex + 1} - , + assets: Array, onOpenAssetSend: Function, onCopyAssetItem: Function, onAssetSettings: Function, diff --git a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js index 4a5fa96eb1..6f40a3eebb 100644 --- a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js +++ b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js @@ -7,9 +7,9 @@ import classNames from 'classnames'; import BorderedBox from '../../widgets/BorderedBox'; import styles from './WalletSummaryAssets.scss'; import Wallet from '../../../domains/Wallet'; -import AssetToken from '../../assets/AssetToken'; +import Asset from '../../assets/Asset'; import AssetAmount from '../../assets/AssetAmount'; -import type { AssetTokenProps } from '../../../api/assets/types'; +import type { AssetToken } from '../../../api/assets/types'; import LoadingSpinner from '../../widgets/LoadingSpinner'; const messages = defineMessages({ @@ -32,7 +32,7 @@ const messages = defineMessages({ type Props = { wallet: Wallet, - assets: Array, + assets: Array, onOpenAssetSend: Function, onCopyAssetItem: Function, onAssetSettings: Function, @@ -45,7 +45,7 @@ type State = { }; @observer -export default class AssetTokens extends Component { +export default class Assets extends Component { static contextTypes = { intl: intlShape.isRequired, }; @@ -88,7 +88,7 @@ export default class AssetTokens extends Component { ) : (
- {assets.map((asset: AssetTokenProps, index: number) => ( + {assets.map((asset: AssetToken, index: number) => ( { > {asset.uniqueId && (
- , + assetTokens: Array, hasAssetsEnabled: boolean, isInternalAddress: Function, isLoadingAssets: boolean, @@ -410,7 +410,7 @@ export default class Transaction extends Component { return !!this.assetsList.length; } - get assetsList(): Array { + get assetsList(): Array { const { assetTokens, data, @@ -692,7 +692,7 @@ export default class Transaction extends Component { {intl.formatMessage(messages.assetLabel)}  #{assetIndex + 1} - { ]); const txTokens = tx.assets; - const assetTokens = getAssetTokens(txTokens, getAssetDomain); + const assetTokens = getAssets(txTokens, getAssetDomain); const totalRawAssets = tx.assets.length; const totalAssets = assetTokens.length; const hasRawAssets = tx.assets.length > 0; diff --git a/source/renderer/app/components/widgets/forms/AssetsDropdown.js b/source/renderer/app/components/widgets/forms/AssetsDropdown.js index 848cbfc95f..53845c0bf9 100644 --- a/source/renderer/app/components/widgets/forms/AssetsDropdown.js +++ b/source/renderer/app/components/widgets/forms/AssetsDropdown.js @@ -3,8 +3,8 @@ import React, { Component } from 'react'; import { omit, filter, escapeRegExp } from 'lodash'; import ItemsDropdown from './ItemsDropdown'; import { formattedTokenWalletAmount } from '../../../utils/formatters'; -import type { AssetTokenProps } from '../../../api/assets/types'; -import AssetToken from '../../assets/AssetToken'; +import type { AssetToken } from '../../../api/assets/types'; +import Asset from '../../assets/Asset'; import styles from './AssetsDropdown.scss'; /** @@ -17,7 +17,7 @@ import styles from './AssetsDropdown.scss'; * */ type Props = { - assets?: Array<$Shape>, + assets?: Array<$Shape>, }; export const onSearchAssetsDropdown = ( @@ -54,7 +54,7 @@ export default class AssetsDropdown extends Component { const detail = formattedTokenWalletAmount(quantity, metadata, decimals); return { label: ( - { static defaultProps = { actions: null, stores: null }; - handleSubmit = (asset: AssetTokenProps, decimals: number) => { + handleSubmit = (asset: AssetToken, decimals: number) => { const { onAssetSettingsSubmit } = this.props.actions.assets; onAssetSettingsSubmit.trigger({ asset, decimals }); }; diff --git a/source/renderer/app/containers/wallet/WalletSendPage.js b/source/renderer/app/containers/wallet/WalletSendPage.js index 210407bfd8..f500520612 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.js +++ b/source/renderer/app/containers/wallet/WalletSendPage.js @@ -12,7 +12,7 @@ import WalletSendForm from '../../components/wallet/WalletSendForm'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import Asset from '../../domains/Asset'; import type { Tokens, ApiTokens } from '../../api/assets/types'; -import { getAssetTokens } from '../../utils/assets'; +import { getAssets } from '../../utils/assets'; type Props = InjectedProps; @@ -113,7 +113,7 @@ export default class WalletSendPage extends Component { const { isHardwareWallet } = wallet; const walletTokens = wallet.assets.total; - const assetTokens = getAssetTokens(walletTokens, getAssetDomain); + const assetTokens = getAssets(walletTokens, getAssetDomain); const totalRawAssets = wallet.assets.total.length; const totalAssets = assetTokens.length; const hasRawAssets = wallet.assets.total.length > 0; diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.js b/source/renderer/app/containers/wallet/WalletSummaryPage.js index dc30d81dec..429fb9fc6d 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.js +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.js @@ -14,7 +14,7 @@ import { getNetworkExplorerUrlByType } from '../../utils/network'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import { ellipsis } from '../../utils/strings'; import type { InjectedProps } from '../../types/injectedPropsType'; -import type { AssetTokenProps } from '../../api/assets/types'; +import type { AssetToken } from '../../api/assets/types'; export const messages = defineMessages({ noTransactions: { @@ -49,7 +49,7 @@ export default class WalletSummaryPage extends Component { }); }; - handleOpenAssetSend = ({ uniqueId }: AssetTokenProps) => { + handleOpenAssetSend = ({ uniqueId }: AssetToken) => { const { stores } = this.props; const { wallets } = stores; const { active } = wallets; @@ -113,7 +113,7 @@ export default class WalletSummaryPage extends Component { const noTransactionsLabel = intl.formatMessage(messages.noTransactions); // $FlowFixMe - const walletAssets: Array = wallet.assets.total + const walletAssets: Array = wallet.assets.total .map((rawAsset) => { const { policyId, assetName } = rawAsset; const assetDetails = getAssetDomain(policyId, assetName); diff --git a/source/renderer/app/containers/wallet/dialogs/WalletSendConfirmationDialogContainer.js b/source/renderer/app/containers/wallet/dialogs/WalletSendConfirmationDialogContainer.js index d986c16f49..1a519ae3a0 100644 --- a/source/renderer/app/containers/wallet/dialogs/WalletSendConfirmationDialogContainer.js +++ b/source/renderer/app/containers/wallet/dialogs/WalletSendConfirmationDialogContainer.js @@ -7,14 +7,14 @@ import WalletSendAssetsConfirmationDialog from '../../../components/wallet/send- import type { StoresMap } from '../../../stores/index'; import type { ActionsMap } from '../../../actions/index'; import type { HwDeviceStatus } from '../../../domains/Wallet'; -import type { AssetTokenProps } from '../../../api/assets/types'; +import type { AssetToken } from '../../../api/assets/types'; type Props = { stores: any | StoresMap, actions: any | ActionsMap, amount: string, receiver: string, - assets: Array, + assets: Array, assetsAmounts: Array, totalAmount: ?string, transactionFee: ?string, diff --git a/source/renderer/app/stores/AssetsStore.js b/source/renderer/app/stores/AssetsStore.js index 865744edb4..c686ec73d9 100644 --- a/source/renderer/app/stores/AssetsStore.js +++ b/source/renderer/app/stores/AssetsStore.js @@ -5,7 +5,7 @@ import Store from './lib/Store'; import Request from './lib/LocalizedRequest'; import Asset from '../domains/Asset'; import { requestGetter } from '../utils/storesUtils'; -import type { GetAssetsResponse, AssetTokenProps } from '../api/assets/types'; +import type { GetAssetsResponse, AssetToken } from '../api/assets/types'; type WalletId = string; @@ -13,7 +13,7 @@ export default class AssetsStore extends Store { ASSETS_REFRESH_INTERVAL: number = 1 * 60 * 1000; // 1 minute | unit: milliseconds @observable activeAsset: ?string = null; - @observable editingsAsset: ?AssetTokenProps = null; + @observable editingsAsset: ?AssetToken = null; @observable assetsRequests: { [key: WalletId]: Request, } = {}; @@ -66,7 +66,7 @@ export default class AssetsStore extends Store { // =================== PRIVATE ================== - @action _onAssetSettingsOpen = ({ asset }: { asset: AssetTokenProps }) => { + @action _onAssetSettingsOpen = ({ asset }: { asset: AssetToken }) => { this.editingsAsset = asset; this.api.localStorage.setAssetSettingsDialogWasOpened(); this.getAssetSettingsDialogWasOpenedRequest.execute(); @@ -76,7 +76,7 @@ export default class AssetsStore extends Store { asset, decimals, }: { - asset: AssetTokenProps, + asset: AssetToken, decimals: number, }) => { this.editingsAsset = null; diff --git a/source/renderer/app/stores/WalletsStore.js b/source/renderer/app/stores/WalletsStore.js index 492f766d60..6d8000efeb 100644 --- a/source/renderer/app/stores/WalletsStore.js +++ b/source/renderer/app/stores/WalletsStore.js @@ -61,7 +61,7 @@ import { ITN_MAGIC, MAINNET_MAGIC, } from '../../../common/types/cardano-node.types'; -import type { AssetTokenProps } from '../api/assets/types'; +import type { AssetToken } from '../api/assets/types'; /* eslint-disable consistent-return */ @@ -686,7 +686,7 @@ export default class WalletsStore extends Store { receiver: string, amount: string, passphrase: string, - assets?: Array, + assets?: Array, assetsAmounts?: Array, }) => { const assetsAmounts = assetsAmountsStr diff --git a/source/renderer/app/utils/assets.js b/source/renderer/app/utils/assets.js index 9259469ae4..1ca9f4cfea 100644 --- a/source/renderer/app/utils/assets.js +++ b/source/renderer/app/utils/assets.js @@ -1,5 +1,5 @@ // @flow -import type { Token, Tokens, AssetTokenProps } from '../api/assets/types'; +import type { Token, Tokens, AssetToken } from '../api/assets/types'; import { TransactionTypes } from '../domains/WalletTransaction'; import type { TransactionType } from '../api/transactions/types'; @@ -30,10 +30,10 @@ export const filterAssets = ( * Data from the Token: policyId, assetName, quantity, address * Data from the Asset: fingerprint, metadata, decimals, recommendedDecimals, uniqueId */ -export const getAssetToken = ( +export const getAsset = ( asset: Token, getAssetDomain: Function -): AssetTokenProps => { +): AssetToken => { const { policyId, assetName, quantity, address } = asset; const { fingerprint, metadata, decimals, recommendedDecimals, uniqueId } = getAssetDomain(policyId, assetName) || {}; @@ -54,22 +54,17 @@ export const getAssetToken = ( /** * * This function receives a list of Tokens (the assets included in a wallet or transaction) - * then retrieves the AssetTokens + * then retrieves the Assets * and sort them accordingly * */ -export const getAssetTokens = ( +export const getAssets = ( tokens: Tokens, getAssetDomain: Function -): Array => - tokens - .map((token) => getAssetToken(token, getAssetDomain)) - .sort(sortAssetTokens); +): Array => + tokens.map((token) => getAsset(token, getAssetDomain)).sort(sortAssets); -export const sortAssetTokens = ( - asset1: AssetTokenProps, - asset2: AssetTokenProps -) => { +export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { if (asset1 && asset2) { if (asset1.uniqueId < asset2.uniqueId) { return -1; diff --git a/storybook/stories/_support/utils.js b/storybook/stories/_support/utils.js index c3bf78e939..6b5d0edeb9 100644 --- a/storybook/stories/_support/utils.js +++ b/storybook/stories/_support/utils.js @@ -29,7 +29,7 @@ import type { AssetMetadata, Tokens, WalletTokens, - AssetTokenProps, + AssetToken, } from '../../../source/renderer/app/api/assets/types'; import type { SyncStateStatus } from '../../../source/renderer/app/api/wallets/types'; import type { TransactionMetadata } from '../../../source/renderer/app/types/TransactionMetadata'; @@ -139,12 +139,12 @@ export const generateWallet = ( delegatedStakePoolId: get(delegatedStakePool, 'id'), }); -export const generateAsset = ( +export const generateAssetDomain = ( policyId: string, assetName: string = '', fingerprint: string = '', metadata?: AssetMetadata = {} -) => +): Asset => new Asset({ policyId, assetName, @@ -163,7 +163,7 @@ export const generateAssetToken = ( metadata: ?AssetMetadata, decimals: ?number, recommendedDecimals: ?number -): AssetTokenProps => ({ +): AssetToken => ({ policyId, assetName, fingerprint, diff --git a/storybook/stories/assets/AssetToken.stories.js b/storybook/stories/assets/Asset.stories.js similarity index 92% rename from storybook/stories/assets/AssetToken.stories.js rename to storybook/stories/assets/Asset.stories.js index 8d3f3cb643..ceae3fe487 100644 --- a/storybook/stories/assets/AssetToken.stories.js +++ b/storybook/stories/assets/Asset.stories.js @@ -5,9 +5,9 @@ import BigNumber from 'bignumber.js'; import { action } from '@storybook/addon-actions'; import { withKnobs, boolean, number, text } from '@storybook/addon-knobs'; import StoryDecorator from '../_support/StoryDecorator'; -import AssetToken from '../../../source/renderer/app/components/assets/AssetToken'; +import Asset from '../../../source/renderer/app/components/assets/Asset'; -storiesOf('Assets|AssetToken', module) +storiesOf('Assets|Asset pill', module) .addDecorator((story) => {story()}) .addDecorator(withKnobs) @@ -21,7 +21,7 @@ storiesOf('Assets|AssetToken', module) const assetName = text('assetName', '6861707079636f696e'); return (
- Date: Mon, 17 May 2021 15:41:14 -0300 Subject: [PATCH 10/16] [DDW-663] Fixings and improvements --- source/renderer/app/api/api.js | 4 ++-- source/renderer/app/api/transactions/types.js | 2 +- source/renderer/app/api/utils/localStorage.js | 8 ++++++-- .../app/components/wallet/summary/WalletSummaryAssets.js | 2 +- .../wallet/transactions/WalletTransactionsList.js | 4 ++-- source/renderer/app/config/assetsConfig.js | 2 +- source/renderer/app/containers/wallet/WalletSendPage.js | 6 +++--- source/renderer/app/domains/Asset.js | 4 ++-- source/renderer/app/stores/AssetsStore.js | 4 ++-- source/renderer/app/utils/assets.js | 8 +++++--- storybook/stories/_support/utils.js | 4 ++-- storybook/stories/assets/Asset.stories.js | 2 +- .../wallets/transactions/TransactionsList.stories.js | 2 +- 13 files changed, 29 insertions(+), 23 deletions(-) diff --git a/source/renderer/app/api/api.js b/source/renderer/app/api/api.js index 3870dab538..7578ea0934 100644 --- a/source/renderer/app/api/api.js +++ b/source/renderer/app/api/api.js @@ -2851,10 +2851,10 @@ const _createAssetFromServerData = action( fingerprint, metadata, } = data; - const uniqueId = policyId + assetName; + const uniqueId = `${policyId}${assetName}`; const { decimals } = localData; const recommendedDecimals = - ASSETS_PREDEFINED_DECIMALS[policyId + assetName]; + ASSETS_PREDEFINED_DECIMALS[`${policyId}${assetName}`]; return new Asset({ policyId, assetName, diff --git a/source/renderer/app/api/transactions/types.js b/source/renderer/app/api/transactions/types.js index 4fbe2dbae4..d2015a3a16 100644 --- a/source/renderer/app/api/transactions/types.js +++ b/source/renderer/app/api/transactions/types.js @@ -3,7 +3,7 @@ import BigNumber from 'bignumber.js'; import { WalletTransaction } from '../../domains/WalletTransaction'; import { WalletUnits } from '../../domains/Wallet'; import type { DelegationAction } from '../../types/stakingTypes'; -import type { ApiTokens, Tokens } from '../assets/types'; +import type { ApiTokens } from '../assets/types'; import type { TransactionMetadata } from '../../types/TransactionMetadata'; export type TransactionAmount = { diff --git a/source/renderer/app/api/utils/localStorage.js b/source/renderer/app/api/utils/localStorage.js index 07a8d35e36..9294b03571 100644 --- a/source/renderer/app/api/utils/localStorage.js +++ b/source/renderer/app/api/utils/localStorage.js @@ -336,14 +336,18 @@ export default class LocalStorageApi { policyId: string, assetName: string ): Promise => - LocalStorageApi.get(keys.ASSET_DATA, {}, policyId + assetName); + LocalStorageApi.get(keys.ASSET_DATA, {}, `${policyId}${assetName}`); setAssetLocalData = ( policyId: string, assetName: string, assetLocalData: AssetLocalData ): Promise => - LocalStorageApi.set(keys.ASSET_DATA, assetLocalData, policyId + assetName); + LocalStorageApi.set( + keys.ASSET_DATA, + assetLocalData, + `${policyId}${assetName}` + ); getAssetSettingsDialogWasOpened = (): Promise => LocalStorageApi.get(keys.ASSET_SETTINGS_DIALOG_WAS_OPENED, false); diff --git a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js index 6f40a3eebb..4186519065 100644 --- a/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js +++ b/source/renderer/app/components/wallet/summary/WalletSummaryAssets.js @@ -45,7 +45,7 @@ type State = { }; @observer -export default class Assets extends Component { +export default class WalletSummaryAssets extends Component { static contextTypes = { intl: intlShape.isRequired, }; diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js index a752770ae9..024d3e3bcb 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js +++ b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js @@ -15,7 +15,7 @@ import { VirtualTransactionList } from './render-strategies/VirtualTransactionLi import { SimpleTransactionList } from './render-strategies/SimpleTransactionList'; import { TransactionInfo, TransactionsGroup } from './types'; import type { Row } from './types'; -import { getAssets } from '../../../utils/assets'; +import { getAssetTokens } from '../../../utils/assets'; const messages = defineMessages({ today: { @@ -231,7 +231,7 @@ export default class WalletTransactionsList extends Component { ]); const txTokens = tx.assets; - const assetTokens = getAssets(txTokens, getAssetDomain); + const assetTokens = getAssetTokens(txTokens, getAssetDomain); const totalRawAssets = tx.assets.length; const totalAssets = assetTokens.length; const hasRawAssets = tx.assets.length > 0; diff --git a/source/renderer/app/config/assetsConfig.js b/source/renderer/app/config/assetsConfig.js index b11a9be6dd..dcf43761ca 100644 --- a/source/renderer/app/config/assetsConfig.js +++ b/source/renderer/app/config/assetsConfig.js @@ -10,7 +10,7 @@ export const DEFAULT_DECIMAL_PRECISION = 0; /** * * Assets with predefined decimal precision - * "[key: policyId + assetName]": number, + * "[key: `${policyId}${assetName}`]": number, * */ export const ASSETS_PREDEFINED_DECIMALS = isTestnet diff --git a/source/renderer/app/containers/wallet/WalletSendPage.js b/source/renderer/app/containers/wallet/WalletSendPage.js index f500520612..c0000306d2 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.js +++ b/source/renderer/app/containers/wallet/WalletSendPage.js @@ -11,8 +11,8 @@ import { import WalletSendForm from '../../components/wallet/WalletSendForm'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import Asset from '../../domains/Asset'; -import type { Tokens, ApiTokens } from '../../api/assets/types'; -import { getAssets } from '../../utils/assets'; +import type { ApiTokens } from '../../api/assets/types'; +import { getAssetTokens } from '../../utils/assets'; type Props = InjectedProps; @@ -113,7 +113,7 @@ export default class WalletSendPage extends Component { const { isHardwareWallet } = wallet; const walletTokens = wallet.assets.total; - const assetTokens = getAssets(walletTokens, getAssetDomain); + const assetTokens = getAssetTokens(walletTokens, getAssetDomain); const totalRawAssets = wallet.assets.total.length; const totalAssets = assetTokens.length; const hasRawAssets = wallet.assets.total.length > 0; diff --git a/source/renderer/app/domains/Asset.js b/source/renderer/app/domains/Asset.js index 8b6a3567a4..3a3caeee76 100644 --- a/source/renderer/app/domains/Asset.js +++ b/source/renderer/app/domains/Asset.js @@ -24,13 +24,13 @@ export default class Asset { constructor(props: AssetDomainProps) { const { policyId, assetName } = props; - const uniqueId = policyId + assetName; + const uniqueId = `${policyId}${assetName}`; Object.assign(this, props, { uniqueId }); } @action update(props: $Shape) { const { policyId, assetName } = props; - const uniqueId = policyId + assetName; + const uniqueId = `${policyId}${assetName}`; Object.assign( this, pick(props, [ diff --git a/source/renderer/app/stores/AssetsStore.js b/source/renderer/app/stores/AssetsStore.js index c686ec73d9..a00d68226d 100644 --- a/source/renderer/app/stores/AssetsStore.js +++ b/source/renderer/app/stores/AssetsStore.js @@ -52,13 +52,13 @@ export default class AssetsStore extends Store { } { return this.all.reduce((details, asset) => { const { policyId, assetName } = asset; - details[policyId + assetName] = asset; + details[`${policyId}${assetName}`] = asset; return details; }, {}); } getAssetDomain = (policyId: string, assetName: string): ?Asset => - this.details[policyId + assetName]; + this.details[`${policyId}${assetName}`]; @computed get assetSettingsDialogWasOpened(): boolean { return requestGetter(this.getAssetSettingsDialogWasOpenedRequest, false); diff --git a/source/renderer/app/utils/assets.js b/source/renderer/app/utils/assets.js index 1ca9f4cfea..73f82c90f0 100644 --- a/source/renderer/app/utils/assets.js +++ b/source/renderer/app/utils/assets.js @@ -30,7 +30,7 @@ export const filterAssets = ( * Data from the Token: policyId, assetName, quantity, address * Data from the Asset: fingerprint, metadata, decimals, recommendedDecimals, uniqueId */ -export const getAsset = ( +export const getAssetToken = ( asset: Token, getAssetDomain: Function ): AssetToken => { @@ -58,11 +58,11 @@ export const getAsset = ( * and sort them accordingly * */ -export const getAssets = ( +export const getAssetTokens = ( tokens: Tokens, getAssetDomain: Function ): Array => - tokens.map((token) => getAsset(token, getAssetDomain)).sort(sortAssets); + tokens.map((token) => getAssetToken(token, getAssetDomain)).sort(sortAssets); export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { if (asset1 && asset2) { @@ -75,3 +75,5 @@ export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { } return 0; }; + +// export const getUniqueId = (asset: Token) => diff --git a/storybook/stories/_support/utils.js b/storybook/stories/_support/utils.js index 6b5d0edeb9..1d85b83b4c 100644 --- a/storybook/stories/_support/utils.js +++ b/storybook/stories/_support/utils.js @@ -152,7 +152,7 @@ export const generateAssetDomain = ( metadata, decimals: 0, recommendedDecimals: null, - uniqueId: policyId + assetName, + uniqueId: `${policyId}${assetName}`, }); export const generateAssetToken = ( @@ -171,7 +171,7 @@ export const generateAssetToken = ( quantity: new BigNumber(quantity), decimals, recommendedDecimals, - uniqueId: policyId + assetName, + uniqueId: `${policyId}${assetName}`, }); export const generateTransaction = ( diff --git a/storybook/stories/assets/Asset.stories.js b/storybook/stories/assets/Asset.stories.js index ceae3fe487..d59f072f43 100644 --- a/storybook/stories/assets/Asset.stories.js +++ b/storybook/stories/assets/Asset.stories.js @@ -25,7 +25,7 @@ storiesOf('Assets|Asset pill', module) asset={{ policyId, assetName, - uniqueId: policyId + assetName, + uniqueId: `${policyId}${assetName}`, fingerprint: text( 'fingerprint', 'asset18v86ulgre52g4l7lvl5shl8h5cm4u3dmrjg2e8' diff --git a/storybook/stories/wallets/transactions/TransactionsList.stories.js b/storybook/stories/wallets/transactions/TransactionsList.stories.js index f93beedd2c..5564e6686b 100644 --- a/storybook/stories/wallets/transactions/TransactionsList.stories.js +++ b/storybook/stories/wallets/transactions/TransactionsList.stories.js @@ -140,7 +140,7 @@ const assets = { }; const getAssetDomain = (policyId: string, assetName: string): ?Asset => - assetDetails[policyId + assetName]; + assetDetails[`${policyId}${assetName}`]; /* eslint-disable consistent-return */ storiesOf('Wallets|Transactions', module) From d9a9067ddba4e7ab4bbf1973323e7574dea5cac8 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Mon, 17 May 2021 15:50:07 -0300 Subject: [PATCH 11/16] [DDW-663] getAssetTokens method to the WalletSummary --- .../containers/wallet/WalletSummaryPage.js | 26 ++++--------------- source/renderer/app/utils/assets.js | 2 -- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.js b/source/renderer/app/containers/wallet/WalletSummaryPage.js index 429fb9fc6d..836a6b5183 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.js +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.js @@ -13,6 +13,7 @@ import { formattedWalletAmount } from '../../utils/formatters'; import { getNetworkExplorerUrlByType } from '../../utils/network'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import { ellipsis } from '../../utils/strings'; +import { getAssetTokens } from '../../utils/assets'; import type { InjectedProps } from '../../types/injectedPropsType'; import type { AssetToken } from '../../api/assets/types'; @@ -112,27 +113,10 @@ export default class WalletSummaryPage extends Component { let walletTransactions = null; const noTransactionsLabel = intl.formatMessage(messages.noTransactions); - // $FlowFixMe - const walletAssets: Array = wallet.assets.total - .map((rawAsset) => { - const { policyId, assetName } = rawAsset; - const assetDetails = getAssetDomain(policyId, assetName); - return assetDetails ? Object.assign({}, rawAsset, assetDetails) : null; - }) - .filter((asset) => asset != null) - .sort((asset1, asset2) => { - if (asset1 && asset2) { - if (asset1.fingerprint < asset2.fingerprint) { - return -1; - } - if (asset1.fingerprint > asset2.fingerprint) { - return 1; - } - } - return 0; - }); + const walletTokens = wallet.assets.total; + const assetTokens = getAssetTokens(walletTokens, getAssetDomain); const totalRawAssets = wallet.assets.total.length; - const totalAssets = walletAssets.length; + const totalAssets = assetTokens.length; const hasRawAssets = wallet.assets.total.length > 0; const isLoadingAssets = hasRawAssets && totalAssets < totalRawAssets; @@ -196,7 +180,7 @@ export default class WalletSummaryPage extends Component { currencyRate={rate} currencySelected={selected} onCurrencySettingClick={this.handleCurrencySettingsClick} - assets={walletAssets} + assets={assetTokens} assetSettingsDialogWasOpened={assetSettingsDialogWasOpened} onOpenAssetSend={this.handleOpenAssetSend} onCopyAssetItem={this.handleOnCopyAssetItem} diff --git a/source/renderer/app/utils/assets.js b/source/renderer/app/utils/assets.js index 73f82c90f0..9d04f1191c 100644 --- a/source/renderer/app/utils/assets.js +++ b/source/renderer/app/utils/assets.js @@ -75,5 +75,3 @@ export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { } return 0; }; - -// export const getUniqueId = (asset: Token) => From 370e349e76043c74152db1f98cfe0c7b9ee0796c Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Mon, 17 May 2021 18:08:19 -0300 Subject: [PATCH 12/16] [DDW-663] Improve types naming --- .../app/api/assets/requests/getAssets.js | 4 ++-- source/renderer/app/api/assets/types.js | 18 +++++++++++++----- source/renderer/app/components/assets/Asset.js | 5 +++-- source/renderer/app/domains/Asset.js | 16 +++------------- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/source/renderer/app/api/assets/requests/getAssets.js b/source/renderer/app/api/assets/requests/getAssets.js index d75fa3f973..a72538c023 100644 --- a/source/renderer/app/api/assets/requests/getAssets.js +++ b/source/renderer/app/api/assets/requests/getAssets.js @@ -1,13 +1,13 @@ // @flow import type { RequestConfig } from '../../common/types'; import { request } from '../../utils/request'; -import type { Assets, GetAssetsRequest } from '../types'; +import type { ApiAssets, GetAssetsRequest } from '../types'; import { getRawWalletId, isLegacyWalletId } from '../../utils'; export const getAssets = ( config: RequestConfig, { walletId }: GetAssetsRequest -): Promise => +): Promise => request({ method: 'GET', path: `/v2/${ diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 13095da049..6aed6d67fc 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -1,8 +1,7 @@ // @flow import BigNumber from 'bignumber.js'; -import Asset from '../../domains/Asset'; -import type { AssetDomainProps } from '../../domains/Asset'; +import AssetDomain from '../../domains/Asset'; /** * @@ -15,13 +14,22 @@ import type { AssetDomainProps } from '../../domains/Asset'; * Missing data: quantity, address * */ -export type Assets = Array; +export type ApiAssets = Array; export type ApiAsset = { policy_id: string, asset_name: string, fingerprint: string, metadata?: ?AssetMetadata, }; +export type Asset = { + assetName: string, + decimals: ?number, + fingerprint: string, + metadata?: ?AssetMetadata, + policyId: string, + recommendedDecimals: ?number, + uniqueId: string, +}; /** * @@ -62,7 +70,7 @@ export type WalletTokens = { */ export type AssetToken = { ...$Exact, - ...$Exact, + ...$Exact, }; export type AssetMetadata = { @@ -87,6 +95,6 @@ export type GetAssetsRequest = { }; export type GetAssetsResponse = { - assets: Array, + assets: Array, total: number, }; diff --git a/source/renderer/app/components/assets/Asset.js b/source/renderer/app/components/assets/Asset.js index 38d9ed38a5..c7f5993d0a 100644 --- a/source/renderer/app/components/assets/Asset.js +++ b/source/renderer/app/components/assets/Asset.js @@ -8,7 +8,7 @@ import CopyToClipboard from 'react-copy-to-clipboard'; import { observer } from 'mobx-react'; import styles from './Asset.scss'; import { ellipsis, hexToString } from '../../utils/strings'; -import type { AssetDomainProps } from '../../domains/Asset'; + import copyIcon from '../../assets/images/copy-asset.inline.svg'; import settingsIcon from '../../assets/images/asset-token-settings-ic.inline.svg'; import warningIcon from '../../assets/images/asset-token-warning-ic.inline.svg'; @@ -17,6 +17,7 @@ import { ASSET_TOKEN_ID_COPY_FEEDBACK, ASSET_TOKEN_DISPLAY_DELAY, } from '../../config/timingConfig'; +import type { Asset as AssetProps } from '../../api/assets/types'; const messages = defineMessages({ fingerprintItem: { @@ -75,7 +76,7 @@ const messages = defineMessages({ }); type Props = { - asset: AssetDomainProps, + asset: AssetProps, small?: boolean, hidePopOver?: boolean, onCopyAssetItem?: Function, diff --git a/source/renderer/app/domains/Asset.js b/source/renderer/app/domains/Asset.js index 3a3caeee76..62a3bb919c 100644 --- a/source/renderer/app/domains/Asset.js +++ b/source/renderer/app/domains/Asset.js @@ -1,17 +1,7 @@ // @flow import { pick } from 'lodash'; import { observable, action } from 'mobx'; -import type { AssetMetadata } from '../api/assets/types'; - -export type AssetDomainProps = { - assetName: string, - decimals: ?number, - fingerprint: string, - metadata?: ?AssetMetadata, - policyId: string, - recommendedDecimals: ?number, - uniqueId: string, -}; +import type { Asset as AssetProps, AssetMetadata } from '../api/assets/types'; export default class Asset { @observable policyId: string = ''; @@ -22,13 +12,13 @@ export default class Asset { @observable decimals: ?number; @observable recommendedDecimals: ?number; - constructor(props: AssetDomainProps) { + constructor(props: AssetProps) { const { policyId, assetName } = props; const uniqueId = `${policyId}${assetName}`; Object.assign(this, props, { uniqueId }); } - @action update(props: $Shape) { + @action update(props: $Shape) { const { policyId, assetName } = props; const uniqueId = `${policyId}${assetName}`; Object.assign( From 35c138b7e9bf314e1fbdacb89d07e1d24630333a Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Mon, 17 May 2021 18:14:45 -0300 Subject: [PATCH 13/16] [DDW-663] Correct component name --- source/renderer/app/components/assets/AssetAmount.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/renderer/app/components/assets/AssetAmount.js b/source/renderer/app/components/assets/AssetAmount.js index c2e4118c9f..a569a321b3 100644 --- a/source/renderer/app/components/assets/AssetAmount.js +++ b/source/renderer/app/components/assets/AssetAmount.js @@ -26,7 +26,7 @@ type Props = { }; @observer -export default class Asset extends Component { +export default class AssetAmount extends Component { static contextTypes = { intl: intlShape.isRequired, }; From 5766825c00d2233d30be2324a5636414eb8489d0 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Tue, 18 May 2021 10:28:46 -0300 Subject: [PATCH 14/16] [DDW-663] Change type to be compatible with the next wallet backend version --- source/renderer/app/api/assets/types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 6aed6d67fc..4cd140e296 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -78,7 +78,7 @@ export type AssetMetadata = { ticker: string, description: string, unit?: { - decimals: number, + decimals?: number, name: string, }, url?: string, From 18686a1ecdccd507226941cc946026cbb6db5cf0 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Tue, 18 May 2021 10:36:24 -0300 Subject: [PATCH 15/16] [DDW-663] Adjustments --- source/renderer/app/api/assets/types.js | 2 +- .../wallet/transactions/WalletTransactions.js | 6 +++--- .../wallet/transactions/WalletTransactionsList.js | 6 +++--- .../app/containers/wallet/WalletSendPage.js | 4 ++-- .../app/containers/wallet/WalletSummaryPage.js | 6 +++--- .../app/containers/wallet/WalletTransactionsPage.js | 4 ++-- source/renderer/app/stores/AssetsStore.js | 4 ++-- source/renderer/app/stores/TransactionsStore.js | 4 ++-- source/renderer/app/utils/assets.js | 13 +++++-------- .../renderer/app/utils/transactionsCsvGenerator.js | 6 +++--- .../transactions/TransactionsList.stories.js | 6 +++--- 11 files changed, 29 insertions(+), 32 deletions(-) diff --git a/source/renderer/app/api/assets/types.js b/source/renderer/app/api/assets/types.js index 4cd140e296..c8a5b52ec9 100644 --- a/source/renderer/app/api/assets/types.js +++ b/source/renderer/app/api/assets/types.js @@ -14,13 +14,13 @@ import AssetDomain from '../../domains/Asset'; * Missing data: quantity, address * */ -export type ApiAssets = Array; export type ApiAsset = { policy_id: string, asset_name: string, fingerprint: string, metadata?: ?AssetMetadata, }; +export type ApiAssets = Array; export type Asset = { assetName: string, decimals: ?number, diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactions.js b/source/renderer/app/components/wallet/transactions/WalletTransactions.js index a07d1b4e85..9c9e3583cd 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactions.js +++ b/source/renderer/app/components/wallet/transactions/WalletTransactions.js @@ -45,7 +45,7 @@ type Props = { totalAvailable: number, transactions: Array, hasAssetsEnabled: boolean, - getAssetDomain: Function, + getAsset: Function, isInternalAddress: Function, onCopyAssetItem: Function, }; @@ -93,7 +93,7 @@ export default class WalletTransactions extends Component { defaultFilterOptions, populatedFilterOptions, hasAssetsEnabled, - getAssetDomain, + getAsset, isInternalAddress, onCopyAssetItem, } = this.props; @@ -137,7 +137,7 @@ export default class WalletTransactions extends Component { currentTimeFormat={currentTimeFormat} currentDateFormat={currentDateFormat} hasAssetsEnabled={hasAssetsEnabled} - getAssetDomain={getAssetDomain} + getAsset={getAsset} isRenderingAsVirtualList isInternalAddress={isInternalAddress} onCopyAssetItem={onCopyAssetItem} diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js index 024d3e3bcb..3f4d2293a3 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js +++ b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.js @@ -67,7 +67,7 @@ type Props = { currentDateFormat: string, currentTimeFormat: string, hasAssetsEnabled: boolean, - getAssetDomain: Function, + getAsset: Function, isInternalAddress: Function, onCopyAssetItem: Function, }; @@ -219,7 +219,7 @@ export default class WalletTransactionsList extends Component { isDeletingTransaction, currentTimeFormat, hasAssetsEnabled, - getAssetDomain, + getAsset, isInternalAddress, onCopyAssetItem, } = this.props; @@ -231,7 +231,7 @@ export default class WalletTransactionsList extends Component { ]); const txTokens = tx.assets; - const assetTokens = getAssetTokens(txTokens, getAssetDomain); + const assetTokens = getAssetTokens(txTokens, getAsset); const totalRawAssets = tx.assets.length; const totalAssets = assetTokens.length; const hasRawAssets = tx.assets.length > 0; diff --git a/source/renderer/app/containers/wallet/WalletSendPage.js b/source/renderer/app/containers/wallet/WalletSendPage.js index c0000306d2..3c2a9936e0 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.js +++ b/source/renderer/app/containers/wallet/WalletSendPage.js @@ -99,7 +99,7 @@ export default class WalletSendPage extends Component { const { validateAmount } = transactions; const { hwDeviceStatus } = hardwareWallets; const hasAssetsEnabled = WALLET_ASSETS_ENABLED; - const { all: allAssets, activeAsset, getAssetDomain } = assetsStore; + const { all: allAssets, activeAsset, getAsset } = assetsStore; const { unsetActiveAsset } = actions.wallets; const selectedAsset = activeAsset @@ -113,7 +113,7 @@ export default class WalletSendPage extends Component { const { isHardwareWallet } = wallet; const walletTokens = wallet.assets.total; - const assetTokens = getAssetTokens(walletTokens, getAssetDomain); + const assetTokens = getAssetTokens(walletTokens, getAsset); const totalRawAssets = wallet.assets.total.length; const totalAssets = assetTokens.length; const hasRawAssets = wallet.assets.total.length > 0; diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.js b/source/renderer/app/containers/wallet/WalletSummaryPage.js index 836a6b5183..e01a1d1a52 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.js +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.js @@ -85,7 +85,7 @@ export default class WalletSummaryPage extends Component { assets, currency, } = stores; - const { getAssetDomain, assetSettingsDialogWasOpened } = assets; + const { getAsset, assetSettingsDialogWasOpened } = assets; const { isInternalAddress } = addresses; const { onAssetSettingsOpen } = actions.assets; const { @@ -114,7 +114,7 @@ export default class WalletSummaryPage extends Component { const noTransactionsLabel = intl.formatMessage(messages.noTransactions); const walletTokens = wallet.assets.total; - const assetTokens = getAssetTokens(walletTokens, getAssetDomain); + const assetTokens = getAssetTokens(walletTokens, getAsset); const totalRawAssets = wallet.assets.total.length; const totalAssets = assetTokens.length; const hasRawAssets = wallet.assets.total.length > 0; @@ -156,7 +156,7 @@ export default class WalletSummaryPage extends Component { currentDateFormat={currentDateFormat} isInternalAddress={isInternalAddress} hasAssetsEnabled={hasAssetsEnabled} - getAssetDomain={getAssetDomain} + getAsset={getAsset} onCopyAssetItem={this.handleOnCopyAssetItem} /> ); diff --git a/source/renderer/app/containers/wallet/WalletTransactionsPage.js b/source/renderer/app/containers/wallet/WalletTransactionsPage.js index 10895f295e..5bdba51c56 100755 --- a/source/renderer/app/containers/wallet/WalletTransactionsPage.js +++ b/source/renderer/app/containers/wallet/WalletTransactionsPage.js @@ -51,7 +51,7 @@ export default class WalletTransactionsPage extends Component { const hasAssetsEnabled = WALLET_ASSETS_ENABLED; - const { getAssetDomain } = assets; + const { getAsset } = assets; const getUrlByType = (type: 'tx' | 'address', param: string) => getNetworkExplorerUrlByType( @@ -90,7 +90,7 @@ export default class WalletTransactionsPage extends Component { onRequestCSVFile={requestCSVFile.trigger} hasAssetsEnabled={hasAssetsEnabled} isInternalAddress={isInternalAddress} - getAssetDomain={getAssetDomain} + getAsset={getAsset} onCopyAssetItem={this.handleOnCopyAssetItem} /> ); diff --git a/source/renderer/app/stores/AssetsStore.js b/source/renderer/app/stores/AssetsStore.js index a00d68226d..500cfac93e 100644 --- a/source/renderer/app/stores/AssetsStore.js +++ b/source/renderer/app/stores/AssetsStore.js @@ -57,7 +57,7 @@ export default class AssetsStore extends Store { }, {}); } - getAssetDomain = (policyId: string, assetName: string): ?Asset => + getAsset = (policyId: string, assetName: string): ?Asset => this.details[`${policyId}${assetName}`]; @computed get assetSettingsDialogWasOpened(): boolean { @@ -81,7 +81,7 @@ export default class AssetsStore extends Store { }) => { this.editingsAsset = null; const { policyId, assetName } = asset; - const assetDomain = this.getAssetDomain(policyId, assetName); + const assetDomain = this.getAsset(policyId, assetName); if (assetDomain) { assetDomain.update({ decimals, diff --git a/source/renderer/app/stores/TransactionsStore.js b/source/renderer/app/stores/TransactionsStore.js index 3a179758df..cdb7cb5d07 100644 --- a/source/renderer/app/stores/TransactionsStore.js +++ b/source/renderer/app/stores/TransactionsStore.js @@ -356,13 +356,13 @@ export default class TransactionsStore extends Store { const intl = i18nContext(locale); const transactions = allFiltered; const walletName = active ? active.name : ''; - const { getAssetDomain } = this.stores.assets; + const { getAsset } = this.stores.assets; const success = await transactionsCsvGenerator({ desktopDirectoryPath, intl, transactions, walletName, - getAssetDomain, + getAsset, isInternalAddress, }); if (success) actions.transactions.requestCSVFileSuccess.trigger(); diff --git a/source/renderer/app/utils/assets.js b/source/renderer/app/utils/assets.js index 9d04f1191c..4a44e8d767 100644 --- a/source/renderer/app/utils/assets.js +++ b/source/renderer/app/utils/assets.js @@ -24,19 +24,16 @@ export const filterAssets = ( /** * - * This function receives a list os Tokens (the assets included in a wallet or transaction) + * This function receives a Token (the asset included in a wallet or transaction) * and combines with the data from the Asset * * Data from the Token: policyId, assetName, quantity, address * Data from the Asset: fingerprint, metadata, decimals, recommendedDecimals, uniqueId */ -export const getAssetToken = ( - asset: Token, - getAssetDomain: Function -): AssetToken => { +export const getAssetToken = (asset: Token, getAsset: Function): AssetToken => { const { policyId, assetName, quantity, address } = asset; const { fingerprint, metadata, decimals, recommendedDecimals, uniqueId } = - getAssetDomain(policyId, assetName) || {}; + getAsset(policyId, assetName) || {}; const txAsset = { policyId, assetName, @@ -60,9 +57,9 @@ export const getAssetToken = ( */ export const getAssetTokens = ( tokens: Tokens, - getAssetDomain: Function + getAsset: Function ): Array => - tokens.map((token) => getAssetToken(token, getAssetDomain)).sort(sortAssets); + tokens.map((token) => getAssetToken(token, getAsset)).sort(sortAssets); export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { if (asset1 && asset2) { diff --git a/source/renderer/app/utils/transactionsCsvGenerator.js b/source/renderer/app/utils/transactionsCsvGenerator.js index 6384c51c72..3a421413ec 100644 --- a/source/renderer/app/utils/transactionsCsvGenerator.js +++ b/source/renderer/app/utils/transactionsCsvGenerator.js @@ -109,7 +109,7 @@ type Params = { intl: intlShape, transactions: Array, walletName: string, - getAssetDomain: Function, + getAsset: Function, isInternalAddress: Function, }; @@ -118,7 +118,7 @@ const transactionsCsvGenerator = async ({ intl, transactions, walletName, - getAssetDomain, + getAsset, isInternalAddress, }: Params): Promise => { const prefix = `${intl.formatMessage(messages.filenamePrefix)}-${walletName}`; @@ -189,7 +189,7 @@ const transactionsCsvGenerator = async ({ } const valueTokens = filterAssets(assets, type, isInternalAddress) .map(({ policyId, assetName, quantity }) => { - const { fingerprint, metadata } = getAssetDomain(policyId, assetName); + const { fingerprint, metadata } = getAsset(policyId, assetName); const formattedAmount = formattedTokenWalletAmount( quantity, metadata, diff --git a/storybook/stories/wallets/transactions/TransactionsList.stories.js b/storybook/stories/wallets/transactions/TransactionsList.stories.js index 5564e6686b..4aba0943dd 100644 --- a/storybook/stories/wallets/transactions/TransactionsList.stories.js +++ b/storybook/stories/wallets/transactions/TransactionsList.stories.js @@ -139,7 +139,7 @@ const assets = { ], }; -const getAssetDomain = (policyId: string, assetName: string): ?Asset => +const getAsset = (policyId: string, assetName: string): ?Asset => assetDetails[`${policyId}${assetName}`]; /* eslint-disable consistent-return */ @@ -206,7 +206,7 @@ storiesOf('Wallets|Transactions', module) totalAvailable={totalAvailable} transactions={transactions} hasAssetsEnabled={false} - getAssetDomain={getAssetDomain} + getAsset={getAsset} onCopyAssetItem={() => {}} /> ); @@ -248,7 +248,7 @@ storiesOf('Wallets|Transactions', module) totalAvailable={totalAvailable} transactions={transactions} hasAssetsEnabled={hasAssetsEnabled} - getAssetDomain={getAssetDomain} + getAsset={getAsset} onCopyAssetItem={() => {}} /> ); From a1fb13e96955c0526118d53451c77671176f20a0 Mon Sep 17 00:00:00 2001 From: Danilo Prates Date: Tue, 18 May 2021 16:26:17 -0300 Subject: [PATCH 16/16] [DDW-663] Adjustments --- source/renderer/app/utils/assets.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/renderer/app/utils/assets.js b/source/renderer/app/utils/assets.js index 4a44e8d767..2df90ad32a 100644 --- a/source/renderer/app/utils/assets.js +++ b/source/renderer/app/utils/assets.js @@ -59,14 +59,17 @@ export const getAssetTokens = ( tokens: Tokens, getAsset: Function ): Array => - tokens.map((token) => getAssetToken(token, getAsset)).sort(sortAssets); + tokens + .map((token) => getAssetToken(token, getAsset)) + .filter((token) => !!token.uniqueId) + .sort(sortAssets); export const sortAssets = (asset1: AssetToken, asset2: AssetToken) => { if (asset1 && asset2) { - if (asset1.uniqueId < asset2.uniqueId) { + if (asset1.fingerprint < asset2.fingerprint) { return -1; } - if (asset1.uniqueId > asset2.uniqueId) { + if (asset1.fingerprint > asset2.fingerprint) { return 1; } }