diff --git a/imports/NeoChat/Component/Timeline/StateDelegate.qml b/imports/NeoChat/Component/Timeline/StateDelegate.qml
index f54c3a92b..be845b353 100644
--- a/imports/NeoChat/Component/Timeline/StateDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/StateDelegate.qml
@@ -96,7 +96,7 @@ Control {
Layout.preferredHeight: icon.height
wrapMode: Text.WordWrap
textFormat: Text.RichText
- text: `${currentRoom.htmlSafeMemberName(author.id)} ${aggregateDisplay}`
+ text: `${model.authorDisplayName} ${aggregateDisplay}`
onLinkActivated: userDetailDialog.createObject(ApplicationWindow.overlay, {room: currentRoom, user: author.object, displayName: author.displayName, avatarMediaId: author.avatarMediaId, avatarUrl: author.avatarUrl}).open()
}
}
diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp
index b73b9c6b2..6f5234834 100644
--- a/src/messageeventmodel.cpp
+++ b/src/messageeventmodel.cpp
@@ -60,6 +60,7 @@ QHash MessageEventModel::roleNames() const
roles[MediaUrlRole] = "mediaUrl";
roles[VerifiedRole] = "verified";
roles[DisplayNameForInitialsRole] = "displayNameForInitials";
+ roles[AuthorDisplayNameRole] = "authorDisplayName";
return roles;
}
@@ -840,6 +841,19 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return user->displayname(m_currentRoom).remove(QStringLiteral(" (%1)").arg(user->id()));
}
+ if (role == AuthorDisplayNameRole) {
+ if (!evt.unsignedJson()["prev_content"]["displayname"].isNull()) {
+ auto previousDisplayName = evt.unsignedJson()["prev_content"]["displayname"].toString().toHtmlEscaped();
+ if (previousDisplayName.isEmpty()) {
+ previousDisplayName = evt.senderId();
+ }
+ return previousDisplayName;
+ } else {
+ auto author = static_cast(isPending ? m_currentRoom->localUser() : m_currentRoom->user(evt.senderId()));
+ m_currentRoom->htmlSafeMemberName(author->id());
+ }
+ }
+
return {};
}
diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h
index b371ffad9..387c6ce83 100644
--- a/src/messageeventmodel.h
+++ b/src/messageeventmodel.h
@@ -48,9 +48,10 @@ public:
EventResolvedTypeRole,
AuthorIdRole,
VerifiedRole,
-
// Sender's displayname, always without the matrix id
DisplayNameForInitialsRole,
+ // The displayname for the event's sender; for name change events, the old displayname
+ AuthorDisplayNameRole,
LastRole, // Keep this last
};
Q_ENUM(EventRoles)