fix(messenger)_: make sure chats have an unread count of 0 for channels you can't view (#5062)

Fixes https://github.com/status-im/status-desktop/issues/14421

The problem is that you can receive messages to  a channel, then later, before marking them as read, a permission is added to them, so you no longer have access.
Then, you can't even mark it as read if it's hidden.
Here, I fix it by setting the unread count on Init at 0 if the user doesn't have view access to it. And I make sure we update the counts when we are removed from a channel
This commit is contained in:
Jonathan Rainville 2024-05-15 15:57:12 -04:00 committed by GitHub
parent bf56cb7ee2
commit 5ca1cb0a0f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 5 deletions

View File

@ -183,6 +183,7 @@ func evaluateCommunityChangesByDescription(origin, modified *protobuf.CommunityD
if _, ok := origin.Chats[chatID]; !ok { if _, ok := origin.Chats[chatID]; !ok {
changes.ChatsAdded[chatID] = chat changes.ChatsAdded[chatID] = chat
} else { } else {
// Check for members added // Check for members added
for pk, member := range modified.Chats[chatID].Members { for pk, member := range modified.Chats[chatID].Members {
if _, ok := origin.Chats[chatID].Members[pk]; !ok { if _, ok := origin.Chats[chatID].Members[pk]; !ok {
@ -192,7 +193,6 @@ func evaluateCommunityChangesByDescription(origin, modified *protobuf.CommunityD
MembersRemoved: make(map[string]*protobuf.CommunityMember), MembersRemoved: make(map[string]*protobuf.CommunityMember),
} }
} }
changes.ChatsModified[chatID].MembersAdded[pk] = member changes.ChatsModified[chatID].MembersAdded[pk] = member
} }
} }
@ -206,7 +206,6 @@ func evaluateCommunityChangesByDescription(origin, modified *protobuf.CommunityD
MembersRemoved: make(map[string]*protobuf.CommunityMember), MembersRemoved: make(map[string]*protobuf.CommunityMember),
} }
} }
changes.ChatsModified[chatID].MembersRemoved[pk] = member changes.ChatsModified[chatID].MembersRemoved[pk] = member
} }
} }

View File

@ -1758,9 +1758,8 @@ func (m *Messenger) Init() error {
continue continue
} }
m.allChats.Store(chat.ID, chat)
if !chat.Active || chat.Timeline() { if !chat.Active || chat.Timeline() {
m.allChats.Store(chat.ID, chat)
continue continue
} }
@ -1784,6 +1783,17 @@ func (m *Messenger) Init() error {
communityInfo[chat.CommunityID] = community communityInfo[chat.CommunityID] = community
} }
if chat.UnviewedMessagesCount > 0 || chat.UnviewedMentionsCount > 0 {
// Make sure the unread count is 0 for the channels the user cannot view
// It's possible that the users received messages to a channel before permissions were added
canView := community.CanView(&m.identity.PublicKey, chat.CommunityChatID())
if !canView {
chat.UnviewedMessagesCount = 0
chat.UnviewedMentionsCount = 0
}
}
filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: community.PubsubTopic()}) filtersToInit = append(filtersToInit, transport.FiltersToInitialize{ChatID: chat.ID, PubsubTopic: community.PubsubTopic()})
case ChatTypeOneToOne: case ChatTypeOneToOne:
pk, err := chat.PublicKey() pk, err := chat.PublicKey()
@ -1802,6 +1812,8 @@ func (m *Messenger) Init() error {
default: default:
return errors.New("invalid chat type") return errors.New("invalid chat type")
} }
m.allChats.Store(chat.ID, chat)
} }
// Timeline and profile chats are deprecated. // Timeline and profile chats are deprecated.

View File

@ -3173,7 +3173,7 @@ func (m *Messenger) handleCommunityResponse(state *ReceivedMessageState, communi
removedChatIDs := make([]string, 0) removedChatIDs := make([]string, 0)
for id := range communityResponse.Changes.ChatsRemoved { for id := range communityResponse.Changes.ChatsRemoved {
chatID := community.IDString() + id chatID := community.ChatID(id)
_, ok := state.AllChats.Load(chatID) _, ok := state.AllChats.Load(chatID)
if ok { if ok {
removedChatIDs = append(removedChatIDs, chatID) removedChatIDs = append(removedChatIDs, chatID)
@ -3185,6 +3185,24 @@ func (m *Messenger) handleCommunityResponse(state *ReceivedMessageState, communi
} }
} }
// Check if we have been removed from a chat (ie no longer have access)
for channelID, changes := range communityResponse.Changes.ChatsModified {
if _, ok := changes.MembersRemoved[common.PubkeyToHex(&m.identity.PublicKey)]; ok {
chatID := community.ChatID(channelID)
if chat, ok := state.AllChats.Load(chatID); ok {
// Reset the chat's message counts
chat.UnviewedMessagesCount = 0
chat.UnviewedMentionsCount = 0
err := m.saveChat(chat)
if err != nil {
return err
}
state.Response.AddChat(chat)
}
}
}
// Update relevant chats names and add new ones // Update relevant chats names and add new ones
// Currently removal is not supported // Currently removal is not supported
chats := CreateCommunityChats(community, state.Timesource) chats := CreateCommunityChats(community, state.Timesource)