From f0675434b9f691f8cc089e58722f373bfda01a0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Mon, 17 May 2021 14:45:32 -0400
Subject: [PATCH] misc: fixes

Change-Id: I83161997e655cbb626f6577cedb53d3b67786c7f
---
 src/conversationlistmodelbase.cpp             |  2 +-
 src/conversationsadapter.cpp                  | 26 +++----
 src/conversationsadapter.h                    |  2 +-
 .../ConversationSmartListContextMenu.qml      | 21 ++----
 src/messagesadapter.cpp                       | 69 ++++++++++++++-----
 src/messagesadapter.h                         |  1 +
 src/webchathelpers.cpp                        |  8 ++-
 src/webchathelpers.h                          |  3 +
 8 files changed, 81 insertions(+), 51 deletions(-)

diff --git a/src/conversationlistmodelbase.cpp b/src/conversationlistmodelbase.cpp
index b56da053a..b896f8db1 100644
--- a/src/conversationlistmodelbase.cpp
+++ b/src/conversationlistmodelbase.cpp
@@ -105,7 +105,7 @@ ConversationListModelBase::dataForItem(item_t item, int role) const
         return QVariant(static_cast<int>(contact.profileInfo.type));
     }
     case Role::IsSwarm: {
-        return QVariant(item.mode != lrc::api::conversation::Mode::NON_SWARM);
+        return QVariant(!item.isNotASwarm());
     }
     case Role::IsBanned: {
         return QVariant(contact.isBanned);
diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp
index 55f5b0119..81d1b6d6d 100644
--- a/src/conversationsadapter.cpp
+++ b/src/conversationsadapter.cpp
@@ -139,17 +139,17 @@ ConversationsAdapter::safeInit()
 
     Q_EMIT modelChanged(QVariant::fromValue(conversationSmartListModel_));
 
-    //    connect(&lrcInstance_->behaviorController(),
-    //            &BehaviorController::newUnreadInteraction,
-    //            this,
-    //            &ConversationsAdapter::onNewUnreadInteraction,
-    //            Qt::UniqueConnection);
-
-    //  connect(&lrcInstance_->behaviorController(),
-    //          &BehaviorController::newReadInteraction,
-    //          this,
-    //          &ConversationsAdapter::onNewReadInteraction,
-    //          Qt::UniqueConnection);
+    connect(&lrcInstance_->behaviorController(),
+            &BehaviorController::newUnreadInteraction,
+            this,
+            &ConversationsAdapter::onNewUnreadInteraction,
+            Qt::UniqueConnection);
+
+    connect(&lrcInstance_->behaviorController(),
+            &BehaviorController::newReadInteraction,
+            this,
+            &ConversationsAdapter::onNewReadInteraction,
+            Qt::UniqueConnection);
 
     connect(&lrcInstance_->behaviorController(),
             &BehaviorController::newTrustRequest,
@@ -231,7 +231,7 @@ ConversationsAdapter::onNewUnreadInteraction(const QString& accountId,
 void
 ConversationsAdapter::onNewReadInteraction(const QString& accountId,
                                            const QString& convUid,
-                                           uint64_t interactionId)
+                                           const QString& interactionId)
 {
 #ifdef Q_OS_LINUX
     // hide notification
@@ -424,7 +424,7 @@ ConversationsAdapter::getConvInfoMap(const QString& convId)
             {"bestId", contactModel->bestIdForContact(peerUri)},
             {"bestName", contactModel->bestNameForContact(peerUri)},
             {"uri", peerUri},
-            {"isSwarm", convInfo.mode != lrc::api::conversation::Mode::NON_SWARM},
+            {"isSwarm", !convInfo.isNotASwarm()},
             {"contactType", static_cast<int>(contact.profileInfo.type)},
             {"isAudioOnly", isAudioOnly},
             {"callState", static_cast<int>(callState)},
diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h
index 362a6ebe7..a3ed887bb 100644
--- a/src/conversationsadapter.h
+++ b/src/conversationsadapter.h
@@ -70,7 +70,7 @@ private Q_SLOTS:
                                 const interaction::Info& interaction);
     void onNewReadInteraction(const QString& accountId,
                               const QString& convUid,
-                              uint64_t interactionId);
+                              const QString& interactionId);
     void onNewTrustRequest(const QString& accountId, const QString& peerUri);
     void onTrustRequestTreated(const QString& accountId, const QString& peerUri);
 
diff --git a/src/mainview/components/ConversationSmartListContextMenu.qml b/src/mainview/components/ConversationSmartListContextMenu.qml
index a96ed6a3a..f129e98f6 100644
--- a/src/mainview/components/ConversationSmartListContextMenu.qml
+++ b/src/mainview/components/ConversationSmartListContextMenu.qml
@@ -56,18 +56,6 @@ ContextMenuAutoLoader {
                             false)
             }
         },
-        GeneralMenuItem {
-            id: clearConversation
-
-            canTrigger: !isSwarm
-            itemName: JamiStrings.clearConversation
-            iconSource: "qrc:/images/icons/place_audiocall-24px.svg"
-            onClicked: {
-                MessagesAdapter.clearConversationHistory(
-                            responsibleAccountId,
-                            responsibleConvUid)
-            }
-        },
         GeneralMenuItem {
             id: startAudioCall
 
@@ -85,18 +73,19 @@ ContextMenuAutoLoader {
         GeneralMenuItem {
             id: clearConversation
 
-            canTrigger: !hasCall
+            canTrigger: !isSwarm && !hasCall
             itemName: JamiStrings.clearConversation
             iconSource: "qrc:/images/icons/ic_clear_24px.svg"
             onClicked: {
-                MessagesAdapter.clearConversationHistory(responsibleAccountId,
-                                                         responsibleConvUid)
+                MessagesAdapter.clearConversationHistory(
+                            responsibleAccountId,
+                            responsibleConvUid)
             }
         },
         GeneralMenuItem {
             id: removeContact
 
-            canTrigger: !hasCall && (contactType === Profile.Type.RING
+            canTrigger: !hasCall && (contactType === Profile.Type.JAMI
                                      || contactType === Profile.Type.SIP)
             itemName: JamiStrings.removeContact
             iconSource: "qrc:/images/icons/ic_hangup_participant-24px.svg"
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index f6fe75955..0adaff78d 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -88,19 +88,19 @@ MessagesAdapter::setupChatView(const QString& convUid)
 
     QMetaObject::invokeMethod(qmlObj_,
                               "setSendContactRequestButtonVisible",
-                              Q_ARG(QVariant, isPending));
+                              Q_ARG(QVariant, convInfo.isNotASwarm() && isPending));
     QMetaObject::invokeMethod(qmlObj_,
                               "setMessagingHeaderButtonsVisible",
                               Q_ARG(QVariant,
-                                    !(convInfo.mode != lrc::api::conversation::Mode::NON_SWARM
+                                    !(convInfo.isNotASwarm()
                                       && (convInfo.isRequest || convInfo.needsSyncing))));
 
     setMessagesVisibility(false);
-    setIsSwarm(convInfo.mode != lrc::api::conversation::Mode::NON_SWARM);
+    setIsSwarm(!convInfo.isNotASwarm());
     setInvitation(convInfo.isRequest or convInfo.needsSyncing,
                   bestName,
                   contactURI,
-                  convInfo.mode != lrc::api::conversation::Mode::NON_SWARM,
+                  !convInfo.isNotASwarm(),
                   convInfo.needsSyncing);
 
     // Type Indicator (contact). TODO: Not shown when invitation request?
@@ -137,6 +137,7 @@ MessagesAdapter::connectConversationModel()
     QObject::disconnect(newInteractionConnection_);
     QObject::disconnect(interactionRemovedConnection_);
     QObject::disconnect(interactionStatusUpdatedConnection_);
+    QObject::disconnect(conversationUpdatedConnection_);
 
     newInteractionConnection_
         = QObject::connect(currentConversationModel,
@@ -185,6 +186,17 @@ MessagesAdapter::connectConversationModel()
                                                      this,
                                                      SLOT(slotMessagesLoaded()));
                            });
+
+    conversationUpdatedConnection_
+        = QObject::connect(currentConversationModel,
+                           &ConversationModel::conversationReady,
+                           [this](const QString& conversationId) {
+                               if (conversationId != lrcInstance_->get_selectedConvUid())
+                                   return;
+                               auto* convModel = lrcInstance_->getCurrentConversationModel();
+                               if (auto optConv = convModel->getConversationForUid(conversationId))
+                                   setConversationProfileData(optConv->get());
+                           });
 }
 
 void
@@ -241,8 +253,7 @@ MessagesAdapter::slotMessagesCleared()
     auto convOpt = convModel->getConversationForUid(lrcInstance_->get_selectedConvUid());
     if (!convOpt)
         return;
-    if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
-        && !convOpt->get().allMessagesLoaded) {
+    if (!convOpt->get().isNotASwarm() && !convOpt->get().allMessagesLoaded) {
         convModel->loadConversationMessages(convOpt->get().uid, 20);
     } else {
         printHistory(*convModel, convOpt->get().interactions);
@@ -470,10 +481,21 @@ MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info&
     try {
         auto& contact = accInfo->contactModel->getContact(contactUri);
         auto bestName = accInfo->contactModel->bestNameForContact(contactUri);
+        bool isPending = contact.profileInfo.type == profile::Type::TEMPORARY;
+
+        QMetaObject::invokeMethod(qmlObj_,
+                                  "setSendContactRequestButtonVisible",
+                                  Q_ARG(QVariant, convInfo.isNotASwarm() && isPending));
+        QMetaObject::invokeMethod(qmlObj_,
+                                  "setMessagingHeaderButtonsVisible",
+                                  Q_ARG(QVariant,
+                                        !(!convInfo.isNotASwarm()
+                                          && (convInfo.isRequest || convInfo.needsSyncing))));
+
         setInvitation(convInfo.isRequest or convInfo.needsSyncing,
                       bestName,
                       contactUri,
-                      convInfo.mode != lrc::api::conversation::Mode::NON_SWARM,
+                      !convInfo.isNotASwarm(),
                       convInfo.needsSyncing);
         if (!contact.profileInfo.avatar.isEmpty()) {
             setSenderImage(contactUri, contact.profileInfo.avatar);
@@ -577,7 +599,10 @@ void
 MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel,
                               MessagesList interactions)
 {
-    auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
+    auto interactionsStr = interactionsToJsonArrayObject(conversationModel,
+                                                         lrcInstance_->get_selectedConvUid(),
+                                                         interactions)
+                               .toUtf8();
     QString s = QString::fromLatin1("printHistory(%1);").arg(interactionsStr.constData());
     QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
 }
@@ -587,7 +612,10 @@ MessagesAdapter::updateHistory(lrc::api::ConversationModel& conversationModel,
                                MessagesList interactions,
                                bool allLoaded)
 {
-    auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
+    auto interactionsStr = interactionsToJsonArrayObject(conversationModel,
+                                                         lrcInstance_->get_selectedConvUid(),
+                                                         interactions)
+                               .toUtf8();
     QString s = QString::fromLatin1("updateHistory(%1, %2);")
                     .arg(interactionsStr.constData())
                     .arg(allLoaded);
@@ -613,8 +641,11 @@ MessagesAdapter::printNewInteraction(lrc::api::ConversationModel& conversationMo
                                      const QString& msgId,
                                      const lrc::api::interaction::Info& interaction)
 {
-    auto interactionObject
-        = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8();
+    auto interactionObject = interactionToJsonInteractionObject(conversationModel,
+                                                                lrcInstance_->get_selectedConvUid(),
+                                                                msgId,
+                                                                interaction)
+                                 .toUtf8();
     if (interactionObject.isEmpty()) {
         return;
     }
@@ -627,8 +658,11 @@ MessagesAdapter::updateInteraction(lrc::api::ConversationModel& conversationMode
                                    const QString& msgId,
                                    const lrc::api::interaction::Info& interaction)
 {
-    auto interactionObject
-        = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8();
+    auto interactionObject = interactionToJsonInteractionObject(conversationModel,
+                                                                lrcInstance_->get_selectedConvUid(),
+                                                                msgId,
+                                                                interaction)
+                                 .toUtf8();
     if (interactionObject.isEmpty()) {
         return;
     }
@@ -686,9 +720,9 @@ MessagesAdapter::contactIsComposing(const QString& uid, const QString& contactUr
     if (!convInfo)
         return;
     auto& conv = convInfo->get();
-    bool showIsComposing = conv.mode != lrc::api::conversation::Mode::NON_SWARM
-                               ? uid == conv.uid
-                               : uid.isEmpty() && conv.participants.first() == contactUri;
+    bool showIsComposing = conv.isNotASwarm()
+                               ? uid.isEmpty() && conv.participants.first() == contactUri
+                               : uid == conv.uid;
     if (showIsComposing) {
         QString s
             = QString::fromLatin1("showTypingIndicator(`%1`, %2);").arg(contactUri).arg(isComposing);
@@ -763,7 +797,6 @@ MessagesAdapter::loadMessages(int n)
     auto convOpt = convModel->getConversationForUid(currentConvUid_);
     if (!convOpt)
         return;
-    if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
-        && !convOpt->get().allMessagesLoaded)
+    if (!convOpt->get().isNotASwarm() && !convOpt->get().allMessagesLoaded)
         convModel->loadConversationMessages(convOpt->get().uid, n);
 }
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index 5611641d8..3860832d0 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -128,6 +128,7 @@ private:
     QMetaObject::Connection interactionStatusUpdatedConnection_;
     QMetaObject::Connection interactionRemovedConnection_;
     QMetaObject::Connection newMessagesAvailableConnection_;
+    QMetaObject::Connection conversationUpdatedConnection_;
 
     AppSettingsManager* settingsManager_;
 };
diff --git a/src/webchathelpers.cpp b/src/webchathelpers.cpp
index 2d87126ef..66e0732f3 100644
--- a/src/webchathelpers.cpp
+++ b/src/webchathelpers.cpp
@@ -23,6 +23,7 @@
 
 QJsonObject
 buildInteractionJson(lrc::api::ConversationModel& conversationModel,
+                     const QString& convId,
                      const QString msgId,
                      const lrc::api::interaction::Info& inter)
 {
@@ -65,7 +66,7 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel,
     case lrc::api::interaction::Type::DATA_TRANSFER: {
         interactionObject.insert("type", QJsonValue("data_transfer"));
         lrc::api::datatransfer::Info info = {};
-        // conversationModel.getTransferInfo(msgId, info);
+        conversationModel.getTransferInfo(convId, msgId, info);
         if (info.status != lrc::api::datatransfer::Status::INVALID) {
             interactionObject.insert("totalSize", QJsonValue(qint64(info.totalSize)));
             interactionObject.insert("progress", QJsonValue(qint64(info.progress)));
@@ -130,20 +131,23 @@ buildInteractionJson(lrc::api::ConversationModel& conversationModel,
 
 QString
 interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel,
+                                   const QString& convId,
                                    const QString& msgId,
                                    const lrc::api::interaction::Info& interaction)
 {
-    auto interactionObject = buildInteractionJson(conversationModel, msgId, interaction);
+    auto interactionObject = buildInteractionJson(conversationModel, convId, msgId, interaction);
     return QString(QJsonDocument(interactionObject).toJson(QJsonDocument::Compact));
 }
 
 QString
 interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel,
+                              const QString& convId,
                               MessagesList interactions)
 {
     QJsonArray array;
     for (const auto& interaction : interactions) {
         auto interactionObject = buildInteractionJson(conversationModel,
+                                                      convId,
                                                       interaction.first,
                                                       interaction.second);
         if (!interactionObject.isEmpty()) {
diff --git a/src/webchathelpers.h b/src/webchathelpers.h
index a35091250..88fc13085 100644
--- a/src/webchathelpers.h
+++ b/src/webchathelpers.h
@@ -30,10 +30,13 @@
 #include "api/conversationmodel.h"
 
 QJsonObject buildInteractionJson(lrc::api::ConversationModel& conversationModel,
+                                 const QString& convId,
                                  const QString& msgId,
                                  lrc::api::interaction::Info& interaction);
 QString interactionToJsonInteractionObject(lrc::api::ConversationModel& conversationModel,
+                                           const QString& convId,
                                            const QString& msgId,
                                            const lrc::api::interaction::Info& interaction);
 QString interactionsToJsonArrayObject(lrc::api::ConversationModel& conversationModel,
+                                      const QString& convId,
                                       MessagesList interactions);
-- 
GitLab