fix(@desktop/profile): Contact requests should support a message

Close #5846
This commit is contained in:
mishkarogachev 2022-05-27 11:57:18 +03:00 committed by Iuri Matias
parent c754cf1aaa
commit 7a14cf5640
17 changed files with 117 additions and 81 deletions

View File

@ -277,11 +277,11 @@ proc getContacts*(self: Controller, group: ContactsGroup): seq[ContactsDto] =
proc getContactDetails*(self: Controller, id: string): ContactDetails =
return self.contactService.getContactDetails(id)
proc addContact*(self: Controller, publicKey: string) =
self.contactService.addContact(publicKey)
proc acceptContactRequest*(self: Controller, publicKey: string) =
self.contactService.acceptContactRequest(publicKey)
proc rejectContactRequest*(self: Controller, publicKey: string) =
self.contactService.rejectContactRequest(publicKey)
proc dismissContactRequest*(self: Controller, publicKey: string) =
self.contactService.dismissContactRequest(publicKey)
proc blockContact*(self: Controller, publicKey: string) =
self.contactService.blockContact(publicKey)

View File

@ -190,10 +190,10 @@ method acceptContactRequest*(self: AccessInterface, publicKey: string) {.base.}
method acceptAllContactRequests*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method rejectContactRequest*(self: AccessInterface, publicKey: string) {.base.} =
method dismissContactRequest*(self: AccessInterface, publicKey: string) {.base.} =
raise newException(ValueError, "No implementation available")
method rejectAllContactRequests*(self: AccessInterface) {.base.} =
method dismissAllContactRequests*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method blockContact*(self: AccessInterface, publicKey: string) {.base.} =

View File

@ -595,7 +595,7 @@ method getCurrentFleet*(self: Module): string =
return self.controller.getCurrentFleet()
method acceptContactRequest*(self: Module, publicKey: string) =
self.controller.addContact(publicKey)
self.controller.acceptContactRequest(publicKey)
method onContactAccepted*(self: Module, publicKey: string) =
self.view.contactRequestsModel().removeItemById(publicKey)
@ -606,17 +606,17 @@ method acceptAllContactRequests*(self: Module) =
for pk in pubKeys:
self.acceptContactRequest(pk)
method rejectContactRequest*(self: Module, publicKey: string) =
self.controller.rejectContactRequest(publicKey)
method dismissContactRequest*(self: Module, publicKey: string) =
self.controller.dismissContactRequest(publicKey)
method onContactRejected*(self: Module, publicKey: string) =
self.view.contactRequestsModel().removeItemById(publicKey)
self.updateParentBadgeNotifications()
method rejectAllContactRequests*(self: Module) =
method dismissAllContactRequests*(self: Module) =
let pubKeys = self.view.contactRequestsModel().getItemIds()
for pk in pubKeys:
self.rejectContactRequest(pk)
self.dismissContactRequest(pk)
method blockContact*(self: Module, publicKey: string) =
self.controller.blockContact(publicKey)

View File

@ -169,11 +169,11 @@ QtObject:
proc acceptAllContactRequests*(self: View) {.slot.} =
self.delegate.acceptAllContactRequests()
proc rejectContactRequest*(self: View, publicKey: string) {.slot.} =
self.delegate.rejectContactRequest(publicKey)
proc dismissContactRequest*(self: View, publicKey: string) {.slot.} =
self.delegate.dismissContactRequest(publicKey)
proc rejectAllContactRequests*(self: View) {.slot.} =
self.delegate.rejectAllContactRequests()
proc dismissAllContactRequests*(self: View) {.slot.} =
self.delegate.dismissAllContactRequests()
proc blockContact*(self: View, publicKey: string) {.slot.} =
self.delegate.blockContact(publicKey)

View File

@ -63,9 +63,6 @@ proc getContactNameAndImage*(self: Controller, contactId: string):
tuple[name: string, image: string] =
return self.contactsService.getContactNameAndImage(contactId)
proc addContact*(self: Controller, publicKey: string) =
self.contactsService.addContact(publicKey)
proc unblockContact*(self: Controller, publicKey: string) =
self.contactsService.unblockContact(publicKey)
@ -78,8 +75,14 @@ proc removeContact*(self: Controller, publicKey: string) =
proc changeContactNickname*(self: Controller, publicKey: string, nickname: string) =
self.contactsService.changeContactNickname(publicKey, nickname)
proc rejectContactRequest*(self: Controller, publicKey: string) =
self.contactsService.rejectContactRequest(publicKey)
proc sendContactRequest*(self: Controller, publicKey: string, message: string) =
self.contactsService.sendContactRequest(publicKey, message)
proc acceptContactRequest*(self: Controller, publicKey: string) =
self.contactsService.acceptContactRequest(publicKey)
proc dismissContactRequest*(self: Controller, publicKey: string) =
self.contactsService.dismissContactRequest(publicKey)
proc removeContactRequestRejection*(self: Controller, publicKey: string) =
self.contactsService.removeContactRequestRejection(publicKey)

View File

@ -22,19 +22,19 @@ method isLoaded*(self: AccessInterface): bool {.base.} =
method viewDidLoad*(self: AccessInterface) {.base.} =
raise newException(ValueError, "No implementation available")
method addContact*(self: AccessInterface, publicKey: string) {.base.} =
raise newException(ValueError, "No implementation available")
method switchToOrCreateOneToOneChat*(self: AccessInterface, publicKey: string) {.base.} =
raise newException(ValueError, "No implementation available")
method acceptContactRequests*(self: AccessInterface, publicKeysJSON: string) {.base.} =
method sendContactRequest*(self: AccessInterface, publicKey: string, message: string) {.base.} =
raise newException(ValueError, "No implementation available")
method rejectContactRequest*(self: AccessInterface, publicKey: string) {.base.} =
method acceptContactRequest*(self: AccessInterface, publicKey: string) {.base.} =
raise newException(ValueError, "No implementation available")
method rejectContactRequests*(self: AccessInterface, publicKeysJSON: string) {.base.} =
method dismissContactRequest*(self: AccessInterface, publicKey: string) {.base.} =
raise newException(ValueError, "No implementation available")
method dismissContactRequests*(self: AccessInterface, publicKeysJSON: string) {.base.} =
raise newException(ValueError, "No implementation available")
method changeContactNickname*(self: AccessInterface, publicKey: string, nickname: string) {.base.} =

View File

@ -83,15 +83,18 @@ method viewDidLoad*(self: Module) =
method getModuleAsVariant*(self: Module): QVariant =
return self.viewVariant
method addContact*(self: Module, publicKey: string) =
self.controller.addContact(publicKey)
method sendContactRequest*(self: Module, publicKey: string, message: string) =
self.controller.sendContactRequest(publicKey, message)
method acceptContactRequest*(self: Module, publicKey: string) =
self.controller.acceptContactRequest(publicKey)
method dismissContactRequest*(self: Module, publicKey: string) =
self.controller.dismissContactRequest(publicKey)
method switchToOrCreateOneToOneChat*(self: Module, publicKey: string) =
self.controller.switchToOrCreateOneToOneChat(publicKey)
method rejectContactRequest*(self: Module, publicKey: string) =
self.controller.rejectContactRequest(publicKey)
method unblockContact*(self: Module, publicKey: string) =
self.controller.unblockContact(publicKey)

View File

@ -123,14 +123,14 @@ QtObject:
proc isMyMutualContact*(self: View, publicKey: string): bool {.slot.} =
return self.myMutualContactsModel.isContactWithIdAdded(publicKey)
proc addContact*(self: View, publicKey: string) {.slot.} =
self.delegate.addContact(publicKey)
proc sendContactRequest*(self: View, publicKey: string, message: string) {.slot.} =
self.delegate.sendContactRequest(publicKey, message)
proc switchToOrCreateOneToOneChat*(self: View, publicKey: string) {.slot.} =
self.delegate.switchToOrCreateOneToOneChat(publicKey)
proc rejectContactRequest*(self: View, publicKey: string) {.slot.} =
self.delegate.rejectContactRequest(publicKey)
proc dismissContactRequest*(self: View, publicKey: string) {.slot.} =
self.delegate.dismissContactRequest(publicKey)
proc changeContactNickname*(self: View, publicKey: string, nickname: string) {.slot.} =
self.delegate.changeContactNickname(publicKey, nickname)

View File

@ -10,8 +10,9 @@ type ActivityCenterNotificationType* {.pure.}= enum
Unknown = 0,
NewOneToOne = 1,
NewPrivateGroupChat = 2,
Mention = 3
Reply = 4
Mention = 3,
Reply = 4,
ContactRequest = 5
type ActivityCenterNotificationDto* = ref object of RootObj
id*: string # ID is the id of the chat, for public chats it is the name e.g. status, for one-to-one is the hex encoded public key and for group chats is a random uuid appended with the hex encoded pk of the creator of the chat

View File

@ -202,7 +202,7 @@ QtObject:
not x.isBlocked())
elif (group == ContactsGroup.AllKnownContacts):
return contacts
proc fetchContact(self: Service, id: string): ContactsDto =
try:
let response = status_contacts.getContactByID(id)
@ -288,34 +288,53 @@ QtObject:
# we must keep local contacts updated
self.contacts[contact.id] = contact
proc addContact*(self: Service, chatKey: string) =
proc sendContactRequest*(self: Service, chatKey: string, message: string) =
try:
let publicKey = status_accounts.decompressPk(chatKey).result
let response = status_contacts.sendContactRequest(publicKey, message)
if(not response.error.isNil):
let msg = response.error.message
error "error sending contact request", msg
return
var contact = self.getContactById(publicKey)
if not contact.added:
contact.added = true
else:
contact.blocked = false
let response = status_contacts.addContact(contact.id, contact.name)
if(not response.error.isNil):
let msg = response.error.message
error "error adding contact ", msg
return
self.saveContact(contact)
self.events.emit(SIGNAL_CONTACT_ADDED, ContactArgs(contactId: contact.id))
except Exception as e:
error "an error occurred while edding contact ", msg=e.msg
error "an error occurred while sending contact request", msg=e.msg
proc rejectContactRequest*(self: Service, publicKey: string) =
var contact = self.getContactById(publicKey)
contact.removed = true
proc acceptContactRequest*(self: Service, publicKey: string) =
try:
# NOTE: publicKey used for accepting last request
let response = status_contacts.acceptLatestContactRequestForContact(publicKey)
if(not response.error.isNil):
let msg = response.error.message
error "error accepting contact request", msg
return
let response = status_contacts.rejectContactRequest(contact.id)
var contact = self.getContactById(publicKey)
contact.added = true
self.saveContact(contact)
self.events.emit(SIGNAL_CONTACT_ADDED, ContactArgs(contactId: contact.id))
except Exception as e:
error "an error occurred while accepting contact request", msg=e.msg
proc dismissContactRequest*(self: Service, publicKey: string) =
# NOTE: publicKey used for dismissing last request
let response = status_contacts.dismissLatestContactRequestForContact(publicKey)
if(not response.error.isNil):
let msg = response.error.message
error "error rejecting contact ", msg
error "error dismissing contact ", msg
return
var contact = self.getContactById(publicKey)
contact.removed = true
self.saveContact(contact)
self.events.emit(SIGNAL_CONTACT_REMOVED, ContactArgs(contactId: contact.id))

View File

@ -21,12 +21,6 @@ proc unblockContact*(id: string): RpcResponse[JsonNode] {.raises: [Exception].}
proc removeContact*(id: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("removeContact".prefix, %* [id])
proc rejectContactRequest*(id: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %*[{
"id": id
}]
result = callPrivateRPC("rejectContactRequest".prefix, payload)
proc setContactLocalNickname*(id: string, name: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [{
"id": id,
@ -34,12 +28,24 @@ proc setContactLocalNickname*(id: string, name: string): RpcResponse[JsonNode] {
}]
result = callPrivateRPC("setContactLocalNickname".prefix, payload)
proc addContact*(id: string, ensName: string): RpcResponse[JsonNode] {.raises: [Exception].} =
proc sendContactRequest*(id: string, message: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [{
"id": id,
"ensName": ensName
"message": message
}]
result = callPrivateRPC("addContact".prefix, payload)
result = callPrivateRPC("sendContactRequest".prefix, payload)
proc acceptLatestContactRequestForContact*(id: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [{
"id": id
}]
result = callPrivateRPC("acceptLatestContactRequestForContact".prefix, payload)
proc dismissLatestContactRequestForContact*(id: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %*[{
"id": id
}]
result = callPrivateRPC("dismissLatestContactRequestForContact".prefix, payload)
proc sendContactUpdate*(publicKey, ensName, thumbnail: string): RpcResponse[JsonNode] {.raises: [Exception].} =
let payload = %* [publicKey, ensName, thumbnail]

View File

@ -47,7 +47,7 @@ ModalPopup {
popup.store.acceptContactRequest(model.pubKey)
}
onDeclineClicked: {
popup.store.rejectContactRequest(model.pubKey)
popup.store.dismissContactRequest(model.pubKey)
}
}
}
@ -71,7 +71,7 @@ ModalPopup {
//% "Are you sure you want to decline all these contact requests"
confirmationText: qsTrId("are-you-sure-you-want-to-decline-all-these-contact-requests")
onConfirmButtonClicked: {
popup.store.rejectAllContactRequests()
popup.store.dismissAllContactRequests()
declineAllDialog.close()
popup.close()
}

View File

@ -62,12 +62,12 @@ QtObject {
chatCommunitySectionModule.acceptAllContactRequests()
}
function rejectContactRequest(pubKey) {
chatCommunitySectionModule.rejectContactRequest(pubKey)
function dismissContactRequest(pubKey) {
chatCommunitySectionModule.dismissContactRequest(pubKey)
}
function rejectAllContactRequests() {
chatCommunitySectionModule.rejectAllContactRequests()
function dismissAllContactRequests() {
chatCommunitySectionModule.dismissAllContactRequests()
}
function blockContact(pubKey) {

View File

@ -19,10 +19,12 @@ StatusModal {
QtObject {
id: d
readonly property int maxMsgLength: 280
readonly property int minMsgLength: 0 //TODO: update this to 1 later, when we introduce "say who you are" feature
readonly property int minMsgLength: 1
readonly property int msgHeight: 152
readonly property int contentSpacing: 0
readonly property int contentSpacing: 5
readonly property int contentMargins: 16
property int minChatKeyLength: 4 // ens or chat key
property string realChatKey: ""
@ -83,7 +85,9 @@ StatusModal {
contentItem: Item {
Column {
id: content
anchors.horizontalCenter: parent.horizontalCenter
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: d.contentMargins
spacing: d.contentSpacing
StatusInput {
@ -143,7 +147,7 @@ StatusModal {
enabled: d.validChatKey && messageInput.valid
text: qsTr("Send Contact Request")
onClicked: {
root.contactsStore.addContact(d.realChatKey)
root.contactsStore.sendContactRequest(d.realChatKey, messageInput.text)
root.close()
}
}

View File

@ -41,10 +41,6 @@ QtObject {
root.contactsModule.switchToOrCreateOneToOneChat(pubKey)
}
function addContact(pubKey) {
root.contactsModule.addContact(pubKey)
}
function unblockContact(pubKey) {
root.contactsModule.unblockContact(pubKey)
}
@ -60,13 +56,17 @@ QtObject {
function changeContactNickname(pubKey, nickname) {
root.contactsModule.changeContactNickname(pubKey, nickname)
}
function acceptContactRequest(pubKey) {
root.contactsModule.addContact(pubKey)
function sendContactRequest(pubKey, message) {
root.contactsModule.sendContactRequest(pubKey, message)
}
function rejectContactRequest(pubKey) {
root.contactsModule.rejectContactRequest(pubKey)
function acceptContactRequest(pubKey) {
root.contactsModule.acceptContactRequest(pubKey)
}
function dismissContactRequest(pubKey) {
root.contactsModule.dismissContactRequest(pubKey)
}
function removeContactRequestRejection(pubKey) {

View File

@ -192,7 +192,7 @@ SettingsContentBase {
}
onContactRequestRejected: {
root.contactsStore.rejectContactRequest(publicKey)
root.contactsStore.dismissContactRequest(publicKey)
}
}

View File

@ -331,7 +331,7 @@ StatusModal {
text: qsTr("Add to contacts")
visible: !userIsBlocked && !isAddedContact
onClicked: {
popup.contactsStore.addContact(userPublicKey);
popup.contactsStore.sendContactRequest(userPublicKey);
popup.contactAdded(userPublicKey);
popup.close();
}