diff --git a/storybook/pages/SendModalAssetsAdaptorPage.qml b/storybook/pages/SendModalAssetsAdaptorPage.qml deleted file mode 100644 index 2567794333..0000000000 --- a/storybook/pages/SendModalAssetsAdaptorPage.qml +++ /dev/null @@ -1,240 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 - -import StatusQ.Models 0.1 - -import Storybook 1.0 - -import utils 1.0 -import shared.popups.send.models 1.0 - -Item { - id: root - - ListModel { - id: listModel - - readonly property var data: [ - { - tokensKey: "key_ETH", - name: "Ether", - symbol: "ETH", - addressPerChain: [ - { chainId: 1, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 5, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 10, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 420, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 42161, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 421613, address: "0x0000000000000000000000000000000000000000"} - ], - balances: [ - { - chainId: "chain_id_1", - balance: "186316672770338050", - account: "account_1", - }, - { - chainId: "chain_id_1", - balance: "386318672772348050", - account: "account_2", - }, - { - chainId: "chain_id_2", - balance: "186311232772348990", - account: "account_1", - }, - { - chainId: "chain_id_2", - balance: "986317232772348990", - account: "account_1", - } - ], - decimals: 18, - communityId: "", - communityName: "", - communityImage: Qt.resolvedUrl(""), - marketDetails: { - changePct24hour: -2.1232, - currencyPrice: { - amount: 3423.23898 - } - }, - detailsLoading: false, - image: Qt.resolvedUrl("") - }, - { - tokensKey: "key_SNT", - name: "Status", - symbol: "SNT", - addressPerChain: [ - { chainId: 1, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 5, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 10, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 420, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 42161, address: "0x0000000000000000000000000000000000000000"}, - { chainId: 421613, address: "0x0000000000000000000000000000000000000000"} - ], - balances: [ - { - chainId: "chain_id_1", - balance: "386316672770338850", - account: "account_1", - }, - { - chainId: "chain_id_1", - balance: "377778672772348050", - account: "account_2", - }, - { - chainId: "chain_id_2", - balance: "146311232772348990", - account: "account_1", - }, - { - chainId: "chain_id_3", - balance: "86317232772348990", - account: "account_1", - } - ], - decimals: 18, - communityId: "", - communityName: "", - communityImage: Qt.resolvedUrl(""), - marketDetails: { - changePct24hour: 9.232, - currencyPrice: { - amount: 33.23898 - } - }, - detailsLoading: false, - image: Qt.resolvedUrl("") - }, - { - tokensKey: "key_MYASST", - name: "Community Asset", - symbol: "MYASST", - balances: [ - { - chainId: "chain_id_1", - balance: "23234", - account: "account_1", - }, - { - chainId: "chain_id_1", - balance: "63234", - account: "account_2", - } - ], - decimals: 3, - communityId: "0x033f36ccb", - communityName: "My Community", - communityImage: Constants.tokenIcon("DAI", false), - marketDetails: { - changePct24hour: 0, - currencyPrice: { - amount: 0 - } - }, - detailsLoading: false, - image: Constants.tokenIcon("ZRX", false) - } - ] - - Component.onCompleted: { - append(data) - - const accounts = new Set() - - data.forEach(e => e.balances.forEach( - e => { accounts.add(e.account) })) - - accountsSelector.model = [...accounts.values()] - } - } - - ManageTokensController { - id: manageTokensController - - sourceModel: listModel - serializeAsCollectibles: false - - onRequestLoadSettings: { - loadingStarted() - - const jsonData = [ - { - "key": "ETH", - "position": 1, - "visible": true - }, - { - "key": "SNT", - "position": 2, - "visible": true - }, - { - "key": "MYASST", - "position": 5, - "visible": true - } - ] - - loadingFinished(JSON.stringify(jsonData)) - } - } - - - SendModalAssetsAdaptor { - id: adaptor - - controller: manageTokensController - account: accountsSelector.selection[0] - tokensModel: listModel - } - - ColumnLayout { - anchors.fill: parent - - Label { text: "ACCOUNTS:" } - - CheckBoxFlowSelector { - id: accountsSelector - - Layout.fillWidth: true - initialSelection: true - exclusive: true - } - - RowLayout { - GenericListView { - label: "Input model" - - model: listModel - - Layout.fillWidth: true - Layout.fillHeight: true - - skipEmptyRoles: true - } - - GenericListView { - label: "Adapter's output model" - - model: adaptor.model - - Layout.fillWidth: true - Layout.fillHeight: true - - roles: - ["key", "error", "currentBalance", "currentCurrencyBalance", "currentBalanceText", - "icon", "visible", "marketDetailsAvailable", "marketDetailsLoading", - "marketPrice", "marketChangePct24hour", "isCommunityAsset", "balancesModel"] - - skipEmptyRoles: true - } - } - } -} - -// category: Adaptors diff --git a/ui/imports/shared/popups/send/SendModal.qml b/ui/imports/shared/popups/send/SendModal.qml index 482b803830..6c1ebbd084 100644 --- a/ui/imports/shared/popups/send/SendModal.qml +++ b/ui/imports/shared/popups/send/SendModal.qml @@ -28,7 +28,6 @@ import AppLayouts.Wallet.stores 1.0 as WalletStores import shared.popups.send.panels 1.0 import "./controls" import "./views" -import "./models" StatusDialog { id: popup diff --git a/ui/imports/shared/popups/send/models/SendModalAssetsAdaptor.qml b/ui/imports/shared/popups/send/models/SendModalAssetsAdaptor.qml deleted file mode 100644 index 063446bd0f..0000000000 --- a/ui/imports/shared/popups/send/models/SendModalAssetsAdaptor.qml +++ /dev/null @@ -1,201 +0,0 @@ -import QtQml 2.15 - -import StatusQ 0.1 -import StatusQ.Models 0.1 -import StatusQ.Core.Utils 0.1 - -import utils 1.0 - -import SortFilterProxyModel 0.2 - -QObject { - id: root - - // Controller providing information about visibility and order defined - // by a user (token management) - required property /*ManageTokensController*/ var controller - - property bool showCommunityAssets: false - - property string assetSearchString: "" - - /** - Expected model structure: - - Tokens related part: - - tokensKey [string] - unique identifier of a token, e.g "0x3234235" - symbol [string] - token's symbol e.g. "ETH" or "SNT" - name [string] - token's name e.g. "Ether" or "Dai" - image [url] - token's icon for custom tokens - decimals [int] - number of decimal places, e.g. 18 for ETH - balances [model] - submodel of balances per chain/account - chainId [string] - unique identifier of a chain - account [string] - unique identifier of an account - balance [string] - balance in basic unit as big integer string - marketDetails [object] - object holding market details - changePct24hour [double] - percentage change of fiat price in last day - currencyPrice [object] - object holding fiat price details - amount [double] - fiat prace of 1 logical unit of cryptocurrency - detailsLoading [bool] - indicatator if market details are ready to use - addressPerChain [model] - submodel of addresses per chain - chainId [string] - unique identifier of a chain - address [string] - address of a token contract - - Community related part (relevant for community minted assets, empty otherwise): - - communityId [string] - unique identifier of a community, e.g. "0x6734235" - **/ - property var tokensModel - - // function formatting tokens balance expressed in a commonly used units, - // e.g. 1.2 for 1.2 ETH, according to rules specific for given symbol - property var formatBalance: - (balance, symbol) => `${balance.toLocaleString(Qt.locale())} ${symbol}` - - // account used for balance calculation - property string account: "" - - // threshold below which the token is omitted from the output model - property double marketValueThreshold - - /** - Model structure: - - All roles from the source model are passed directly to the output model, - additionally: - - key [string] - renamed from tokensKey - icon [url] - from image or fetched by symbol for well-known tokens - currentbalance [double] - tokens balance is the commonly used unit, e.g. 1.2 for 1.2 ETH, - computed from balances according to provided criteria - currentBalanceText [string] - formatted and localized balance - currentCurrencyBalance [double] - tokens fiat balance computed from balance and market price - - marketDetailsAvailable [bool] - specifies if market datails are available for given token - marketDetailsLoading [bool] - specifies if market datails are available for given token - marketPrice [double] - specifies market price in currently used currency - marketChangePct24hour [double] - percentage price change in last 24 hours, e.g. 0.5 for 0.5% of price change - balancesModel [model] - filtered balances model by selected account - **/ - readonly property alias model: sfpm - - ObjectProxyModel { - id: proxyModel - - objectName: "sendModalAssetsAdaptor_proxyModel" - - sourceModel: root.tokensModel ?? null - - delegate: QObject { - readonly property var rootModel: model - readonly property bool isCommunityAsset: !!model.communityId - readonly property var marketDetails: model.marketDetails - - // Read-only roles exposed to the model: - readonly property string key: model.tokensKey - - readonly property double currentBalance: AmountsArithmetic.toNumber(totalBalanceAggregator.value, model.decimals) - readonly property double currentCurrencyBalance: currentBalance * marketPrice - - readonly property string currentBalanceText: root.formatBalance(currentBalance, model.symbol) - - readonly property bool marketDetailsAvailable: !isCommunityAsset - readonly property bool marketDetailsLoading: model.detailsLoading - readonly property real marketPrice: marketDetails.currencyPrice.amount ?? 0 - readonly property real marketChangePct24hour: marketDetails.changePct24hour ?? 0 - - readonly property bool visible: { - root.controller.revision - - if (!root.controller.filterAcceptsSymbol(model.symbol)) - return false - - if (isCommunityAsset) { - return root.showCommunityAssets - } - return currentCurrencyBalance >= root.marketValueThreshold - } - - readonly property url icon: !!model.image ? model.image : Constants.tokenIcon(model.symbol, false) - - readonly property var balancesModel: filteredBalances - - SortFilterProxyModel { - id: filteredBalances - - sourceModel: rootModel.balances - - filters: [ - FastExpressionFilter { - expression: root.account === model.account - expectedRoles: ["account"] - } - ] - } - - FunctionAggregator { - id: totalBalanceAggregator - - model: filteredBalances - initialValue: "0" - roleName: "balance" - - aggregateFunction: (aggr, value) => AmountsArithmetic.sum( - AmountsArithmetic.fromString(aggr), - AmountsArithmetic.fromString(value)).toString() - } - } - - expectedRoles: - ["tokensKey", "symbol", "image", "balances", "decimals", - "detailsLoading", "marketDetails", "communityId", "addressPerChain"] - exposedRoles: - ["key", "error", "currentBalance", "currentCurrencyBalance", "currentBalanceText", - "icon", "visible", "marketDetailsAvailable", "marketDetailsLoading", - "marketPrice", "marketChangePct24hour", "isCommunityAsset", "balancesModel"] - - - /* Internal function to search token address */ - function __searchAddressInList(addressPerChain, searchString) { - const uppercaseSearchString = searchString.toUpperCase() - let addressFound = false - let tokenAddresses = ModelUtils.modelToFlatArray(addressPerChain, "address") - for (let i =0; i< tokenAddresses.length; i++){ - if(tokenAddresses[i].toUpperCase().startsWith(uppercaseSearchString)) { - addressFound = true - break; - } - } - return addressFound - } - } - - SortFilterProxyModel { - id: sfpm - - sourceModel: proxyModel - objectName: "SendModalAssetsAdaptorModel" - - filters: [ - FastExpressionFilter { - function search(symbol, name, addressPerChain, searchString) { - const uppercaseSearchString = searchString.toUpperCase() - return ( - symbol.toUpperCase().startsWith(uppercaseSearchString) || - name.toUpperCase().startsWith(uppercaseSearchString) || proxyModel.__searchAddressInList(addressPerChain, searchString) - ) - } - expression: search(symbol, name, addressPerChain, root.assetSearchString) - expectedRoles: ["symbol", "name", "addressPerChain"] - }, - ValueFilter { - roleName: "visible" - value: true - } - ] - sorters: RoleSorter { - roleName: "isCommunityAsset" - } - } -} diff --git a/ui/imports/shared/popups/send/models/qmldir b/ui/imports/shared/popups/send/models/qmldir deleted file mode 100644 index 1f3d85b922..0000000000 --- a/ui/imports/shared/popups/send/models/qmldir +++ /dev/null @@ -1 +0,0 @@ -SendModalAssetsAdaptor 1.0 SendModalAssetsAdaptor.qml