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