From 951eb3cf85d4d41c27d10d1672fe31afc5e2bb27 Mon Sep 17 00:00:00 2001
From: ababi <albert.babi@savoirfairelinux.com>
Date: Wed, 23 Dec 2020 18:48:06 +0100
Subject: [PATCH] swarm: add support for lazy loading conversations

depends on https://review.jami.net/c/ring-lrc/+/16720

Change-Id: Ic254459827c189fc92595be6e2485e0eed31edd8
---
 src/mainview/components/MessageWebView.qml |  4 +++
 src/messagesadapter.cpp                    | 32 ++++++++++++++++++++--
 src/messagesadapter.h                      |  6 +++-
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/mainview/components/MessageWebView.qml b/src/mainview/components/MessageWebView.qml
index 5afac80cc..4f7531fe6 100644
--- a/src/mainview/components/MessageWebView.qml
+++ b/src/mainview/components/MessageWebView.qml
@@ -252,6 +252,10 @@ Rectangle {
         function parseI18nData() {
             return MessagesAdapter.chatviewTranslatedStrings
         }
+
+        function loadMessages(n) {
+            return MessagesAdapter.loadMessages(n)
+        }
     }
 
     WebEngineView {
diff --git a/src/messagesadapter.cpp b/src/messagesadapter.cpp
index 4fd6ff823..43f1be85b 100644
--- a/src/messagesadapter.cpp
+++ b/src/messagesadapter.cpp
@@ -156,7 +156,7 @@ MessagesAdapter::connectConversationModel()
 
     newMessagesAvailableConnection_
         = QObject::connect(currentConversationModel,
-                           &lrc::api::ConversationModel::newMessagesAvailable,
+                           &ConversationModel::newMessagesAvailable,
                            [this](const QString& accountId, const QString& conversationId) {
                                auto* convModel = lrcInstance_->accountModel()
                                                      .getAccountInfo(accountId)
@@ -164,7 +164,9 @@ MessagesAdapter::connectConversationModel()
                                auto optConv = convModel->getConversationForUid(conversationId);
                                if (!optConv)
                                    return;
-                               printHistory(*convModel, optConv->get().interactions);
+                               updateHistory(*convModel,
+                                             optConv->get().interactions,
+                                             optConv->get().allMessagesLoaded);
                                Utils::oneShotConnect(qmlObj_,
                                                      SIGNAL(messagesLoaded()),
                                                      this,
@@ -228,7 +230,7 @@ MessagesAdapter::slotMessagesCleared()
         return;
     if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
         && !convOpt->get().allMessagesLoaded) {
-        convModel->loadConversationMessages(convOpt->get().uid, 0);
+        convModel->loadConversationMessages(convOpt->get().uid, 20);
     } else {
         printHistory(*convModel, convOpt->get().interactions);
         Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded()));
@@ -556,6 +558,18 @@ MessagesAdapter::printHistory(lrc::api::ConversationModel& conversationModel,
     QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
 }
 
+void
+MessagesAdapter::updateHistory(lrc::api::ConversationModel& conversationModel,
+                               MessagesList interactions,
+                               bool allLoaded)
+{
+    auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
+    QString s = QString::fromLatin1("updateHistory(%1, %2);")
+                    .arg(interactionsStr.constData())
+                    .arg(allLoaded);
+    QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
+}
+
 void
 MessagesAdapter::setSenderImage(const QString& sender, const QString& senderImage)
 {
@@ -717,3 +731,15 @@ MessagesAdapter::removeConversation(const QString& accountId,
     if (convUid == currentConvUid_)
         currentConvUid_.clear();
 }
+
+void
+MessagesAdapter::loadMessages(int n)
+{
+    auto* convModel = lrcInstance_->getCurrentConversationModel();
+    auto convOpt = convModel->getConversationForUid(currentConvUid_);
+    if (!convOpt)
+        return;
+    if (convOpt->get().mode != lrc::api::conversation::Mode::NON_SWARM
+        && !convOpt->get().allMessagesLoaded)
+        convModel->loadConversationMessages(convOpt->get().uid, n);
+}
diff --git a/src/messagesadapter.h b/src/messagesadapter.h
index a5cbb78a5..cd5f905f6 100644
--- a/src/messagesadapter.h
+++ b/src/messagesadapter.h
@@ -67,6 +67,7 @@ protected:
     Q_INVOKABLE void refuseFile(const QString& arg);
     Q_INVOKABLE void pasteKeyDetected();
     Q_INVOKABLE void onComposing(bool isComposing);
+    Q_INVOKABLE void loadMessages(int n);
 
     // Manually update draft when hiding message web view (Back to welcome page).
     Q_INVOKABLE void updateDraft();
@@ -76,7 +77,10 @@ protected:
     void requestSendMessageContent();
     void setInvitation(bool show, const QString& contactUri = {}, const QString& contactId = {});
     void clear();
-    void printHistory(lrc::api::ConversationModel& conversationModel, MessagesList interactions);
+    void printHistory(ConversationModel& conversationModel, MessagesList interactions);
+    void updateHistory(ConversationModel& conversationModel,
+                       MessagesList interactions,
+                       bool allLoaded);
     void setSenderImage(const QString& sender, const QString& senderImage);
     void printNewInteraction(lrc::api::ConversationModel& conversationModel,
                              const QString& msgId,
-- 
GitLab