fix(@desktop/community): Updates to a joined community channel doesnr reflect on the UI

fixes #4505
This commit is contained in:
Khushboo Mehta 2022-01-20 23:08:08 +01:00 committed by Sale Djenic
parent a2fd27057c
commit 59ec288e7a
13 changed files with 200 additions and 26 deletions

View File

@ -69,6 +69,9 @@ method color*(self: BaseItem): string {.inline base.} =
method description*(self: BaseItem): string {.inline base.} = method description*(self: BaseItem): string {.inline base.} =
self.description self.description
method `description=`*(self: var BaseItem, value: string) {.inline base.} =
self.description = value
method type*(self: BaseItem): int {.inline base.} = method type*(self: BaseItem): int {.inline base.} =
self.`type` self.`type`

View File

@ -107,6 +107,12 @@ method init*(self: Controller) =
# remove from pinned messages model # remove from pinned messages model
self.delegate.onUnpinMessage(args.messageId) self.delegate.onUnpinMessage(args.messageId)
self.events.on(SIGNAL_COMMUNITY_CHANNEL_EDITED) do(e:Args):
let args = CommunityChatArgs(e)
if(args.communityId != self.sectionId or self.chatId != args.chat.id or not self.belongsToCommunity):
return
self.delegate.onChatEdited(args.chat)
method getMyChatId*(self: Controller): string = method getMyChatId*(self: Controller): string =
return self.chatId return self.chatId

View File

@ -281,3 +281,8 @@ method onMessageEdited*(self: Module, message: MessageDto) =
let renderedMessageText = self.controller.getRenderedText(message.parsedText) let renderedMessageText = self.controller.getRenderedText(message.parsedText)
self.view.model().updateEditedMsg(message.id, renderedMessageText, message.containsContactMentions()) self.view.model().updateEditedMsg(message.id, renderedMessageText, message.containsContactMentions())
method updateChatIdentifier*(self: Module) =
# Delete the old ChatIdentifier message first
self.view.model().removeItem(CHAT_IDENTIFIER_MESSAGE_ID)
# Add new loaded messages
self.view.model().appendItem(self.createChatIdentifierItem())

View File

@ -30,3 +30,6 @@ method updateContactDetails*(self: AccessInterface, contactId: string) {.base.}
method onMessageEdited*(self: AccessInterface, message: MessageDto) {.base.} = method onMessageEdited*(self: AccessInterface, message: MessageDto) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method updateChatIdentifier*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -271,3 +271,7 @@ method onContactDetailsUpdated*(self: Module, contactId: string) =
method onNotificationsUpdated*(self: Module, hasUnreadMessages: bool, notificationCount: int) = method onNotificationsUpdated*(self: Module, hasUnreadMessages: bool, notificationCount: int) =
self.view.updateChatDetailsNotifications(hasUnreadMessages, notificationCount) self.view.updateChatDetailsNotifications(hasUnreadMessages, notificationCount)
method onChatEdited*(self: Module, chatDto: ChatDto) =
self.view.updateChatDetails(chatDto.name, chatDto.description)
self.messagesModule.updateChatIdentifier()

View File

@ -1,4 +1,5 @@
import ../../../../../../app_service/service/message/dto/pinned_message import ../../../../../../app_service/service/message/dto/pinned_message
import ../../../../../../app_service/service/chat/dto/chat
method newPinnedMessagesLoaded*(self: AccessInterface, pinnedMessages: seq[PinnedMessageDto]) {.base.} = method newPinnedMessagesLoaded*(self: AccessInterface, pinnedMessages: seq[PinnedMessageDto]) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
@ -23,3 +24,6 @@ method onReactionRemoved*(self: AccessInterface, messageId: string, emojiId: int
method onContactDetailsUpdated*(self: AccessInterface, contactId: string) {.base.} = method onContactDetailsUpdated*(self: AccessInterface, contactId: string) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method onChatEdited*(self: AccessInterface, chatDto: ChatDto) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -113,3 +113,8 @@ QtObject:
proc amIChatAdmin*(self: View): bool {.slot.} = proc amIChatAdmin*(self: View): bool {.slot.} =
return self.delegate.amIChatAdmin() return self.delegate.amIChatAdmin()
proc updateChatDetails*(self: View, name, description: string) =
self.chatDetails.setName(name)
self.chatDetails.setDescription(description)
self.chatDetailsChanged()

View File

@ -89,24 +89,9 @@ method init*(self: Controller) =
self.events.on(SIGNAL_COMMUNITY_CHANNEL_CREATED) do(e:Args): self.events.on(SIGNAL_COMMUNITY_CHANNEL_CREATED) do(e:Args):
let args = CommunityChatArgs(e) let args = CommunityChatArgs(e)
if (args.communityId == self.sectionId): if (args.communityId == self.sectionId):
let chatDto = ChatDto( self.chatService.updateOrAddChat(args.chat)
id: args.chat.id,
name: args.chat.name,
chatType: ChatType.CommunityChat,
color: args.chat.color,
emoji: args.chat.emoji,
description: args.chat.description,
# permissions: args.chat.permissions, # TODO implement chat permissions
canPost: args.chat.canPost,
position: args.chat.position,
categoryId: args.chat.categoryId,
communityId: args.communityId
)
self.chatService.updateOrAddChat(chatDto)
self.delegate.addNewChat( self.delegate.addNewChat(
chatDto, args.chat,
true, true,
self.events, self.events,
self.settingsService, self.settingsService,
@ -122,6 +107,17 @@ method init*(self: Controller) =
if (args.communityId == self.sectionId): if (args.communityId == self.sectionId):
self.delegate.onCommunityChannelDeleted(args.chatId) self.delegate.onCommunityChannelDeleted(args.chatId)
self.events.on(SIGNAL_COMMUNITY_CHANNEL_EDITED) do(e:Args):
let args = CommunityChatArgs(e)
if (args.communityId == self.sectionId):
self.chatService.updateOrAddChat(args.chat)
self.delegate.onCommunityChannelEdited(args.chat)
self.events.on(SIGNAL_COMMUNITY_CHANNEL_REORDERED) do(e:Args):
let args = CommunityChatOrderArgs(e)
if (args.communityId == self.sectionId):
self.delegate.reorderChannels(args.chatId, args.categoryId, args.position)
self.events.on(SIGNAL_CONTACT_NICKNAME_CHANGED) do(e: Args): self.events.on(SIGNAL_CONTACT_NICKNAME_CHANGED) do(e: Args):
var args = ContactArgs(e) var args = ContactArgs(e)
self.delegate.onContactDetailsUpdated(args.contactId) self.delegate.onContactDetailsUpdated(args.contactId)

View File

@ -1,4 +1,4 @@
import NimQml, Tables, strutils, strformat, json import NimQml, Tables, strutils, strformat, json, algorithm
from ../../../../app_service/service/chat/dto/chat import ChatType from ../../../../app_service/service/chat/dto/chat import ChatType
import item, sub_item, base_item, sub_model import item, sub_item, base_item, sub_model
@ -44,6 +44,11 @@ QtObject:
[{i}]:({$self.items[i]}) [{i}]:({$self.items[i]})
""" """
proc sortChats(x, y: Item): int =
if x.position < y.position: -1
elif x.position == y.position: 0
else: 1
proc countChanged(self: Model) {.signal.} proc countChanged(self: Model) {.signal.}
proc getCount*(self: Model): int {.slot.} = proc getCount*(self: Model): int {.slot.} =
@ -227,6 +232,16 @@ QtObject:
self.dataChanged(index, index, @[ModelRole.Name.int]) self.dataChanged(index, index, @[ModelRole.Name.int])
return return
proc updateItemDetails*(self: Model, id, name, description: string) =
## This updates only first level items, it doesn't update subitems, since subitems cannot have custom icon.
for i in 0 ..< self.items.len:
if(self.items[i].id == id):
self.items[i].BaseItem.name = name
self.items[i].BaseItem.description = description
let index = self.createIndex(i, 0, nil)
self.dataChanged(index, index, @[ModelRole.Name.int, ModelRole.Description.int])
return
proc updateNotificationsForItemOrSubItemById*(self: Model, id: string, hasUnreadMessages: bool, proc updateNotificationsForItemOrSubItemById*(self: Model, id: string, hasUnreadMessages: bool,
notificationsCount: int) = notificationsCount: int) =
for i in 0 ..< self.items.len: for i in 0 ..< self.items.len:
@ -251,3 +266,20 @@ QtObject:
result.hasNotifications = result.hasNotifications or self.items[i].BaseItem.hasUnreadMessages result.hasNotifications = result.hasNotifications or self.items[i].BaseItem.hasUnreadMessages
result.notificationsCount = result.notificationsCount + self.items[i].BaseItem.notificationsCount result.notificationsCount = result.notificationsCount + self.items[i].BaseItem.notificationsCount
proc reorder*(self: Model, chatId, categoryId: string, position: int) =
let index = self.getItemIdxById(chatId)
if(index == -1 or position == index):
return
let idx = self.createIndex(index, 0, nil)
self.items[index].BaseItem.position = position
self.dataChanged(idx, idx, @[ModelRole.Position.int])
let tempItem = self.items[position]
self.beginResetModel()
self.items[position] = self.items[index]
self.items[index] = tempItem
self.endResetModel()

View File

@ -379,6 +379,11 @@ method onCommunityChannelDeleted*(self: Module, chatId: string) =
let subItem = item.subItems.getItemAtIndex(0) let subItem = item.subItems.getItemAtIndex(0)
self.setActiveItemSubItem(item.id, subItem.id) self.setActiveItemSubItem(item.id, subItem.id)
method onCommunityChannelEdited*(self: Module, chat: ChatDto) =
if(not self.chatContentModules.contains(chat.id)):
return
self.view.chatsModel().updateItemDetails(chat.id, chat.name, chat.description)
method createOneToOneChat*(self: Module, chatId: string, ensName: string) = method createOneToOneChat*(self: Module, chatId: string, ensName: string) =
if(self.controller.isCommunity()): if(self.controller.isCommunity()):
debug "creating an one to one chat is not allowed for community, most likely it's an error in qml" debug "creating an one to one chat is not allowed for community, most likely it's an error in qml"
@ -503,3 +508,6 @@ method joinGroupChatFromInvitation*(self: Module, groupName: string, chatId: str
method onChatRenamed*(self: Module, chatId: string, newName: string) = method onChatRenamed*(self: Module, chatId: string, newName: string) =
self.view.chatsModel().renameItem(chatId, newName) self.view.chatsModel().renameItem(chatId, newName)
method reorderChannels*(self: Module, chatId, categoryId: string, position: int) =
self.view.chatsModel().reorder(chatId, categoryId, position)

View File

@ -37,3 +37,9 @@ method onCommunityChannelDeleted*(self: AccessInterface, chatId: string) {.base.
method onChatRenamed*(self: AccessInterface, chatId: string, newName: string) {.base.} = method onChatRenamed*(self: AccessInterface, chatId: string, newName: string) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method onCommunityChannelEdited*(self: AccessInterface, chat: ChatDto) {.base.} =
raise newException(ValueError, "No implementation available")
method reorderChannels*(self: AccessInterface, chatId, categoryId: string, position: int) {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -23,7 +23,7 @@ type
CommunityChatArgs* = ref object of Args CommunityChatArgs* = ref object of Args
communityId*: string communityId*: string
chat*: Chat chat*: ChatDto
CommunityIdArgs* = ref object of Args CommunityIdArgs* = ref object of Args
communityId*: string communityId*: string
@ -86,6 +86,84 @@ QtObject:
result.allCommunities = initTable[string, CommunityDto]() result.allCommunities = initTable[string, CommunityDto]()
result.myCommunityRequests = @[] result.myCommunityRequests = @[]
proc mapChatToChatDto(chat: Chat): ChatDto =
result = ChatDto()
result.id = chat.id
result.name = chat.name
result.color = chat.color
result.emoji = chat.emoji
result.description = chat.description
result.canPost = chat.canPost
result.position = chat.position
result.categoryId = chat.categoryId
proc findChatById(id: string, chats: seq[ChatDto]): ChatDto =
for chat in chats:
if(chat.id == id):
return chat
proc findIndexById(id: string, chats: seq[Chat]): int =
for chat in chats:
if(chat.id == id):
return 0
return -1
proc handleCommunityUpdates(self: Service, communities: seq[CommunityDto], updatedChats: seq[ChatDto]) =
let community = communities[0]
var sortingOrderChanged = false
if(not self.joinedCommunities.hasKey(community.id)):
error "error: community doesn't exist"
return
let prev_community = self.joinedCommunities[community.id]
# channel was added
if(community.chats.len > prev_community.chats.len):
for chat in community.chats:
if findIndexById(chat.id, prev_community.chats) == -1:
# update missing params
let updated_chat = findChatById(community.id&chat.id, updatedChats)
var chat_to_be_added = chat
chat_to_be_added.id = community.id&chat.id
chat_to_be_added.color = updated_chat.color
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_CREATED, CommunityChatArgs(communityId: community.id, chat: mapChatToChatDto(chat_to_be_added)))
# channel was removed
elif(community.chats.len < prev_community.chats.len):
for prv_chat in prev_community.chats:
if findIndexById(prv_chat.id, community.chats) == -1:
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_DELETED, CommunityChatIdArgs(communityId: community.id, chatId: community.id&prv_chat.id))
# some property has changed
else:
for chat in community.chats:
# id is present
if findIndexById(chat.id, prev_community.chats) == -1:
error "error: chat not present"
return
# but something is different
for prev_chat in prev_community.chats:
# Category changes not handled yet
#if(chat.id == prev_chat.id and chat.categoryId != prev_chat.categoryId):
# Handle position changes
if(chat.id == prev_chat.id and chat.position != prev_chat.position):
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_REORDERED, CommunityChatOrderArgs(communityId: community.id, chatId: community.id&chat.id, categoryId: chat.categoryId, position: chat.position))
# Handle name/description changes
if(chat.id == prev_chat.id and (chat.name != prev_chat.name or chat.description != prev_chat.description)):
# update missing params
let updated_chat = findChatById(community.id&chat.id, updatedChats)
var chat_to_be_edited = chat
chat_to_be_edited.id = community.id&chat.id
if(updated_chat.color != ""):
chat_to_be_edited.color = updated_chat.color
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_EDITED, CommunityChatArgs(communityId: community.id, chat: mapChatToChatDto(chat_to_be_edited)))
self.joinedCommunities[community.id].chats = community.chats
proc init*(self: Service) = proc init*(self: Service) =
try: try:
let joinedCommunities = self.loadJoinedComunities() let joinedCommunities = self.loadJoinedComunities()
@ -108,6 +186,11 @@ QtObject:
# Handling community updates # Handling community updates
if (receivedData.communities.len > 0): if (receivedData.communities.len > 0):
# Channel added removed is notified in the chats param
if (receivedData.chats.len > 0):
self.handleCommunityUpdates(receivedData.communities, receivedData.chats)
self.events.emit(SIGNAL_COMMUNITIES_UPDATE, CommunitiesArgs(communities: receivedData.communities)) self.events.emit(SIGNAL_COMMUNITIES_UPDATE, CommunitiesArgs(communities: receivedData.communities))
proc loadAllCommunities(self: Service): seq[CommunityDto] = proc loadAllCommunities(self: Service): seq[CommunityDto] =
@ -341,9 +424,13 @@ QtObject:
if response.result != nil and response.result.kind != JNull: if response.result != nil and response.result.kind != JNull:
let chat = response.result["chats"][0].toChat() let chat = response.result["chats"][0].toChat()
# update the joined communities
self.joinedCommunities[communityId].chats.add(chat)
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_CREATED, CommunityChatArgs( self.events.emit(SIGNAL_COMMUNITY_CHANNEL_CREATED, CommunityChatArgs(
communityId: communityId, communityId: communityId,
chat: chat) chat: mapChatToChatDto(chat))
) )
except Exception as e: except Exception as e:
error "Error creating community channel", msg = e.msg, communityId, name, description error "Error creating community channel", msg = e.msg, communityId, name, description
@ -371,7 +458,13 @@ QtObject:
if response.result != nil and response.result.kind != JNull: if response.result != nil and response.result.kind != JNull:
let chat = response.result["chats"][0].toChat() let chat = response.result["chats"][0].toChat()
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_EDITED, CommunityChatArgs(chat: chat))
# update the joined communities
let idx = self.joinedCommunities[communityId].chats.find(chat)
if(idx != -1):
self.joinedCommunities[communityId].chats[idx] = chat
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_EDITED, CommunityChatArgs(chat: mapChatToChatDto(chat)))
except Exception as e: except Exception as e:
error "Error editing community channel", msg = e.msg, communityId, channelId error "Error editing community channel", msg = e.msg, communityId, channelId
@ -411,6 +504,15 @@ QtObject:
let error = Json.decode($response.error, RpcError) let error = Json.decode($response.error, RpcError)
raise newException(RpcException, "Error deleting community chat: " & error.message) raise newException(RpcException, "Error deleting community chat: " & error.message)
if response.result == nil or response.result.kind == JNull:
error "response is invalid"
return
let community = response.result["communities"][0].toCommunityDto()
# update the joined communities
self.joinedCommunities[community.id].chats = community.chats
self.events.emit(SIGNAL_COMMUNITY_CHANNEL_DELETED, self.events.emit(SIGNAL_COMMUNITY_CHANNEL_DELETED,
CommunityChatIdArgs( CommunityChatIdArgs(
communityId: communityId, communityId: communityId,