Skip to content

Commit a4a17bc

Browse files
committed
fix(efp): Refactor following addresses UI and logic
Extracted FollowingAddressMenu into a separate QML component and updated FollowingAddressesDelegate to use a menuRequested signal for menu actions. Improved property requirements and data flow in FollowingAddresses and FollowingAddressesView, and updated connections for refreshing and updating following addresses. Minor UI text adjustment in WalletFollowingAddressesHeader and code cleanup in RootStore. This refactor improves modularity, maintainability, and clarity of the following addresses feature.
1 parent a409d88 commit a4a17bc

File tree

12 files changed

+203
-169
lines changed

12 files changed

+203
-169
lines changed

src/app/modules/main/module.nim

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ type
102102
walletAccountService: wallet_account_service.Service
103103
savedAddressService: saved_address_service.Service
104104
followingAddressService: following_address_service.Service
105-
keychainService: keychain_service.Service
106105
networkConnectionService: network_connection_service.Service
107106
stickersService: stickers_service.Service
108107
communityTokensService: community_tokens_service.Service
@@ -217,7 +216,6 @@ proc newModule*[T](
217216
result.walletAccountService = walletAccountService
218217
result.savedAddressService = savedAddressService
219218
result.followingAddressService = followingAddressService
220-
result.keychainService = keychainService
221219
result.stickersService = stickersService
222220
result.communityTokensService = communityTokensService
223221

src/app/modules/main/wallet_section/following_addresses/model.nim

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ QtObject:
3535
result &= fmt"""[{i}]:({$self.items[i]})"""
3636

3737
proc countChanged(self: Model) {.signal.}
38-
proc itemChanged(self: Model, address: string) {.signal.}
3938

4039
proc getCount*(self: Model): int {.slot.} =
4140
self.items.len
@@ -82,10 +81,6 @@ QtObject:
8281
self.beginResetModel()
8382
self.items = items
8483
self.endResetModel()
85-
self.countChanged()
86-
87-
for item in items:
88-
self.itemChanged(item.getAddress())
8984

9085
proc getItemByAddress*(self: Model, address: string): Item =
9186
if address.len == 0:

src/app/modules/main/wallet_section/following_addresses/module.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ method loadFollowingAddresses*(self: Module, userAddress: string) =
4747
))
4848
)
4949
self.view.totalFollowingCountChanged()
50+
self.view.followingAddressesUpdated(userAddress)
5051

5152
method load*(self: Module) =
5253
try:

ui/app/AppLayouts/Wallet/WalletLayout.qml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ Item {
249249
id: cmpSavedAddresses
250250

251251
SavedAddressesView {
252+
rootStore: RootStore
252253
networkConnectionStore: root.networkConnectionStore
253254
networksStore: root.networksStore
254255

@@ -261,7 +262,8 @@ Item {
261262
Component {
262263
id: cmpFollowingAddresses
263264
FollowingAddressesView {
264-
rootStore: root.store
265+
rootStore: RootStore
266+
contactsStore: root.contactsStore
265267
networkConnectionStore: root.networkConnectionStore
266268
networksStore: root.networksStore
267269

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
import QtQuick
2+
import QtQuick.Controls
3+
4+
import utils
5+
6+
import StatusQ
7+
import StatusQ.Controls
8+
import StatusQ.Components
9+
import StatusQ.Core
10+
import StatusQ.Core.Theme
11+
import StatusQ.Core.Utils as StatusQUtils
12+
import StatusQ.Popups
13+
14+
import shared.controls
15+
import shared.popups
16+
import shared.stores as SharedStores
17+
18+
import "../popups"
19+
import "../controls"
20+
import "../stores"
21+
import ".."
22+
23+
import AppLayouts.Wallet.stores as WalletStores
24+
25+
StatusMenu {
26+
id: root
27+
28+
property string name
29+
property string address
30+
property string ensName
31+
property var tags
32+
property var activeNetworks
33+
34+
readonly property int maxHeight: 341
35+
height: implicitHeight > maxHeight ? maxHeight : implicitHeight
36+
37+
QtObject {
38+
id: d
39+
readonly property string visibleAddress: !!root.ensName ? root.ensName : root.address
40+
}
41+
42+
function openMenu(parent, x, y, model) {
43+
root.name = model.name;
44+
root.address = model.address;
45+
root.ensName = model.ensName;
46+
root.tags = model.tags;
47+
popup(parent, x, y);
48+
}
49+
50+
onClosed: {
51+
root.name = "";
52+
root.address = "";
53+
root.ensName = ""
54+
root.tags = []
55+
}
56+
57+
StatusSuccessAction {
58+
id: copyAddressAction
59+
objectName: "copyFollowingAddressAction"
60+
successText: qsTr("Address copied")
61+
text: qsTr("Copy address")
62+
icon.name: "copy"
63+
timeout: 1500
64+
autoDismissMenu: true
65+
onTriggered: ClipboardUtils.setText(d.visibleAddress)
66+
}
67+
68+
StatusAction {
69+
text: qsTr("Show address QR")
70+
objectName: "showQrFollowingAddressAction"
71+
assetSettings.name: "qr"
72+
onTriggered: {
73+
Global.openShowQRPopup({
74+
showSingleAccount: true,
75+
showForSavedAddress: false,
76+
switchingAccounsEnabled: false,
77+
hasFloatingButtons: false,
78+
name: root.name,
79+
address: root.address
80+
})
81+
}
82+
}
83+
84+
StatusAction {
85+
text: qsTr("View activity")
86+
objectName: "viewActivityFollowingAddressAction"
87+
assetSettings.name: "wallet"
88+
onTriggered: {
89+
Global.changeAppSectionBySectionType(Constants.appSection.wallet,
90+
WalletLayout.LeftPanelSelection.AllAddresses,
91+
WalletLayout.RightPanelSelection.Activity,
92+
{savedAddress: root.address})
93+
}
94+
}
95+
96+
StatusMenuSeparator {}
97+
98+
BlockchainExplorersMenu {
99+
id: blockchainExplorersMenu
100+
flatNetworks: root.activeNetworks
101+
onNetworkClicked: {
102+
let link = Utils.getUrlForAddressOnNetwork(shortname, isTestnet, d.visibleAddress ? d.visibleAddress : root.ensName);
103+
Global.openLinkWithConfirmation(link, StatusQUtils.StringUtils.extractDomainFromLink(link));
104+
}
105+
}
106+
107+
StatusMenuSeparator { }
108+
109+
StatusAction {
110+
text: {
111+
var savedAddr = WalletStores.RootStore.getSavedAddress(root.address)
112+
var isSaved = savedAddr && savedAddr.address !== ""
113+
return isSaved ? qsTr("Already in saved addresses") : qsTr("Add to saved addresses")
114+
}
115+
assetSettings.name: {
116+
var savedAddr = WalletStores.RootStore.getSavedAddress(root.address)
117+
var isSaved = savedAddr && savedAddr.address !== ""
118+
return isSaved ? "star-icon" : "star-icon-outline"
119+
}
120+
objectName: "addToSavedAddressesAction"
121+
enabled: {
122+
var savedAddr = WalletStores.RootStore.getSavedAddress(root.address)
123+
return !(savedAddr && savedAddr.address !== "")
124+
}
125+
onTriggered: {
126+
var nameToUse = root.ensName || root.address
127+
if (root.ensName && root.ensName.includes(".")) {
128+
nameToUse = root.ensName.split(".")[0]
129+
}
130+
131+
Global.openAddEditSavedAddressesPopup({
132+
addAddress: true,
133+
address: root.address,
134+
name: nameToUse,
135+
ens: root.ensName
136+
})
137+
}
138+
}
139+
}
140+

ui/app/AppLayouts/Wallet/controls/FollowingAddressesDelegate.qml

Lines changed: 7 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,14 @@ StatusListItem {
3939
property alias sendButton: sendButton
4040
property alias starButton: starButton
4141

42-
signal aboutToOpenPopup()
4342
signal openSendModal(string recipient)
43+
signal menuRequested(var menuModel)
4444

4545
enum Usage {
4646
Delegate,
4747
Item
4848
}
4949

50-
implicitWidth: ListView.view ? ListView.view.width : 0
51-
5250
title: name
5351
objectName: name || "followingAddressDelegate"
5452
subTitle: WalletUtils.addressToDisplay(root.address, false, sensor.containsMouse)
@@ -151,134 +149,14 @@ StatusListItem {
151149
radius: 8
152150
icon.name: "more"
153151
onClicked: {
154-
menu.openMenu(this, x + width - menu.width - statusListItemComponentsSlot.spacing, y + height + Theme.halfPadding,
155-
{
156-
name: root.name,
157-
address: root.address,
158-
ensName: root.ensName,
159-
tags: root.tags,
160-
}
161-
);
152+
root.menuRequested({
153+
name: root.name,
154+
address: root.address,
155+
ensName: root.ensName,
156+
tags: root.tags,
157+
})
162158
}
163159

164160
}
165161
]
166-
167-
StatusMenu {
168-
id: menu
169-
property string name
170-
property string address
171-
property string ensName
172-
property var tags
173-
174-
readonly property int maxHeight: 341
175-
height: implicitHeight > maxHeight ? maxHeight : implicitHeight
176-
177-
function openMenu(parent, x, y, model) {
178-
menu.name = model.name;
179-
menu.address = model.address;
180-
menu.ensName = model.ensName;
181-
menu.tags = model.tags;
182-
popup(parent, x, y);
183-
}
184-
onClosed: {
185-
menu.name = "";
186-
menu.address = "";
187-
menu.ensName = ""
188-
menu.tags = []
189-
}
190-
191-
StatusSuccessAction {
192-
id: copyAddressAction
193-
objectName: "copyFollowingAddressAction"
194-
successText: qsTr("Address copied")
195-
text: qsTr("Copy address")
196-
icon.name: "copy"
197-
timeout: 1500
198-
autoDismissMenu: true
199-
onTriggered: ClipboardUtils.setText(d.visibleAddress)
200-
}
201-
202-
StatusAction {
203-
text: qsTr("Show address QR")
204-
objectName: "showQrFollowingAddressAction"
205-
assetSettings.name: "qr"
206-
onTriggered: {
207-
if (root.usage === FollowingAddressesDelegate.Usage.Item) {
208-
root.aboutToOpenPopup()
209-
}
210-
Global.openShowQRPopup({
211-
showSingleAccount: true,
212-
showForSavedAddress: false,
213-
switchingAccounsEnabled: false,
214-
hasFloatingButtons: false,
215-
name: menu.name,
216-
address: menu.address
217-
})
218-
}
219-
}
220-
221-
StatusAction {
222-
text: qsTr("View activity")
223-
objectName: "viewActivityFollowingAddressAction"
224-
assetSettings.name: "wallet"
225-
onTriggered: {
226-
if (root.usage === FollowingAddressesDelegate.Usage.Item) {
227-
root.aboutToOpenPopup()
228-
}
229-
Global.changeAppSectionBySectionType(Constants.appSection.wallet,
230-
WalletLayout.LeftPanelSelection.AllAddresses,
231-
WalletLayout.RightPanelSelection.Activity,
232-
{savedAddress: menu.address})
233-
}
234-
}
235-
236-
StatusMenuSeparator {}
237-
238-
BlockchainExplorersMenu {
239-
id: blockchainExplorersMenu
240-
flatNetworks: root.activeNetworks
241-
onNetworkClicked: {
242-
let link = Utils.getUrlForAddressOnNetwork(shortname, isTestnet, d.visibleAddress ? d.visibleAddress : root.ensName);
243-
Global.openLinkWithConfirmation(link, StatusQUtils.StringUtils.extractDomainFromLink(link));
244-
}
245-
}
246-
247-
StatusMenuSeparator { }
248-
249-
StatusAction {
250-
text: {
251-
var savedAddr = WalletStores.RootStore.getSavedAddress(menu.address)
252-
var isSaved = savedAddr && savedAddr.address !== ""
253-
return isSaved ? qsTr("Already in saved addresses") : qsTr("Add to saved addresses")
254-
}
255-
assetSettings.name: {
256-
var savedAddr = WalletStores.RootStore.getSavedAddress(menu.address)
257-
var isSaved = savedAddr && savedAddr.address !== ""
258-
return isSaved ? "star-icon" : "star-icon-outline"
259-
}
260-
objectName: "addToSavedAddressesAction"
261-
enabled: {
262-
var savedAddr = WalletStores.RootStore.getSavedAddress(menu.address)
263-
return !(savedAddr && savedAddr.address !== "")
264-
}
265-
onTriggered: {
266-
if (root.usage === FollowingAddressesDelegate.Usage.Item) {
267-
root.aboutToOpenPopup()
268-
}
269-
270-
var nameToUse = menu.ensName || menu.address
271-
if (menu.ensName && menu.ensName.includes(".")) {
272-
nameToUse = menu.ensName.split(".")[0]
273-
}
274-
275-
Global.openAddEditSavedAddressesPopup({
276-
addAddress: true,
277-
address: menu.address,
278-
name: nameToUse,
279-
ens: menu.ensName
280-
})
281-
}
282-
}
283-
}
284162
}

ui/app/AppLayouts/Wallet/controls/qmldir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ DappsComboBox 1.0 DappsComboBox.qml
1111
EditSlippagePanel 1.0 EditSlippagePanel.qml
1212
FilterComboBox 1.0 FilterComboBox.qml
1313
FollowingAddressesDelegate 1.0 FollowingAddressesDelegate.qml
14+
FollowingAddressMenu 1.0 FollowingAddressMenu.qml
1415
InformationTileAssetDetails 1.0 InformationTileAssetDetails.qml
1516
ManageTokenMenuButton 1.0 ManageTokenMenuButton.qml
1617
ManageTokensCommunityTag 1.0 ManageTokensCommunityTag.qml

ui/app/AppLayouts/Wallet/panels/WalletFollowingAddressesHeader.qml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Control {
4646

4747
Layout.preferredHeight: 38
4848

49-
text: qsTr("+Add via EFP")
49+
text: qsTr("Add via EFP")
5050
size: StatusBaseButton.Size.Small
5151
normalColor: Theme.palette.primaryColor3
5252
hoverColor: Theme.palette.primaryColor2

ui/app/AppLayouts/Wallet/stores/RootStore.qml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ QtObject {
7878
}
7979

8080
function getPrimaryAccountAddress() {
81-
var firstAccount = SQUtils.ModelUtils.getFirstModelEntryIf(root.accounts, (account) => {
82-
return true // Get the first account
83-
})
84-
return firstAccount ? firstAccount.address : ""
81+
return SQUtils.ModelUtils.get(root.accounts, 0, "address") || ""
8582
}
8683

8784
property var nonWatchAccounts: SortFilterProxyModel {

0 commit comments

Comments
 (0)