diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index d6eb0148..d0b287b1 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -135,6 +135,7 @@ class MessageListView extends StatefulWidget { this.systemMessageBuilder, this.messageListBuilder, this.errorWidgetBuilder, + this.messageFilter, this.customAttachmentBuilders, this.onMessageTap, this.onSystemMessageTap, @@ -214,6 +215,9 @@ class MessageListView extends StatefulWidget { /// of a connection failure. final ErrorBuilder errorWidgetBuilder; + /// Predicate used to filter messages + final bool Function(Message) messageFilter; + /// Attachment builders for the default message widget /// Please change this in the [MessageWidget] if you are using a custom implementation final Map customAttachmentBuilders; @@ -281,6 +285,7 @@ class _MessageListViewState extends State { @override Widget build(BuildContext context) { return MessageListCore( + messageFilter: widget.messageFilter, loadingBuilder: widget.loadingBuilder ?? (context) { return Center( diff --git a/packages/stream_chat_flutter_core/lib/src/message_list_core.dart b/packages/stream_chat_flutter_core/lib/src/message_list_core.dart index 64e8f255..b162dfca 100644 --- a/packages/stream_chat_flutter_core/lib/src/message_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/message_list_core.dart @@ -64,6 +64,7 @@ class MessageListCore extends StatefulWidget { this.showScrollToBottom = true, this.parentMessage, this.messageListController, + this.messageFilter, }) : assert(loadingBuilder != null), assert(emptyBuilder != null), assert(messageListBuilder != null), @@ -95,6 +96,9 @@ class MessageListCore extends StatefulWidget { /// first message or the parent of the conversation. final Message parentMessage; + /// Predicate used to filter messages + final bool Function(Message) messageFilter; + @override _MessageListCoreState createState() => _MessageListCoreState(); } @@ -106,6 +110,8 @@ class _MessageListCoreState extends State { bool get _isThreadConversation => widget.parentMessage != null; + OwnUser get _currentUser => streamChannel.channel.client.state.user; + int initialIndex; double initialAlignment; @@ -121,13 +127,16 @@ class _MessageListCoreState extends State { .map((threads) => threads[widget.parentMessage.id]) : streamChannel.channel.state?.messagesStream; + bool defaultFilter(Message m) { + final isMyMessage = m.user.id == _currentUser.id; + final isDeletedOrShadowed = m.isDeleted || m.shadowed; + if (isDeletedOrShadowed && !isMyMessage) return false; + return true; + } + return StreamBuilder>( - stream: messagesStream?.map((messages) => messages - ?.where((e) => - (!e.isDeleted && e.shadowed != true) || - (e.isDeleted && - e.user.id == streamChannel.channel.client.state.user.id)) - ?.toList()), + stream: messagesStream?.map((messages) => + messages?.where(widget.messageFilter ?? defaultFilter)?.toList()), builder: (context, snapshot) { if (!snapshot.hasData) { return widget.loadingBuilder(context);