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 45b8e17bfd1..ade4c4c3371 100644 --- a/src/app/modules/main/io_interface.nim +++ b/src/app/modules/main/io_interface.nim @@ -134,12 +134,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 746069a2c4d..e48ddf17edb 100644 --- a/src/app/modules/main/module.nim +++ b/src/app/modules/main/module.nim @@ -773,32 +773,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 cc5814e455d..21ca1e5f83e 100644 --- a/src/app/modules/main/view.nim +++ b/src/app/modules/main/view.nim @@ -103,6 +103,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/StatusQ b/ui/StatusQ index 69b5cb1988b..83938c50bc9 160000 --- a/ui/StatusQ +++ b/ui/StatusQ @@ -1 +1 @@ -Subproject commit 69b5cb1988bc86cf4a6d21ef693de71c38bce060 +Subproject commit 83938c50bc9beda17c4a51e57ce7354f7e151bee diff --git a/ui/app/mainui/AppMain.qml b/ui/app/mainui/AppMain.qml index d09b731ff5b..8be3e7a0953 100644 --- a/ui/app/mainui/AppMain.qml +++ b/ui/app/mainui/AppMain.qml @@ -962,6 +962,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); }