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:
parent
2df6def7f9
commit
a530f65ada
|
@ -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:
|
||||
|
|
|
@ -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])
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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])
|
|
@ -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
|
||||
|
|
|
@ -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: "",
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue