From c5a9a42c450c292f5958b34e27fd9cfa3a6ff503 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Tue, 2 Mar 2021 20:57:58 +0530 Subject: [PATCH] feat: Add support for messages filter in `MessageListView` and `MessageListCore` (#303) * [MessageListView, MessageListCore] Add support for message filter Signed-off-by: Sahil Kumar * [UI-Kit -> Pubspec] Remove `stream_chat_flutter_core` relative import Signed-off-by: Sahil Kumar --- .../lib/src/message_list_view.dart | 5 +++++ .../lib/src/message_list_core.dart | 21 +++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) 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);