From 66249ed12628b9bb5cf0603a627858d921e8b41a Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Sun, 17 Jun 2018 02:29:19 +0300 Subject: [PATCH] Correctly mark received messages whose response came after /sync --- include/timeline/TimelineItem.h | 5 +++++ src/timeline/TimelineItem.cc | 1 + src/timeline/TimelineView.cc | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/include/timeline/TimelineItem.h b/include/timeline/TimelineItem.h index 6623a82c..f055f217 100644 --- a/include/timeline/TimelineItem.h +++ b/include/timeline/TimelineItem.h @@ -193,6 +193,7 @@ public: QString eventId() const { return event_id_; } void setEventId(const QString &event_id) { event_id_ = event_id; } void markReceived(); + bool isReceived() { return isReceived_; }; void setRoomId(QString room_id) { room_id_ = room_id; } void sendReadReceipt() const; @@ -225,6 +226,10 @@ private: void setupAvatarLayout(const QString &userName); void setupSimpleLayout(); + //! Whether or not the event associated with the widget + //! has been acknowledged by the server. + bool isReceived_ = false; + QString replaceEmoji(const QString &body); QString event_id_; QString room_id_; diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc index 3505d347..c104801d 100644 --- a/src/timeline/TimelineItem.cc +++ b/src/timeline/TimelineItem.cc @@ -432,6 +432,7 @@ TimelineItem::TimelineItem(const mtx::events::RoomEvent void TimelineItem::markReceived() { + isReceived_ = true; checkmark_->setText(CHECKMARK); checkmark_->setAlignment(Qt::AlignTop); diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc index 5ee2d32b..e437439e 100644 --- a/src/timeline/TimelineView.cc +++ b/src/timeline/TimelineView.cc @@ -602,11 +602,18 @@ TimelineView::updatePendingMessage(const std::string &txn_id, const QString &eve if (msg.widget) { msg.widget->setEventId(event_id); - msg.widget->markReceived(); eventIds_[event_id] = msg.widget; - } - pending_sent_msgs_.append(msg); + // If the response comes after we have received the event from sync + // we've already marked the widget as received. + if (!msg.widget->isReceived()) { + msg.widget->markReceived(); + pending_sent_msgs_.append(msg); + } + } else { + nhlog::ui()->warn("[{}] received message response for invalid widget", + txn_id); + } } sendNextPendingMessage(); @@ -809,10 +816,10 @@ TimelineView::removePendingMessage(const std::string &txn_id) } for (auto it = pending_msgs_.begin(); it != pending_msgs_.end(); ++it) { if (it->txn_id == txn_id) { - int index = std::distance(pending_msgs_.begin(), it); - pending_msgs_.removeAt(index); + if (it->widget) + it->widget->markReceived(); - nhlog::ui()->info("[{}] removed message before sync", txn_id); + nhlog::ui()->info("[{}] received sync before message response", txn_id); return; } }