From b82842876ccb743c95aaa3909b442f2e57ba9035 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 16 Mar 2023 16:13:53 -0400
Subject: [PATCH] swarmdetails: add "Contact details" option in members list

This allow to easily get URI + QRCode

Change-Id: If986b42e46c074971c7467de4d7446d2c8d3a865
GitLab: #955
---
 .../SwarmParticipantContextMenu.qml           | 17 +++++++++++++++
 src/app/mainview/components/UserProfile.qml   |  7 ++++---
 src/app/qrimageprovider.h                     |  2 ++
 src/app/utilsadapter.cpp                      | 21 +++++++++++++++++++
 src/app/utilsadapter.h                        |  2 ++
 5 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/src/app/mainview/components/SwarmParticipantContextMenu.qml b/src/app/mainview/components/SwarmParticipantContextMenu.qml
index f30526af0..e7258f7ec 100644
--- a/src/app/mainview/components/SwarmParticipantContextMenu.qml
+++ b/src/app/mainview/components/SwarmParticipantContextMenu.qml
@@ -86,6 +86,23 @@ ContextMenuAutoLoader {
                     MessagesAdapter.removeConversationMember(conversationId, participantUri)
                 }
             }
+        },
+        GeneralMenuItem {
+            id: contactDetails
+
+            itemName: JamiStrings.contactDetails
+            iconSource: JamiResources.person_24dp_svg
+            onClicked: {
+                viewCoordinator.presentDialog(
+                            appWindow,
+                            "mainview/components/UserProfile.qml",
+                            {
+                                aliasText: UtilsAdapter.getBestNameForUri(CurrentAccount.id, participantUri),
+                                registeredNameText: UtilsAdapter.getBestIdForUri(CurrentAccount.id, participantUri),
+                                idText: participantUri,
+                                convId: UtilsAdapter.getConvIdForUri(CurrentAccount.id, participantUri)
+                            })
+            }
         }
     ]
 
diff --git a/src/app/mainview/components/UserProfile.qml b/src/app/mainview/components/UserProfile.qml
index b989dc5a1..77069a637 100644
--- a/src/app/mainview/components/UserProfile.qml
+++ b/src/app/mainview/components/UserProfile.qml
@@ -56,15 +56,16 @@ BaseModalDialog {
             rowSpacing: 16
             columnSpacing: 24
 
-            ConversationAvatar {
+            Avatar {
                 id: contactImage
 
                 Layout.alignment: Qt.AlignRight
                 Layout.preferredWidth: preferredImgSize
                 Layout.preferredHeight: preferredImgSize
 
-                imageId: convId
+                imageId: convId !== "" ? convId : idText
                 showPresenceIndicator: false
+                mode: convId !== "" ? Avatar.Mode.Conversation : Avatar.Mode.Contact
             }
 
             // Visible when user alias is not empty and not equal to id.
@@ -193,7 +194,7 @@ BaseModalDialog {
 
                 source: convId !== "" ?
                             "image://qrImage/contact_" + convId :
-                            ""
+                            "image://qrImage/contact_" + idText
             }
 
             MaterialButton {
diff --git a/src/app/qrimageprovider.h b/src/app/qrimageprovider.h
index 2fda91329..eba496eb0 100644
--- a/src/app/qrimageprovider.h
+++ b/src/app/qrimageprovider.h
@@ -52,6 +52,8 @@ public:
             // For contact_xxx, xxx is "" initially
             try {
                 const auto& convInfo = lrcInstance_->getConversationFromConvUid(list[1]);
+                if (convInfo.uid.isEmpty())
+                    return {QrType::Contact, list[1]};
                 if (convInfo.mode == conversation::Mode::ONE_TO_ONE
                     || convInfo.mode == conversation::Mode::NON_SWARM) {
                     auto peerUri = lrcInstance_->getCurrentAccountInfo()
diff --git a/src/app/utilsadapter.cpp b/src/app/utilsadapter.cpp
index 8adc0ba21..de6680331 100644
--- a/src/app/utilsadapter.cpp
+++ b/src/app/utilsadapter.cpp
@@ -194,6 +194,27 @@ UtilsAdapter::getBestNameForUri(const QString& accountId, const QString& uri)
     return lrcInstance_->getAccountInfo(accountId).contactModel->bestNameForContact(uri);
 }
 
+QString
+UtilsAdapter::getBestIdForUri(const QString& accountId, const QString& uri)
+{
+    return lrcInstance_->getAccountInfo(accountId).contactModel->bestIdForContact(uri);
+}
+
+QString
+UtilsAdapter::getConvIdForUri(const QString& accountId, const QString& uri)
+{
+    try {
+        auto* convModel = lrcInstance_->getAccountInfo(accountId).conversationModel.get();
+        auto convInfo = convModel->getConversationForPeerUri(uri);
+        if (!convInfo)
+            return {};
+        return convInfo->get().uid;
+    } catch (const std::out_of_range& e) {
+        qDebug() << e.what();
+        return "";
+    }
+}
+
 const QString
 UtilsAdapter::getPeerUri(const QString& accountId, const QString& uid)
 {
diff --git a/src/app/utilsadapter.h b/src/app/utilsadapter.h
index b7e79e822..496a136b7 100644
--- a/src/app/utilsadapter.h
+++ b/src/app/utilsadapter.h
@@ -92,6 +92,8 @@ public:
     Q_INVOKABLE void setConversationFilter(const QString& filter);
     Q_INVOKABLE const QString getBestName(const QString& accountId, const QString& uid);
     Q_INVOKABLE QString getBestNameForUri(const QString& accountId, const QString& uri);
+    Q_INVOKABLE QString getBestIdForUri(const QString& accountId, const QString& uri);
+    Q_INVOKABLE QString getConvIdForUri(const QString& accountId, const QString& uri);
     Q_INVOKABLE const QString getPeerUri(const QString& accountId, const QString& uid);
     Q_INVOKABLE QString getBestId(const QString& accountId);
     Q_INVOKABLE const QString getBestId(const QString& accountId, const QString& uid);
-- 
GitLab