fix(@desktop/communities): `joinedCommunities` doesn't update underlying community

Counting mentions for community seems was not developed yet. That's added here in this commit, but
instead of using "mentionsCount" we introduced on the side of nim, I found that we're receiving
"unviewedMentionsCount", but only for new messages. I used it for this fix.

Counting mentions and requests per community added.

Fixes: #2972
This commit is contained in:
Sale Djenic 2021-07-30 18:52:44 +02:00 committed by Iuri Matias
parent 2df6def7f9
commit a530f65ada
8 changed files with 110 additions and 74 deletions

View File

@ -28,7 +28,6 @@ proc handleChatEvents(self: ChatController) =
self.status.events.on("activityCenterNotificationsLoaded") do(e:Args):
let notifications = ActivityCenterNotificationsArgs(e).activityCenterNotifications
self.view.pushActivityCenterNotifications(notifications)
self.view.communities.updateNotifications(notifications)
self.status.events.on("contactBlocked") do(e: Args):
var evArgs = ContactBlockedArgs(e)
@ -86,7 +85,6 @@ proc handleChatEvents(self: ChatController) =
self.view.refreshPinnedMessages(evArgs.pinnedMessages)
if (evArgs.activityCenterNotifications.len > 0):
self.view.addActivityCenterNotification(evArgs.activityCenterNotifications)
self.view.communities.updateNotifications(evArgs.activityCenterNotifications)
if (evArgs.deletedMessages.len > 0):
for messageId in evArgs.deletedMessages:

View File

@ -181,6 +181,7 @@ QtObject:
let index = self.createIndex(idx, 0, nil)
self.chats[idx].unviewedMessagesCount = 0
self.chats[idx].unviewedMentionsCount = 0
self.dataChanged(index, index, @[ChannelsRoles.UnreadMessages.int])
@ -191,6 +192,7 @@ QtObject:
let index = self.createIndex(idx, 0, nil)
self.chats[idx].mentionsCount = 0
self.chats[idx].unviewedMentionsCount = 0
self.dataChanged(index, index, @[ChannelsRoles.MentionsCount.int])
@ -205,18 +207,7 @@ QtObject:
let index = self.createIndex(idx, 0, nil)
self.chats[idx].mentionsCount.dec
self.dataChanged(index, index, @[ChannelsRoles.MentionsCount.int])
proc incrementMentions*(self: ChannelsList, channelId: string) : bool =
result = false
let idx = self.chats.findIndexById(channelId)
if idx == -1:
return
let index = self.createIndex(idx, 0, nil)
self.chats[idx].mentionsCount.inc
result = true
self.chats[idx].unviewedMentionsCount.dec
self.dataChanged(index, index, @[ChannelsRoles.MentionsCount.int])

View File

@ -24,7 +24,6 @@ proc mergeChat(community: var Community, chat: Chat): bool =
if (c.id == chat.id):
chat.canPost = community.chats[i].canPost
chat.categoryId = community.chats[i].categoryId
chat.mentionsCount = community.chats[i].mentionsCount
community.chats[i] = chat
return true
@ -73,13 +72,6 @@ QtObject:
self.importingCommunityState = state
self.importingCommunityStateChanged(state.int, communityImportingProcessId)
proc calculateUnreadMessages*(self: CommunitiesView, community: var Community) =
var unreadTotal = 0
for chatItem in community.chats:
unreadTotal = unreadTotal + chatItem.unviewedMessagesCount
if unreadTotal != community.unviewedMessagesCount:
community.unviewedMessagesCount = unreadTotal
proc updateMemberVisibility*(self: CommunitiesView, statusUpdate: StatusUpdate) =
self.joinedCommunityList.updateMemberVisibility(statusUpdate)
self.activeCommunity.setCommunityItem(self.joinedCommunityList.getCommunityById(self.activeCommunity.communityItem.id))
@ -109,7 +101,6 @@ QtObject:
if (not found):
community.chats.add(newChat)
self.calculateUnreadMessages(community)
self.joinedCommunityList.replaceCommunity(community)
if (self.activeCommunity.active and self.activeCommunity.communityItem.id == community.id):
self.activeCommunity.changeChats(community.chats)
@ -164,6 +155,8 @@ QtObject:
var communities = self.status.chat.getJoinedComunities()
communities = self.populateChats(communities)
self.joinedCommunityList.setNewData(communities)
for c in communities:
self.addMembershipRequests(self.pendingRequestsToJoinForCommunity(c.id))
self.joinedCommunityList.fetched = true
# Also fetch requests
@ -200,7 +193,6 @@ QtObject:
proc setActiveCommunity*(self: CommunitiesView, communityId: string) {.slot.} =
if(communityId == ""): return
self.addMembershipRequests(self.pendingRequestsToJoinForCommunity(communityId))
self.activeCommunity.setCommunityItem(self.joinedCommunityList.getCommunityById(communityId))
self.activeCommunity.setActive(true)
self.activeCommunityChanged()
@ -219,7 +211,8 @@ QtObject:
if (not self.userCanJoin(communityId) or self.isUserMemberOfCommunity(communityId)):
return
self.status.chat.joinCommunity(communityId)
self.joinedCommunityList.addCommunityItemToList(self.communityList.getCommunityById(communityId))
var community = self.communityList.getCommunityById(communityId)
self.joinedCommunityList.addCommunityItemToList(community)
if (setActive):
self.setActiveCommunity(communityId)
except Exception as e:
@ -284,7 +277,7 @@ QtObject:
result = ""
try:
var image = image_utils.formatImagePath(imagePath)
let community = self.status.chat.createCommunity(name, description, access, ensOnly, color, image, aX, aY, bX, bY)
var community = self.status.chat.createCommunity(name, description, access, ensOnly, color, image, aX, aY, bX, bY)
if (community.id == ""):
return "Community was not created. Please try again later"
@ -527,7 +520,7 @@ QtObject:
of ActivityCenterNotificationType.NewPrivateGroupChat:
debug "Clear all private group chat notifications"
of ActivityCenterNotificationType.Mention:
self.activeCommunity.chats.clearAllMentionsFromAllChannels()
self.activeCommunity.clearAllMentions()
for c in self.joinedCommunityList.communities:
# We don't need to update channels from the currently active community.
@ -549,7 +542,8 @@ QtObject:
debug "Clear private group chat notification"
of ActivityCenterNotificationType.Mention:
if (markAsReadProps.communityId == self.activeCommunity.communityItem.id):
self.activeCommunity.chats.decrementMentions(markAsReadProps.channelId)
self.activeCommunity.decrementMentions(markAsReadProps.channelId)
self.joinedCommunityList.updateMentions(markAsReadProps.communityId)
else:
for c in self.joinedCommunityList.communities:
# We don't need to update channels from the currently active community.
@ -560,21 +554,3 @@ QtObject:
debug "Clear reply notification"
else:
debug "Unknown notification"
proc updateNotifications*(self: CommunitiesView, notifications: seq[ActivityCenterNotification]) =
for n in notifications:
if (not n.read):
case n.notificationType:
of ActivityCenterNotificationType.NewOneToOne:
debug "Update one to one notification"
of ActivityCenterNotificationType.NewPrivateGroupChat:
debug "Update private group chat notification"
of ActivityCenterNotificationType.Mention:
let incremented = self.activeCommunity.chats.incrementMentions(n.chatId)
if (not incremented):
self.joinedCommunityList.incrementMentions(n.chatId)
of ActivityCenterNotificationType.Reply:
debug "Update reply notification"
else:
debug "Unknown notification"

View File

@ -249,3 +249,14 @@ QtObject:
categoryItemView.setCategoryItem(category)
self.categoryItemViews[id] = categoryItemView
return categoryItemView
proc clearAllMentions*(self: CommunityItemView) =
self.chats.clearAllMentionsFromAllChannels()
self.communityItem.unviewedMentionsCount = 0
self.chatsChanged()
proc decrementMentions*(self: CommunityItemView, channelId: string) =
self.chats.decrementMentions(channelId)
self.communityItem.unviewedMentionsCount -= 1
self.chatsChanged()

View File

@ -10,23 +10,25 @@ import # status-desktop libs
type
CommunityRoles {.pure.} = enum
Id = UserRole + 1,
Name = UserRole + 2
Description = UserRole + 3
Access = UserRole + 4
Admin = UserRole + 5
Joined = UserRole + 6
Verified = UserRole + 7
NumMembers = UserRole + 8
ThumbnailImage = UserRole + 9
LargeImage = UserRole + 10
EnsOnly = UserRole + 11
CanRequestAccess = UserRole + 12
CanManageUsers = UserRole + 13
CanJoin = UserRole + 14
IsMember = UserRole + 15
UnviewedMessagesCount = UserRole + 16
CommunityColor = UserRole + 17
Muted = UserRole + 18
Name
Description
Access
Admin
Joined
Verified
NumMembers
ThumbnailImage
LargeImage
EnsOnly
CanRequestAccess
CanManageUsers
CanJoin
IsMember
UnviewedMessagesCount
UnviewedMentionsCount
RequestsCount
CommunityColor
Muted
QtObject:
type
@ -75,6 +77,8 @@ QtObject:
of "isMember": result = $community.isMember
of "nbMembers": result = $community.members.len
of "unviewedMessagesCount": result = $community.unviewedMessagesCount
of "unviewedMentionsCount": result = $community.unviewedMentionsCount
of "requestsCount": result = $community.membershipRequests.len
of "thumbnailImage":
if (not community.communityImage.isNil):
result = community.communityImage.thumbnail
@ -111,6 +115,8 @@ QtObject:
of CommunityRoles.IsMember: result = newQVariant(communityItem.isMember.bool)
of CommunityRoles.NumMembers: result = newQVariant(communityItem.members.len)
of CommunityRoles.UnviewedMessagesCount: result = newQVariant(communityItem.unviewedMessagesCount)
of CommunityRoles.UnviewedMentionsCount: result = newQVariant(communityItem.unviewedMentionsCount)
of CommunityRoles.RequestsCount: result = newQVariant(communityItem.membershipRequests.len)
of CommunityRoles.ThumbnailImage:
if (not communityItem.communityImage.isNil):
result = newQVariant(communityItem.communityImage.thumbnail)
@ -145,17 +151,26 @@ QtObject:
CommunityRoles.Muted.int: "muted",
CommunityRoles.NumMembers.int: "nbMembers",
CommunityRoles.UnviewedMessagesCount.int: "unviewedMessagesCount",
CommunityRoles.UnviewedMentionsCount.int: "unviewedMentionsCount",
CommunityRoles.RequestsCount.int: "requestsCount",
CommunityRoles.ThumbnailImage.int:"thumbnailImage",
CommunityRoles.LargeImage.int:"largeImage",
CommunityRoles.CommunityColor.int:"communityColor"
}.toTable
proc setNewData*(self: CommunityList, communityList: seq[Community]) =
proc setNewData*(self: CommunityList, communityList: var seq[Community]) =
for c in communityList.mitems:
c.recalculateUnviewedMessages()
c.recalculateMentions()
self.beginResetModel()
self.communities = communityList
self.endResetModel()
proc addCommunityItemToList*(self: CommunityList, community: Community) =
proc addCommunityItemToList*(self: CommunityList, community: var Community) =
community.recalculateUnviewedMessages()
community.recalculateMentions()
self.beginInsertRows(newQModelIndex(), self.communities.len, self.communities.len)
self.communities.add(community)
self.endInsertRows()
@ -218,8 +233,16 @@ QtObject:
let bottomRight = self.createIndex(index, index, nil)
var oldCommunity = self.communities[index]
community.memberStatus = oldCommunity.memberStatus
community.recalculateUnviewedMessages()
community.recalculateMentions()
self.communities[index] = community
self.dataChanged(topLeft, bottomRight, @[CommunityRoles.Name.int, CommunityRoles.Description.int, CommunityRoles.UnviewedMessagesCount.int, CommunityRoles.ThumbnailImage.int])
self.dataChanged(topLeft, bottomRight, @[CommunityRoles.Name.int,
CommunityRoles.Description.int,
CommunityRoles.UnviewedMessagesCount.int,
CommunityRoles.UnviewedMentionsCount.int,
CommunityRoles.ThumbnailImage.int])
proc removeCategoryFromCommunity*(self: CommunityList, communityId: string, categoryId:string) =
var community = self.getCommunityById(communityId)
@ -238,11 +261,14 @@ QtObject:
# Clear unread messages for each channel in community.
for c in self.communities[idx].chats:
c.unviewedMessagesCount = 0
c.unviewedMentionsCount = 0
let index = self.createIndex(idx, 0, nil)
self.communities[idx].unviewedMessagesCount = 0
self.communities[idx].unviewedMentionsCount = 0
self.dataChanged(index, index, @[CommunityRoles.UnviewedMessagesCount.int])
self.dataChanged(index, index, @[CommunityRoles.UnviewedMessagesCount.int,
CommunityRoles.UnviewedMentionsCount.int])
proc clearAllMentions*(self: CommunityList, communityId: string, clearFromChannels : bool) =
let idx = self.communities.findIndexById(communityId)
@ -254,6 +280,13 @@ QtObject:
# as mentins are not exposed to qml using roles from this model.
for c in self.communities[idx].chats:
c.mentionsCount = 0
c.unviewedMentionsCount = 0
self.communities[idx].unviewedMentionsCount = 0
let index = self.createIndex(idx, 0, nil)
self.dataChanged(index, index, @[CommunityRoles.UnviewedMentionsCount.int,
CommunityRoles.ThumbnailImage.int])
# If we decide in one moment to expose mention role we should do that here.
@ -267,9 +300,17 @@ QtObject:
return
self.communities[comIndex].chats[chatIndex].mentionsCount.dec
self.communities[comIndex].chats[chatIndex].unviewedMentionsCount.dec
proc incrementMentions*(self: CommunityList, channelId : string) =
for c in self.communities:
let chatIndex = c.chats.findIndexById(channelId)
if (chatIndex != -1):
c.chats[chatIndex].mentionsCount.inc
self.communities[comIndex].unviewedMentionsCount.dec
let index = self.createIndex(comIndex, 0, nil)
self.dataChanged(index, index, @[CommunityRoles.UnviewedMentionsCount.int])
proc updateMentions*(self: CommunityList, communityId : string) =
let comIndex = self.communities.findIndexById(communityId)
if (comIndex == -1):
return
self.communities[comIndex].recalculateMentions()
let index = self.createIndex(comIndex, 0, nil)
self.dataChanged(index, index, @[CommunityRoles.UnviewedMentionsCount.int])

View File

@ -80,10 +80,11 @@ type Chat* = ref object
lastClockValue*: int64 # indicates the last clock value to be used when sending messages
deletedAtClockValue*: int64 # indicates the clock value at time of deletion, messages with lower clock value of this should be discarded
unviewedMessagesCount*: int
unviewedMentionsCount*: int
lastMessage*: Message
members*: seq[ChatMember]
membershipUpdateEvents*: seq[ChatMembershipEvent]
mentionsCount*: int
mentionsCount*: int # Using this is not a good approach, we should instead use unviewedMentionsCount and refer to it always.
muted*: bool
canPost*: bool
ensName*: string
@ -128,6 +129,7 @@ type Community* = object
members*: seq[string]
access*: int
unviewedMessagesCount*: int
unviewedMentionsCount*: int
admin*: bool
joined*: bool
verified*: bool
@ -235,3 +237,18 @@ proc isAdmin*(self: Chat, pubKey: string): bool =
if member.id == pubKey:
return member.joined and member.admin
return false
proc recalculateUnviewedMessages*(community: var Community) =
var total = 0
for chat in community.chats:
total += chat.unviewedMessagesCount
community.unviewedMessagesCount = total
proc recalculateMentions*(community: var Community) =
echo "(recalculateMentions) chatId: ", community.id, " before: ", community.unviewedMentionsCount
var total = 0
for chat in community.chats:
total += chat.unviewedMentionsCount
community.unviewedMentionsCount = total

View File

@ -174,6 +174,7 @@ proc toChat*(jsonChat: JsonNode): Chat =
lastClockValue: jsonChat{"lastClockValue"}.getBiggestInt,
deletedAtClockValue: jsonChat{"deletedAtClockValue"}.getBiggestInt,
unviewedMessagesCount: jsonChat{"unviewedMessagesCount"}.getInt,
unviewedMentionsCount: jsonChat{"unviewedMentionsCount"}.getInt,
mentionsCount: 0,
muted: false,
ensName: "",

View File

@ -171,7 +171,8 @@ StatusAppLayout {
icon.color: model.communityColor
icon.source: model.thumbnailImage
badge.visible: !checked && model.unviewedMessagesCount > 0
badge.value: model.unviewedMentionsCount + model.requestsCount
badge.visible: badge.value > 0 || (!checked && model.unviewedMessagesCount > 0)
badge.border.color: hovered ? Theme.palette.statusBadge.hoverBorderColor : Theme.palette.statusBadge.borderColor
badge.border.width: 2
badge.anchors.rightMargin: 4