diff --git a/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart b/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart index 0c78b926..16fcc5cc 100644 --- a/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart +++ b/packages/stream_chat_flutter/lib/src/v4/channel_list_view/stream_channel_list_tile.dart @@ -367,6 +367,11 @@ class ChannelLastMessageText extends StatelessWidget { final lastMessageAttachments = lastMessage.attachments; final lastMessageMentionedUsers = lastMessage.mentionedUsers; + final mentionedUsersRegex = RegExp( + lastMessageMentionedUsers.map((it) => '@${it.name}').join('|'), + caseSensitive: false, + ); + final messageTextParts = [ ...lastMessageAttachments.map((it) { if (it.type == 'image') { @@ -380,7 +385,11 @@ class ChannelLastMessageText extends StatelessWidget { ? (it.title ?? 'File') : '${it.title ?? 'File'} , '; }), - if (lastMessageText != null) lastMessageText, + if (lastMessageText != null) + if (lastMessageMentionedUsers.isNotEmpty) + ...mentionedUsersRegex.allMatchesWithSep(lastMessageText) + else + lastMessageText, ]; final fontStyle = (lastMessage.isSystem || lastMessage.isDeleted) @@ -399,7 +408,7 @@ class ChannelLastMessageText extends StatelessWidget { if (lastMessageMentionedUsers.isNotEmpty && lastMessageMentionedUsers.any((it) => '@${it.name}' == part)) TextSpan( - text: '$part ', + text: part, style: mentionsTextStyle, ) else if (lastMessageAttachments.isNotEmpty && @@ -407,12 +416,14 @@ class ChannelLastMessageText extends StatelessWidget { .where((it) => it.title != null) .any((it) => it.title == part)) TextSpan( - text: '$part ', - style: regularTextStyle, + text: part, + style: regularTextStyle?.copyWith( + fontStyle: FontStyle.italic, + ), ) else TextSpan( - text: part == messageTextParts.last ? part : '$part ', + text: part, style: regularTextStyle, ), ]; @@ -426,3 +437,18 @@ class ChannelLastMessageText extends StatelessWidget { }, ); } + +extension _RegExpX on RegExp { + List allMatchesWithSep(String input, [int start = 0]) { + final result = []; + for (final match in allMatches(input, start)) { + result.add(input.substring(start, match.start)); + // ignore: cascade_invocations + result.add(match[0]!); + // ignore: parameter_assignments + start = match.end; + } + result.add(input.substring(start)); + return result; + } +} diff --git a/packages/stream_chat_flutter/test/src/channel_preview_test.dart b/packages/stream_chat_flutter/test/src/channel_preview_test.dart index 63116196..47554605 100644 --- a/packages/stream_chat_flutter/test/src/channel_preview_test.dart +++ b/packages/stream_chat_flutter/test/src/channel_preview_test.dart @@ -71,7 +71,7 @@ void main() { child: StreamChannel( channel: channel, child: Scaffold( - body: StreamChannelPreview( + body: ChannelPreview( channel: channel, ), ),