From e0c8068fbdc9a8fdba1ce696d198f17870391232 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 25 Jan 2021 09:54:16 +0100 Subject: [PATCH] add messageFilter property in messageListView --- example/lib/main.dart | 4 ++-- lib/src/message_list_view.dart | 27 ++++++++++++++++++--------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index f048f584..4b8418e9 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -59,7 +59,7 @@ void _initNotifications(Client client) { if (connector.token.value != null) { client.addDevice( connector.token.value, - Platform.isAndroid ? 'firebase' : 'apn', + Platform.isAndroid ? PushProvider.firebase : PushProvider.apn, ); } }); @@ -127,7 +127,7 @@ class ChannelListPage extends StatelessWidget { '\$in': [StreamChat.of(context).user.id], } }, - // sort: [SortOption('last_message_at')], + sort: [SortOption('last_message_at')], pagination: PaginationParams( limit: 20, ), diff --git a/lib/src/message_list_view.dart b/lib/src/message_list_view.dart index f1d1a2ce..8b6876d2 100644 --- a/lib/src/message_list_view.dart +++ b/lib/src/message_list_view.dart @@ -108,6 +108,7 @@ class MessageListView extends StatefulWidget { this.onParentMessageTap, this.scrollPhysics = const AlwaysScrollableScrollPhysics(), this.keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual, + this.messageFilter, }) : super(key: key); /// Function used to build a custom message widget @@ -119,6 +120,9 @@ class MessageListView extends StatefulWidget { /// Function used to build a custom thread widget final ThreadBuilder threadBuilder; + /// Filter applied to the message list before rendering + final bool Function(Message) messageFilter; + /// Function called when tapping on a thread /// By default it calls [Navigator.push] using the widget built using [threadBuilder] final ThreadTapCallback onThreadTap; @@ -518,15 +522,20 @@ class _MessageListViewState extends State { .map((threads) => threads[widget.parentMessage.id]); } - _streamListener = stream - .map((messages) => - messages - ?.where((m) => - !(m.status == MessageSendingStatus.FAILED && m.isDeleted) && - m.shadowed != true) - ?.toList() ?? - []) - .listen((newMessages) { + _streamListener = stream.map((messages) { + final filteredMessages = messages + ?.where((m) => + !(m.status == MessageSendingStatus.FAILED && m.isDeleted) && + m.shadowed != true) + ?.toList() ?? + []; + + if (widget.messageFilter != null) { + return messages.where(widget.messageFilter).toList(); + } + + return filteredMessages; + }).listen((newMessages) { newMessages = newMessages.reversed.toList(); if (_messages.isEmpty || newMessages.isEmpty ||