From 9c84866bd29d19dd18bfba0c508252197f4218bf Mon Sep 17 00:00:00 2001 From: Jonathan Ma Date: Tue, 21 Apr 2026 10:49:14 -0400 Subject: [PATCH] show last message instead of last event for previews --- commet/lib/client/matrix/matrix_room.dart | 20 +++++++++++++++++++ .../matrix_background_room.dart | 3 +++ commet/lib/client/room.dart | 3 +++ commet/lib/ui/navigation/quick_switcher.dart | 16 +++++++-------- .../home_screen/home_screen_view.dart | 20 +++++++++---------- .../space_summary/space_summary_view.dart | 10 +++++----- 6 files changed, 49 insertions(+), 23 deletions(-) diff --git a/commet/lib/client/matrix/matrix_room.dart b/commet/lib/client/matrix/matrix_room.dart index 80d5348e2..c6811748d 100644 --- a/commet/lib/client/matrix/matrix_room.dart +++ b/commet/lib/client/matrix/matrix_room.dart @@ -41,6 +41,7 @@ import 'package:commet/client/member.dart'; import 'package:commet/client/permissions.dart'; import 'package:commet/client/role.dart'; import 'package:commet/client/timeline_events/timeline_event.dart'; +import 'package:commet/client/timeline_events/timeline_event_emote.dart'; import 'package:commet/client/timeline_events/timeline_event_message.dart'; import 'package:commet/client/timeline_events/timeline_event_sticker.dart'; import 'package:commet/config/build_config.dart'; @@ -111,6 +112,9 @@ class MatrixRoom extends Room { @override TimelineEvent? lastEvent; + @override + TimelineEvent? lastMessage; + @override Iterable get memberIds => _matrixRoom.getParticipants([matrix.Membership.join]).map((e) => e.id); @@ -223,6 +227,10 @@ class MatrixRoom extends Room { if (latest != null) { lastEvent = convertEvent(latest); + + if (latest.type == matrix.EventTypes.Message) { + lastMessage = lastEvent; + } } updateAvatar(); @@ -284,6 +292,18 @@ class MatrixRoom extends Room { lastEvent = event; _onUpdate.add(null); } + + if (event is TimelineEventMessage || + event is TimelineEventSticker || + event is TimelineEventEmote) { + if (lastMessage == null) { + lastMessage = event; + _onUpdate.add(null); + } else if (event.originServerTs.isAfter(lastMessage!.originServerTs)) { + lastMessage = event; + _onUpdate.add(null); + } + } } } diff --git a/commet/lib/client/matrix_background/matrix_background_room.dart b/commet/lib/client/matrix_background/matrix_background_room.dart index 67513dafd..41c598aec 100644 --- a/commet/lib/client/matrix_background/matrix_background_room.dart +++ b/commet/lib/client/matrix_background/matrix_background_room.dart @@ -224,6 +224,9 @@ class MatrixBackgroundRoom implements Room { @override TimelineEvent? get lastEvent => throw UnimplementedError(); + @override + TimelineEvent? get lastMessage => throw UnimplementedError(); + @override DateTime get lastEventTimestamp => throw UnimplementedError(); diff --git a/commet/lib/client/room.dart b/commet/lib/client/room.dart index 5a3173a7b..25195a76a 100644 --- a/commet/lib/client/room.dart +++ b/commet/lib/client/room.dart @@ -216,6 +216,9 @@ abstract class Room { /// The last known event in the room timeline TimelineEvent? get lastEvent; + /// The last message in the room timeline (filters out non-message events) + TimelineEvent? get lastMessage; + T? getComponent(); List getAllComponents>(); diff --git a/commet/lib/ui/navigation/quick_switcher.dart b/commet/lib/ui/navigation/quick_switcher.dart index 99a4a6ca1..777bb502e 100644 --- a/commet/lib/ui/navigation/quick_switcher.dart +++ b/commet/lib/ui/navigation/quick_switcher.dart @@ -57,8 +57,8 @@ class QuickSwitcherSearchItemRoom implements QuickSwitcherSearchItem { @override Widget build(BuildContext context) { - var sender = room.lastEvent != null - ? room.getMemberOrFallback(room.lastEvent!.senderId) + var sender = room.lastMessage != null + ? room.getMemberOrFallback(room.lastMessage!.senderId) : null; return RoomPanel( @@ -68,7 +68,7 @@ class QuickSwitcherSearchItemRoom implements QuickSwitcherSearchItem { avatar: room.avatar, recentEventSender: sender?.displayName, recentEventSenderColor: sender?.defaultColor, - body: room.lastEvent?.plainTextBody, + body: room.lastMessage?.plainTextBody, ); } @@ -195,17 +195,17 @@ class _QuickSwitcherState extends State { displayName: room.displayName, color: room.defaultColor, avatar: room.avatar, - recentEventSender: room.lastEvent != null + recentEventSender: room.lastMessage != null ? room - .getMemberOrFallback(room.lastEvent!.senderId) + .getMemberOrFallback(room.lastMessage!.senderId) .displayName : null, - recentEventSenderColor: room.lastEvent != null + recentEventSenderColor: room.lastMessage != null ? room - .getMemberOrFallback(room.lastEvent!.senderId) + .getMemberOrFallback(room.lastMessage!.senderId) .defaultColor : null, - body: room.lastEvent?.plainTextBody, + body: room.lastMessage?.plainTextBody, ) ], )) diff --git a/commet/lib/ui/organisms/home_screen/home_screen_view.dart b/commet/lib/ui/organisms/home_screen/home_screen_view.dart index f6def7809..7d2c0f997 100644 --- a/commet/lib/ui/organisms/home_screen/home_screen_view.dart +++ b/commet/lib/ui/organisms/home_screen/home_screen_view.dart @@ -107,14 +107,14 @@ class HomeScreenView extends StatelessWidget { displayName: room.displayName, avatar: room.avatar, color: room.defaultColor, - body: room.lastEvent?.plainTextBody, - recentEventSender: room.lastEvent != null + body: room.lastMessage?.plainTextBody, + recentEventSender: room.lastMessage != null ? room - .getMemberOrFallback(room.lastEvent!.senderId) + .getMemberOrFallback(room.lastMessage!.senderId) .displayName : null, - recentEventSenderColor: room.lastEvent != null - ? room.getColorOfUser(room.lastEvent!.senderId) + recentEventSenderColor: room.lastMessage != null + ? room.getColorOfUser(room.lastMessage!.senderId) : null, onTap: () => onRoomClicked?.call(room), showUserAvatar: clientManager.rooms @@ -147,14 +147,14 @@ class HomeScreenView extends StatelessWidget { displayName: room.displayName, avatar: room.avatar, color: room.defaultColor, - body: room.lastEvent?.plainTextBody, - recentEventSender: room.lastEvent != null + body: room.lastMessage?.plainTextBody, + recentEventSender: room.lastMessage != null ? room - .getMemberOrFallback(room.lastEvent!.senderId) + .getMemberOrFallback(room.lastMessage!.senderId) .displayName : null, - recentEventSenderColor: room.lastEvent != null - ? room.getColorOfUser(room.lastEvent!.senderId) + recentEventSenderColor: room.lastMessage != null + ? room.getColorOfUser(room.lastMessage!.senderId) : null, onTap: () => onRoomClicked?.call(room), showUserAvatar: clientManager.rooms diff --git a/commet/lib/ui/organisms/space_summary/space_summary_view.dart b/commet/lib/ui/organisms/space_summary/space_summary_view.dart index 2dc56b9ae..a62dd5b9b 100644 --- a/commet/lib/ui/organisms/space_summary/space_summary_view.dart +++ b/commet/lib/ui/organisms/space_summary/space_summary_view.dart @@ -564,12 +564,12 @@ class SpaceSummaryViewState extends State { widget.onRoomTap?.call(room); } : null, - body: room.lastEvent?.plainTextBody, - recentEventSender: room.lastEvent != null - ? room.getMemberOrFallback(room.lastEvent!.senderId).displayName + body: room.lastMessage?.plainTextBody, + recentEventSender: room.lastMessage != null + ? room.getMemberOrFallback(room.lastMessage!.senderId).displayName : null, - recentEventSenderColor: room.lastEvent != null - ? room.getColorOfUser(room.lastEvent!.senderId) + recentEventSenderColor: room.lastMessage != null + ? room.getColorOfUser(room.lastMessage!.senderId) : null, ); } else if (item case SpaceChildSpace _) {