blob: 37b477f9e588237891cb2b2f6395cec0a5113309 [file] [log] [blame]
Sébastien Blin1f915762020-08-03 13:27:42 -04001/*
2 * Copyright (C) 2020 by Savoir-faire Linux
3 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
4 * Author: Anthony L�onard <anthony.leonard@savoirfairelinux.com>
5 * Author: Olivier Soldano <olivier.soldano@savoirfairelinux.com>
6 * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
7 * Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
8 * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24#include "messagesadapter.h"
25#include "webchathelpers.h"
26
27#include "utils.h"
28
29#include <QDesktopServices>
30#include <QFileInfo>
31#include <QImageReader>
32#include <QList>
33#include <QUrl>
34
35MessagesAdapter::MessagesAdapter(QObject *parent)
36 : QmlAdapterBase(parent)
37{}
38
39MessagesAdapter::~MessagesAdapter() {}
40
41void
ababi69f5dfc2020-08-25 15:07:57 +020042MessagesAdapter::initQmlObject() {}
Sébastien Blin1f915762020-08-03 13:27:42 -040043
44void
45MessagesAdapter::setupChatView(const QString &uid)
46{
ababi0b686642020-08-18 17:21:28 +020047
48 auto* convModel = LRCInstance::getCurrentConversationModel();
49 if (convModel == nullptr) {
50 return;
51 }
52 const auto &convInfo = convModel->getConversationForUID(uid);
53 if (convInfo.uid.isEmpty() || convInfo.participants.isEmpty()) {
Sébastien Blin1f915762020-08-03 13:27:42 -040054 return;
55 }
56
57 QString contactURI = convInfo.participants.at(0);
58
59 bool isContact = false;
60 auto selectedAccountId = LRCInstance::getCurrAccId();
61 auto &accountInfo = LRCInstance::accountModel().getAccountInfo(selectedAccountId);
62
63 lrc::api::profile::Type contactType;
64 try {
65 auto contactInfo = accountInfo.contactModel->getContact(contactURI);
66 if (contactInfo.isTrusted) {
67 isContact = true;
68 }
69 contactType = contactInfo.profileInfo.type;
70 } catch (...) {
71 }
72
73 bool shouldShowSendContactRequestBtn = !isContact
74 && contactType != lrc::api::profile::Type::SIP;
75
76 QMetaObject::invokeMethod(qmlObj_,
77 "setSendContactRequestButtonVisible",
78 Q_ARG(QVariant, shouldShowSendContactRequestBtn));
79
80 setMessagesVisibility(false);
81
82 /*
83 * Type Indicator (contact).
84 */
85 contactIsComposing(convInfo.uid, "", false);
86 connect(LRCInstance::getCurrentConversationModel(),
87 &ConversationModel::composingStatusChanged,
88 [this](const QString &uid, const QString &contactUri, bool isComposing) {
89 contactIsComposing(uid, contactUri, isComposing);
90 });
91
92 /*
93 * Draft and message content set up.
94 */
95 Utils::oneShotConnect(qmlObj_,
96 SIGNAL(sendMessageContentSaved(const QString &)),
97 this,
98 SLOT(slotSendMessageContentSaved(const QString &)));
99
100 requestSendMessageContent();
101}
102
103void
104MessagesAdapter::connectConversationModel()
105{
ababi0b686642020-08-18 17:21:28 +0200106 auto currentConversationModel = LRCInstance::getCurrentConversationModel();
Sébastien Blin1f915762020-08-03 13:27:42 -0400107
108 QObject::disconnect(newInteractionConnection_);
109 QObject::disconnect(interactionRemovedConnection_);
110 QObject::disconnect(interactionStatusUpdatedConnection_);
111
ababi0b686642020-08-18 17:21:28 +0200112 newInteractionConnection_ = QObject::connect(currentConversationModel,
113 &lrc::api::ConversationModel::newInteraction,
114 [this](const QString &convUid, uint64_t interactionId,
115 const lrc::api::interaction::Info &interaction) {
116 auto accountId = LRCInstance::getCurrAccId();
117 newInteraction(accountId, convUid, interactionId, interaction);
118 });
Sébastien Blin1f915762020-08-03 13:27:42 -0400119
ababi0b686642020-08-18 17:21:28 +0200120 interactionStatusUpdatedConnection_ = QObject::connect(currentConversationModel,
121 &lrc::api::ConversationModel::interactionStatusUpdated,
122 [this](const QString &convUid, uint64_t interactionId,
123 const lrc::api::interaction::Info &interaction) {
124 auto currentConversationModel = LRCInstance::getCurrentConversationModel();
125 currentConversationModel->clearUnreadInteractions(convUid);
126 updateInteraction(*currentConversationModel, interactionId, interaction);
127 });
Sébastien Blin1f915762020-08-03 13:27:42 -0400128
129 interactionRemovedConnection_
130 = QObject::connect(currentConversationModel,
131 &lrc::api::ConversationModel::interactionRemoved,
132 [this](const QString &convUid, uint64_t interactionId) {
133 Q_UNUSED(convUid);
134 removeInteraction(interactionId);
135 });
136
137 currentConversationModel->setFilter("");
138}
139
140void
141MessagesAdapter::sendContactRequest()
142{
ababi0b686642020-08-18 17:21:28 +0200143 const auto convUid = LRCInstance::getCurrentConvUid();
144 if (!convUid.isEmpty()) {
145 LRCInstance::getCurrentConversationModel()->makePermanent(convUid);
Sébastien Blin1f915762020-08-03 13:27:42 -0400146 }
147}
148
149void
ababi0b686642020-08-18 17:21:28 +0200150MessagesAdapter::accountChangedSetUp(const QString &accountId)
Sébastien Blin1f915762020-08-03 13:27:42 -0400151{
ababi0b686642020-08-18 17:21:28 +0200152 Q_UNUSED(accountId)
Sébastien Blin1f915762020-08-03 13:27:42 -0400153
154 connectConversationModel();
155}
156
157void
158MessagesAdapter::updateConversationForAddedContact()
159{
ababi0b686642020-08-18 17:21:28 +0200160 auto* convModel = LRCInstance::getCurrentConversationModel();
161 const auto conversation = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
Sébastien Blin1f915762020-08-03 13:27:42 -0400162
163 clear();
164 setConversationProfileData(conversation);
165 printHistory(*convModel, conversation.interactions);
166}
167
168void
169MessagesAdapter::slotSendMessageContentSaved(const QString &content)
170{
171 if (!LastConvUid_.isEmpty()) {
172 LRCInstance::setContentDraft(LastConvUid_, LRCInstance::getCurrAccId(), content);
173 }
174 LastConvUid_ = LRCInstance::getCurrentConvUid();
175
176 Utils::oneShotConnect(qmlObj_, SIGNAL(messagesCleared()), this, SLOT(slotMessagesCleared()));
177
178 setInvitation(false);
179 clear();
180 auto restoredContent = LRCInstance::getContentDraft(LRCInstance::getCurrentConvUid(),
181 LRCInstance::getCurrAccId());
182 setSendMessageContent(restoredContent);
183 emit needToUpdateSmartList();
184}
185
186void
187MessagesAdapter::slotUpdateDraft(const QString &content)
188{
189 if (!LastConvUid_.isEmpty()) {
190 LRCInstance::setContentDraft(LastConvUid_, LRCInstance::getCurrAccId(), content);
191 }
192 emit needToUpdateSmartList();
193}
194
195void
196MessagesAdapter::slotMessagesCleared()
197{
ababi0b686642020-08-18 17:21:28 +0200198 auto* convModel = LRCInstance::getCurrentConversationModel();
199 const auto convInfo = convModel->getConversationForUID(LRCInstance::getCurrentConvUid());
Sébastien Blin1f915762020-08-03 13:27:42 -0400200
201 printHistory(*convModel, convInfo.interactions);
202
203 Utils::oneShotConnect(qmlObj_, SIGNAL(messagesLoaded()), this, SLOT(slotMessagesLoaded()));
204
205 setConversationProfileData(convInfo);
206}
207
208void
209MessagesAdapter::slotMessagesLoaded()
210{
211 setMessagesVisibility(true);
212}
213
214void
215MessagesAdapter::sendMessage(const QString &message)
216{
217 try {
ababi0b686642020-08-18 17:21:28 +0200218 const auto convUid = LRCInstance::getCurrentConvUid();
Sébastien Blin1f915762020-08-03 13:27:42 -0400219 LRCInstance::getCurrentConversationModel()->sendMessage(convUid, message);
220 } catch (...) {
221 qDebug() << "Exception during sendMessage:" << message;
222 }
223}
224
225void
226MessagesAdapter::sendImage(const QString &message)
227{
228 if (message.startsWith("data:image/png;base64,")) {
229 /*
230 * Img tag contains base64 data, trim "data:image/png;base64," from data.
231 */
232 QByteArray data = QByteArray::fromStdString(message.toStdString().substr(22));
233 auto img_name_hash = QString::fromStdString(
234 QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex().toStdString());
235 QString fileName = "\\img_" + img_name_hash + ".png";
236
237 QPixmap image_to_save;
238 if (!image_to_save.loadFromData(QByteArray::fromBase64(data))) {
239 qDebug().noquote() << "Errors during loadFromData"
240 << "\n";
241 }
242
243 QString path = QString(Utils::WinGetEnv("TEMP")) + fileName;
244 if (!image_to_save.save(path, "PNG")) {
245 qDebug().noquote() << "Errors during QPixmap save"
246 << "\n";
247 }
248
249 try {
250 auto convUid = LRCInstance::getCurrentConvUid();
251 LRCInstance::getCurrentConversationModel()->sendFile(convUid, path, fileName);
252 } catch (...) {
253 qDebug().noquote() << "Exception during sendFile - base64 img"
254 << "\n";
255 }
256
257 } else {
258 /*
259 * Img tag contains file paths.
260 */
261
262 QString msg(message);
263#ifdef Q_OS_WIN
264 msg = msg.replace("file:///", "");
265#else
266 msg = msg.replace("file:///", "/");
267#endif
268 QFileInfo fi(msg);
269 QString fileName = fi.fileName();
270
271 try {
272 auto convUid = LRCInstance::getCurrentConvUid();
273 LRCInstance::getCurrentConversationModel()->sendFile(convUid, msg, fileName);
274 } catch (...) {
275 qDebug().noquote() << "Exception during sendFile - image from path"
276 << "\n";
277 }
278 }
279}
280
281void
282MessagesAdapter::sendFile(const QString &message)
283{
284 QFileInfo fi(message);
285 QString fileName = fi.fileName();
286 try {
287 auto convUid = LRCInstance::getCurrentConvUid();
288 LRCInstance::getCurrentConversationModel()->sendFile(convUid, message, fileName);
289 } catch (...) {
290 qDebug() << "Exception during sendFile";
291 }
292}
293
294void
295MessagesAdapter::retryInteraction(const QString &arg)
296{
297 bool ok;
298 uint64_t interactionUid = arg.toULongLong(&ok);
299 if (ok) {
300 LRCInstance::getCurrentConversationModel()
301 ->retryInteraction(LRCInstance::getCurrentConvUid(), interactionUid);
302 } else {
303 qDebug() << "retryInteraction - invalid arg" << arg;
304 }
305}
306
307void
308MessagesAdapter::setNewMessagesContent(const QString &path)
309{
310 if (path.length() == 0)
311 return;
312 QByteArray imageFormat = QImageReader::imageFormat(path);
313
314 if (!imageFormat.isEmpty()) {
315 setMessagesImageContent(path);
316 } else {
317 setMessagesFileContent(path);
318 }
319}
320
321void
322MessagesAdapter::deleteInteraction(const QString &arg)
323{
324 bool ok;
325 uint64_t interactionUid = arg.toULongLong(&ok);
326 if (ok) {
327 LRCInstance::getCurrentConversationModel()
328 ->clearInteractionFromConversation(LRCInstance::getCurrentConvUid(), interactionUid);
329 } else {
330 qDebug() << "DeleteInteraction - invalid arg" << arg;
331 }
332}
333
334void
335MessagesAdapter::openFile(const QString &arg)
336{
337 QUrl fileUrl("file:///" + arg);
338 if (!QDesktopServices::openUrl(fileUrl)) {
339 qDebug() << "Couldn't open file: " << fileUrl;
340 }
341}
342
343void
344MessagesAdapter::acceptFile(const QString &arg)
345{
346 try {
347 auto interactionUid = arg.toLongLong();
348 auto convUid = LRCInstance::getCurrentConvUid();
349 LRCInstance::getCurrentConversationModel()->acceptTransfer(convUid, interactionUid);
350 } catch (...) {
351 qDebug() << "JS bridging - exception during acceptFile: " << arg;
352 }
353}
354
355void
356MessagesAdapter::refuseFile(const QString &arg)
357{
358 try {
359 auto interactionUid = arg.toLongLong();
ababi0b686642020-08-18 17:21:28 +0200360 const auto convUid = LRCInstance::getCurrentConvUid();
Sébastien Blin1f915762020-08-03 13:27:42 -0400361 LRCInstance::getCurrentConversationModel()->cancelTransfer(convUid, interactionUid);
362 } catch (...) {
363 qDebug() << "JS bridging - exception during refuseFile:" << arg;
364 }
365}
366
367void
368MessagesAdapter::pasteKeyDetected()
369{
370 const QMimeData *mimeData = QApplication::clipboard()->mimeData();
371
372 if (mimeData->hasImage()) {
373 /*
374 * Save temp data into base64 format.
375 */
376 QPixmap pixmap = qvariant_cast<QPixmap>(mimeData->imageData());
377 QByteArray ba;
378 QBuffer bu(&ba);
379 bu.open(QIODevice::WriteOnly);
380 pixmap.save(&bu, "PNG");
381 auto str = QString::fromLocal8Bit(ba.toBase64());
382
383 setMessagesImageContent(str, true);
384 } else if (mimeData->hasUrls()) {
385 QList<QUrl> urlList = mimeData->urls();
386 /*
387 * Extract the local paths of the files.
388 */
389 for (int i = 0; i < urlList.size(); ++i) {
390 /*
391 * Trim file:/// from url.
392 */
393 QString filePath = urlList.at(i).toString().remove(0, 8);
394 QByteArray imageFormat = QImageReader::imageFormat(filePath);
395
396 /*
397 * Check if file is qt supported image file type.
398 */
399 if (!imageFormat.isEmpty()) {
400 setMessagesImageContent(filePath);
401 } else {
402 setMessagesFileContent(filePath);
403 }
404 }
405 } else {
406 QMetaObject::invokeMethod(qmlObj_,
407 "webViewRunJavaScript",
408 Q_ARG(QVariant,
409 QStringLiteral("replaceText(`%1`)").arg(mimeData->text())));
410 }
411}
412
413void
414MessagesAdapter::onComposing(bool isComposing)
415{
416 LRCInstance::getCurrentConversationModel()->setIsComposing(LRCInstance::getCurrentConvUid(),
417 isComposing);
418}
419
420void
421MessagesAdapter::setConversationProfileData(const lrc::api::conversation::Info &convInfo)
422{
ababi0b686642020-08-18 17:21:28 +0200423 auto* convModel = LRCInstance::getCurrentConversationModel();
Sébastien Blin1f915762020-08-03 13:27:42 -0400424 auto accInfo = &LRCInstance::getCurrentAccountInfo();
ababi0b686642020-08-18 17:21:28 +0200425 const auto conv = convModel->getConversationForUID(convInfo.uid);
Sébastien Blin1f915762020-08-03 13:27:42 -0400426
ababi0b686642020-08-18 17:21:28 +0200427 if (conv.participants.isEmpty()) {
428 return;
429 }
430
431 auto contactUri = conv.participants.front();
Sébastien Blin1f915762020-08-03 13:27:42 -0400432 if (contactUri.isEmpty()) {
433 return;
434 }
435 try {
436 auto &contact = accInfo->contactModel->getContact(contactUri);
437 auto bestName = Utils::bestNameForConversation(convInfo, *convModel);
438 setInvitation(contact.profileInfo.type == lrc::api::profile::Type::PENDING,
439 bestName,
440 contactUri);
441
442 if (!contact.profileInfo.avatar.isEmpty()) {
443 setSenderImage(contactUri, contact.profileInfo.avatar);
444 } else {
445 auto avatar = Utils::conversationPhoto(convInfo.uid, *accInfo, true);
446 QByteArray ba;
447 QBuffer bu(&ba);
448 avatar.save(&bu, "PNG");
449 setSenderImage(contactUri, QString::fromLocal8Bit(ba.toBase64()));
450 }
451 } catch (...) {
452 }
453}
454
455void
456MessagesAdapter::newInteraction(const QString &accountId,
457 const QString &convUid,
458 uint64_t interactionId,
459 const interaction::Info &interaction)
460{
461 Q_UNUSED(interactionId);
462 try {
463 auto &accountInfo = LRCInstance::getAccountInfo(accountId);
464 auto &convModel = accountInfo.conversationModel;
ababi0b686642020-08-18 17:21:28 +0200465 const auto conversation = convModel->getConversationForUID(convUid);
Sébastien Blin1f915762020-08-03 13:27:42 -0400466
467 if (conversation.uid.isEmpty()) {
468 return;
469 }
470 if (!interaction.authorUri.isEmpty()
471 && (!QApplication::focusWindow() || LRCInstance::getCurrAccId() != accountId)) {
472 /*
473 * TODO: Notification from other accounts.
474 */
475 }
476 if (convUid != LRCInstance::getCurrentConvUid()) {
477 return;
478 }
479 convModel->clearUnreadInteractions(convUid);
480 printNewInteraction(*convModel, interactionId, interaction);
481 } catch (...) {
482 }
483}
484
485void
486MessagesAdapter::updateDraft()
487{
488 Utils::oneShotConnect(qmlObj_,
489 SIGNAL(sendMessageContentSaved(const QString &)),
490 this,
491 SLOT(slotUpdateDraft(const QString &)));
492
493 requestSendMessageContent();
494}
495
496/*
497 * JS invoke.
498 */
499void
500MessagesAdapter::setMessagesVisibility(bool visible)
501{
502 QString s = QString::fromLatin1(visible ? "showMessagesDiv();" : "hideMessagesDiv();");
503 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
504}
505
506void
507MessagesAdapter::requestSendMessageContent()
508{
509 QString s = QString::fromLatin1("requestSendMessageContent();");
510 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
511}
512
513void
514MessagesAdapter::setInvitation(bool show, const QString &contactUri, const QString &contactId)
515{
516 QString s
517 = show
518 ? QString::fromLatin1("showInvitation(\"%1\", \"%2\")").arg(contactUri).arg(contactId)
519 : QString::fromLatin1("showInvitation()");
520
521 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
522}
523
524void
525MessagesAdapter::clear()
526{
527 QString s = QString::fromLatin1("clearMessages();");
528 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
529}
530
531void
532MessagesAdapter::printHistory(lrc::api::ConversationModel &conversationModel,
533 const std::map<uint64_t, lrc::api::interaction::Info> interactions)
534{
535 auto interactionsStr = interactionsToJsonArrayObject(conversationModel, interactions).toUtf8();
536 QString s = QString::fromLatin1("printHistory(%1);").arg(interactionsStr.constData());
537 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
538}
539
540void
541MessagesAdapter::setSenderImage(const QString &sender, const QString &senderImage)
542{
543 QJsonObject setSenderImageObject = QJsonObject();
544 setSenderImageObject.insert("sender_contact_method", QJsonValue(sender));
545 setSenderImageObject.insert("sender_image", QJsonValue(senderImage));
546
547 auto setSenderImageObjectString = QString(
548 QJsonDocument(setSenderImageObject).toJson(QJsonDocument::Compact));
549 QString s = QString::fromLatin1("setSenderImage(%1);")
550 .arg(setSenderImageObjectString.toUtf8().constData());
551 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
552}
553
554void
555MessagesAdapter::printNewInteraction(lrc::api::ConversationModel &conversationModel,
556 uint64_t msgId,
557 const lrc::api::interaction::Info &interaction)
558{
559 auto interactionObject
560 = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8();
561 if (interactionObject.isEmpty()) {
562 return;
563 }
564 QString s = QString::fromLatin1("addMessage(%1);").arg(interactionObject.constData());
565 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
566}
567
568void
569MessagesAdapter::updateInteraction(lrc::api::ConversationModel &conversationModel,
570 uint64_t msgId,
571 const lrc::api::interaction::Info &interaction)
572{
573 auto interactionObject
574 = interactionToJsonInteractionObject(conversationModel, msgId, interaction).toUtf8();
575 if (interactionObject.isEmpty()) {
576 return;
577 }
578 QString s = QString::fromLatin1("updateMessage(%1);").arg(interactionObject.constData());
579 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
580}
581
582void
583MessagesAdapter::setMessagesImageContent(const QString &path, bool isBased64)
584{
585 if (isBased64) {
586 QString param = QString("addImage_base64('file://%1')").arg(path);
587 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, param));
588 } else {
589 QString param = QString("addImage_path('file://%1')").arg(path);
590 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, param));
591 }
592}
593
594void
595MessagesAdapter::setMessagesFileContent(const QString &path)
596{
597 qint64 fileSize = QFileInfo(path).size();
598 QString fileName = QFileInfo(path).fileName();
599 /*
600 * If file name is too large, trim it.
601 */
602 if (fileName.length() > 15) {
603 fileName = fileName.remove(12, fileName.length() - 12) + "...";
604 }
605 QString param = QString("addFile_path('%1','%2','%3')")
606 .arg(path, fileName, Utils::humanFileSize(fileSize));
607
608 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, param));
609}
610
611void
612MessagesAdapter::removeInteraction(uint64_t interactionId)
613{
614 QString s = QString::fromLatin1("removeInteraction(%1);").arg(QString::number(interactionId));
615 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
616}
617
618void
619MessagesAdapter::setSendMessageContent(const QString &content)
620{
621 QString s = QString::fromLatin1("setSendMessageContent(`%1`);").arg(content);
622 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
623}
624
625void
626MessagesAdapter::contactIsComposing(const QString &uid, const QString &contactUri, bool isComposing)
627{
628 if (LRCInstance::getCurrentConvUid() == uid) {
629 QString s
630 = QString::fromLatin1("showTypingIndicator(`%1`, %2);").arg(contactUri).arg(isComposing);
631 QMetaObject::invokeMethod(qmlObj_, "webViewRunJavaScript", Q_ARG(QVariant, s));
632 }
633}
634
635void
Ming Rui Zhang96808872020-08-27 12:59:09 -0400636MessagesAdapter::acceptInvitation(const QString &convUid)
Sébastien Blin1f915762020-08-03 13:27:42 -0400637{
Ming Rui Zhang96808872020-08-27 12:59:09 -0400638 const auto currentConvUid = convUid.isEmpty() ? LRCInstance::getCurrentConvUid() : convUid;
639 LRCInstance::getCurrentConversationModel()->makePermanent(currentConvUid);
Sébastien Blin1f915762020-08-03 13:27:42 -0400640}
641
642void
Ming Rui Zhang96808872020-08-27 12:59:09 -0400643MessagesAdapter::refuseInvitation(const QString &convUid)
Sébastien Blin1f915762020-08-03 13:27:42 -0400644{
Ming Rui Zhang96808872020-08-27 12:59:09 -0400645 const auto currentConvUid = convUid.isEmpty() ? LRCInstance::getCurrentConvUid() : convUid;
646 LRCInstance::getCurrentConversationModel()->removeConversation(currentConvUid, false);
Sébastien Blin1f915762020-08-03 13:27:42 -0400647 setInvitation(false);
648}
649
650void
Ming Rui Zhang96808872020-08-27 12:59:09 -0400651MessagesAdapter::blockConversation(const QString &convUid)
Sébastien Blin1f915762020-08-03 13:27:42 -0400652{
Ming Rui Zhang96808872020-08-27 12:59:09 -0400653 const auto currentConvUid = convUid.isEmpty() ? LRCInstance::getCurrentConvUid() : convUid;
654 LRCInstance::getCurrentConversationModel()->removeConversation(currentConvUid, true);
Sébastien Blin1f915762020-08-03 13:27:42 -0400655 setInvitation(false);
656}