refactor(@desktop/chat-communities): a list of users who reacted with an emoji updated

A list of users who reacted with an emoji now displays names instead of users'
public key
This commit is contained in:
Sale Djenic 2021-12-10 12:01:43 +01:00
parent 6c76974985
commit 6ae88cf1cc
7 changed files with 47 additions and 23 deletions

View File

@ -80,4 +80,8 @@ method pinUnpinMessage*(self: Controller, messageId: string, pin: bool) =
self.messageService.pinUnpinMessage(self.chatId, messageId, pin) self.messageService.pinUnpinMessage(self.chatId, messageId, pin)
method getContactById*(self: Controller, contactId: string): ContactsDto = method getContactById*(self: Controller, contactId: string): ContactsDto =
return self.contactService.getContactById(contactId) return self.contactService.getContactById(contactId)
method getContactNameAndImage*(self: Controller, contactId: string):
tuple[name: string, image: string, isIdenticon: bool] =
return self.contactService.getContactNameAndImage(contactId)

View File

@ -26,4 +26,8 @@ method pinUnpinMessage*(self: AccessInterface, messageId: string, pin: bool) {.b
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method getContactById*(self: AccessInterface, contactId: string): ContactsDto {.base.} = method getContactById*(self: AccessInterface, contactId: string): ContactsDto {.base.} =
raise newException(ValueError, "No implementation available")
method getContactNameAndImage*(self: AccessInterface, contactId: string):
tuple[name: string, image: string, isIdenticon: bool] {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")

View File

@ -70,7 +70,6 @@ method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: se
for r in reactions: for r in reactions:
if(r.messageId == m.id): if(r.messageId == m.id):
# m.`from` should be replaced by appropriate ens/alias when we have that part refactored
item.addReaction(r.emojiId, m.`from`, r.id) item.addReaction(r.emojiId, m.`from`, r.id)
for p in pinnedMessages: for p in pinnedMessages:
@ -80,10 +79,10 @@ method newMessagesLoaded*(self: Module, messages: seq[MessageDto], reactions: se
# messages are sorted from the most recent to the least recent one # messages are sorted from the most recent to the least recent one
viewItems = item & viewItems viewItems = item & viewItems
self.view.model.prependItems(viewItems) self.view.model().prependItems(viewItems)
method toggleReaction*(self: Module, messageId: string, emojiId: int) = method toggleReaction*(self: Module, messageId: string, emojiId: int) =
let item = self.view.model.getItemWithMessageId(messageId) let item = self.view.model().getItemWithMessageId(messageId)
let myName = singletonInstance.userProfile.getName() let myName = singletonInstance.userProfile.getName()
if(item.shouldAddReaction(emojiId, myName)): if(item.shouldAddReaction(emojiId, myName)):
self.controller.addReaction(messageId, emojiId) self.controller.addReaction(messageId, emojiId)
@ -93,13 +92,19 @@ method toggleReaction*(self: Module, messageId: string, emojiId: int) =
method onReactionAdded*(self: Module, messageId: string, emojiId: int, reactionId: string) = method onReactionAdded*(self: Module, messageId: string, emojiId: int, reactionId: string) =
let myName = singletonInstance.userProfile.getName() let myName = singletonInstance.userProfile.getName()
self.view.model.addReaction(messageId, emojiId, myName, reactionId) self.view.model().addReaction(messageId, emojiId, myName, reactionId)
method onReactionRemoved*(self: Module, messageId: string, reactionId: string) = method onReactionRemoved*(self: Module, messageId: string, reactionId: string) =
self.view.model.removeReaction(messageId, reactionId) self.view.model().removeReaction(messageId, reactionId)
method getNamesReactedWithEmojiIdForMessageId*(self: Module, messageId: string, emojiId: int): seq[string] =
let pubKeysForEmojiId = self.view.model().getPubKeysReactedWithEmojiIdForMessageId(messageId, emojiId)
for pk in pubKeysForEmojiId:
let (name, _, _) = self.controller.getContactNameAndImage(pk)
result.add(name)
method pinUnpinMessage*(self: Module, messageId: string, pin: bool) = method pinUnpinMessage*(self: Module, messageId: string, pin: bool) =
self.controller.pinUnpinMessage(messageId, pin) self.controller.pinUnpinMessage(messageId, pin)
method onPinUnpinMessage*(self: Module, messageId: string, pin: bool) = method onPinUnpinMessage*(self: Module, messageId: string, pin: bool) =
self.view.model.pinUnpinMessage(messageId, pin) self.view.model().pinUnpinMessage(messageId, pin)

View File

@ -5,4 +5,8 @@ method toggleReaction*(self: AccessInterface, messageId: string, emojiId: int) {
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method pinUnpinMessage*(self: AccessInterface, messageId: string, pin: bool) {.base.} = method pinUnpinMessage*(self: AccessInterface, messageId: string, pin: bool) {.base.} =
raise newException(ValueError, "No implementation available")
method getNamesReactedWithEmojiIdForMessageId*(self: AccessInterface, messageId: string, emojiId: int): seq[string]
{.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")

View File

@ -6,7 +6,7 @@ QtObject:
type type
View* = ref object of QObject View* = ref object of QObject
delegate: io_interface.AccessInterface delegate: io_interface.AccessInterface
model*: Model model: Model
modelVariant: QVariant modelVariant: QVariant
proc delete*(self: View) = proc delete*(self: View) =
@ -24,6 +24,9 @@ QtObject:
proc load*(self: View) = proc load*(self: View) =
self.delegate.viewDidLoad() self.delegate.viewDidLoad()
proc model*(self: View): Model =
return self.model
proc getModel(self: View): QVariant {.slot.} = proc getModel(self: View): QVariant {.slot.} =
return self.modelVariant return self.modelVariant
@ -33,8 +36,8 @@ QtObject:
proc toggleReaction*(self: View, messageId: string, emojiId: int) {.slot.} = proc toggleReaction*(self: View, messageId: string, emojiId: int) {.slot.} =
self.delegate.toggleReaction(messageId, emojiId) self.delegate.toggleReaction(messageId, emojiId)
proc getNamesForReaction*(self: View, messageId: string, emojiId: int): string {.slot.} = proc getNamesReactedWithEmojiIdForMessageId*(self: View, messageId: string, emojiId: int): string {.slot.} =
return $(%* self.model.getNamesForReaction(messageId, emojiId)) return $(%* self.delegate.getNamesReactedWithEmojiIdForMessageId(messageId, emojiId))
proc pinMessage*(self: View, messageId: string) {.slot.} = proc pinMessage*(self: View, messageId: string) {.slot.} =
self.delegate.pinUnpinMessage(messageId, true) self.delegate.pinUnpinMessage(messageId, true)

View File

@ -38,7 +38,7 @@ type
timestamp: int64 timestamp: int64
contentType: ContentType contentType: ContentType
messageType: int messageType: int
reactions: OrderedTable[int, seq[tuple[name: string, reactionId: string]]] # [emojiId, list of [names reacted with the emojiId, reaction id]] reactions: OrderedTable[int, seq[tuple[publicKey: string, reactionId: string]]] # [emojiId, list of [user publicKey reacted with the emojiId, reaction id]]
reactionIds: seq[string] reactionIds: seq[string]
pinned: bool pinned: bool
@ -113,38 +113,38 @@ proc pinned*(self: Item): bool {.inline.} =
proc `pinned=`*(self: Item, value: bool) {.inline.} = proc `pinned=`*(self: Item, value: bool) {.inline.} =
self.pinned = value self.pinned = value
proc shouldAddReaction*(self: Item, emojiId: int, name: string): bool = proc shouldAddReaction*(self: Item, emojiId: int, publicKey: string): bool =
for k, values in self.reactions: for k, values in self.reactions:
if(k != emojiId): if(k != emojiId):
continue continue
for t in values: for t in values:
if(t.name == name): if(t.publicKey == publicKey):
return false return false
return true return true
proc getReactionId*(self: Item, emojiId: int, name: string): string = proc getReactionId*(self: Item, emojiId: int, publicKey: string): string =
for k, values in self.reactions: for k, values in self.reactions:
if(k != emojiId): if(k != emojiId):
continue continue
for t in values: for t in values:
if(t.name == name): if(t.publicKey == publicKey):
return t.reactionId return t.reactionId
# we should never be here, since this is a controlled call # we should never be here, since this is a controlled call
return "" return ""
proc addReaction*(self: Item, emojiId: int, name: string, reactionId: string) = proc addReaction*(self: Item, emojiId: int, publicKey: string, reactionId: string) =
if(not self.reactions.contains(emojiId)): if(not self.reactions.contains(emojiId)):
self.reactions[emojiId] = @[] self.reactions[emojiId] = @[]
self.reactions[emojiId].add((name, reactionId)) self.reactions[emojiId].add((publicKey, reactionId))
proc removeReaction*(self: Item, reactionId: string) = proc removeReaction*(self: Item, reactionId: string) =
var key: int var key = -1
var index: int var index = -1
for k, values in self.reactions: for k, values in self.reactions:
var i = -1 var i = -1
for t in values: for t in values:
@ -152,17 +152,21 @@ proc removeReaction*(self: Item, reactionId: string) =
if(t.reactionId == reactionId): if(t.reactionId == reactionId):
key = k key = k
index = i index = i
break
if(key == -1 or index == -1):
return
self.reactions[key].del(index) self.reactions[key].del(index)
if(self.reactions[key].len == 0): if(self.reactions[key].len == 0):
self.reactions.del(key) self.reactions.del(key)
proc getNamesForReactions*(self: Item, emojiId: int): seq[string] = proc getPubKeysReactedWithEmojiId*(self: Item, emojiId: int): seq[string] =
if(not self.reactions.contains(emojiId)): if(not self.reactions.contains(emojiId)):
return return
for v in self.reactions[emojiId]: for v in self.reactions[emojiId]:
result.add(v.name) result.add(v.publicKey)
proc getCountsForReactions*(self: Item): seq[JsonNode] = proc getCountsForReactions*(self: Item): seq[JsonNode] =
for k, v in self.reactions: for k, v in self.reactions:

View File

@ -198,10 +198,10 @@ QtObject:
let index = self.createIndex(ind, 0, nil) let index = self.createIndex(ind, 0, nil)
self.dataChanged(index, index, @[ModelRole.CountsForReactions.int]) self.dataChanged(index, index, @[ModelRole.CountsForReactions.int])
proc getNamesForReaction*(self: Model, messageId: string, emojiId: int): seq[string] = proc getPubKeysReactedWithEmojiIdForMessageId*(self: Model, messageId: string, emojiId: int): seq[string] =
for i in 0 ..< self.items.len: for i in 0 ..< self.items.len:
if(self.items[i].id == messageId): if(self.items[i].id == messageId):
return self.items[i].getNamesForReactions(emojiId) return self.items[i].getPubKeysReactedWithEmojiId(emojiId)
proc pinUnpinMessage*(self: Model, messageId: string, pin: bool) = proc pinUnpinMessage*(self: Model, messageId: string, pin: bool) =
let ind = self.findIndexForMessageId(messageId) let ind = self.findIndexForMessageId(messageId)