diff --git a/web/src/api/statestore.ts b/web/src/api/statestore.ts
index 67b1f12..d95e78b 100644
--- a/web/src/api/statestore.ts
+++ b/web/src/api/statestore.ts
@@ -194,6 +194,7 @@ export interface RoomListEntry {
room_id: RoomID
sorting_timestamp: number
preview_event?: MemDBEvent
+ preview_sender?: MemDBEvent
name: string
avatar?: ContentURI
}
@@ -212,10 +213,13 @@ export class StateStore {
if (!room) {
room = this.rooms.get(entry.meta.room_id)
}
+ const preview_event = room?.eventsByRowID.get(entry.meta.preview_event_rowid)
+ const preview_sender = preview_event && room?.getStateEvent("m.room.member", preview_event.sender)
return {
room_id: entry.meta.room_id,
sorting_timestamp: entry.meta.sorting_timestamp,
- preview_event: room?.eventsByRowID.get(entry.meta.preview_event_rowid),
+ preview_event,
+ preview_sender,
name: entry.meta.name ?? "Unnamed room",
avatar: entry.meta.avatar,
}
diff --git a/web/src/ui/roomlist/Entry.tsx b/web/src/ui/roomlist/Entry.tsx
index 6b3108d..f179dc3 100644
--- a/web/src/ui/roomlist/Entry.tsx
+++ b/web/src/ui/roomlist/Entry.tsx
@@ -15,7 +15,7 @@
// along with this program. If not, see .
import { getMediaURL } from "../../api/media.ts"
import type { RoomListEntry } from "../../api/statestore.ts"
-import type { MemDBEvent } from "../../api/types"
+import type { MemDBEvent, MemberEventContent } from "../../api/types"
export interface RoomListEntryProps {
room: RoomListEntry
@@ -23,18 +23,25 @@ export interface RoomListEntryProps {
isActive: boolean
}
-function makePreviewText(evt?: MemDBEvent): string {
+function makePreviewText(evt?: MemDBEvent, senderMemberEvt?: MemDBEvent): [string, string] {
if (!evt) {
- return ""
+ return ["", ""]
}
if ((evt.type === "m.room.message" || evt.type === "m.sticker") && typeof evt.content.body === "string") {
- return evt.content.body
+ let displayname = (senderMemberEvt?.content as MemberEventContent)?.displayname
+ if (!displayname) {
+ displayname = evt.sender.slice(1).split(":")[0]
+ }
+ return [
+ `${displayname}: ${evt.content.body}`,
+ `${displayname.length > 16 ? displayname.slice(0, 12) + "…" : displayname}: ${evt.content.body}`,
+ ]
}
- return ""
+ return ["", ""]
}
const Entry = ({ room, setActiveRoom, isActive }: RoomListEntryProps) => {
- const previewText = makePreviewText(room.preview_event)
+ const [previewText, croppedPreviewText] = makePreviewText(room.preview_event, room.preview_sender)
return
{
{room.name}
- {previewText &&
{previewText}
}
+ {previewText &&
{croppedPreviewText}
}
}
diff --git a/web/src/ui/roomlist/RoomList.css b/web/src/ui/roomlist/RoomList.css
index 8e27b95..6ca52b9 100644
--- a/web/src/ui/roomlist/RoomList.css
+++ b/web/src/ui/roomlist/RoomList.css
@@ -45,6 +45,16 @@ div.room-list {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
+
+ > span.sender-name {
+ display: block;
+ max-width: 6rem;
+ overflow: hidden;
+ }
+
+ > span.preview-text {
+ display: block;
+ }
}
}
}
diff --git a/websocket.go b/websocket.go
index f9d2a7c..089d577 100644
--- a/websocket.go
+++ b/websocket.go
@@ -254,11 +254,19 @@ func (gmx *Gomuks) sendInitialData(ctx context.Context, conn *websocket.Conn) {
return
}
if previewEvent != nil {
+ previewMember, err := gmx.Client.DB.CurrentState.Get(ctx, room.ID, event.StateMember, previewEvent.Sender.String())
+ if err != nil {
+ log.Err(err).Msg("Failed to get preview member event for room")
+ } else if previewMember != nil {
+ syncRoom.Events = append(syncRoom.Events, previewMember)
+ syncRoom.State[event.StateMember] = map[string]database.EventRowID{
+ *previewMember.StateKey: previewMember.RowID,
+ }
+ }
if previewEvent.LastEditRowID != nil {
lastEdit, err := gmx.Client.DB.Event.GetByRowID(ctx, *previewEvent.LastEditRowID)
if err != nil {
log.Err(err).Msg("Failed to get last edit for preview event")
- return
} else if lastEdit != nil {
syncRoom.Events = append(syncRoom.Events, lastEdit)
}