diff --git a/src/gui/Pages/Chat/Timeline/EventContent.qml b/src/gui/Pages/Chat/Timeline/EventContent.qml
index a799f390..b0fd0dbb 100644
--- a/src/gui/Pages/Chat/Timeline/EventContent.qml
+++ b/src/gui/Pages/Chat/Timeline/EventContent.qml
@@ -37,7 +37,8 @@ HRowLayout {
readonly property string timeText: utils.formatTime(model.date, false)
readonly property string stateText:
- `` +
+ ` ⧗` : // U+29D7
@@ -46,7 +47,7 @@ HRowLayout {
model.read_by_count : // U+29BF
">"
- ) + ""
+ ) + ""
readonly property bool pureMedia: ! contentText && linksRepeater.count
@@ -260,6 +261,37 @@ HRowLayout {
acceptedPointerTypes: PointerDevice.Finger | PointerDevice.Pen
}
+ HToolTip {
+ visible: eventContent.hoveredLink === "#state-text"
+ label.textFormat: HLabel.StyledText
+ text: {
+ if (! visible) return ""
+
+ const members =
+ ModelStore.get(chat.userId, chat.roomId, "members")
+
+ const readBy = Object.entries(
+ JSON.parse(model.last_read_by)
+ ).sort((a, b) => a[1] - b[1]) // sort by values (dates)
+
+ const lines = []
+
+ for (const [userId, epoch] of readBy) {
+ const member = members.find(userId)
+
+ const by = utils.coloredNameHtml(
+ member ? member.display_name: userId, userId,
+ )
+ const at = utils.formatRelativeTime(
+ new Date(epoch) - model.date,
+ )
+ lines.push(qsTr("Seen by %1 %2 after").arg(by).arg(at))
+ }
+
+ return lines.join("
")
+ }
+ }
+
Rectangle {
id: contentBackground
width: Math.max(