diff --git a/src/TimelineView.cc b/src/TimelineView.cc
index ed046fe1..bdc59af3 100644
--- a/src/TimelineView.cc
+++ b/src/TimelineView.cc
@@ -21,6 +21,7 @@
#include <QSettings>
#include <QTimer>
+#include "FileItem.h"
#include "FloatingButton.h"
#include "ImageItem.h"
#include "RoomMessages.h"
@@ -331,6 +332,34 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire
updateLastSender(emote.sender(), direction);
return createTimelineItem(emote, with_sender);
+ } else if (msg_type == events::MessageEventType::File) {
+ events::MessageEvent<msgs::File> file;
+
+ try {
+ file.deserialize(event);
+ } catch (const DeserializationException &e) {
+ qWarning() << e.what() << event;
+ return nullptr;
+ }
+
+ if (isDuplicate(file.eventId()))
+ return nullptr;
+
+ eventIds_[file.eventId()] = true;
+
+ QString txnid = file.unsignedData().transactionId();
+
+ if (!txnid.isEmpty() &&
+ isPendingMessage(txnid, file.sender(), local_user_)) {
+ removePendingMessage(txnid);
+ return nullptr;
+ }
+
+ auto withSender = isSenderRendered(file.sender(), direction);
+
+ updateLastSender(file.sender(), direction);
+
+ return createTimelineItem(file, withSender);
} else if (msg_type == events::MessageEventType::Unknown) {
// TODO Handle redacted messages.
// Silenced for now.
@@ -470,6 +499,15 @@ TimelineView::createTimelineItem(const events::MessageEvent<msgs::Image> &event,
}
TimelineItem *
+TimelineView::createTimelineItem(const events::MessageEvent<msgs::File> &event, bool withSender)
+{
+ auto file = new FileItem(client_, event);
+ auto item = new TimelineItem(file, event, withSender, scroll_widget_);
+
+ return item;
+}
+
+TimelineItem *
TimelineView::createTimelineItem(const events::MessageEvent<msgs::Notice> &event, bool with_sender)
{
TimelineItem *item = new TimelineItem(event, with_sender, scroll_widget_);
|