fix(ac): cache ac unread count and hasUnread in the view (#16152)

Fixes #16023

Caches the values of the number of notifications and hasUnseen in the view so that we access status-go only when there is an update or on app start.
Also, uses the response value from user actions in the AC to retrieve the hasUnseen value directly instead of re-fetching.
Finally, fixes an issue where marking notifs as read/unread wouldn't update the count
This commit is contained in:
Jonathan Rainville 2024-08-22 15:29:20 -04:00 committed by GitHub
parent 30f1529471
commit dea975cd0a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 61 additions and 15 deletions

View File

@ -71,6 +71,10 @@ proc init*(self: Controller) =
self.delegate.onNotificationsCountMayHaveChanged()
self.updateActivityGroupCounters()
self.events.on(activity_center_service.SIGNAL_ACTIVITY_CENTER_UNSEEN_UPDATED) do(e: Args):
var evArgs = ActivityCenterNotificationHasUnseen(e)
self.delegate.onUnseenChanged(evArgs.hasUnseen)
self.events.on(activity_center_service.SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_REMOVED) do(e: Args):
var evArgs = ActivityCenterNotificationIdsArgs(e)
if (evArgs.notificationIds.len > 0):

View File

@ -24,12 +24,18 @@ method hasMoreToShow*(self: AccessInterface): bool {.base.} =
method unreadActivityCenterNotificationsCount*(self: AccessInterface): int {.base.} =
raise newException(ValueError, "No implementation available")
method unreadActivityCenterNotificationsCountFromView*(self: AccessInterface): int {.base.} =
raise newException(ValueError, "No implementation available")
method hasUnseenActivityCenterNotifications*(self: AccessInterface): bool {.base.} =
raise newException(ValueError, "No implementation available")
method onNotificationsCountMayHaveChanged*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method onUnseenChanged*(self: AccessInterface, hasUnseen: bool) {.base.} =
raise newException(ValueError, "No implementation available")
method hasUnseenActivityCenterNotificationsChanged*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -61,24 +61,31 @@ method load*(self: Module) =
method isLoaded*(self: Module): bool =
return self.moduleLoaded
method viewDidLoad*(self: Module) =
self.moduleLoaded = true
self.delegate.activityCenterDidLoad()
method hasMoreToShow*(self: Module): bool =
self.controller.hasMoreToShow()
method unreadActivityCenterNotificationsCount*(self: Module): int =
self.controller.unreadActivityCenterNotificationsCount()
method unreadActivityCenterNotificationsCountFromView*(self: Module): int =
self.view.unreadCount()
method hasUnseenActivityCenterNotifications*(self: Module): bool =
self.controller.hasUnseenActivityCenterNotifications()
method viewDidLoad*(self: Module) =
self.moduleLoaded = true
self.delegate.activityCenterDidLoad()
self.view.setUnreadCount(self.unreadActivityCenterNotificationsCount())
self.view.setHasUnseen(self.hasUnseenActivityCenterNotifications())
method hasMoreToShow*(self: Module): bool =
self.controller.hasMoreToShow()
method onNotificationsCountMayHaveChanged*(self: Module) =
self.view.unreadActivityCenterNotificationsCountChanged()
self.view.hasUnseenActivityCenterNotificationsChanged()
self.view.setUnreadCount(self.unreadActivityCenterNotificationsCount())
self.delegate.onActivityNotificationsUpdated()
method onUnseenChanged*(self: Module, hasUnseen: bool) =
self.view.setHasUnseen(hasUnseen)
proc createMessageItemFromDto(self: Module, message: MessageDto, communityId: string, albumMessages: seq[MessageDto]): MessageItem =
let contactDetails = self.controller.getContactDetails(message.`from`)
let communityChats = self.controller.getCommunityById(communityId).chats
@ -221,7 +228,6 @@ method markAllActivityCenterNotificationsRead*(self: Module): string =
method markAllActivityCenterNotificationsReadDone*(self: Module) =
self.view.markAllActivityCenterNotificationsReadDone()
self.view.unreadActivityCenterNotificationsCountChanged()
method markActivityCenterNotificationRead*(self: Module, notificationId: string) =
self.controller.markActivityCenterNotificationRead(notificationId)
@ -229,7 +235,6 @@ method markActivityCenterNotificationRead*(self: Module, notificationId: string)
method markActivityCenterNotificationReadDone*(self: Module, notificationIds: seq[string]) =
for notificationId in notificationIds:
self.view.markActivityCenterNotificationReadDone(notificationId)
self.view.unreadActivityCenterNotificationsCountChanged()
method markAsSeenActivityCenterNotifications*(self: Module) =
self.controller.markAsSeenActivityCenterNotifications()
@ -259,7 +264,6 @@ method dismissActivityCenterNotificationDone*(self: Module, notificationId: stri
method markActivityCenterNotificationUnreadDone*(self: Module, notificationIds: seq[string]) =
for notificationId in notificationIds:
self.view.markActivityCenterNotificationUnreadDone(notificationId)
self.view.unreadActivityCenterNotificationsCountChanged()
method removeActivityCenterNotifications*(self: Module, notificationIds: seq[string]) =
self.view.removeActivityCenterNotifications(notificationIds)

View File

@ -12,6 +12,7 @@ QtObject:
modelVariant: QVariant
groupCounters: Table[ActivityCenterGroup, int]
unreadCount: int
hasUnseen: bool
proc delete*(self: View) =
self.QObject.delete
@ -24,6 +25,7 @@ QtObject:
result.modelVariant = newQVariant(result.model)
result.groupCounters = initTable[ActivityCenterGroup, int]()
result.unreadCount = 0
result.hasUnseen = false
proc load*(self: View) =
self.delegate.viewDidLoad()
@ -52,22 +54,33 @@ QtObject:
proc unreadActivityCenterNotificationsCountChanged*(self: View) {.signal.}
proc unreadActivityCenterNotificationsCount*(self: View): int {.slot.} =
self.unreadCount = self.delegate.unreadActivityCenterNotificationsCount()
return self.unreadCount
QtProperty[int] unreadActivityCenterNotificationsCount:
read = unreadActivityCenterNotificationsCount
notify = unreadActivityCenterNotificationsCountChanged
proc setUnreadCount*(self: View, count: int) =
if self.unreadCount == count:
return
self.unreadCount = count
self.unreadActivityCenterNotificationsCountChanged()
proc hasUnseenActivityCenterNotificationsChanged*(self: View) {.signal.}
proc hasUnseenActivityCenterNotifications*(self: View): bool {.slot.} =
self.delegate.hasUnseenActivityCenterNotifications()
return self.hasUnseen
QtProperty[bool] hasUnseenActivityCenterNotifications:
read = hasUnseenActivityCenterNotifications
notify = hasUnseenActivityCenterNotificationsChanged
proc setHasUnseen*(self: View, hasUnseen: bool) =
if self.hasUnseen == hasUnseen:
return
self.hasUnseen = hasUnseen
self.hasUnseenActivityCenterNotificationsChanged()
proc fetchActivityCenterNotifications(self: View) {.slot.} =
self.delegate.fetchActivityCenterNotifications()

View File

@ -972,7 +972,7 @@ method onChatLeft*[T](self: Module[T], chatId: string) =
proc checkIfWeHaveNotifications[T](self: Module[T]) =
let sectionWithUnread = self.view.model().isThereASectionWithUnreadMessages()
let activtyCenterNotifications = self.activityCenterModule.unreadActivityCenterNotificationsCount() > 0
let activtyCenterNotifications = self.activityCenterModule.unreadActivityCenterNotificationsCountFromView() > 0
self.view.setNotificationAvailable(sectionWithUnread or activtyCenterNotifications)
method onActivityNotificationsUpdated[T](self: Module[T]) =

View File

@ -32,9 +32,13 @@ type
ActivityCenterNotificationIdArgs* = ref object of Args
notificationId*: string
ActivityCenterNotificationHasUnseen* = ref object of Args
hasUnseen*: bool
# Signals which may be emitted by this service:
const SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_LOADED* = "activityCenterNotificationsLoaded"
const SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED* = "activityCenterNotificationsCountMayChanged"
const SIGNAL_ACTIVITY_CENTER_UNSEEN_UPDATED* = "activityCenterNotificationsHasUnseenUpdated"
const SIGNAL_ACTIVITY_CENTER_MARK_NOTIFICATIONS_AS_READ* = "activityCenterMarkNotificationsAsRead"
const SIGNAL_ACTIVITY_CENTER_MARK_NOTIFICATIONS_AS_UNREAD* = "activityCenterMarkNotificationsAsUnread"
const SIGNAL_ACTIVITY_CENTER_MARK_ALL_NOTIFICATIONS_AS_READ* = "activityCenterMarkAllNotificationsAsRead"
@ -137,6 +141,12 @@ QtObject:
proc hasMoreToShow*(self: Service): bool =
return self.cursor != ""
proc parseActivityCenterState*(self: Service, response: RpcResponse) =
var activityCenterState: JsonNode = newJObject()
if response.result.getProp("activityCenterState", activityCenterState):
let hasSeen = activityCenterState["hasSeen"].getBool
self.events.emit(SIGNAL_ACTIVITY_CENTER_UNSEEN_UPDATED, ActivityCenterNotificationHasUnseen(hasUnseen: not hasSeen))
proc asyncActivityNotificationLoad*(self: Service) =
let arg = AsyncActivityNotificationLoadTaskArg(
tptr: asyncActivityNotificationLoadTask,
@ -234,7 +244,9 @@ QtObject:
messagesWithMentionsCount: seenAndUnseenMessages.countWithMentions)
self.events.emit(SIGNAL_MESSAGES_MARKED_AS_READ, data)
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_MARK_NOTIFICATIONS_AS_READ, ActivityCenterNotificationIdsArgs(notificationIds: notificationIds))
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e:
error "Error marking as read", msg = e.msg
@ -245,7 +257,9 @@ QtObject:
if response.error != nil:
raise newException(RpcException, response.error.message)
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_MARK_NOTIFICATIONS_AS_UNREAD, ActivityCenterNotificationIdsArgs(notificationIds: notificationIds))
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e:
error "Error marking as unread", msg = e.msg
@ -263,7 +277,9 @@ QtObject:
let data = MessagesMarkedAsReadArgs(chatId: seenAndUnseenMessages.chatId, allMessagesMarked: true)
self.events.emit(SIGNAL_MESSAGES_MARKED_AS_READ, data)
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_MARK_ALL_NOTIFICATIONS_AS_READ, Args())
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e:
error "Error marking all as read", msg = e.msg
@ -296,6 +312,7 @@ QtObject:
if response.error != nil:
raise newException(RpcException, response.error.message)
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_REMOVED, ActivityCenterNotificationIdsArgs(notificationIds: notificationIds))
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e:
@ -322,6 +339,7 @@ QtObject:
self.chatService.updateOrAddChat(chat)
self.events.emit(SIGNAL_CHAT_UPDATE, ChatUpdateArgs(chats: @[chat]))
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_ACCEPTED, ActivityCenterNotificationIdArgs(notificationId: notificationId))
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e:
@ -334,6 +352,7 @@ QtObject:
if response.error != nil:
raise newException(RpcException, response.error.message)
self.parseActivityCenterState(response)
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_DISMISSED, ActivityCenterNotificationIdArgs(notificationId: notificationId))
self.events.emit(SIGNAL_ACTIVITY_CENTER_NOTIFICATIONS_COUNT_MAY_HAVE_CHANGED, Args())
except Exception as e: