From 3345a9cc48c5e81e452578a62c31e3e953e561a8 Mon Sep 17 00:00:00 2001 From: Andrey Bocharnikov Date: Tue, 4 Jun 2024 16:55:08 +0400 Subject: [PATCH] fix(HistoryNodes): Fix mailserver management UI controllers Fixes #14982 --- .../signals/remote_signals/mailserver.nim | 2 + .../main/profile_section/sync/controller.nim | 19 +++-- .../profile_section/sync/io_interface.nim | 12 ++- .../main/profile_section/sync/module.nim | 26 +++--- .../main/profile_section/sync/view.nim | 48 +++++++---- .../service/mailservers/service.nim | 22 ++--- .../service/settings/dto/settings.nim | 2 +- src/app_service/service/settings/service.nim | 81 ++++++++++++------- src/backend/mailservers.nim | 6 ++ .../Profile/popups/WakuStoreModal.qml | 4 +- .../Profile/stores/MessagingStore.qml | 10 +-- .../AppLayouts/Profile/views/AdvancedView.qml | 2 +- 12 files changed, 149 insertions(+), 85 deletions(-) diff --git a/src/app/core/signals/remote_signals/mailserver.nim b/src/app/core/signals/remote_signals/mailserver.nim index 79e97a5e93..0d7213a59a 100644 --- a/src/app/core/signals/remote_signals/mailserver.nim +++ b/src/app/core/signals/remote_signals/mailserver.nim @@ -33,6 +33,7 @@ type MailserverAvailableSignal* = ref object of Signal type MailserverChangedSignal* = ref object of Signal address*: string + id*: string type MailserverNotWorkingSignal* = ref object of Signal @@ -84,6 +85,7 @@ proc fromEvent*(T: type MailserverChangedSignal, jsonSignal: JsonNode): Mailserv result = MailserverChangedSignal() result.signalType = SignalType.MailserverChanged result.address = jsonSignal["event"]{"address"}.getStr() + result.id = jsonSignal["event"]{"id"}.getStr() proc fromEvent*(T: type MailserverNotWorkingSignal, jsonSignal: JsonNode): MailserverNotWorkingSignal = result = MailserverNotWorkingSignal() diff --git a/src/app/modules/main/profile_section/sync/controller.nim b/src/app/modules/main/profile_section/sync/controller.nim index ff145833da..57412dad13 100644 --- a/src/app/modules/main/profile_section/sync/controller.nim +++ b/src/app/modules/main/profile_section/sync/controller.nim @@ -34,19 +34,24 @@ proc delete*(self: Controller) = proc init*(self: Controller) = self.events.on(SIGNAL_ACTIVE_MAILSERVER_CHANGED) do(e: Args): - var args = ActiveMailserverChangedArgs(e) - self.delegate.onActiveMailserverChanged(args.nodeAddress) + self.delegate.onActiveMailserverChanged() + + self.events.on(SIGNAL_PINNED_MAILSERVER_CHANGED) do(e: Args): + self.delegate.onPinnedMailserverChanged() proc getAllMailservers*(self: Controller): seq[tuple[name: string, nodeAddress: string]] = return self.mailserversService.getAllMailservers() -proc getPinnedMailserver*(self: Controller): string = +proc getPinnedMailserverId*(self: Controller): string = let fleet = self.nodeConfigurationService.getFleet() - self.settingsService.getPinnedMailserver(fleet) + self.settingsService.getPinnedMailserverId(fleet) -proc pinMailserver*(self: Controller, mailserverID: string) = +proc setPinnedMailserverId*(self: Controller, mailserverID: string) = let fleet = self.nodeConfigurationService.getFleet() - discard self.settingsService.pinMailserver(mailserverID, fleet) + discard self.settingsService.setPinnedMailserverId(mailserverID, fleet) + +proc getActiveMailserverId*(self: Controller): string = + return self.mailserversService.getActiveMailserverId() proc saveNewMailserver*(self: Controller, name: string, nodeAddress: string) = discard self.mailserversService.saveMailserver(name, nodeAddress) @@ -58,4 +63,4 @@ proc getUseMailservers*(self: Controller): bool = return self.settingsService.getUseMailservers() proc setUseMailservers*(self: Controller, value: bool): bool = - return self.settingsService.saveUseMailservers(value) \ No newline at end of file + return self.settingsService.toggleUseMailservers(value) \ No newline at end of file diff --git a/src/app/modules/main/profile_section/sync/io_interface.nim b/src/app/modules/main/profile_section/sync/io_interface.nim index 7ba65d724b..54f651efc9 100644 --- a/src/app/modules/main/profile_section/sync/io_interface.nim +++ b/src/app/modules/main/profile_section/sync/io_interface.nim @@ -15,7 +15,10 @@ method isLoaded*(self: AccessInterface): bool {.base.} = method getModuleAsVariant*(self: AccessInterface): QVariant {.base.} = raise newException(ValueError, "No implementation available") -method onActiveMailserverChanged*(self: AccessInterface, nodeAddress: string) {.base.} = +method onActiveMailserverChanged*(self: AccessInterface) {.base.} = + raise newException(ValueError, "No implementation available") + +method onPinnedMailserverChanged*(self: AccessInterface) {.base.} = raise newException(ValueError, "No implementation available") method viewDidLoad*(self: AccessInterface) {.base.} = @@ -24,10 +27,13 @@ method viewDidLoad*(self: AccessInterface) {.base.} = method isAutomaticSelection*(self: AccessInterface): bool {.base.} = raise newException(ValueError, "No implementation available") -method getMailserverNameForNodeAddress*(self: AccessInterface, nodeAddress: string): string {.base.} = +method getActiveMailserverId*(self: AccessInterface): string {.base.} = raise newException(ValueError, "No implementation available") -method setActiveMailserver*(self: AccessInterface, mailserverID: string) {.base.} = +method getPinnedMailserverId*(self: AccessInterface): string {.base.} = + raise newException(ValueError, "No implementation available") + +method setPinnedMailserverId*(self: AccessInterface, mailserverID: string) {.base.} = raise newException(ValueError, "No implementation available") method saveNewMailserver*(self: AccessInterface, name: string, nodeAddress: string) {.base.} = diff --git a/src/app/modules/main/profile_section/sync/module.nim b/src/app/modules/main/profile_section/sync/module.nim index 0f0a402b7a..c5660f77fd 100644 --- a/src/app/modules/main/profile_section/sync/module.nim +++ b/src/app/modules/main/profile_section/sync/module.nim @@ -63,19 +63,23 @@ method getModuleAsVariant*(self: Module): QVariant = return self.viewVariant method isAutomaticSelection*(self: Module): bool = - return self.controller.getPinnedMailserver().len == 0 + return self.controller.getPinnedMailserverId().len == 0 -method onActiveMailserverChanged*(self: Module, nodeAddress: string) = - self.view.onActiveMailserverSet(nodeAddress) +method onActiveMailserverChanged*(self: Module) = + self.view.onActiveMailserverSet() -method getMailserverNameForNodeAddress*(self: Module, nodeAddress: string): string = - let name = self.view.model().getNameForNodeAddress(nodeAddress) - if(name.len > 0): - return name - return "---" +method onPinnedMailserverChanged*(self: Module) = + self.view.onPinnedMailserverSet() -method setActiveMailserver*(self: Module, mailserverID: string) = - self.controller.pinMailserver(mailserverID) +method setPinnedMailserverId*(self: Module, mailserverID: string) = + self.controller.setPinnedMailserverId(mailserverID) + +method getPinnedMailserverId*(self: Module): string = + return self.controller.getPinnedMailserverId() + +method getActiveMailserverId*(self: Module): string = + let res = self.controller.getActiveMailserverId() + return res method saveNewMailserver*(self: Module, name: string, nodeAddress: string) = self.controller.saveNewMailserver(name, nodeAddress) @@ -90,5 +94,5 @@ method getUseMailservers*(self: Module): bool = return self.controller.getUseMailservers() method setUseMailservers*(self: Module, value: bool) = - if (self.controller.setUseMailservers(value)): + if self.controller.setUseMailservers(value): self.view.useMailserversChanged() diff --git a/src/app/modules/main/profile_section/sync/view.nim b/src/app/modules/main/profile_section/sync/view.nim index 4cff2c7ebe..60c3621078 100644 --- a/src/app/modules/main/profile_section/sync/view.nim +++ b/src/app/modules/main/profile_section/sync/view.nim @@ -5,7 +5,6 @@ QtObject: type View* = ref object of QObject delegate: io_interface.AccessInterface - activeMailserver: string model: Model modelVariant: QVariant @@ -18,7 +17,6 @@ QtObject: new(result, delete) result.QObject.setup result.delegate = delegate - result.activeMailserver = "" result.model = newModel() result.modelVariant = newQVariant(result.model) @@ -31,33 +29,49 @@ QtObject: proc modelChanged*(self: View) {.signal.} proc getModel(self: View): QVariant {.slot.} = return self.modelVariant + QtProperty[QVariant] model: read = getModel notify = modelChanged proc isAutomaticSelection(self: View): bool {.slot.} = return self.delegate.isAutomaticSelection() + QtProperty[bool] automaticSelection: read = isAutomaticSelection + notify = pinnedMailserverIdChanged - proc activeMailserverChanged*(self: View) {.signal.} - proc getActiveMailserver(self: View): string {.slot.} = - return self.activeMailserver - QtProperty[string] activeMailserver: - read = getActiveMailserver - notify = activeMailserverChanged + proc activeMailserverIdChanged*(self: View) {.signal.} - proc setActiveMailserver(self: View, mailserverID: string) {.slot.} = - self.delegate.setActiveMailserver(mailserverID) + proc getActiveMailserverId(self: View): string {.slot.} = + let res = self.delegate.getActiveMailserverId() + return res - proc onActiveMailserverSet*(self: View, nodeAddress: string) = - if(self.activeMailserver == nodeAddress): + QtProperty[string] activeMailserverId: + read = getActiveMailserverId + notify = activeMailserverIdChanged + + proc onActiveMailserverSet*(self: View) = + self.activeMailserverIdChanged() + + proc pinnedMailserverIdChanged*(self: View) {.signal.} + + proc getPinnedMailserverId(self: View): string {.slot.} = + let res = self.delegate.getPinnedMailserverId() + return res + + QtProperty[string] pinnedMailserverId: + read = getPinnedMailserverId + write = setPinnedMailserverId + notify = pinnedMailserverIdChanged + + proc setPinnedMailserverId(self: View, mailserverID: string) {.slot.} = + if mailserverID == self.getPinnedMailserverId(): return - self.activeMailserver = nodeAddress - self.activeMailserverChanged() + self.delegate.setPinnedMailserverId(mailserverID) - proc getMailserverNameForNodeAddress*(self: View, nodeAddress: string): string {.slot.} = - self.delegate.getMailserverNameForNodeAddress(nodeAddress) + proc onPinnedMailserverSet*(self: View) = + self.pinnedMailserverIdChanged() proc saveNewMailserver(self: View, name: string, address: string) {.slot.} = self.delegate.saveNewMailserver(name, address) @@ -71,6 +85,8 @@ QtObject: return self.delegate.getUseMailservers() proc setUseMailservers*(self: View, value: bool) {.slot.} = + if value == self.delegate.getUseMailservers(): + return self.delegate.setUseMailservers(value) QtProperty[bool] useMailservers: diff --git a/src/app_service/service/mailservers/service.nim b/src/app_service/service/mailservers/service.nim index 00bade8a8e..bdadded5a5 100644 --- a/src/app_service/service/mailservers/service.nim +++ b/src/app_service/service/mailservers/service.nim @@ -23,6 +23,7 @@ logScope: type ActiveMailserverChangedArgs* = ref object of Args nodeAddress*: string + nodeId*: string MailserverAvailableArgs* = ref object of Args @@ -80,6 +81,7 @@ QtObject: settingsService: settings_service.Service nodeConfigurationService: node_configuration_service.Service fleetConfiguration: FleetConfiguration + activeMailserverData: ActiveMailserverChangedArgs # Forward declaration: proc doConnect(self: Service) @@ -101,6 +103,7 @@ QtObject: result.settingsService = settingsService result.nodeConfigurationService = nodeConfigurationService result.fleetConfiguration = fleetConfiguration + result.activeMailserverData = ActiveMailserverChangedArgs(nodeAddress: "", nodeId: "") proc init*(self: Service) = self.doConnect() @@ -118,10 +121,10 @@ QtObject: let mailserverName = "Test Mailserver" self.mailservers.add((name: mailserverName, nodeAddress: TEST_PEER_ENR)) let mailserverID = self.saveMailserver(mailserverName, TEST_PEER_ENR) - discard self.settingsService.pinMailserver(mailserverId, fleet) + discard self.settingsService.setPinnedMailserverId(mailserverId, fleet) if MAILSERVER_ID != "": - discard self.settingsService.pinMailserver(MAILSERVER_ID, fleet) + discard self.settingsService.setPinnedMailserverId(MAILSERVER_ID, fleet) proc requestMoreMessages*(self: Service, chatId: string) = let arg = RequestMoreMessagesTaskArg( @@ -144,13 +147,14 @@ QtObject: self.events.on(SignalType.MailserverChanged.event) do(e: Args): let receivedData = MailserverChangedSignal(e) let address = receivedData.address + let id = receivedData.id if address == "": info "removing active mailserver" else: - info "active mailserver changed", node=address - let data = ActiveMailserverChangedArgs(nodeAddress: address) - self.events.emit(SIGNAL_ACTIVE_MAILSERVER_CHANGED, data) + info "active mailserver changed", node=address, id = id + self.activeMailserverData = ActiveMailserverChangedArgs(nodeAddress: address, nodeId: id) + self.events.emit(SIGNAL_ACTIVE_MAILSERVER_CHANGED, self.activeMailserverData) self.events.on(SignalType.MailserverAvailable.event) do(e: Args): info "mailserver available" @@ -179,7 +183,6 @@ QtObject: let h = HistoryRequestSuccessSignal(e) info "history request success", requestId=h.requestId, peerId=h.peerId - proc initMailservers(self: Service) = let fleet = self.nodeConfigurationService.getFleet() let mailservers = self.fleetConfiguration.getMailservers(fleet) @@ -188,6 +191,9 @@ QtObject: info "initMailservers", topics="mailserver-interaction", name, nodeAddress self.mailservers.add((name: name, nodeAddress: nodeAddress)) + proc getActiveMailserverId*(self: Service): string = + return self.activeMailserverData.nodeId + proc fetchMailservers(self: Service) = try: let response = status_mailservers.getMailservers() @@ -235,7 +241,3 @@ QtObject: # slot: "onActiveMailserverResult" # ) #mailserverWorker.start(task) - - proc onActiveMailserverResult*(self: Service, response: string) {.slot.} = - let fleet = self.nodeConfigurationService.getFleet() - discard self.settingsService.pinMailserver(response, fleet) diff --git a/src/app_service/service/settings/dto/settings.nim b/src/app_service/service/settings/dto/settings.nim index 4d0eb15a57..739dff74ea 100644 --- a/src/app_service/service/settings/dto/settings.nim +++ b/src/app_service/service/settings/dto/settings.nim @@ -255,6 +255,6 @@ proc pinnedMailserverToJsonNode*(mailserver: PinnedMailserver): JsonNode = "waku.test": mailserver.wakuTest, "status.test": mailserver.statusTest, "status.prod": mailserver.statusProd, - "shard.test": mailserver.shardsTest, + "shards.test": mailserver.shardsTest, "sharding.staging": mailserver.shardsStaging, } diff --git a/src/app_service/service/settings/service.nim b/src/app_service/service/settings/service.nim index 02c6cb6f1d..0e8ce0146e 100644 --- a/src/app_service/service/settings/service.nim +++ b/src/app_service/service/settings/service.nim @@ -1,9 +1,10 @@ import NimQml, chronicles, json, strutils, sequtils, tables -import app_service/common/types as common_types import app/core/eventemitter import app/core/fleets/fleet_configuration import app/core/signals/types +import app_service/common/types as common_types +import backend/mailservers as status_mailservers import backend/settings as status_settings import backend/status_update as status_update @@ -26,6 +27,7 @@ const SIGNAL_MNEMONIC_REMOVED* = "mnemonicRemoved" const SIGNAL_CURRENT_USER_STATUS_UPDATED* = "currentUserStatusUpdated" const SIGNAL_PROFILE_MIGRATION_NEEDED_UPDATED* = "profileMigrationNeededUpdated" const SIGNAL_URL_UNFURLING_MODE_UPDATED* = "urlUnfurlingModeUpdated" +const SIGNAL_PINNED_MAILSERVER_CHANGED* = "pinnedMailserverChanged" logScope: topics = "settings-service" @@ -328,11 +330,18 @@ QtObject: proc getAppearance*(self: Service): int = self.settings.appearance - proc saveUseMailservers*(self: Service, value: bool): bool = - if(self.saveSetting(KEY_USE_MAILSERVERS, value)): + proc toggleUseMailservers*(self: Service, value: bool): bool = + try: + let response = status_mailservers.toggleUseMailservers(value) + if not response.error.isNil: + error "error saving use mailservers: ", errDescription = response.error.message + return false self.settings.useMailservers = value - return true - return false + except Exception as e: + let errDesription = e.msg + error "saving use mailservers error: ", errDesription + return false + return true proc getUseMailservers*(self: Service): bool = self.settings.useMailservers @@ -390,36 +399,52 @@ QtObject: proc getCurrentUserStatus*(self: Service): CurrentUserStatus = self.settings.currentUserStatus - proc getPinnedMailserver*(self: Service, fleet: Fleet): string = - if (fleet == Fleet.WakuSandbox): - return self.settings.pinnedMailserver.wakuSandbox - elif (fleet == Fleet.WakuTest): - return self.settings.pinnedMailserver.wakuTest - elif (fleet == Fleet.ShardsTest): - return self.settings.pinnedMailserver.shardsTest - elif (fleet == Fleet.ShardsStaging): - return self.settings.pinnedMailserver.shardsStaging - return "" + proc getPinnedMailserverId*(self: Service, fleet: Fleet): string = + case fleet: + of Fleet.WakuSandbox: + return self.settings.pinnedMailserver.wakuSandbox + of Fleet.WakuTest: + return self.settings.pinnedMailserver.wakuTest + of Fleet.ShardsTest: + return self.settings.pinnedMailserver.shardsTest + of Fleet.ShardsStaging: + return self.settings.pinnedMailserver.shardsStaging + else: + return "" - proc pinMailserver*(self: Service, mailserverID: string, fleet: Fleet): bool = + proc setPinnedMailserverId*(self: Service, mailserverID: string, fleet: Fleet): bool = if fleet == Fleet.Undefined: return false var newMailserverJsonObj = self.settings.pinnedMailserver.pinnedMailserverToJsonNode() newMailserverJsonObj[$fleet] = %* mailserverID - if(self.saveSetting(KEY_PINNED_MAILSERVERS, newMailserverJsonObj)): - if (fleet == Fleet.WakuSandbox): - self.settings.pinnedMailserver.wakuSandbox = mailserverID - elif (fleet == Fleet.WakuTest): - self.settings.pinnedMailserver.wakuTest = mailserverID - elif (fleet == Fleet.ShardsTest): - self.settings.pinnedMailserver.shardsTest = mailserverID - elif (fleet == Fleet.ShardsStaging): - self.settings.pinnedMailserver.shardsStaging = mailserverID - return true - return false + + try: + let response = status_mailservers.setPinnedMailservers(newMailserverJsonObj) + if not response.error.isNil: + error "error saving pinned mailserver: ", errDescription = response.error.message + return false + + case fleet: + of Fleet.WakuSandbox: + self.settings.pinnedMailserver.wakuSandbox = mailserverID + of Fleet.WakuTest: + self.settings.pinnedMailserver.wakuTest = mailserverID + of Fleet.ShardsTest: + self.settings.pinnedMailserver.shardsTest = mailserverID + of Fleet.ShardsStaging: + self.settings.pinnedMailserver.shardsStaging = mailserverID + else: + return false + except Exception as e: + let errDesription = e.msg + error "saving pinned mailserver error: ", errDesription + return false + + self.events.emit(SIGNAL_PINNED_MAILSERVER_CHANGED, Args()) + return true proc unpinMailserver*(self: Service, fleet: Fleet): bool = - return self.pinMailserver("", fleet) + return self.setPinnedMailserverId("", fleet) proc saveNodeConfiguration*(self: Service, value: JsonNode): bool = if(self.saveSetting(KEY_NODE_CONFIG, value)): diff --git a/src/backend/mailservers.nim b/src/backend/mailservers.nim index 697328e5e3..7f9c264123 100644 --- a/src/backend/mailservers.nim +++ b/src/backend/mailservers.nim @@ -20,6 +20,12 @@ proc saveMailserver*(id: string, name: string, enode: string, fleet: string): proc getMailservers*(): RpcResponse[JsonNode] = result = core.callPrivateRPC("mailservers_getMailservers") +proc setPinnedMailservers*(mailservers: JsonNode): RpcResponse[JsonNode] = + result = core.callPrivateRPC("setPinnedMailservers".prefix, %*[ mailservers ]) + +proc toggleUseMailservers*(value: bool): RpcResponse[JsonNode] = + result = core.callPrivateRPC("toggleUseMailservers".prefix, %*[ value ]) + proc syncChatFromSyncedFrom*(chatId: string): RpcResponse[JsonNode] = let payload = %*[chatId] result = core.callPrivateRPC("syncChatFromSyncedFrom".prefix, payload) diff --git a/ui/app/AppLayouts/Profile/popups/WakuStoreModal.qml b/ui/app/AppLayouts/Profile/popups/WakuStoreModal.qml index 87a055b9e9..5a8f2cebe6 100644 --- a/ui/app/AppLayouts/Profile/popups/WakuStoreModal.qml +++ b/ui/app/AppLayouts/Profile/popups/WakuStoreModal.qml @@ -100,10 +100,10 @@ StatusModal { StatusRadioButton { id: nodeRadioBtn ButtonGroup.group: nodesButtonGroup - checked: model.nodeAddress === root.messagingStore.activeMailserver + checked: model.name === root.messagingStore.pinnedMailserverId onCheckedChanged: { if (checked) { - root.messagingStore.setActiveMailserver(model.name) + root.messagingStore.setPinnedMailserverId(model.name) } } } diff --git a/ui/app/AppLayouts/Profile/stores/MessagingStore.qml b/ui/app/AppLayouts/Profile/stores/MessagingStore.qml index 471a003960..c40e00d29d 100644 --- a/ui/app/AppLayouts/Profile/stores/MessagingStore.qml +++ b/ui/app/AppLayouts/Profile/stores/MessagingStore.qml @@ -19,14 +19,12 @@ QtObject { // Module Properties property bool automaticMailserverSelection: syncModule.automaticSelection - property string activeMailserver: syncModule.activeMailserver + property string activeMailserverId: syncModule.activeMailserverId + property string pinnedMailserverId: syncModule.pinnedMailserverId - function getMailserverNameForNodeAddress(nodeAddress) { - return root.syncModule.getMailserverNameForNodeAddress(nodeAddress) - } - function setActiveMailserver(mailserverID) { - root.syncModule.setActiveMailserver(mailserverID) + function setPinnedMailserverId(mailserverID) { + root.syncModule.setPinnedMailserverId(mailserverID) } function saveNewMailserver(name, nodeAddress) { diff --git a/ui/app/AppLayouts/Profile/views/AdvancedView.qml b/ui/app/AppLayouts/Profile/views/AdvancedView.qml index 2683d6e3f9..1c874ab208 100644 --- a/ui/app/AppLayouts/Profile/views/AdvancedView.qml +++ b/ui/app/AppLayouts/Profile/views/AdvancedView.qml @@ -314,7 +314,7 @@ SettingsContentBase { anchors.leftMargin: Style.current.padding anchors.rightMargin: Style.current.padding title: qsTr("History nodes") - label: root.messagingStore.getMailserverNameForNodeAddress(root.messagingStore.activeMailserver) + label: root.messagingStore.activeMailserverId || "---" components: [ StatusIcon { icon: "next"