summary refs log tree commit diff
path: root/src/timeline
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2022-06-15 15:24:07 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2022-06-15 15:24:07 +0200
commitbcc6c518be3956557a7046260c9aafc60468646d (patch)
treece736d12e13215f99f4acd83cefc6ea2a0343d3d /src/timeline
parentSpeedup startup by caching last message timestamp (diff)
downloadnheko-bcc6c518be3956557a7046260c9aafc60468646d.tar.xz
Fix edits not updating in replies
Diffstat (limited to 'src/timeline')
-rw-r--r--src/timeline/EventStore.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index 79bd028a..264cde77 100644
--- a/src/timeline/EventStore.cpp
+++ b/src/timeline/EventStore.cpp
@@ -384,6 +384,7 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
 
     for (const auto &event : events.events) {
         std::set<std::string> relates_to;
+        std::string edited_event;
         if (auto redaction =
               std::get_if<mtx::events::RedactionEvent<mtx::events::msg::Redaction>>(&event)) {
             // fixup reactions
@@ -402,8 +403,12 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
 
             relates_to.insert(redaction->redacts);
         } else {
-            for (const auto &r : mtx::accessors::relations(event).relations)
+            for (const auto &r : mtx::accessors::relations(event).relations) {
                 relates_to.insert(r.event_id);
+
+                if (r.rel_type == mtx::common::RelationType::Replace)
+                    edited_event = r.event_id;
+            }
         }
 
         for (const auto &relates_to_id : relates_to) {
@@ -425,6 +430,16 @@ EventStore::handleSync(const mtx::responses::Timeline &events)
             }
         }
 
+        if (!edited_event.empty()) {
+            for (const auto &downstream_event :
+                 cache::client()->relatedEvents(room_id_, edited_event)) {
+                auto idx = cache::client()->getTimelineIndex(room_id_, downstream_event);
+                if (idx) {
+                    emit dataChanged(toExternalIdx(*idx), toExternalIdx(*idx));
+                }
+            }
+        }
+
         // decrypting and checking some encrypted messages
         if (auto encrypted =
               std::get_if<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>(&event)) {