diff --git a/src/mainview/components/MessageWebView.qml b/src/mainview/components/MessageWebView.qml index 5afac80cc9fd9a147c1f171afa5f8a193ca6aae7..4f7531fe6d207f8591e7896bb676ece36b4e57cc 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 4fd6ff8230f01b11d4f4152cdb4c0aeef60b578f..43f1be85bce5163b53a3c1c7e490b39e7df6f841 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 a5cbb78a53b75c81d6ee5a1c8fb58c06110f6dc6..cd5f905f61ca0fa24576e4cef9fbbe9cd1eefaf9 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,