diff --git a/src/app/modules/main/browser_section/current_account/controller.nim b/src/app/modules/main/browser_section/current_account/controller.nim index afd5393576..6ef0b8e80a 100644 --- a/src/app/modules/main/browser_section/current_account/controller.nim +++ b/src/app/modules/main/browser_section/current_account/controller.nim @@ -55,4 +55,7 @@ proc getCurrentCurrency*(self: Controller): string = return self.walletAccountService.getCurrency() proc getCurrencyFormat*(self: Controller, symbol: string): CurrencyFormatDto = - return self.currencyService.getCurrencyFormat(symbol) \ No newline at end of file + return self.currencyService.getCurrencyFormat(symbol) + +proc areTestNetworksEnabled*(self: Controller): bool = + return self.walletAccountService.areTestNetworksEnabled() diff --git a/src/app/modules/main/browser_section/current_account/module.nim b/src/app/modules/main/browser_section/current_account/module.nim index 2e75537e31..2f6226a74e 100644 --- a/src/app/modules/main/browser_section/current_account/module.nim +++ b/src/app/modules/main/browser_section/current_account/module.nim @@ -66,7 +66,7 @@ proc switchAccount*(self: Module, accountIndex: int) = let keycardAccount = self.controller.isKeycardAccount(walletAccount) let currency = self.controller.getCurrentCurrency() let enabledChainIds = self.controller.getEnabledChainIds() - + let areTestNetworksEnabled = self.controller.areTestNetworksEnabled() let currencyFormat = self.controller.getCurrencyFormat(currency) let accountItem = walletAccountToWalletAccountsItem( @@ -75,6 +75,7 @@ proc switchAccount*(self: Module, accountIndex: int) = enabledChainIds, currency, currencyFormat, + areTestNetworksEnabled ) self.view.setData(accountItem) diff --git a/src/app/modules/main/profile_section/wallet/accounts/controller.nim b/src/app/modules/main/profile_section/wallet/accounts/controller.nim index 2e5fa2fe4b..879c36b2c1 100644 --- a/src/app/modules/main/profile_section/wallet/accounts/controller.nim +++ b/src/app/modules/main/profile_section/wallet/accounts/controller.nim @@ -63,3 +63,12 @@ proc getCurrentCurrency*(self: Controller): string = proc getCurrencyFormat*(self: Controller, symbol: string): CurrencyFormatDto = return self.walletAccountService.getCurrencyFormat(symbol) + +proc updateWalletAccountProdPreferredChains*(self: Controller, address, preferredChainIds: string) = + discard self.walletAccountService.updateWalletAccountProdPreferredChains(address, preferredChainIds) + +proc updateWalletAccountTestPreferredChains*(self: Controller, address, preferredChainIds: string) = + discard self.walletAccountService.updateWalletAccountTestPreferredChains(address, preferredChainIds) + +proc areTestNetworksEnabled*(self: Controller): bool = + return self.walletAccountService.areTestNetworksEnabled() diff --git a/src/app/modules/main/profile_section/wallet/accounts/io_interface.nim b/src/app/modules/main/profile_section/wallet/accounts/io_interface.nim index 523d316984..1242f01b03 100644 --- a/src/app/modules/main/profile_section/wallet/accounts/io_interface.nim +++ b/src/app/modules/main/profile_section/wallet/accounts/io_interface.nim @@ -42,3 +42,9 @@ method getModuleAsVariant*(self: AccessInterface): QVariant {.base.} = method toggleIncludeWatchOnlyAccount*(self: AccessInterface) {.base.} = raise newException(ValueError, "No implementation available") + +method updateWalletAccountProdPreferredChains*(self: AccessInterface, address, preferredChainIds: string) {.base.} = + raise newException(ValueError, "No implementation available") + +method updateWalletAccountTestPreferredChains*(self: AccessInterface, address, preferredChainIds: string) {.base.} = + raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/profile_section/wallet/accounts/item.nim b/src/app/modules/main/profile_section/wallet/accounts/item.nim deleted file mode 100644 index 49805af89c..0000000000 --- a/src/app/modules/main/profile_section/wallet/accounts/item.nim +++ /dev/null @@ -1,45 +0,0 @@ -import strformat -import ../../../../shared_models/wallet_account_item -import ./related_accounts_model as related_accounts_model - -export wallet_account_item - -type - Item* = ref object of WalletAccountItem - relatedAccounts: related_accounts_model.Model - -proc initItem*( - name: string = "", - address: string = "", - path: string = "", - colorId: string = "", - walletType: string = "", - emoji: string = "", - relatedAccounts: related_accounts_model.Model = nil, - keyUid: string = "", - keycardAccount: bool = false, - position: int = 0, - operability: string = "" -): Item = - result = Item() - result.WalletAccountItem.setup(name, - address, - colorId, - emoji, - walletType, - path, - keyUid, - keycardAccount, - position, - operability) - - result.relatedAccounts = relatedAccounts - -proc `$`*(self: Item): string = - result = "ProfileSection-Accounts-Item(" - result = result & $self.WalletAccountItem - result = result & "\nrelatedAccounts: " & $self.relatedAccounts - result = result & ")" - -proc relatedAccounts*(self: Item): related_accounts_model.Model = - return self.relatedAccounts diff --git a/src/app/modules/main/profile_section/wallet/accounts/model.nim b/src/app/modules/main/profile_section/wallet/accounts/model.nim index 913627c3e6..9a3639df91 100644 --- a/src/app/modules/main/profile_section/wallet/accounts/model.nim +++ b/src/app/modules/main/profile_section/wallet/accounts/model.nim @@ -1,7 +1,6 @@ import NimQml, Tables, strutils, sequtils, strformat -import ./item -export item +import ../../../../shared_models/wallet_account_item type ModelRole {.pure.} = enum @@ -11,7 +10,6 @@ type ColorId, WalletType, Emoji, - RelatedAccounts, KeyUid, Position, KeycardAccount, @@ -19,7 +17,7 @@ type QtObject: type Model* = ref object of QAbstractListModel - items: seq[Item] + items: seq[WalletAccountItem] proc delete(self: Model) = self.items = @[] @@ -56,20 +54,19 @@ QtObject: ModelRole.ColorId.int:"colorId", ModelRole.WalletType.int:"walletType", ModelRole.Emoji.int: "emoji", - ModelRole.RelatedAccounts.int: "relatedAccounts", ModelRole.KeyUid.int: "keyUid", ModelRole.Position.int: "position", ModelRole.KeycardAccount.int: "keycardAccount", }.toTable - proc setItems*(self: Model, items: seq[Item]) = + proc setItems*(self: Model, items: seq[WalletAccountItem]) = self.beginResetModel() self.items = items self.endResetModel() self.countChanged() - proc onUpdatedAccount*(self: Model, account: Item) = + proc onUpdatedAccount*(self: Model, account: WalletAccountItem) = var i = 0 for item in self.items.mitems: if account.address == item.address: @@ -106,8 +103,6 @@ QtObject: result = newQVariant(item.walletType()) of ModelRole.Emoji: result = newQVariant(item.emoji()) - of ModelRole.RelatedAccounts: - result = newQVariant(item.relatedAccounts()) of ModelRole.KeyUid: result = newQVariant(item.keyUid()) of ModelRole.Position: @@ -133,4 +128,4 @@ QtObject: self.items.delete(fromRow) self.items.insert(@[currentItem], toRow) self.endMoveRows() - return true \ No newline at end of file + return true diff --git a/src/app/modules/main/profile_section/wallet/accounts/module.nim b/src/app/modules/main/profile_section/wallet/accounts/module.nim index 8c87186a2b..197fea93c1 100644 --- a/src/app/modules/main/profile_section/wallet/accounts/module.nim +++ b/src/app/modules/main/profile_section/wallet/accounts/module.nim @@ -1,6 +1,6 @@ import NimQml, sequtils, sugar, chronicles, tables -import ./io_interface, ./view, ./item, ./controller +import ./io_interface, ./view, ./controller import ../io_interface as delegate_interface import app/modules/shared/wallet_utils import app/modules/shared/keypairs @@ -62,7 +62,10 @@ method convertWalletAccountDtoToKeyPairAccountItem(self: Module, account: Wallet balance = newCurrencyAmount(), balanceFetched = false, operability = account.operable, - isDefaultAccount = account.isWallet) + isDefaultAccount = account.isWallet, + self.controller.areTestNetworksEnabled(), + prodPreferredChainIds = account.prodPreferredChainIds, + testPreferredChainIds = account.testPreferredChainIds) method createKeypairItems*(self: Module, walletAccounts: seq[WalletAccountDto], accountsTokens: OrderedTable[string, seq[WalletTokenDto]]): seq[KeyPairItem] = let enabledChainIds = self.controller.getEnabledChainIds() @@ -70,7 +73,7 @@ method createKeypairItems*(self: Module, walletAccounts: seq[WalletAccountDto], let currencyFormat = self.controller.getCurrencyFormat(currency) var keyPairItems = keypairs.buildKeyPairsList(self.controller.getKeypairs(), excludeAlreadyMigratedPairs = false, - excludePrivateKeyKeypairs = false) + excludePrivateKeyKeypairs = false, self.controller.areTestNetworksEnabled()) var item = newKeyPairItem() item.setIcon("show") @@ -90,7 +93,8 @@ method refreshWalletAccounts*(self: Module, accountsTokens: OrderedTable[string, let items = walletAccounts.map(w => (block: let keycardAccount = self.controller.isKeycardAccount(w) - walletAccountToWalletSettingsAccountsItem(w, keycardAccount) + let areTestNetworksEnabled = self.controller.areTestNetworksEnabled() + walletAccountToWalletAccountItem(w, keycardAccount, areTestNetworksEnabled) )) self.view.setKeyPairModelItems(self.createKeypairItems(walletAccounts, accountsTokens)) @@ -113,7 +117,8 @@ method load*(self: Module) = self.events.on(SIGNAL_WALLET_ACCOUNT_UPDATED) do(e:Args): let args = AccountArgs(e) let keycardAccount = self.controller.isKeycardAccount(args.account) - self.view.onUpdatedAccount(walletAccountToWalletSettingsAccountsItem(args.account, keycardAccount)) + let areTestNetworksEnabled = self.controller.areTestNetworksEnabled() + self.view.onUpdatedAccount(walletAccountToWalletAccountItem(args.account, keycardAccount, areTestNetworksEnabled), args.account.prodPreferredChainIds, args.account.testPreferredChainIds) self.events.on(SIGNAL_NEW_KEYCARD_SET) do(e: Args): let args = KeycardArgs(e) @@ -164,3 +169,9 @@ method renameKeypair*(self: Module, keyUid: string, name: string) = proc onKeypairRenamed(self: Module, keyUid: string, name: string) = self.view.keyPairModel.updateKeypairName(keyUid, name) + +method updateWalletAccountProdPreferredChains*(self: Module, address, preferredChainIds: string) = + self.controller.updateWalletAccountProdPreferredChains(address, preferredChainIds) + +method updateWalletAccountTestPreferredChains*(self: Module, address, preferredChainIds: string) = + self.controller.updateWalletAccountTestPreferredChains(address, preferredChainIds) diff --git a/src/app/modules/main/profile_section/wallet/accounts/related_account_item.nim b/src/app/modules/main/profile_section/wallet/accounts/related_account_item.nim deleted file mode 100644 index c39984bc48..0000000000 --- a/src/app/modules/main/profile_section/wallet/accounts/related_account_item.nim +++ /dev/null @@ -1,32 +0,0 @@ -import strformat - -type - Item* = object - name: string - colorId: string - emoji: string - -proc initItem*( - name: string = "", - colorId: string = "", - emoji: string = "", -): Item = - result.name = name - result.colorId = colorId - result.emoji = emoji - -proc `$`*(self: Item): string = - result = fmt"""WalletAccountItem( - name: {self.name}, - colorId: {self.colorId}, - emoji: {self.emoji}, - ]""" - -proc getName*(self: Item): string = - return self.name - -proc getEmoji*(self: Item): string = - return self.emoji - -proc getColorId*(self: Item): string = - return self.colorId diff --git a/src/app/modules/main/profile_section/wallet/accounts/related_accounts_model.nim b/src/app/modules/main/profile_section/wallet/accounts/related_accounts_model.nim deleted file mode 100644 index 7324f77b46..0000000000 --- a/src/app/modules/main/profile_section/wallet/accounts/related_accounts_model.nim +++ /dev/null @@ -1,73 +0,0 @@ -import NimQml, Tables, strutils, strformat - -import ./related_account_item - -type - ModelRole {.pure.} = enum - Name = UserRole + 1, - ColorId, - Emoji, - -QtObject: - type - Model* = ref object of QAbstractListModel - items: seq[Item] - - proc delete(self: Model) = - self.items = @[] - self.QAbstractListModel.delete - - proc setup(self: Model) = - self.QAbstractListModel.setup - - proc newModel*(): Model = - new(result, delete) - result.setup - - proc `$`*(self: Model): string = - for i in 0 ..< self.items.len: - result &= fmt"""[{i}]:({$self.items[i]})""" - - proc countChanged(self: Model) {.signal.} - - proc getCount*(self: Model): int {.slot.} = - self.items.len - - QtProperty[int] count: - read = getCount - notify = countChanged - - method rowCount(self: Model, index: QModelIndex = nil): int = - return self.items.len - - method roleNames(self: Model): Table[int, string] = - { - ModelRole.Name.int:"name", - ModelRole.ColorId.int:"colorId", - ModelRole.Emoji.int: "emoji", - }.toTable - - - proc setItems*(self: Model, items: seq[Item]) = - self.beginResetModel() - self.items = items - self.endResetModel() - self.countChanged() - - method data(self: Model, index: QModelIndex, role: int): QVariant = - if (not index.isValid): - return - - if (index.row < 0 or index.row >= self.items.len): - return - - let item = self.items[index.row] - let enumRole = role.ModelRole - - case enumRole: - of ModelRole.Name: - result = newQVariant(item.getName()) - of ModelRole.ColorId: - result = newQVariant(item.getColorId()) - of ModelRole.Emoji: - result = newQVariant(item.getEmoji()) diff --git a/src/app/modules/main/profile_section/wallet/accounts/view.nim b/src/app/modules/main/profile_section/wallet/accounts/view.nim index 6a63421a3e..52a1ebc7e2 100644 --- a/src/app/modules/main/profile_section/wallet/accounts/view.nim +++ b/src/app/modules/main/profile_section/wallet/accounts/view.nim @@ -3,6 +3,7 @@ import NimQml, sequtils, strutils, sugar import ./io_interface import ./model import app/modules/shared_models/keypair_model +import app/modules/shared_models/wallet_account_item QtObject: type @@ -39,15 +40,15 @@ QtObject: read = getAccounts notify = accountsChanged - proc setItems*(self: View, items: seq[Item]) = + proc setItems*(self: View, items: seq[WalletAccountItem]) = self.accounts.setItems(items) proc updateAccount(self: View, address: string, accountName: string, colorId: string, emoji: string) {.slot.} = self.delegate.updateAccount(address, accountName, colorId, emoji) - proc onUpdatedAccount*(self: View, account: Item) = + proc onUpdatedAccount*(self: View, account: WalletAccountItem, prodPreferredChainIds: string, testPreferredChainIds: string) = self.accounts.onUpdatedAccount(account) - self.keyPairModel.onUpdatedAccount(account.keyUid, account.address, account.name, account.colorId, account.emoji) + self.keyPairModel.onUpdatedAccount(account.keyUid, account.address, account.name, account.colorId, account.emoji, prodPreferredChainIds, testPreferredChainIds) proc deleteAccount*(self: View, address: string) {.slot.} = self.delegate.deleteAccount(address) @@ -90,4 +91,10 @@ QtObject: discard self.accounts.moveItem(fromRow, toRow) proc moveAccountFinally(self: View, fromRow: int, toRow: int) {.slot.} = - self.delegate.moveAccountFinally(fromRow, toRow) \ No newline at end of file + self.delegate.moveAccountFinally(fromRow, toRow) + + proc updateWalletAccountProdPreferredChains*(self: View, address: string, preferredChainIds: string) {.slot.} = + self.delegate.updateWalletAccountProdPreferredChains(address, preferredChainIds) + + proc updateWalletAccountTestPreferredChains*(self: View, address: string, preferredChainIds: string) {.slot.} = + self.delegate.updateWalletAccountTestPreferredChains(address, preferredChainIds) diff --git a/src/app/modules/main/profile_section/wallet/networks/combined_item.nim b/src/app/modules/main/profile_section/wallet/networks/combined_item.nim index 15ba1c5f05..58a9d6e92e 100644 --- a/src/app/modules/main/profile_section/wallet/networks/combined_item.nim +++ b/src/app/modules/main/profile_section/wallet/networks/combined_item.nim @@ -38,3 +38,9 @@ proc getShortName*(self: CombinedItem, areTestNetworksEnabled: bool): string = return self.test.shortName() else: return self.prod.shortName() + +proc getChainId*(self: CombinedItem, areTestNetworksEnabled: bool): int = + if areTestNetworksEnabled: + return self.test.chainId() + else: + return self.prod.chainId() diff --git a/src/app/modules/main/profile_section/wallet/networks/combined_model.nim b/src/app/modules/main/profile_section/wallet/networks/combined_model.nim index 6353d4776e..6ee46b5b03 100644 --- a/src/app/modules/main/profile_section/wallet/networks/combined_model.nim +++ b/src/app/modules/main/profile_section/wallet/networks/combined_model.nim @@ -71,8 +71,19 @@ QtObject: self.endResetModel() self.countChanged() - proc getAllNetworksSupportedPrefix*(self: CombinedModel, areTestNetworksEnabled: bool): string = - var networkString = "" + proc getAllNetworksChainIds*(self: CombinedModel, areTestNetworksEnabled: bool): string = + var networks: seq[int] = @[] for item in self.items: - networkString = networkString & item.getShortName(areTestNetworksEnabled) & ':' + networks.add(item.getChainId(areTestNetworksEnabled)) + return networks.join(":") + + proc getNetworkShortNames*(self: CombinedModel, preferredNetworks: string, areTestNetworksEnabled: bool): string = + var networkString = "" + let networks = preferredNetworks.split(":") + for nw in networks: + for item in self.items: + if $item.getChainId(areTestNetworksEnabled) == nw: + networkString = networkString & $item.getShortName(areTestNetworksEnabled) & ':' + break return networkString + diff --git a/src/app/modules/main/profile_section/wallet/networks/model.nim b/src/app/modules/main/profile_section/wallet/networks/model.nim new file mode 100644 index 0000000000..749b2ddad5 --- /dev/null +++ b/src/app/modules/main/profile_section/wallet/networks/model.nim @@ -0,0 +1,96 @@ +import NimQml, Tables, strutils, strformat + +import ./item + +type + ModelRole* {.pure.} = enum + ChainId = UserRole + 1, + Layer + ChainName + IconUrl + ShortName + ChainColor + +QtObject: + type + Model* = ref object of QAbstractListModel + items: seq[Item] + + proc delete(self: Model) = + self.items = @[] + self.QAbstractListModel.delete + + proc setup(self: Model) = + self.QAbstractListModel.setup + + proc newModel*(): Model = + new(result, delete) + result.setup + + proc `$`*(self: Model): string = + for i in 0 ..< self.items.len: + result &= fmt"""[{i}]:({$self.items[i]})""" + + proc countChanged(self: Model) {.signal.} + + proc getCount(self: Model): int {.slot.} = + self.items.len + + QtProperty[int] count: + read = getCount + notify = countChanged + + method rowCount*(self: Model, index: QModelIndex = nil): int = + return self.items.len + + method roleNames(self: Model): Table[int, string] = + { + ModelRole.ChainId.int:"chainId", + ModelRole.Layer.int:"layer", + ModelRole.ChainName.int:"chainName", + ModelRole.IconUrl.int:"iconUrl", + ModelRole.ShortName.int:"shortName", + ModelRole.ChainColor.int:"chainColor", + }.toTable + + method data(self: Model, index: QModelIndex, role: int): QVariant = + if (not index.isValid): + return + + if (index.row < 0 or index.row >= self.items.len): + return + + let item = self.items[index.row] + let enumRole = role.ModelRole + + case enumRole: + of ModelRole.ChainId: + result = newQVariant(item.chainId()) + of ModelRole.Layer: + result = newQVariant(item.layer()) + of ModelRole.ChainName: + result = newQVariant(item.chainName()) + of ModelRole.IconUrl: + result = newQVariant(item.iconURL()) + of ModelRole.ShortName: + result = newQVariant(item.shortName()) + of ModelRole.ChainColor: + result = newQVariant(item.chainColor()) + + proc rowData*(self: Model, index: int, column: string): string {.slot.} = + if (index >= self.items.len): + return + let item = self.items[index] + case column: + of "chainId": result = $item.chainId() + of "layer": result = $item.layer() + of "chainName": result = $item.chainName() + of "iconUrl": result = $item.iconURL() + of "shortName": result = $item.shortName() + of "chainColor": result = $item.chainColor() + + proc setItems*(self: Model, items: seq[Item]) = + self.beginResetModel() + self.items = items + self.endResetModel() + self.countChanged() diff --git a/src/app/modules/main/profile_section/wallet/networks/module.nim b/src/app/modules/main/profile_section/wallet/networks/module.nim index 0c58a8e6cd..dea2969f76 100644 --- a/src/app/modules/main/profile_section/wallet/networks/module.nim +++ b/src/app/modules/main/profile_section/wallet/networks/module.nim @@ -39,6 +39,7 @@ method getModuleAsVariant*(self: Module): QVariant = return self.viewVariant method refreshNetworks*(self: Module) = + var items: seq[Item] = @[] var combinedItems: seq[CombinedItem] = @[] for n in self.controller.getNetworks(): var prod = newItem( @@ -65,8 +66,12 @@ method refreshNetworks*(self: Module) = n.test.blockExplorerURL, n.test.nativeCurrencySymbol ) + if self.controller.areTestNetworksEnabled(): + items.add(test) + else: + items.add(prod) combinedItems.add(initCombinedItem(prod,test,n.prod.layer)) - self.view.setItems(combinedItems) + self.view.setItems(items, combinedItems) method load*(self: Module) = self.controller.init() @@ -98,4 +103,4 @@ method fetchChainIdForUrl*(self: Module, url: string) = self.controller.fetchChainIdForUrl(url) method chainIdFetchedForUrl*(self: Module, url: string, chainId: int, success: bool) = - self.view.chainIdFetchedForUrl(url, chainId, success) \ No newline at end of file + self.view.chainIdFetchedForUrl(url, chainId, success) diff --git a/src/app/modules/main/profile_section/wallet/networks/view.nim b/src/app/modules/main/profile_section/wallet/networks/view.nim index 83544f9c8f..a90b8676a3 100644 --- a/src/app/modules/main/profile_section/wallet/networks/view.nim +++ b/src/app/modules/main/profile_section/wallet/networks/view.nim @@ -1,8 +1,8 @@ import Tables, NimQml, sequtils, sugar -#import ../../../../../../app_service/service/network/dto import ./io_interface -#import ./item +import ./item +import ./model import ./combined_item import ./combined_model @@ -11,6 +11,7 @@ QtObject: View* = ref object of QObject delegate: io_interface.AccessInterface combinedNetworks: CombinedModel + networks: Model areTestNetworksEnabled: bool proc setup(self: View) = @@ -24,6 +25,7 @@ QtObject: new(result, delete) result.delegate = delegate result.combinedNetworks = newCombinedModel() + result.networks = newModel() result.setup() proc areTestNetworksEnabledChanged*(self: View) {.signal.} @@ -44,6 +46,13 @@ QtObject: self.areTestNetworksEnabled = not self.areTestNetworksEnabled self.areTestNetworksEnabledChanged() + proc networksChanged*(self: View) {.signal.} + proc getNetworks(self: View): QVariant {.slot.} = + return newQVariant(self.networks) + QtProperty[QVariant] networks: + read = getNetworks + notify = networksChanged + proc combinedNetworksChanged*(self: View) {.signal.} proc getCombinedNetworks(self: View): QVariant {.slot.} = return newQVariant(self.combinedNetworks) @@ -54,11 +63,15 @@ QtObject: proc load*(self: View) = self.delegate.viewDidLoad() - proc setItems*(self: View, combinedItems: seq[CombinedItem]) = + proc setItems*(self: View, items: seq[Item], combinedItems: seq[CombinedItem]) = + self.networks.setItems(items) self.combinedNetworks.setItems(combinedItems) - proc getAllNetworksSupportedPrefix*(self: View): string {.slot.} = - return self.combinedNetworks.getAllNetworksSupportedPrefix(self.areTestNetworksEnabled) + proc getAllNetworksChainIds*(self: View): string {.slot.} = + return self.combinedNetworks.getAllNetworksChainIds(self.areTestNetworksEnabled) + + proc getNetworkShortNames*(self: View, preferredNetworks: string): string {.slot.} = + return self.combinedNetworks.getNetworkShortNames(preferredNetworks, self.areTestNetworksEnabled) proc updateNetworkEndPointValues*(self: View, chainId: int, newMainRpcInput, newFailoverRpcUrl: string) = self.delegate.updateNetworkEndPointValues(chainId, newMainRpcInput, newFailoverRpcUrl) @@ -66,4 +79,4 @@ QtObject: proc fetchChainIdForUrl*(self: View, url: string) {.slot.} = self.delegate.fetchChainIdForUrl(url) - proc chainIdFetchedForUrl*(self: View, url: string, chainId: int, success: bool) {.signal.} \ No newline at end of file + proc chainIdFetchedForUrl*(self: View, url: string, chainId: int, success: bool) {.signal.} diff --git a/src/app/modules/main/wallet_section/accounts/controller.nim b/src/app/modules/main/wallet_section/accounts/controller.nim index 10f6798a87..0b54b2dad5 100644 --- a/src/app/modules/main/wallet_section/accounts/controller.nim +++ b/src/app/modules/main/wallet_section/accounts/controller.nim @@ -58,3 +58,12 @@ proc getWalletAccount*(self: Controller, address: string): WalletAccountDto = proc updateAccount*(self: Controller, address: string, accountName: string, colorId: string, emoji: string) = discard self.walletAccountService.updateWalletAccount(address, accountName, colorId, emoji) + +proc updateWalletAccountProdPreferredChains*(self: Controller, address, preferredChainIds: string) = + discard self.walletAccountService.updateWalletAccountProdPreferredChains(address, preferredChainIds) + +proc updateWalletAccountTestPreferredChains*(self: Controller, address, preferredChainIds: string) = + discard self.walletAccountService.updateWalletAccountTestPreferredChains(address, preferredChainIds) + +proc areTestNetworksEnabled*(self: Controller): bool = + return self.walletAccountService.areTestNetworksEnabled() diff --git a/src/app/modules/main/wallet_section/accounts/io_interface.nim b/src/app/modules/main/wallet_section/accounts/io_interface.nim index afb80a8a89..cce2343e31 100644 --- a/src/app/modules/main/wallet_section/accounts/io_interface.nim +++ b/src/app/modules/main/wallet_section/accounts/io_interface.nim @@ -30,3 +30,9 @@ method updateAccount*(self: AccessInterface, address: string, accountName: strin # inheritance, which is not well supported in Nim. method viewDidLoad*(self: AccessInterface) {.base.} = raise newException(ValueError, "No implementation available") + +method updateWalletAccountProdPreferredChains*(self: AccessInterface, address, preferredChainIds: string) {.base.} = + raise newException(ValueError, "No implementation available") + +method updateWalletAccountTestPreferredChains*(self: AccessInterface, address, preferredChainIds: string) {.base.} = + raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/wallet_section/accounts/item.nim b/src/app/modules/main/wallet_section/accounts/item.nim index b4aef18649..9b72aae512 100644 --- a/src/app/modules/main/wallet_section/accounts/item.nim +++ b/src/app/modules/main/wallet_section/accounts/item.nim @@ -25,6 +25,9 @@ proc initItem*( keycardAccount: bool = false, assetsLoading: bool = true, isWallet: bool = false, + areTestNetworksEnabled: bool = false, + prodPreferredChainIds: string = "", + testPreferredChainIds: string = "" ): Item = result = Item() result.WalletAccountItem.setup(name, @@ -35,7 +38,11 @@ proc initItem*( path, keyUid, keycardAccount, - position) + position, + operability = wa_dto.AccountFullyOperable, + areTestNetworksEnabled, + prodPreferredChainIds, + testPreferredChainIds) result.createdAt = createdAt result.assetsLoading = assetsLoading result.currencyBalance = currencyBalance diff --git a/src/app/modules/main/wallet_section/accounts/model.nim b/src/app/modules/main/wallet_section/accounts/model.nim index 2949957148..925d97aa30 100644 --- a/src/app/modules/main/wallet_section/accounts/model.nim +++ b/src/app/modules/main/wallet_section/accounts/model.nim @@ -19,6 +19,7 @@ type KeycardAccount, AssetsLoading, IsWallet, + PreferredSharingChainIds QtObject: type @@ -68,6 +69,7 @@ QtObject: ModelRole.KeycardAccount.int: "keycardAccount", ModelRole.AssetsLoading.int: "assetsLoading", ModelRole.IsWallet.int: "isWallet", + ModelRole.PreferredSharingChainIds.int: "preferredSharingChainIds" }.toTable @@ -117,6 +119,8 @@ QtObject: result = newQVariant(item.assetsLoading()) of ModelRole.IsWallet: result = newQVariant(item.isWallet()) + of ModelRole.PreferredSharingChainIds: + result = newQVariant(item.preferredSharingChainIds()) proc getNameByAddress*(self: Model, address: string): string = for item in self.items: diff --git a/src/app/modules/main/wallet_section/accounts/module.nim b/src/app/modules/main/wallet_section/accounts/module.nim index 931eb4d1ca..4a9aeb0f42 100644 --- a/src/app/modules/main/wallet_section/accounts/module.nim +++ b/src/app/modules/main/wallet_section/accounts/module.nim @@ -46,6 +46,7 @@ method filterChanged*(self: Module, addresses: seq[string], chainIds: seq[int]) let walletAccounts = self.controller.getWalletAccounts() let currency = self.controller.getCurrentCurrency() let currencyFormat = self.controller.getCurrencyFormat(currency) + let areTestNetworksEnabled = self.controller.areTestNetworksEnabled() let items = walletAccounts.map(w => (block: let keycardAccount = self.controller.isKeycardAccount(w) walletAccountToWalletAccountsItem( @@ -54,6 +55,7 @@ method filterChanged*(self: Module, addresses: seq[string], chainIds: seq[int]) chainIds, currency, currencyFormat, + areTestNetworksEnabled ) )) self.view.setItems(items) @@ -75,3 +77,9 @@ method deleteAccount*(self: Module, address: string) = method updateAccount*(self: Module, address: string, accountName: string, colorId: string, emoji: string) = self.controller.updateAccount(address, accountName, colorId, emoji) + +method updateWalletAccountProdPreferredChains*(self: Module, address, preferredChainIds: string) = + self.controller.updateWalletAccountProdPreferredChains(address, preferredChainIds) + +method updateWalletAccountTestPreferredChains*(self: Module, address, preferredChainIds: string) = + self.controller.updateWalletAccountTestPreferredChains(address, preferredChainIds) diff --git a/src/app/modules/main/wallet_section/accounts/view.nim b/src/app/modules/main/wallet_section/accounts/view.nim index 49c0097bd2..a146a7955d 100644 --- a/src/app/modules/main/wallet_section/accounts/view.nim +++ b/src/app/modules/main/wallet_section/accounts/view.nim @@ -54,3 +54,10 @@ QtObject: proc getColorByAddress(self: View, address: string): string {.slot.}= return self.accounts.getColorByAddress(address) + + proc updateWalletAccountProdPreferredChains*(self: View, address: string, preferredChainIds: string) {.slot.} = + self.delegate.updateWalletAccountProdPreferredChains(address, preferredChainIds) + + proc updateWalletAccountTestPreferredChains*(self: View, address: string, preferredChainIds: string) {.slot.} = + self.delegate.updateWalletAccountTestPreferredChains(address, preferredChainIds) + diff --git a/src/app/modules/main/wallet_section/assets/item.nim b/src/app/modules/main/wallet_section/assets/item.nim index 891f6f0adb..78d07ae638 100644 --- a/src/app/modules/main/wallet_section/assets/item.nim +++ b/src/app/modules/main/wallet_section/assets/item.nim @@ -17,7 +17,7 @@ proc initItem*( result.hasMarketValuesCache = hasMarketValuesCache proc `$`*(self: Item): string = - result = fmt"""WalletAccountItem( + result = fmt"""WalletAssetItem( assetsLoading: {self.assetsLoading}, hasBalanceCache: {self.hasBalanceCache}, hasMarketValuesCache: {self.hasMarketValuesCache}, @@ -30,4 +30,4 @@ proc getHasBalanceCache*(self: Item): bool = return self.hasBalanceCache proc getHasMarketValuesCache*(self: Item): bool = - return self.hasMarketValuesCache \ No newline at end of file + return self.hasMarketValuesCache diff --git a/src/app/modules/main/wallet_section/networks/model.nim b/src/app/modules/main/wallet_section/networks/model.nim index b8403200ea..fa9741b2cb 100644 --- a/src/app/modules/main/wallet_section/networks/model.nim +++ b/src/app/modules/main/wallet_section/networks/model.nim @@ -1,4 +1,4 @@ -import NimQml, Tables, strutils, strformat, sequtils +import NimQml, Tables, strutils, strformat, sequtils, sugar import ./item @@ -241,8 +241,15 @@ QtObject: return (chainIds, enable) - proc getAllNetworksSupportedPrefix*(self: Model): string = + proc getNetworkShortNames*(self: Model, preferredNetworks: string): string = var networkString = "" - for item in self.items: - networkString = networkString & item.getShortName() & ':' + let networks = preferredNetworks.split(":") + for nw in networks: + for item in self.items: + if $item.getChainId() == nw: + networkString = networkString & item.getShortName() & ':' + break return networkString + + proc getAllNetworksChainIds*(self: Model): string = + return self.items.map(x => x.getChainId()).join(":") diff --git a/src/app/modules/main/wallet_section/networks/view.nim b/src/app/modules/main/wallet_section/networks/view.nim index 70f6fd2ced..b0c1f1136e 100644 --- a/src/app/modules/main/wallet_section/networks/view.nim +++ b/src/app/modules/main/wallet_section/networks/view.nim @@ -126,8 +126,11 @@ QtObject: proc getMainnetChainId*(self: View): int {.slot.} = return self.layer1.getLayer1Network(self.areTestNetworksEnabled) - proc getAllNetworksSupportedPrefix*(self: View): string {.slot.} = - return self.all.getAllNetworksSupportedPrefix() + proc getNetworkShortNames*(self: View, preferredNetworks: string): string {.slot.} = + return self.all.getNetworkShortNames(preferredNetworks) + + proc getAllNetworksChainIds*(self: View): string {.slot.} = + return self.all.getAllNetworksChainIds() proc networkEnabledToUxEnabledState(enabled: bool, allEnabled: bool): UxEnabledState = return if allEnabled: @@ -141,4 +144,4 @@ proc areAllEnabled(networks: seq[NetworkDto]): bool = return networks.allIt(it.enabled) proc getNetworkLayer*(self: View, chainId: int): string = - return self.all.getNetworkLayer(chainId) \ No newline at end of file + return self.all.getNetworkLayer(chainId) diff --git a/src/app/modules/main/wallet_section/send/account_item.nim b/src/app/modules/main/wallet_section/send/account_item.nim index a7e98e762f..d53a9fea59 100644 --- a/src/app/modules/main/wallet_section/send/account_item.nim +++ b/src/app/modules/main/wallet_section/send/account_item.nim @@ -19,6 +19,9 @@ QtObject: assets: token_model.Model, currencyBalance: CurrencyAmount, position: int, + areTestNetworksEnabled: bool, + prodPreferredChainIds: string, + testPreferredChainIds: string ) = self.QObject.setup self.WalletAccountItem.setup(name, @@ -29,7 +32,11 @@ QtObject: path = "", keyUid = "", keycardAccount = false, - position) + position, + operability = wa_dto.AccountFullyOperable, + areTestNetworksEnabled, + prodPreferredChainIds, + testPreferredChainIds) self.assets = assets self.currencyBalance = currencyBalance @@ -44,10 +51,13 @@ QtObject: walletType: string = "", assets: token_model.Model = nil, currencyBalance: CurrencyAmount = nil, + areTestNetworksEnabled: bool = false, + prodPreferredChainIds: string = "", + testPreferredChainIds: string = "", position: int = 0, ): AccountItem = new(result, delete) - result.setup(name, address, colorId, emoji, walletType, assets, currencyBalance, position) + result.setup(name, address, colorId, emoji, walletType, assets, currencyBalance, position, areTestNetworksEnabled, prodPreferredChainIds, testPreferredChainIds) proc `$`*(self: AccountItem): string = result = "WalletSection-Send-Item(" @@ -72,4 +82,4 @@ QtObject: return newQVariant(self.currencyBalance) QtProperty[QVariant] currencyBalance: read = getCurrencyBalanceAsQVariant - notify = currencyBalanceChanged \ No newline at end of file + notify = currencyBalanceChanged diff --git a/src/app/modules/main/wallet_section/send/accounts_model.nim b/src/app/modules/main/wallet_section/send/accounts_model.nim index d46f449405..750f1bcb7d 100644 --- a/src/app/modules/main/wallet_section/send/accounts_model.nim +++ b/src/app/modules/main/wallet_section/send/accounts_model.nim @@ -13,6 +13,7 @@ type Assets, CurrencyBalance, Position, + PreferredSharingChainIds QtObject: type @@ -56,6 +57,7 @@ QtObject: ModelRole.Assets.int: "assets", ModelRole.CurrencyBalance.int: "currencyBalance", ModelRole.Position.int: "position", + ModelRole.PreferredSharingChainIds.int: "preferredSharingChainIds" }.toTable proc setItems*(self: AccountsModel, items: seq[AccountItem]) = @@ -91,6 +93,8 @@ QtObject: result = newQVariant(item.getAssetsAsQVariant()) of ModelRole.CurrencyBalance: result = newQVariant(item.getCurrencyBalanceAsQVariant()) + of ModelRole.PreferredSharingChainIds: + result = newQVariant(item.preferredSharingChainIds()) method getItemByIndex*(self: AccountsModel, index: int): AccountItem = if index < 0 or index >= self.items.len: diff --git a/src/app/modules/main/wallet_section/send/controller.nim b/src/app/modules/main/wallet_section/send/controller.nim index fcbbc22f13..12a83d3231 100644 --- a/src/app/modules/main/wallet_section/send/controller.nim +++ b/src/app/modules/main/wallet_section/send/controller.nim @@ -101,3 +101,6 @@ proc transfer*(self: Controller, from_addr: string, to_addr: string, tokenSymbol proc suggestedFees*(self: Controller, chainId: int): string = let suggestedFees = self.transactionService.suggestedFees(chainId) return suggestedFees.toJson() + +proc areTestNetworksEnabled*(self: Controller): bool = + return self.walletAccountService.areTestNetworksEnabled() diff --git a/src/app/modules/main/wallet_section/send/module.nim b/src/app/modules/main/wallet_section/send/module.nim index dc17bc8f3f..9717799d62 100644 --- a/src/app/modules/main/wallet_section/send/module.nim +++ b/src/app/modules/main/wallet_section/send/module.nim @@ -62,6 +62,7 @@ method refreshWalletAccounts*(self: Module) = let enabledChainIds = self.controller.getEnabledChainIds() let currencyFormat = self.controller.getCurrencyFormat(currency) let chainIds = self.controller.getChainIds() + let areTestNetworksEnabled = self.controller.areTestNetworksEnabled() let items = walletAccounts.map(w => (block: let tokenFormats = collect(initTable()): @@ -74,6 +75,7 @@ method refreshWalletAccounts*(self: Module) = currency, currencyFormat, tokenFormats, + areTestNetworksEnabled, ) )) diff --git a/src/app/modules/shared/keypairs.nim b/src/app/modules/shared/keypairs.nim index e3a6763a40..822950b5a1 100644 --- a/src/app/modules/shared/keypairs.nim +++ b/src/app/modules/shared/keypairs.nim @@ -11,7 +11,7 @@ logScope: topics = "shared-keypairs" proc buildKeyPairsList*(keypairs: seq[KeypairDto], excludeAlreadyMigratedPairs: bool, - excludePrivateKeyKeypairs: bool): seq[KeyPairItem] = + excludePrivateKeyKeypairs: bool, areTestNetworksEnabled: bool = false): seq[KeyPairItem] = var items: seq[KeyPairItem] for kp in keypairs: if kp.accounts.len == 0: @@ -40,7 +40,7 @@ proc buildKeyPairsList*(keypairs: seq[KeypairDto], excludeAlreadyMigratedPairs: if acc.emoji.len == 0: icon = "wallet" item.addAccount(newKeyPairAccountItem(acc.name, acc.path, acc.address, acc.publicKey, acc.emoji, acc.colorId, - icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet)) + icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet, areTestNetworksEnabled, acc.prodPreferredChainIds, acc.testPreferredChainIds)) items.insert(item, 0) # Status Account must be at first place continue if kp.keypairType == KeypairTypeSeed: @@ -59,7 +59,7 @@ proc buildKeyPairsList*(keypairs: seq[KeypairDto], excludeAlreadyMigratedPairs: if acc.emoji.len == 0: icon = "wallet" item.addAccount(newKeyPairAccountItem(acc.name, acc.path, acc.address, acc.publicKey, acc.emoji, acc.colorId, - icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet)) + icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet, areTestNetworksEnabled, acc.prodPreferredChainIds, acc.testPreferredChainIds)) items.add(item) continue if kp.keypairType == KeypairTypeKey: @@ -80,7 +80,7 @@ proc buildKeyPairsList*(keypairs: seq[KeypairDto], excludeAlreadyMigratedPairs: if acc.emoji.len == 0: icon = "wallet" item.addAccount(newKeyPairAccountItem(acc.name, acc.path, acc.address, acc.publicKey, acc.emoji, acc.colorId, - icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet)) + icon, newCurrencyAmount(), balanceFetched = true, operability = acc.operable, acc.isWallet, areTestNetworksEnabled, acc.prodPreferredChainIds, acc.testPreferredChainIds)) items.add(item) continue if items.len == 0: diff --git a/src/app/modules/shared/wallet_utils.nim b/src/app/modules/shared/wallet_utils.nim index 3435c8e1f6..c601cc953b 100644 --- a/src/app/modules/shared/wallet_utils.nim +++ b/src/app/modules/shared/wallet_utils.nim @@ -1,6 +1,6 @@ import tables, sequtils, sugar -import ../shared_models/[balance_item, currency_amount, token_item, token_model] +import ../shared_models/[balance_item, currency_amount, token_item, token_model, wallet_account_item] import ../../../app_service/service/wallet_account/service as wallet_account_service import ../../../app_service/service/currency/dto as currency_dto @@ -8,8 +8,6 @@ import ../../../app_service/service/currency/dto as currency_dto import ../main/wallet_section/accounts/item as wallet_accounts_item import ../main/wallet_section/assets/item as wallet_assets_item import ../main/wallet_section/send/account_item as wallet_send_account_item -import ../main/profile_section/wallet/accounts/item as wallet_settings_accounts_item -import ../main/profile_section/wallet/accounts/[related_account_item, related_accounts_model] proc currencyAmountToItem*(amount: float64, format: CurrencyFormatDto) : CurrencyAmount = return newCurrencyAmount( @@ -26,36 +24,28 @@ proc balanceToItemBalanceItem*(b: BalanceDto, format: CurrencyFormatDto) : balan b.chainId ) -proc walletAccountToRelatedAccountItem*(w: WalletAccountDto) : related_account_item.Item = - return related_account_item.initItem( - w.name, - w.colorId, - w.emoji, - ) - -proc walletAccountToWalletSettingsAccountsItem*(w: WalletAccountDto, keycardAccount: bool): wallet_settings_accounts_item.Item = - let relatedAccounts = related_accounts_model.newModel() +proc walletAccountToWalletAccountItem*(w: WalletAccountDto, keycardAccount: bool, areTestNetworksEnabled: bool): WalletAccountItem = if w.isNil: - return wallet_settings_accounts_item.initItem() + return newWalletAccountItem() - relatedAccounts.setItems(w.relatedAccounts.map(x => walletAccountToRelatedAccountItem(x))) - - return wallet_settings_accounts_item.initItem( + return newWalletAccountItem( w.name, w.address, - w.path, w.colorId, - w.walletType, w.emoji, - relatedAccounts, + w.walletType, + w.path, w.keyUid, keycardAccount, w.position, - w.operable + w.operable, + areTestNetworksEnabled, + w.prodPreferredChainIds, + w.testPreferredChainIds ) proc walletAccountToWalletAccountsItem*(w: WalletAccountDto, keycardAccount: bool, enabledChainIds: seq[int], currency: string, - currencyFormat: CurrencyFormatDto): wallet_accounts_item.Item = + currencyFormat: CurrencyFormatDto, areTestNetworksEnabled: bool): wallet_accounts_item.Item = return wallet_accounts_item.initItem( w.name, w.address, @@ -69,7 +59,10 @@ proc walletAccountToWalletAccountsItem*(w: WalletAccountDto, keycardAccount: boo w.position, keycardAccount, w.assetsLoading, - w.isWallet + w.isWallet, + areTestNetworksEnabled, + w.prodPreferredChainIds, + w.testPreferredChainIds ) proc walletAccountToWalletAssetsItem*(w: WalletAccountDto): wallet_assets_item.Item = @@ -109,7 +102,7 @@ proc walletTokenToItem*( ) proc walletAccountToWalletSendAccountItem*(w: WalletAccountDto, chainIds: seq[int], enabledChainIds: seq[int], currency: string, - currencyFormat: CurrencyFormatDto, tokenFormats: Table[string, CurrencyFormatDto]): wallet_send_account_item.AccountItem = + currencyFormat: CurrencyFormatDto, tokenFormats: Table[string, CurrencyFormatDto], areTestNetworksEnabled: bool): wallet_send_account_item.AccountItem = let assets = token_model.newModel() assets.setItems( w.tokens.map(t => walletTokenToItem(t, chainIds, enabledChainIds, currency, currencyFormat, tokenFormats[t.symbol])) @@ -122,4 +115,7 @@ proc walletAccountToWalletSendAccountItem*(w: WalletAccountDto, chainIds: seq[in w.walletType, assets, currencyAmountToItem(w.getCurrencyBalance(enabledChainIds, currency), currencyFormat), + areTestNetworksEnabled, + w.prodPreferredChainIds, + w.testPreferredChainIds ) diff --git a/src/app/modules/shared_models/keypair_account_item.nim b/src/app/modules/shared_models/keypair_account_item.nim index 805c97d7df..6c547a6e0d 100644 --- a/src/app/modules/shared_models/keypair_account_item.nim +++ b/src/app/modules/shared_models/keypair_account_item.nim @@ -17,12 +17,16 @@ QtObject: balance: CurrencyAmount balanceFetched: bool isDefaultAccount: bool + areTestNetworksEnabled: bool + prodPreferredChainIds: string + testPreferredChainIds: string proc delete*(self: KeyPairAccountItem) = self.QObject.delete proc newKeyPairAccountItem*(name = "", path = "", address = "", pubKey = "", emoji = "", colorId = "", icon = "", - balance = newCurrencyAmount(), balanceFetched = true, operability = wa_dto.AccountFullyOperable, isDefaultAccount = false): KeyPairAccountItem = + balance = newCurrencyAmount(), balanceFetched = true, operability = wa_dto.AccountFullyOperable, + isDefaultAccount = false, areTestNetworksEnabled =false, prodPreferredChainIds = "", testPreferredChainIds = ""): KeyPairAccountItem = new(result, delete) result.QObject.setup result.name = name @@ -36,6 +40,9 @@ QtObject: result.balanceFetched = balanceFetched result.operability = operability result.isDefaultAccount = isDefaultAccount + result.areTestNetworksEnabled = areTestNetworksEnabled + result.prodPreferredChainIds = prodPreferredChainIds + result.testPreferredChainIds = testPreferredChainIds proc `$`*(self: KeyPairAccountItem): string = result = fmt"""KeyPairAccountItem[ @@ -47,8 +54,11 @@ QtObject: colorId: {self.colorId}, icon: {self.icon}, balance: {self.balance}, - balanceFetched: {self.balanceFetched} - isDefaultAccount = {self.isDefaultAccount} + balanceFetched: {self.balanceFetched}, + isDefaultAccount: {self.isDefaultAccount}, + areTestNetworksEnabled: {self.areTestNetworksEnabled}, + prodPreferredChainIds: {self.prodPreferredChainIds}, + testPreferredChainIds: {self.testPreferredChainIds} ]""" proc nameChanged*(self: KeyPairAccountItem) {.signal.} @@ -164,3 +174,19 @@ QtObject: QtProperty[bool] isDefaultAccount: read = getIsDefaultAccount notify = isDefaultAccountChanged + + proc preferredSharingChainIdsChanged*(self: KeyPairAccountItem) {.signal.} + proc preferredSharingChainIds*(self: KeyPairAccountItem): string {.slot.} = + if self.areTestNetworksEnabled: + return self.testPreferredChainIds + else : + return self.prodPreferredChainIds + proc setProdPreferredChainIds*(self: KeyPairAccountItem, value: string) = + self.prodPreferredChainIds = value + self.preferredSharingChainIdsChanged() + proc setTestPreferredChainIds*(self: KeyPairAccountItem, value: string) = + self.testPreferredChainIds = value + self.preferredSharingChainIdsChanged() + QtProperty[string] preferredSharingChainIds: + read = preferredSharingChainIds + notify = preferredSharingChainIdsChanged diff --git a/src/app/modules/shared_models/keypair_account_model.nim b/src/app/modules/shared_models/keypair_account_model.nim index 51f7fc5914..0e99291db0 100644 --- a/src/app/modules/shared_models/keypair_account_model.nim +++ b/src/app/modules/shared_models/keypair_account_model.nim @@ -114,7 +114,7 @@ QtObject: self.removeItemAtIndex(i) return - proc updateDetailsForAddressIfTheyAreSet*(self: KeyPairAccountModel, address, name, colorId, emoji: string) = + proc updateDetailsForAddressIfTheyAreSet*(self: KeyPairAccountModel, address, name, colorId, emoji, prodPreferredChainIds, testPreferredChainIds: string) = for i in 0 ..< self.items.len: if cmpIgnoreCase(self.items[i].getAddress(), address) == 0: if name.len > 0: @@ -123,6 +123,10 @@ QtObject: self.items[i].setColorId(colorId) if emoji.len > 0: self.items[i].setEmoji(emoji) + if prodPreferredChainIds.len > 0: + self.items[i].setProdPreferredChainIds(prodPreferredChainIds) + if testPreferredChainIds.len > 0: + self.items[i].setTestPreferredChainIds(testPreferredChainIds) return proc updateOperabilityForAddress*(self: KeyPairAccountModel, address: string, operability: string) = diff --git a/src/app/modules/shared_models/keypair_item.nim b/src/app/modules/shared_models/keypair_item.nim index ea73dd6380..d141924ad2 100644 --- a/src/app/modules/shared_models/keypair_item.nim +++ b/src/app/modules/shared_models/keypair_item.nim @@ -248,8 +248,8 @@ QtObject: return self.accounts.containsAccountPath(path) proc containsPathOutOfTheDefaultStatusDerivationTree*(self: KeyPairItem): bool {.slot.} = return self.accounts.containsPathOutOfTheDefaultStatusDerivationTree() - proc updateDetailsForAccountWithAddressIfTheyAreSet*(self: KeyPairItem, address, name, colorId, emoji: string) = - self.accounts.updateDetailsForAddressIfTheyAreSet(address, name, colorId, emoji) + proc updateDetailsForAccountWithAddressIfTheyAreSet*(self: KeyPairItem, address, name, colorId, emoji, prodPreferredChainIds, testPreferredChainIds: string) = + self.accounts.updateDetailsForAddressIfTheyAreSet(address, name, colorId, emoji, prodPreferredChainIds, testPreferredChainIds) proc setBalanceForAddress*(self: KeyPairItem, address: string, balance: CurrencyAmount) = self.accounts.setBalanceForAddress(address, balance) proc updateOperabilityForAccountWithAddress*(self: KeyPairItem, address: string, operability: string) = diff --git a/src/app/modules/shared_models/keypair_model.nim b/src/app/modules/shared_models/keypair_model.nim index 7ce44ba122..d999693598 100644 --- a/src/app/modules/shared_models/keypair_model.nim +++ b/src/app/modules/shared_models/keypair_model.nim @@ -75,10 +75,10 @@ QtObject: return self.items[i] return nil - proc onUpdatedAccount*(self: KeyPairModel, keyUid, address, name, colorId, emoji: string) = + proc onUpdatedAccount*(self: KeyPairModel, keyUid, address, name, colorId, emoji, prodPreferredChainIds, testPreferredChainIds: string) = for item in self.items: if keyUid == item.getKeyUid(): - item.getAccountsModel().updateDetailsForAddressIfTheyAreSet(address, name, colorId, emoji) + item.getAccountsModel().updateDetailsForAddressIfTheyAreSet(address, name, colorId, emoji, prodPreferredChainIds, testPreferredChainIds) break proc keypairNameExists*(self: KeyPairModel, name: string): bool = @@ -88,4 +88,4 @@ QtObject: let item = self.findItemByKeyUid(keyUid) if item.isNil: return - item.setName(name) \ No newline at end of file + item.setName(name) diff --git a/src/app/modules/shared_models/wallet_account_item.nim b/src/app/modules/shared_models/wallet_account_item.nim index 477bba1bbc..4823e8a1c0 100644 --- a/src/app/modules/shared_models/wallet_account_item.nim +++ b/src/app/modules/shared_models/wallet_account_item.nim @@ -15,6 +15,9 @@ QtObject: keycardAccount: bool position: int operability: string + areTestNetworksEnabled: bool + prodPreferredChainIds: string + testPreferredChainIds: string proc setup*(self: WalletAccountItem, name: string = "", @@ -26,7 +29,10 @@ QtObject: keyUid: string = "", keycardAccount: bool = false, position: int = 0, - operability: string = wa_dto.AccountFullyOperable + operability: string = wa_dto.AccountFullyOperable, + areTestNetworksEnabled: bool = false, + prodPreferredChainIds: string = "", + testPreferredChainIds: string = "" ) = self.QObject.setup self.name = name @@ -39,10 +45,43 @@ QtObject: self.keycardAccount = keycardAccount self.position = position self.operability = operability + self.areTestNetworksEnabled = areTestNetworksEnabled + self.prodPreferredChainIds = prodPreferredChainIds + self.testPreferredChainIds = testPreferredChainIds proc delete*(self: WalletAccountItem) = self.QObject.delete + proc newWalletAccountItem*( + name: string = "", + address: string = "", + colorId: string = "", + emoji: string = "", + walletType: string = "", + path: string = "", + keyUid: string = "", + keycardAccount: bool = false, + position: int = 0, + operability: string = wa_dto.AccountFullyOperable, + areTestNetworksEnabled: bool = false, + prodPreferredChainIds: string = "", + testPreferredChainIds: string = ""): WalletAccountItem = + new(result, delete) + result.QObject.setup + result.name = name + result.address = address + result.colorId = colorId + result.emoji = emoji + result.walletType = walletType + result.path = path + result.keyUid = keyUid + result.keycardAccount = keycardAccount + result.position = position + result.operability = operability + result.areTestNetworksEnabled = areTestNetworksEnabled + result.prodPreferredChainIds = prodPreferredChainIds + result.testPreferredChainIds = testPreferredChainIds + proc `$`*(self: WalletAccountItem): string = result = fmt"""WalletAccountItem( name: {self.name}, @@ -55,6 +94,9 @@ QtObject: keycardAccount: {self.keycardAccount}, position: {self.position}, operability: {self.operability}, + areTestNetworksEnabled: {self.areTestNetworksEnabled}, + prodPreferredChainIds: {self.prodPreferredChainIds}, + testPreferredChainIds: {self.testPreferredChainIds}, ]""" proc nameChanged*(self: WalletAccountItem) {.signal.} @@ -145,4 +187,14 @@ QtObject: QtProperty[string] operability: read = getOperability write = setOperability - notify = operabilityChanged \ No newline at end of file + notify = operabilityChanged + + proc preferredSharingChainIdsChanged*(self: WalletAccountItem) {.signal.} + proc preferredSharingChainIds*(self: WalletAccountItem): string {.slot.} = + if self.areTestNetworksEnabled: + return self.testPreferredChainIds + else : + return self.prodPreferredChainIds + QtProperty[string] preferredSharingChainIds: + read = preferredSharingChainIds + notify = preferredSharingChainIdsChanged diff --git a/src/app/modules/shared_modules/keycard_popup/models/keycard_model.nim b/src/app/modules/shared_modules/keycard_popup/models/keycard_model.nim index f2de2b8fc2..29b099cb02 100644 --- a/src/app/modules/shared_modules/keycard_popup/models/keycard_model.nim +++ b/src/app/modules/shared_modules/keycard_popup/models/keycard_model.nim @@ -167,9 +167,3 @@ QtObject: self.items[i].removeAccountByAddress(acc) if removeKeycardItemIfHasNoAccounts and self.items[i].getAccountsModel().getCount() == 0: self.removeItem(i) - - proc updateDetailsForAddressForKeyPairsWithKeyUid*(self: KeycardModel, keyUid: string, accAddress: string, accName: string, - accColor: string, accEmoji: string) = - for i in 0 ..< self.items.len: - if(self.items[i].getKeyUid() == keyUid): - self.items[i].updateDetailsForAccountWithAddressIfTheyAreSet(accAddress, accName, accColor, accEmoji) \ No newline at end of file diff --git a/src/app_service/service/wallet_account/dto.nim b/src/app_service/service/wallet_account/dto.nim index 3b2fc75976..cf5e3c3cb4 100644 --- a/src/app_service/service/wallet_account/dto.nim +++ b/src/app_service/service/wallet_account/dto.nim @@ -99,7 +99,6 @@ type isChat*: bool tokens*: seq[WalletTokenDto] emoji*: string - relatedAccounts*: seq[WalletAccountDto] ens*: string assetsLoading*: bool hasBalanceCache*: bool @@ -108,6 +107,8 @@ type operable*: string createdAt*: int position*: int + prodPreferredChainIDs*: string + testPreferredChainIDs*: string proc toWalletAccountDto*(jsonObj: JsonNode): WalletAccountDto = result = WalletAccountDto() @@ -127,6 +128,8 @@ proc toWalletAccountDto*(jsonObj: JsonNode): WalletAccountDto = discard jsonObj.getProp("operable", result.operable) discard jsonObj.getProp("createdAt", result.createdAt) discard jsonObj.getProp("position", result.position) + discard jsonObj.getProp("prodPreferredChainIds", result.prodPreferredChainIds) + discard jsonObj.getProp("testPreferredChainIds", result.testPreferredChainIds) result.assetsLoading = true result.hasBalanceCache = false result.hasMarketValuesCache = false @@ -147,6 +150,8 @@ proc `$`*(self: WalletAccountDto): string = hasMarketValuesCache: {self.hasMarketValuesCache}, removed: {self.removed} operable: {self.operable} + prodPreferredChainIds: {self.prodPreferredChainIds} + testPreferredChainIds: {self.testPreferredChainIds} ]""" proc getCurrencyBalance*(self: BalanceDto, currencyPrice: float64): float64 = diff --git a/src/app_service/service/wallet_account/service.nim b/src/app_service/service/wallet_account/service.nim index 9b7a732237..6f29ef90cc 100644 --- a/src/app_service/service/wallet_account/service.nim +++ b/src/app_service/service/wallet_account/service.nim @@ -227,21 +227,7 @@ QtObject: error "error: ", errDesription return - proc setRelatedAccountsToAccount(self: Service, account: WalletAccountDto) = - let keypair = self.getKeypairByKeyUid(account.keyUid) - if keypair.isNil: - return - account.relatedAccounts = keypair.accounts - - proc setRelatedAccountsForAllAccounts(self: Service, keyUid: string) = - for wAcc in self.walletAccounts.mvalues: - if wAcc.keyUid == keyUid: - self.setRelatedAccountsToAccount(wAcc) - - proc storeAccount(self: Service, account: WalletAccountDto, updateRelatedAccounts = true) = - if updateRelatedAccounts: - # updating related accounts for already added accounts - self.setRelatedAccountsForAllAccounts(account.keyUid) + proc storeAccount(self: Service, account: WalletAccountDto) = # add new account to store self.walletAccounts[account.address] = account @@ -342,7 +328,6 @@ QtObject: for account in accounts: let account = account # TODO https://github.com/nim-lang/Nim/issues/16740 self.setEnsName(account) - self.setRelatedAccountsToAccount(account) self.storeAccount(account) self.buildAllTokens(self.getAddresses(), store = true) @@ -426,7 +411,6 @@ QtObject: return self.setEnsName(newAccount) - self.setRelatedAccountsToAccount(newAccount) self.storeAccount(newAccount) self.buildAllTokens(@[newAccount.address], store = true) @@ -438,8 +422,6 @@ QtObject: return let removedAcc = self.walletAccounts[address] self.walletAccounts.del(address) - # updating related accounts for other accounts - self.setRelatedAccountsForAllAccounts(removedAcc.keyUid) if notify: self.events.emit(SIGNAL_WALLET_ACCOUNT_DELETED, AccountArgs(account: removedAcc)) @@ -450,24 +432,28 @@ QtObject: if localAcc.isNil: continue localAcc.position = dbAcc.position - self.storeAccount(localAcc, updateRelatedAccounts = false) + self.storeAccount(localAcc) proc updateAccountInLocalStoreAndNotify(self: Service, address, name, colorId, emoji: string, - positionUpdated: Option[bool] = none(bool), notify: bool = true) = + positionUpdated: Option[bool] = none(bool), prodPreferredChains: string = "", testPreferredChains: string = "", notify: bool = true) = if address.len > 0: if not self.walletAccountsContainsAddress(address): return var account = self.getAccountByAddress(address) if account.isNil: return - if name.len > 0 or colorId.len > 0 or emoji.len > 0: + if name.len > 0 or colorId.len > 0 or emoji.len > 0 or prodPreferredChains.len > 0 or testPreferredChains.len > 0: if name.len > 0 and name != account.name: account.name = name if colorId.len > 0 and colorId != account.colorId: account.colorId = colorId if emoji.len > 0 and emoji != account.emoji: account.emoji = emoji - self.storeAccount(account, updateRelatedAccounts = false) + if testPreferredChains.len > 0 and testPreferredChains != account.testPreferredChainIds: + account.testPreferredChainIds = testPreferredChains + if prodPreferredChains.len > 0 and prodPreferredChains != account.prodPreferredChainIds: + account.prodPreferredChainIds = prodPreferredChains + self.storeAccount(account) if notify: self.events.emit(SIGNAL_WALLET_ACCOUNT_UPDATED, AccountArgs(account: account)) else: @@ -594,7 +580,7 @@ QtObject: try: var account = self.getAccountByAddress(address) let response = status_go_accounts.updateAccount(accountName, account.address, account.path, account.publicKey, - account.keyUid, account.walletType, colorId, emoji, account.isWallet, account.isChat) + account.keyUid, account.walletType, colorId, emoji, account.isWallet, account.isChat, account.prodPreferredChainIds, account.testPreferredChainIds) if not response.error.isNil: error "status-go error", procName="updateWalletAccount", errCode=response.error.code, errDesription=response.error.message return false @@ -604,6 +590,40 @@ QtObject: error "error: ", procName="updateWalletAccount", errName=e.name, errDesription=e.msg return false + proc updateWalletAccountProdPreferredChains*(self: Service, address, preferredChainIds: string): bool = + if not self.walletAccountsContainsAddress(address): + error "account's address is not among known addresses: ", address=address + return false + try: + var account = self.getAccountByAddress(address) + let response = status_go_accounts.updateAccount(account.name, account.address, account.path, account.publicKey, + account.keyUid, account.walletType, account.colorId, account.emoji, account.isWallet, account.isChat, preferredChainIds, account.testPreferredChainIds) + if not response.error.isNil: + error "status-go error", procName="updateWalletAccount", errCode=response.error.code, errDesription=response.error.message + return false + self.updateAccountInLocalStoreAndNotify(address, name ="", colorId = "", emoji = "", positionUpdated = none(bool), prodPreferredChains = preferredChainIds, testPreferredChains = "") + return true + except Exception as e: + error "error: ", procName="updateWalletAccount", errName=e.name, errDesription=e.msg + return false + + proc updateWalletAccountTestPreferredChains*(self: Service, address, preferredChainIds: string): bool = + if not self.walletAccountsContainsAddress(address): + error "account's address is not among known addresses: ", address=address + return false + try: + var account = self.getAccountByAddress(address) + let response = status_go_accounts.updateAccount(account.name, account.address, account.path, account.publicKey, + account.keyUid, account.walletType, account.colorId, account.emoji, account.isWallet, account.isChat, account.prodPreferredChainIds, preferredChainIds) + if not response.error.isNil: + error "status-go error", procName="updateWalletAccount", errCode=response.error.code, errDesription=response.error.message + return false + self.updateAccountInLocalStoreAndNotify(address, name ="", colorId = "", emoji = "", positionUpdated = none(bool), prodPreferredChains = "", testPreferredChains = preferredChainIds) + return true + except Exception as e: + error "error: ", procName="updateWalletAccount", errName=e.name, errDesription=e.msg + return false + proc moveAccountFinally*(self: Service, fromPosition: int, toPosition: int) = var updated = false try: @@ -1000,7 +1020,7 @@ QtObject: else: if self.walletAccountsContainsAddress(account.address): self.updateAccountInLocalStoreAndNotify(account.address, account.name, account.colorId, account.emoji, - none(bool), notify) + none(bool), account.prodPreferredChainIDs, account.testPreferredChainIDs, notify) else: self.addNewAccountToLocalStoreAndNotify(notify) @@ -1061,3 +1081,6 @@ proc getEnabledChainIds*(self: Service): seq[int] = proc getCurrencyFormat*(self: Service, symbol: string): CurrencyFormatDto = return self.currencyService.getCurrencyFormat(symbol) + +proc areTestNetworksEnabled*(self: Service): bool = + return self.settingsService.areTestNetworksEnabled() diff --git a/src/backend/accounts.nim b/src/backend/accounts.nim index 7ac977d4a9..4009794e81 100644 --- a/src/backend/accounts.nim +++ b/src/backend/accounts.nim @@ -102,7 +102,7 @@ proc addAccountWithoutKeystoreFileCreation*(name, address, path, publicKey, keyU ## Updates either regular or keycard account, without interaction to a Keystore file and notifies paired devices proc updateAccount*(name, address, path: string, publicKey, keyUid, accountType, colorId, emoji: string, - walletDefaultAccount: bool, chatDefaultAccount: bool): + walletDefaultAccount: bool, chatDefaultAccount: bool, prodPreferredChainIds, testPreferredChainIds: string): RpcResponse[JsonNode] {.raises: [Exception].} = let payload = %* [ { @@ -116,6 +116,8 @@ proc updateAccount*(name, address, path: string, publicKey, keyUid, accountType, "name": name, "emoji": emoji, "colorId": colorId, + "prodPreferredChainIds": prodPreferredChainIds, + "testPreferredChainIds": testPreferredChainIds #"hidden" present on the status-go side, but we don't use it #"clock" we leave this empty, set on the status-go side #"removed" present on the status-go side, used for synchronization, no need to set it here diff --git a/storybook/pages/AccountViewPage.qml b/storybook/pages/AccountViewPage.qml index cf4d1f6fb9..0f9bf1931e 100644 --- a/storybook/pages/AccountViewPage.qml +++ b/storybook/pages/AccountViewPage.qml @@ -40,7 +40,8 @@ SplitView { stripTrailingZeroes: false}), isAllAccounts: false, includeWatchOnly: false, - path: "m/44’/60’/0’/0’/34" + path: "m/44’/60’/0’/0’/34", + preferredSharingChainIds: walletStore.areTestNetworksEnabled ? "5:420:421613": "1:10:42161" }) } @@ -49,22 +50,28 @@ SplitView { } readonly property QtObject walletStore: QtObject { - property var allNetworks: enabledNetworks - property var layer1Networks: NetworksModel.layer1Networks - property var layer2Networks: NetworksModel.layer2Networks - property var testNetworks: NetworksModel.testNetworks - property var enabledNetworks: NetworksModel.enabledNetworks + property var networks: NetworksModel.mainNetworks + property bool areTestNetworksEnabled: areTestNetworksEnabledCheckbox.checked function toggleNetwork(chainId) { } - function getAllNetworksSupportedPrefix(hovered) { - return hovered ? "" + "eth:" + "" + - "" + "opt:" + "" + - "" + "arb:" + "" : "eth:opt:arb:" + function getNetworkShortNames() { + return "eth:opt:arb:" + } + + function getAllNetworksChainIds() { + return "1:10:42161" + } + + function updateWalletAccountPreferredChains(address, preferredChainIds) { + console.warn("updateWalletAccountPreferredChains :: address ::", address, "preferredChainIds :: ", preferredChainIds) + } + + function processPreferredSharingNetworkToggle(preferredSharingNetworksArray, network) { + console.warn("processPreferredSharingNetworkToggle :: preferredSharingNetworksArray ::", preferredSharingNetworksArray, "network :: ", network) } } - property var keyPairModel: WalletKeyPairModel {} } @@ -82,4 +89,17 @@ SplitView { keyPair: d.keyPairModel.data[0].keyPair } } + + LogsAndControlsPanel { + id: logsAndControlsPanel + + SplitView.minimumHeight: 100 + SplitView.preferredHeight: 200 + + CheckBox { + id: areTestNetworksEnabledCheckbox + text: "areTestNetworksEnabled" + checked: false + } + } } diff --git a/storybook/pages/EditCommunityTokenViewPage.qml b/storybook/pages/EditCommunityTokenViewPage.qml index bd81f1b180..9091ca0a29 100644 --- a/storybook/pages/EditCommunityTokenViewPage.qml +++ b/storybook/pages/EditCommunityTokenViewPage.qml @@ -30,7 +30,6 @@ SplitView { isAssetView: isAssetBox.checked layer1Networks: NetworksModel.layer1Networks layer2Networks: NetworksModel.layer2Networks - testNetworks: NetworksModel.testNetworks enabledNetworks: NetworksModel.enabledNetworks allNetworks: enabledNetworks accounts: WalletAccountsModel {} diff --git a/storybook/pages/EditOwnerTokenViewPage.qml b/storybook/pages/EditOwnerTokenViewPage.qml index 88e32b6d4a..2b2917f0c5 100644 --- a/storybook/pages/EditOwnerTokenViewPage.qml +++ b/storybook/pages/EditOwnerTokenViewPage.qml @@ -47,7 +47,6 @@ SplitView { layer1Networks: NetworksModel.layer1Networks layer2Networks: NetworksModel.layer2Networks - testNetworks: NetworksModel.testNetworks enabledNetworks: NetworksModel.enabledNetworks allNetworks: enabledNetworks accounts: WalletAccountsModel {} diff --git a/storybook/pages/MintTokensSettingsPanelPage.qml b/storybook/pages/MintTokensSettingsPanelPage.qml index f8dd837f7e..63ce61c14b 100644 --- a/storybook/pages/MintTokensSettingsPanelPage.qml +++ b/storybook/pages/MintTokensSettingsPanelPage.qml @@ -83,7 +83,6 @@ SplitView { privilegedModelChecked.checked ? privilegedTokensModel : mintedTokensModel layer1Networks: NetworksModel.layer1Networks layer2Networks: NetworksModel.layer2Networks - testNetworks: NetworksModel.testNetworks enabledNetworks: NetworksModel.enabledNetworks allNetworks: enabledNetworks accounts: WalletAccountsModel {} diff --git a/storybook/pages/NetworkFilterPage.qml b/storybook/pages/NetworkFilterPage.qml index 38bd8b703b..aa83bb8d03 100644 --- a/storybook/pages/NetworkFilterPage.qml +++ b/storybook/pages/NetworkFilterPage.qml @@ -36,7 +36,6 @@ SplitView { layer1Networks: NetworksModel.layer1Networks layer2Networks: NetworksModel.layer2Networks - testNetworks: NetworksModel.testNetworks enabledNetworks: NetworksModel.enabledNetworks allNetworks: enabledNetworks diff --git a/storybook/pages/NetworkSelectPopupPage.qml b/storybook/pages/NetworkSelectPopupPage.qml index daf0b03953..4d553a2bb0 100644 --- a/storybook/pages/NetworkSelectPopupPage.qml +++ b/storybook/pages/NetworkSelectPopupPage.qml @@ -51,11 +51,6 @@ SplitView { filters: [ValueFilter { roleName: "layer"; value: 2; }, ValueFilter { roleName: "isTest"; value: false; }] } - testNetworks: SortFilterProxyModel { - sourceModel: simulatedNimModel - filters: [ValueFilter { roleName: "layer"; value: 2; }, - ValueFilter { roleName: "isTest"; value: true; }] - } enabledNetworks: SortFilterProxyModel { sourceModel: simulatedNimModel filters: ValueFilter { roleName: "isEnabled"; value: true; } @@ -84,7 +79,6 @@ SplitView { layer1Networks: networkFilter.layer1Networks layer2Networks: networkFilter.layer2Networks - testNetworks: networkFilter.testNetworks useEnabledRole: false @@ -129,7 +123,6 @@ SplitView { sourceComponent: NetworkSelectPopup { layer1Networks: networkFilter.layer1Networks layer2Networks: networkFilter.layer2Networks - testNetworks: networkFilter.testNetworks singleSelection { enabled: true diff --git a/storybook/pages/WalletHeaderPage.qml b/storybook/pages/WalletHeaderPage.qml index d3f264c695..60ed589696 100644 --- a/storybook/pages/WalletHeaderPage.qml +++ b/storybook/pages/WalletHeaderPage.qml @@ -85,7 +85,6 @@ SplitView { property var allNetworks: enabledNetworks property var layer1Networks: NetworksModel.layer1Networks property var layer2Networks: NetworksModel.layer2Networks - property var testNetworks: NetworksModel.testNetworks property var enabledNetworks: NetworksModel.enabledNetworks function toggleNetwork(chainId) { } diff --git a/storybook/src/Models/NetworksModel.qml b/storybook/src/Models/NetworksModel.qml index 67e2ecfc00..cc403da0d6 100644 --- a/storybook/src/Models/NetworksModel.qml +++ b/storybook/src/Models/NetworksModel.qml @@ -9,7 +9,7 @@ QtObject { readonly property int arbitrumNet: 3 readonly property int hermezNet: 4 readonly property int testnetNet: 5 - readonly property int customNet: 6 + readonly property int customNet: 6 readonly property var layer1Networks: ListModel { function rowData(index, propName) { @@ -263,4 +263,42 @@ QtObject { }] ) } + + readonly property var mainNetworks: ListModel { + Component.onCompleted: append([ + { + chainId: 1, + chainName: "Ethereum Mainnet", + iconUrl: ModelsData.networks.ethereum, + isActive: true, + isEnabled: true, + shortName: "ETH", + chainColor: "blue", + layer: 1, + isTest: false + }, + { + chainId: 10, + chainName: "Optimism", + iconUrl: ModelsData.networks.optimism, + isActive: false, + isEnabled: true, + shortName: "OPT", + chainColor: "red", + layer: 2, + isTest: false + }, + { + chainId: 42161, + chainName: "Arbitrum", + iconUrl: ModelsData.networks.arbitrum, + isActive: false, + isEnabled: true, + shortName: "ARB", + chainColor: "purple", + layer: 2, + isTest: false + } + ]) + } } diff --git a/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml b/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml index 7435b402ac..6d51b43345 100644 --- a/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml +++ b/ui/app/AppLayouts/Communities/panels/MintTokensSettingsPanel.qml @@ -56,7 +56,6 @@ StackView { // Network related properties: property var layer1Networks property var layer2Networks - property var testNetworks property var enabledNetworks property var allNetworks @@ -240,8 +239,7 @@ StackView { layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks - enabledNetworks: root.testNetworks + enabledNetworks: root.enabledNetworks allNetworks: root.allNetworks accounts: root.accounts @@ -353,7 +351,6 @@ StackView { viewWidth: root.viewWidth layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks enabledNetworks: root.enabledNetworks allNetworks: root.allNetworks accounts: root.accounts diff --git a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml index 4bf2543b42..154a0398c0 100644 --- a/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml +++ b/ui/app/AppLayouts/Communities/views/CommunitySettingsView.qml @@ -342,7 +342,6 @@ StatusSectionLayout { tokensModelWallet: root.rootStore.tokensModelWallet layer1Networks: communityTokensStore.layer1Networks layer2Networks: communityTokensStore.layer2Networks - testNetworks: communityTokensStore.testNetworks enabledNetworks: communityTokensStore.enabledNetworks allNetworks: communityTokensStore.allNetworks accounts: root.rootStore.accounts diff --git a/ui/app/AppLayouts/Communities/views/EditCommunityTokenView.qml b/ui/app/AppLayouts/Communities/views/EditCommunityTokenView.qml index b88b4b8b08..00b5786156 100644 --- a/ui/app/AppLayouts/Communities/views/EditCommunityTokenView.qml +++ b/ui/app/AppLayouts/Communities/views/EditCommunityTokenView.qml @@ -42,7 +42,6 @@ StatusScrollView { // Network related properties: property var layer1Networks property var layer2Networks - property var testNetworks property var enabledNetworks property var allNetworks @@ -522,7 +521,6 @@ StatusScrollView { allNetworks: root.allNetworks layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks enabledNetworks: root.enabledNetworks multiSelection: false diff --git a/ui/app/AppLayouts/Communities/views/EditOwnerTokenView.qml b/ui/app/AppLayouts/Communities/views/EditOwnerTokenView.qml index 646dc12f02..40aa7bbb51 100644 --- a/ui/app/AppLayouts/Communities/views/EditOwnerTokenView.qml +++ b/ui/app/AppLayouts/Communities/views/EditOwnerTokenView.qml @@ -30,7 +30,6 @@ StatusScrollView { // Network related properties: property var layer1Networks property var layer2Networks - property var testNetworks property var enabledNetworks property var allNetworks @@ -318,7 +317,6 @@ StatusScrollView { allNetworks: root.allNetworks layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks enabledNetworks: root.enabledNetworks multiSelection: false diff --git a/ui/app/AppLayouts/Profile/controls/WalletAccountDelegate.qml b/ui/app/AppLayouts/Profile/controls/WalletAccountDelegate.qml index fca6a302c3..f7da7961b6 100644 --- a/ui/app/AppLayouts/Profile/controls/WalletAccountDelegate.qml +++ b/ui/app/AppLayouts/Profile/controls/WalletAccountDelegate.qml @@ -13,7 +13,7 @@ StatusListItem { id: root property var account - property string chainShortNames + property var getNetworkShortNames: function(chainIds){} property int totalCount: 0 signal goToAccountView() @@ -22,6 +22,7 @@ StatusListItem { title: account.name subTitle: { const elidedAddress = StatusQUtils.Utils.elideText(account.address,6,4) + let chainShortNames = root.getNetworkShortNames(model.account.preferredSharingChainIds) return sensor.containsMouse ? WalletUtils.colorizedChainPrefix(chainShortNames) + Utils.richColorText(elidedAddress, Theme.palette.directColor1) : chainShortNames + elidedAddress } asset.color: !!account.colorId ? Utils.getColorForId(account.colorId): "" diff --git a/ui/app/AppLayouts/Profile/controls/WalletKeyPairDelegate.qml b/ui/app/AppLayouts/Profile/controls/WalletKeyPairDelegate.qml index d4f851e318..d7503317c3 100644 --- a/ui/app/AppLayouts/Profile/controls/WalletKeyPairDelegate.qml +++ b/ui/app/AppLayouts/Profile/controls/WalletKeyPairDelegate.qml @@ -13,7 +13,7 @@ Rectangle { id: root property var keyPair - property string chainShortNames + property var getNetworkShortNames: function(chainIds){} property string userProfilePublicKey property bool includeWatchOnlyAccount @@ -154,7 +154,7 @@ Rectangle { width: ListView.view.width account: model.account totalCount: ListView.view.count - chainShortNames: root.chainShortNames + getNetworkShortNames: root.getNetworkShortNames onGoToAccountView: root.goToAccountView(model.account) } } diff --git a/ui/app/AppLayouts/Profile/stores/WalletStore.qml b/ui/app/AppLayouts/Profile/stores/WalletStore.qml index dd8b5ad6c4..60212ec5fa 100644 --- a/ui/app/AppLayouts/Profile/stores/WalletStore.qml +++ b/ui/app/AppLayouts/Profile/stores/WalletStore.qml @@ -11,6 +11,7 @@ QtObject { property var accountSensitiveSettings: Global.appIsReady? localAccountSensitiveSettings : null readonly property bool areTestNetworksEnabled: networksModule.areTestNetworksEnabled + readonly property var networks: networksModule.networks readonly property var combinedNetworks: networksModule.combinedNetworks property var selectedAccount @@ -48,8 +49,8 @@ QtObject { root.accountsModule.moveAccountFinally(from, to) } - function getAllNetworksSupportedPrefix() { - return networksModule.getAllNetworksSupportedPrefix() + function getAllNetworksChainIds() { + return networksModule.getAllNetworksChainIds() } function runAddAccountPopup() { @@ -63,4 +64,40 @@ QtObject { function updateNetworkEndPointValues(chainId, newMainRpcInput, newFailoverRpcUrl) { networksModule.updateNetworkEndPointValues(chainId, newMainRpcInput, newFailoverRpcUrl) } + + function updateWalletAccountPreferredChains(address, preferredChainIds) { + if(areTestNetworksEnabled) { + accountsModule.updateWalletAccountTestPreferredChains(address, preferredChainIds) + } + else { + accountsModule.updateWalletAccountProdPreferredChains(address, preferredChainIds) + } + } + + function getNetworkShortNames(chainIds) { + return networksModule.getNetworkShortNames(chainIds) + } + + function processPreferredSharingNetworkToggle(preferredSharingNetworks, toggledNetwork) { + let prefChains = preferredSharingNetworks + if(prefChains.length === networks.count) { + prefChains = [toggledNetwork.chainId.toString()] + } + else if(!prefChains.includes(toggledNetwork.chainId.toString())) { + prefChains.push(toggledNetwork.chainId.toString()) + } + else { + if(prefChains.length === 1) { + prefChains = getAllNetworksChainIds().split(":") + } + else { + for(var i = 0; i < prefChains.length;i++) { + if(prefChains[i] === toggledNetwork.chainId.toString()) { + prefChains.splice(i, 1) + } + } + } + } + return prefChains + } } diff --git a/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml b/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml index 3baf230048..3b7eb344df 100644 --- a/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml +++ b/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml @@ -8,11 +8,14 @@ import StatusQ.Core.Theme 0.1 import StatusQ.Core.Utils 0.1 as StatusQUtils import AppLayouts.Wallet 1.0 +import AppLayouts.Wallet.controls 1.0 import shared.popups 1.0 import shared.panels 1.0 import utils 1.0 +import SortFilterProxyModel 0.2 + import "../../popups" import "../../controls" @@ -29,8 +32,11 @@ ColumnLayout { QtObject { id: d - property bool watchOnlyAccount: keyPair && keyPair.pairType === Constants.keycard.keyPairType.watchOnly - property bool privateKeyAccount: keyPair && keyPair.pairType === Constants.keycard.keyPairType.privateKeyImport + readonly property bool watchOnlyAccount: keyPair && keyPair.pairType ? keyPair.pairType === Constants.keycard.keyPairType.watchOnly: false + readonly property bool privateKeyAccount: keyPair && keyPair.pairType ? keyPair.pairType === Constants.keycard.keyPairType.privateKeyImport: false + readonly property string preferredSharingNetworks: !!account ? account.preferredSharingChainIds: "" + property var preferredSharingNetworksArray: preferredSharingNetworks.split(":").filter(Boolean) + onPreferredSharingNetworksChanged: preferredSharingNetworksArray = preferredSharingNetworks.split(":").filter(Boolean) } spacing: 0 @@ -100,7 +106,7 @@ ColumnLayout { title: qsTr("Address") subTitle: { let address = root.account && root.account.address ? root.account.address: "" - d.watchOnlyAccount ? address : WalletUtils.colorizedChainPrefix(walletStore.getAllNetworksSupportedPrefix()) + address + return WalletUtils.colorizedChainPrefix(walletStore.getNetworkShortNames(d.preferredSharingNetworks)) + address } } Separator { @@ -158,7 +164,7 @@ ColumnLayout { Layout.fillWidth: true title: qsTr("Derivation Path") subTitle: root.account ? Utils.getPathForDisplay(root.account.path) : "" - visible: !!subTitle && !d.privateKeyAccount + visible: !!subTitle && !d.privateKeyAccount && !d.watchOnlyAccount } Separator { Layout.fillWidth: true @@ -181,45 +187,67 @@ ColumnLayout { color: Theme.palette.baseColor2 } - RowLayout { + StatusListItem { + Layout.fillWidth: true + title: qsTr("Preferred networks when sharing this address") + color: Theme.palette.transparent + components: [ + NetworkFilter { + layer1Networks: SortFilterProxyModel { + sourceModel: root.walletStore.networks + filters: ValueFilter { roleName: "layer"; value: 1; } + } + layer2Networks: SortFilterProxyModel { + sourceModel: root.walletStore.networks + filters: ValueFilter { roleName: "layer"; value: 2; } + } + allNetworks: root.walletStore.networks + enabledNetworks: SortFilterProxyModel { + sourceModel: root.walletStore.networks + filters: ExpressionFilter { + expression: d.preferredSharingNetworksArray.includes(model.chainId.toString()) + } + } + preferredNetworksMode: true + preferredSharingNetworks: d.preferredSharingNetworksArray + onToggleNetwork: (network) => { + d.preferredSharingNetworksArray = root.walletStore.processPreferredSharingNetworkToggle(d.preferredSharingNetworksArray, network) + } + control.popup.onClosed: root.walletStore.updateWalletAccountPreferredChains(root.account.address, d.preferredSharingNetworksArray.join(":")) + } + ] + } + + Separator { + Layout.fillWidth: true + Layout.preferredHeight: 1 + color: Theme.palette.baseColor2 + } + + StatusButton { Layout.topMargin: 20 Layout.fillWidth: true - spacing: 8 - StatusButton { - Layout.fillWidth: true - visible: !d.watchOnlyAccount && !d.privateKeyAccount - text: keyPair && keyPair.migratedToKeycard? qsTr("Stop using Keycard") : qsTr("Migrate to Keycard") - icon.name: "keycard" - onClicked: { - if (keyPair && keyPair.migratedToKeycard) - console.warn("TODO: stop using Keycard") - else - console.warn("TODO: move keys to a Keycard") - } - } - StatusButton { - Layout.fillWidth: true - objectName: "deleteAccountButton" - visible: !!root.account && !root.account.isDefaultAccount - text: qsTr("Remove account") - icon.name: "delete" - type: StatusBaseButton.Type.Danger - onClicked: confirmationPopup.open() + objectName: "deleteAccountButton" + visible: !!root.account && !root.account.isDefaultAccount + text: qsTr("Remove account") + icon.name: "delete" + type: StatusBaseButton.Type.Danger + onClicked: confirmationPopup.open() - ConfirmationDialog { - id: confirmationPopup - confirmButtonObjectName: "confirmDeleteAccountButton" - headerSettings.title: qsTr("Confirm %1 Removal").arg(root.account ? root.account.name : "") - confirmationText: qsTr("You will not be able to restore viewing access to this account in the future unless you enter this account’s address again.") - confirmButtonLabel: qsTr("Remove Account") - onConfirmButtonClicked: { - root.walletStore.deleteAccount(root.account.address); - confirmationPopup.close() - root.goBack() - } + ConfirmationDialog { + id: confirmationPopup + confirmButtonObjectName: "confirmDeleteAccountButton" + headerSettings.title: qsTr("Confirm %1 Removal").arg(root.account ? root.account.name : "") + confirmationText: qsTr("You will not be able to restore viewing access to this account in the future unless you enter this account’s address again.") + confirmButtonLabel: qsTr("Remove Account") + onConfirmButtonClicked: { + root.walletStore.deleteAccount(root.account.address); + confirmationPopup.close() + root.goBack() } } } + Component { id: renameAccountModalComponent RenameAccontModal { diff --git a/ui/app/AppLayouts/Profile/views/wallet/MainView.qml b/ui/app/AppLayouts/Profile/views/wallet/MainView.qml index 52d9c4bf92..67a58df571 100644 --- a/ui/app/AppLayouts/Profile/views/wallet/MainView.qml +++ b/ui/app/AppLayouts/Profile/views/wallet/MainView.qml @@ -101,7 +101,7 @@ Column { delegate: WalletKeyPairDelegate { width: parent.width keyPair: model.keyPair - chainShortNames: walletStore.getAllNetworksSupportedPrefix() + getNetworkShortNames: walletStore.getNetworkShortNames userProfilePublicKey: walletStore.userProfilePublicKey includeWatchOnlyAccount: walletStore.includeWatchOnlyAccount onGoToAccountView: root.goToAccountView(account, keyPair) diff --git a/ui/app/AppLayouts/Wallet/controls/NetworkFilter.qml b/ui/app/AppLayouts/Wallet/controls/NetworkFilter.qml index 00fe181933..b00c17b653 100644 --- a/ui/app/AppLayouts/Wallet/controls/NetworkFilter.qml +++ b/ui/app/AppLayouts/Wallet/controls/NetworkFilter.qml @@ -17,9 +17,10 @@ StatusComboBox { required property var allNetworks required property var layer1Networks required property var layer2Networks - required property var testNetworks required property var enabledNetworks property bool multiSelection: true + property bool preferredNetworksMode: false + property var preferredSharingNetworks: [] /// \c network is a network.model.nim entry /// It is called for every toggled network if \c multiSelection is \c true @@ -37,9 +38,6 @@ StatusComboBox { } else if(!!root.layer2Networks && ModelUtils.contains(root.layer2Networks, "chainId", chainId)) { d.currentModel = root.layer2Networks chainIdExists = true - } else if(!!root.testNetworks && ModelUtils.contains(root.testNetworks, "chainId", chainId)) { - d.currentModel = root.testNetworks - chainIdExists = true } } @@ -65,6 +63,7 @@ StatusComboBox { readonly property string selectedIconUrl: ModelUtils.get(d.currentModel, d.currentIndex, "iconUrl") ?? "" readonly property bool allSelected: (!!root.enabledNetworks && !!root.allNetworks) ? root.enabledNetworks.count === root.allNetworks.count : false + readonly property bool noneSelected: (!!root.enabledNetworks) ? root.enabledNetworks.count === 0 : false // Persist selection between selectPopupLoader reloads property var currentModel: layer1Networks @@ -108,7 +107,7 @@ StatusComboBox { lineHeight: 24 lineHeightMode: Text.FixedHeight verticalAlignment: Text.AlignVCenter - text: root.multiSelection ? (d.allSelected ? qsTr("All networks") : "") : d.selectedChainName + text: root.multiSelection ? (d.noneSelected ? qsTr("Select networks"): d.allSelected ? qsTr("All networks") : "") : d.selectedChainName color: Theme.palette.baseColor1 visible: !!text } @@ -132,7 +131,8 @@ StatusComboBox { control.popup.contentItem: NetworkSelectionView { layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks + preferredSharingNetworks: root.preferredSharingNetworks + preferredNetworksMode: root.preferredNetworksMode implicitWidth: contentWidth implicitHeight: contentHeight diff --git a/ui/app/AppLayouts/Wallet/controls/NetworkSelectItemDelegate.qml b/ui/app/AppLayouts/Wallet/controls/NetworkSelectItemDelegate.qml index df1e0a3c59..3786e34d47 100644 --- a/ui/app/AppLayouts/Wallet/controls/NetworkSelectItemDelegate.qml +++ b/ui/app/AppLayouts/Wallet/controls/NetworkSelectItemDelegate.qml @@ -16,6 +16,11 @@ StatusListItem { property var radioButtonGroup property bool useEnabledRole: true + // Needed for preferred sharing networks + property bool preferredNetworksMode: false + property var preferredSharingNetworks: [] + property bool allChecked: true + signal toggleNetwork(var network, var model, int index) /// Mirrors Nim's UxEnabledState enum from networks/item.nim @@ -47,7 +52,10 @@ StatusListItem { visible: !root.singleSelection.enabled checkState: { - if(root.useEnabledRole) { + if(root.preferredNetworksMode) { + return root.allChecked ? Qt.PartiallyChecked : preferredSharingNetworks.includes(model.chainId.toString()) ? Qt.Checked : Qt.Unchecked + } + else if(root.useEnabledRole) { return model.isEnabled ? Qt.Checked : Qt.Unchecked } else if(model.enabledState === NetworkSelectItemDelegate.Enabled) { return Qt.Checked diff --git a/ui/app/AppLayouts/Wallet/panels/WalletHeader.qml b/ui/app/AppLayouts/Wallet/panels/WalletHeader.qml index f4f732ce34..67570c70c7 100644 --- a/ui/app/AppLayouts/Wallet/panels/WalletHeader.qml +++ b/ui/app/AppLayouts/Wallet/panels/WalletHeader.qml @@ -116,7 +116,6 @@ Item { allNetworks: walletStore.allNetworks layer1Networks: walletStore.layer1Networks layer2Networks: walletStore.layer2Networks - testNetworks: walletStore.testNetworks enabledNetworks: walletStore.enabledNetworks onToggleNetwork: (network) => { diff --git a/ui/app/AppLayouts/Wallet/popups/NetworkSelectPopup.qml b/ui/app/AppLayouts/Wallet/popups/NetworkSelectPopup.qml index e46b7f4c5a..9ee6e94ee5 100644 --- a/ui/app/AppLayouts/Wallet/popups/NetworkSelectPopup.qml +++ b/ui/app/AppLayouts/Wallet/popups/NetworkSelectPopup.qml @@ -14,20 +14,10 @@ import "../views" StatusDialog { id: root - modal: false - standardButtons: Dialog.NoButton - - anchors.centerIn: undefined - - padding: 4 - width: 360 - implicitHeight: Math.min(432, scrollView.contentHeight + root.padding * 2) - - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - required property var layer1Networks required property var layer2Networks - property var testNetworks: null + property var preferredSharingNetworks: [] + property bool preferredNetworksMode: false /// Grouped properties for single selection state. \c singleSelection.enabled is \c false by default /// \see SingleSelectionInfo @@ -47,6 +37,17 @@ StatusDialog { property SingleSelectionInfo singleSelection: SingleSelectionInfo {} } + modal: false + standardButtons: Dialog.NoButton + + anchors.centerIn: undefined + + padding: 4 + width: 360 + implicitHeight: Math.min(432, scrollView.contentHeight + root.padding * 2) + + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + background: Rectangle { radius: Style.current.radius color: Style.current.background @@ -67,7 +68,8 @@ StatusDialog { anchors.fill: parent layer1Networks: root.layer1Networks layer2Networks: root.layer2Networks - testNetworks: root.testNetworks + preferredNetworksMode: root.preferredNetworksMode + preferredSharingNetworks: root.preferredSharingNetworks useEnabledRole: root.useEnabledRole singleSelection: d.singleSelection onToggleNetwork: { diff --git a/ui/app/AppLayouts/Wallet/popups/ReceiveModal.qml b/ui/app/AppLayouts/Wallet/popups/ReceiveModal.qml index 47d50e8075..23705500de 100644 --- a/ui/app/AppLayouts/Wallet/popups/ReceiveModal.qml +++ b/ui/app/AppLayouts/Wallet/popups/ReceiveModal.qml @@ -32,6 +32,7 @@ StatusModal { QtObject { id: d property string completeAddressWithNetworkPrefix + property var preferredSharingNetworksArray: !!RootStore.selectedReceiveAccount ? RootStore.selectedReceiveAccount.preferredSharingChainIds.split(":").filter(Boolean): [] } headerSettings.title: qsTr("Receive") @@ -48,8 +49,8 @@ StatusModal { sorters: RoleSorter { roleName: "position"; sortOrder: Qt.AscendingOrder } } - selectedAccount: RootStore.selectedReceiveAccount + getNetworkShortNames: RootStore.getNetworkShortNames onSelectedIndexChanged: RootStore.switchReceiveAccount(selectedIndex) } @@ -99,7 +100,7 @@ StatusModal { tagPrimaryLabel.text: model.shortName tagPrimaryLabel.color: model.chainColor image.source: Style.svg("tiny/" + model.iconUrl) - visible: model.isEnabled + visible: d.preferredSharingNetworksArray.includes(model.chainId.toString()) MouseArea { anchors.fill: parent cursorShape: root.readOnly ? Qt.ArrowCursor : Qt.PointingHandCursor @@ -209,7 +210,7 @@ StatusModal { font.pixelSize: 15 color: chainColor text: shortName + ":" - visible: model.isEnabled + visible: d.preferredSharingNetworksArray.includes(model.chainId.toString()) onVisibleChanged: { if (root.readOnly) return @@ -258,12 +259,18 @@ StatusModal { layer1Networks: layer1NetworksClone layer2Networks: layer2NetworksClone + preferredNetworksMode: true + preferredSharingNetworks: d.preferredSharingNetworksArray + + useEnabledRole: false closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside onToggleNetwork: (network, networkModel, index) => { - network.isEnabled = !network.isEnabled - } + d.preferredSharingNetworksArray = RootStore.processPreferredSharingNetworkToggle( d.preferredSharingNetworksArray, network) + } + + onClosed: RootStore.updateWalletAccountPreferredChains(root.address, d.preferredSharingNetworksArray.join(":")) CloneModel { id: layer1NetworksClone diff --git a/ui/app/AppLayouts/Wallet/stores/RootStore.qml b/ui/app/AppLayouts/Wallet/stores/RootStore.qml index 92cae71edf..39ee992e59 100644 --- a/ui/app/AppLayouts/Wallet/stores/RootStore.qml +++ b/ui/app/AppLayouts/Wallet/stores/RootStore.qml @@ -88,7 +88,6 @@ QtObject { property var layer1Networks: networksModule.layer1 property var layer2Networks: networksModule.layer2 - property var testNetworks: networksModule.test property var enabledNetworks: networksModule.enabled property var allNetworks: networksModule.all onAllNetworksChanged: { @@ -234,4 +233,44 @@ QtObject { function toggleWatchOnlyAccounts() { walletSection.toggleWatchOnlyAccounts() } + + function getAllNetworksChainIds() { + return networksModule.getAllNetworksChainIds() + } + + function getNetworkShortNames(chainIds) { + return networksModule.getNetworkShortNames(chainIds) + } + + function updateWalletAccountPreferredChains(address, preferredChainIds) { + if(areTestNetworksEnabled) { + walletSectionAccounts.updateWalletAccountTestPreferredChains(address, preferredChainIds) + } + else { + walletSectionAccounts.updateWalletAccountProdPreferredChains(address, preferredChainIds) + } + } + + function processPreferredSharingNetworkToggle(preferredSharingNetworks, toggledNetwork) { + let prefChains = preferredSharingNetworks + if(prefChains.length === allNetworks.count) { + prefChains = [toggledNetwork.chainId.toString()] + } + else if(!prefChains.includes(toggledNetwork.chainId.toString())) { + prefChains.push(toggledNetwork.chainId.toString()) + } + else { + if(prefChains.length === 1) { + prefChains = getAllNetworksChainIds().split(":") + } + else { + for(var i = 0; i < prefChains.length;i++) { + if(prefChains[i] === toggledNetwork.chainId.toString()) { + prefChains.splice(i, 1) + } + } + } + } + return prefChains + } } diff --git a/ui/app/AppLayouts/Wallet/views/NetworkSelectionView.qml b/ui/app/AppLayouts/Wallet/views/NetworkSelectionView.qml index 39dbc000cb..e061c9603e 100644 --- a/ui/app/AppLayouts/Wallet/views/NetworkSelectionView.qml +++ b/ui/app/AppLayouts/Wallet/views/NetworkSelectionView.qml @@ -4,6 +4,8 @@ import QtQuick.Controls 2.15 import StatusQ.Core 0.1 import StatusQ.Core.Theme 0.1 +import SortFilterProxyModel 0.2 + import utils 1.0 import "../stores/NetworkSelectPopup" @@ -12,11 +14,12 @@ import "../controls" StatusScrollView { id: root - property var testNetworks: null required property var layer1Networks required property var layer2Networks property bool useEnabledRole: true property SingleSelectionInfo singleSelection: SingleSelectionInfo {} + property var preferredSharingNetworks: [] + property bool preferredNetworksMode: false signal toggleNetwork(var network, var model, int index) @@ -48,6 +51,9 @@ StatusScrollView { useEnabledRole: root.useEnabledRole singleSelection: root.singleSelection onToggleNetwork: root.toggleNetwork(network, model, index) + preferredNetworksMode: root.preferredNetworksMode + preferredSharingNetworks: root.preferredSharingNetworks + allChecked: root.preferredSharingNetworks.length === layer1Networks.count + layer2Networks.count } } @@ -75,20 +81,9 @@ StatusScrollView { useEnabledRole: root.useEnabledRole singleSelection: root.singleSelection onToggleNetwork: root.toggleNetwork(network, model, index) - } - } - - Repeater { - id: chainRepeater3 - model: root.testNetworks - delegate: NetworkSelectItemDelegate { - implicitHeight: 48 - width: parent.width - radioButtonGroup: radioBtnGroup - networkModel: chainRepeater3.model - useEnabledRole: root.useEnabledRole - singleSelection: root.singleSelection - onToggleNetwork: root.toggleNetwork(network, model, index) + preferredNetworksMode: root.preferredNetworksMode + preferredSharingNetworks: root.preferredSharingNetworks + allChecked: root.preferredSharingNetworks.length === layer1Networks.count + layer2Networks.count } } } diff --git a/ui/imports/shared/controls/WalletAccountListItem.qml b/ui/imports/shared/controls/WalletAccountListItem.qml index f80473197a..7291ac340f 100644 --- a/ui/imports/shared/controls/WalletAccountListItem.qml +++ b/ui/imports/shared/controls/WalletAccountListItem.qml @@ -14,7 +14,7 @@ StatusListItem { id: root property var modelData - property string chainShortNames + property var getNetworkShortNames: function(chainIds){} property bool clearVisible: false signal cleared() @@ -25,6 +25,7 @@ StatusListItem { subTitle:{ if(!!modelData) { let elidedAddress = StatusQUtils.Utils.elideText(modelData.address,6,4) + let chainShortNames = root.getNetworkShortNames(modelData.preferredSharingChainIds) return sensor.containsMouse ? WalletUtils.colorizedChainPrefix(chainShortNames) || Utils.richColorText(elidedAddress, Theme.palette.directColor1) : elidedAddress } return "" diff --git a/ui/imports/shared/popups/AccountsModalHeader.qml b/ui/imports/shared/popups/AccountsModalHeader.qml index a744b15b47..e8dbfbbbb9 100644 --- a/ui/imports/shared/popups/AccountsModalHeader.qml +++ b/ui/imports/shared/popups/AccountsModalHeader.qml @@ -14,7 +14,7 @@ StatusComboBox { id: root property var selectedAccount - property string chainShortNames + property var getNetworkShortNames: function(chainIds){} property int selectedIndex: -1 control.padding: 0 @@ -67,7 +67,7 @@ StatusComboBox { delegate: WalletAccountListItem { width: ListView.view.width modelData: model - chainShortNames: root.chainShortNames + getNetworkShortNames: root.getNetworkShortNames color: sensor.containsMouse || highlighted ? Theme.palette.baseColor2 : selectedAccount.name === model.name ? Theme.palette.statusListItem.highlightColor : "transparent" diff --git a/ui/imports/shared/popups/SendModal.qml b/ui/imports/shared/popups/SendModal.qml index 116b37fe1f..75d5fe982e 100644 --- a/ui/imports/shared/popups/SendModal.qml +++ b/ui/imports/shared/popups/SendModal.qml @@ -157,7 +157,7 @@ StatusDialog { sorters: RoleSorter { roleName: "position"; sortOrder: Qt.AscendingOrder } } selectedAccount: !!popup.selectedAccount ? popup.selectedAccount: {} - chainShortNames: store.getAllNetworksSupportedPrefix() + getNetworkShortNames: function(chainIds) {return store.getNetworkShortNames(chainIds)} onSelectedIndexChanged: store.switchSenderAccount(selectedIndex) } diff --git a/ui/imports/shared/stores/CommunityTokensStore.qml b/ui/imports/shared/stores/CommunityTokensStore.qml index c6414d80a9..cece7f76d4 100644 --- a/ui/imports/shared/stores/CommunityTokensStore.qml +++ b/ui/imports/shared/stores/CommunityTokensStore.qml @@ -9,7 +9,6 @@ QtObject { // Network selection properties: property var layer1Networks: networksModule.layer1 property var layer2Networks: networksModule.layer2 - property var testNetworks: networksModule.test property var enabledNetworks: networksModule.enabled property var allNetworks: networksModule.all diff --git a/ui/imports/shared/stores/TransactionStore.qml b/ui/imports/shared/stores/TransactionStore.qml index dc2497be82..2b35d0f4f9 100644 --- a/ui/imports/shared/stores/TransactionStore.qml +++ b/ui/imports/shared/stores/TransactionStore.qml @@ -26,12 +26,13 @@ QtObject { property var senderAccounts: walletSectionSendInst.senderAccounts property var selectedSenderAccount: walletSectionSendInst.selectedSenderAccount property string signingPhrase: walletSectionInst.signingPhrase + property bool areTestNetworksEnabled: networksModule.areTestNetworksEnabled property var savedAddressesModel: SortFilterProxyModel { sourceModel: walletSectionSavedAddresses.model filters: [ ValueFilter { roleName: "isTest" - value: networksModule.areTestNetworksEnabled + value: areTestNetworksEnabled } ] } @@ -289,4 +290,8 @@ QtObject { function switchSenderAccount(index) { walletSectionSendInst.switchSenderAccount(index) } + + function getNetworkShortNames(chainIds) { + return networksModule.getNetworkShortNames(chainIds) + } } diff --git a/ui/imports/shared/views/RecipientView.qml b/ui/imports/shared/views/RecipientView.qml index 326645eff0..cfe379f822 100644 --- a/ui/imports/shared/views/RecipientView.qml +++ b/ui/imports/shared/views/RecipientView.qml @@ -140,7 +140,6 @@ Loader { id: myAccountRecipient WalletAccountListItem { implicitWidth: parent.width - chainShortNames: store.getAllNetworksSupportedPrefix() modelData: root.selectedRecipient radius: 8 clearVisible: true @@ -149,6 +148,7 @@ Loader { subTitle: { if(!!modelData) { let elidedAddress = StatusQUtils.Utils.elideText(modelData.address,6,4) + let chainShortNames = store.getNetworkShortNames(modelData.preferredSharingChainIds) return WalletUtils.colorizedChainPrefix(chainShortNames) + StatusQUtils.Utils.elideText(elidedAddress,6,4) } return "" diff --git a/ui/imports/shared/views/TabAddressSelectorView.qml b/ui/imports/shared/views/TabAddressSelectorView.qml index a70ed79657..991c6722b5 100644 --- a/ui/imports/shared/views/TabAddressSelectorView.qml +++ b/ui/imports/shared/views/TabAddressSelectorView.qml @@ -135,13 +135,15 @@ Item { delegate: WalletAccountListItem { implicitWidth: ListView.view.width modelData: model - chainShortNames: root.store.getAllNetworksSupportedPrefix() + getNetworkShortNames: root.store.getNetworkShortNames onClicked: recipientSelected({name: modelData.name, address: modelData.address, color: modelData.color, emoji: modelData.emoji, walletType: modelData.walletType, - currencyBalance: modelData.currencyBalance}, TabAddressSelectorView.Type.Account ) + currencyBalance: modelData.currencyBalance, + preferredSharingChainIds: modelData.preferredSharingChainIds}, + TabAddressSelectorView.Type.Account) } model: root.store.accounts diff --git a/ui/imports/utils/Utils.qml b/ui/imports/utils/Utils.qml index c7311b29b7..41d8aed57f 100644 --- a/ui/imports/utils/Utils.qml +++ b/ui/imports/utils/Utils.qml @@ -819,8 +819,7 @@ QtObject { } function getPathForDisplay(path) { - let letters = path.split("/").join(" / ") - return letters + return path.split("/").join(" / ") } // Leave this function at the bottom of the file as QT Creator messes up the code color after this diff --git a/vendor/status-go b/vendor/status-go index eb8d74e1ae..1df8c1c511 160000 --- a/vendor/status-go +++ b/vendor/status-go @@ -1 +1 @@ -Subproject commit eb8d74e1aed94930241c9fb466805b09bd45810d +Subproject commit 1df8c1c5110e7b3600ea8defecaf0447009c1b18