From 39a56372ee7e56ced063b09a792207fd71bc6df7 Mon Sep 17 00:00:00 2001 From: Sale Djenic Date: Tue, 21 Jun 2022 12:42:27 +0200 Subject: [PATCH] fix(@desktop/notifications): nothing happens after clicking on any notification Fixes: #5935 --- src/app/core/notifications/details.nim | 6 +++++- .../notifications/notifications_manager.nim | 3 +++ .../main/ephemeral_notification_item.nim | 10 ++++++++- .../main/ephemeral_notification_model.nim | 6 ++++++ src/app/modules/main/io_interface.nim | 5 ++++- src/app/modules/main/module.nim | 21 ++++++++++++++----- src/app/modules/main/view.nim | 3 +++ ui/app/mainui/AppMain.qml | 4 ++++ 8 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/app/core/notifications/details.nim b/src/app/core/notifications/details.nim index a88deec87c4..cb7b625a06b 100644 --- a/src/app/core/notifications/details.nim +++ b/src/app/core/notifications/details.nim @@ -6,6 +6,7 @@ include ../../../app_service/common/json_utils type NotificationType* {.pure.} = enum + UnknownNotification, TestNotification, NewContactRequest, AcceptedContactRequest, @@ -18,7 +19,7 @@ type IdentityVerificationRequest NotificationDetails* = object - notificationType*: NotificationType + notificationType*: NotificationType # the default value is `UnknownNotification` sectionId*: string isCommunitySection*: bool sectionActive*: bool @@ -28,6 +29,9 @@ type isGroupChat*: bool messageId*: string +proc isEmpty*(self: NotificationDetails): bool = + return self.notificationType == NotificationType.UnknownNotification + proc toNotificationDetails*(jsonObj: JsonNode): NotificationDetails = var notificationType: int if (not (jsonObj.getProp("notificationType", notificationType) and diff --git a/src/app/core/notifications/notifications_manager.nim b/src/app/core/notifications/notifications_manager.nim index da68c0afca4..dd9dab53dc1 100644 --- a/src/app/core/notifications/notifications_manager.nim +++ b/src/app/core/notifications/notifications_manager.nim @@ -98,6 +98,9 @@ QtObject: app_makeItActive(singletonInstance.engine) let details = toNotificationDetails(parseJson(identifier)) + if(details.isEmpty()): + info "Notification details are empty" + return if(details.notificationType == NotificationType.TestNotification): info "Test notification was clicked" return diff --git a/src/app/modules/main/ephemeral_notification_item.nim b/src/app/modules/main/ephemeral_notification_item.nim index 31768126d96..7f8f6832da6 100644 --- a/src/app/modules/main/ephemeral_notification_item.nim +++ b/src/app/modules/main/ephemeral_notification_item.nim @@ -1,3 +1,5 @@ +import ../../core/notifications/details + type EphemeralNotificationType* {.pure.} = enum Default = 0 @@ -13,6 +15,7 @@ type loading: bool ephNotifType: EphemeralNotificationType url: string + details: NotificationDetails proc initItem*(id: int64, title: string, @@ -21,7 +24,8 @@ proc initItem*(id: int64, icon = "", loading = false, ephNotifType = EphemeralNotificationType.Default, - url = ""): Item = + url = "", + details: NotificationDetails): Item = result = Item() result.id = id result.durationInMs = durationInMs @@ -31,6 +35,7 @@ proc initItem*(id: int64, result.loading = loading result.ephNotifType = ephNotifType result.url = url + result.details = details proc id*(self: Item): int64 = self.id @@ -55,3 +60,6 @@ proc ephNotifType*(self: Item): EphemeralNotificationType = proc url*(self: Item): string = self.url + +proc details*(self: Item): NotificationDetails = + self.details \ No newline at end of file diff --git a/src/app/modules/main/ephemeral_notification_model.nim b/src/app/modules/main/ephemeral_notification_model.nim index b6d5ef38543..d4e2a95c8ae 100644 --- a/src/app/modules/main/ephemeral_notification_model.nim +++ b/src/app/modules/main/ephemeral_notification_model.nim @@ -73,6 +73,12 @@ QtObject: if(self.items[i].id == id): return i return -1 + + proc getItemWithId*(self: Model, id: int64): Item = + let ind = self.findIndexById(id) + if(ind == -1): + return + return self.items[ind] proc addItem*(self: Model, item: Item) = let parentModelIndex = newQModelIndex() diff --git a/src/app/modules/main/io_interface.nim b/src/app/modules/main/io_interface.nim index 5e3d81658b7..69686df0690 100644 --- a/src/app/modules/main/io_interface.nim +++ b/src/app/modules/main/io_interface.nim @@ -137,12 +137,15 @@ method displayEphemeralNotification*(self: AccessInterface, title: string, subTi raise newException(ValueError, "No implementation available") method displayEphemeralNotification*(self: AccessInterface, title: string, subTitle: string, icon: string, loading: bool, - ephNotifType: int, url: string) {.base.} = + ephNotifType: int, url: string, details = NotificationDetails()) {.base.} = raise newException(ValueError, "No implementation available") method removeEphemeralNotification*(self: AccessInterface, id: int64) {.base.} = raise newException(ValueError, "No implementation available") +method ephemeralNotificationClicked*(self: AccessInterface, id: int64) {.base.} = + raise newException(ValueError, "No implementation available") + method newCommunityMembershipRequestReceived*(self: AccessInterface, membershipRequest: CommunityMembershipRequestDto) {.base.} = raise newException(ValueError, "No implementation available") diff --git a/src/app/modules/main/module.nim b/src/app/modules/main/module.nim index 0b0bffa4e08..3fdf54824f1 100644 --- a/src/app/modules/main/module.nim +++ b/src/app/modules/main/module.nim @@ -781,32 +781,43 @@ method meMentionedCountChanged*[T](self: Module[T], allMentions: int) = singletonInstance.globalEvents.meMentionedIconBadgeNotification(allMentions) method displayEphemeralNotification*[T](self: Module[T], title: string, subTitle: string, icon: string, loading: bool, - ephNotifType: int, url: string) = + ephNotifType: int, url: string, details = NotificationDetails()) = let now = getTime() let id = now.toUnix * 1000000000 + now.nanosecond var finalEphNotifType = EphemeralNotificationType.Default if(ephNotifType == EphemeralNotificationType.Success.int): finalEphNotifType = EphemeralNotificationType.Success let item = ephemeral_notification_item.initItem(id, title, TOAST_MESSAGE_VISIBILITY_DURATION_IN_MS, subTitle, icon, - loading, finalEphNotifType, url) + loading, finalEphNotifType, url, details) self.view.ephemeralNotificationModel().addItem(item) method displayEphemeralNotification*[T](self: Module[T], title: string, subTitle: string, details: NotificationDetails) = if(details.notificationType == NotificationType.NewMessage or details.notificationType == NotificationType.NewMessageWithPersonalMention or details.notificationType == NotificationType.NewMessageWithGlobalMention): - self.displayEphemeralNotification(title, subTitle, "", false, EphemeralNotificationType.Default.int, "") + self.displayEphemeralNotification(title, subTitle, "", false, EphemeralNotificationType.Default.int, "", details) elif(details.notificationType == NotificationType.NewContactRequest or details.notificationType == NotificationType.IdentityVerificationRequest): - self.displayEphemeralNotification(title, subTitle, "contact", false, EphemeralNotificationType.Default.int, "") + self.displayEphemeralNotification(title, subTitle, "contact", false, EphemeralNotificationType.Default.int, "", details) elif(details.notificationType == NotificationType.AcceptedContactRequest): - self.displayEphemeralNotification(title, subTitle, "checkmark-circle", false, EphemeralNotificationType.Success.int, "") + self.displayEphemeralNotification(title, subTitle, "checkmark-circle", false, EphemeralNotificationType.Success.int, "", details) method removeEphemeralNotification*[T](self: Module[T], id: int64) = self.view.ephemeralNotificationModel().removeItemWithId(id) +method ephemeralNotificationClicked*[T](self: Module[T], id: int64) = + let item = self.view.ephemeralNotificationModel().getItemWithId(id) + if(item.details.isEmpty()): + return + if(item.details.notificationType == NotificationType.NewMessage or + item.details.notificationType == NotificationType.NewMessageWithPersonalMention or + item.details.notificationType == NotificationType.NewMessageWithGlobalMention): + self.controller.switchTo(item.details.sectionId, item.details.chatId, item.details.messageId) + else: + self.osNotificationClicked(item.details) + method onStatusUrlRequested*[T](self: Module[T], action: StatusUrlAction, communityId: string, chatId: string, url: string, userId: string, groupName: string, listOfUserIds: seq[string]) = diff --git a/src/app/modules/main/view.nim b/src/app/modules/main/view.nim index da5b1415df4..9d322671f8b 100644 --- a/src/app/modules/main/view.nim +++ b/src/app/modules/main/view.nim @@ -105,6 +105,9 @@ QtObject: proc removeEphemeralNotification*(self: View, id: string) {.slot.} = self.delegate.removeEphemeralNotification(id.parseInt) + proc ephemeralNotificationClicked*(self: View, id: string) {.slot.} = + self.delegate.ephemeralNotificationClicked(id.parseInt) + proc openStoreToKeychainPopup*(self: View) {.signal.} proc offerToStorePassword*(self: View) = diff --git a/ui/app/mainui/AppMain.qml b/ui/app/mainui/AppMain.qml index 232a3de86eb..32689d9d1ce 100644 --- a/ui/app/mainui/AppMain.qml +++ b/ui/app/mainui/AppMain.qml @@ -1006,6 +1006,10 @@ Item { type: model.ephNotifType linkUrl: model.url duration: model.durationInMs + onClicked: { + appMain.rootStore.mainModuleInst.ephemeralNotificationClicked(model.id) + this.open = false + } onLinkActivated: { Qt.openUrlExternally(link); }