feat: Add support for messages filter in MessageListView and MessageListCore (#303)

* [MessageListView, MessageListCore] Add support for message filter

Signed-off-by: Sahil Kumar <[email protected]>

* [UI-Kit -> Pubspec] Remove `stream_chat_flutter_core` relative import

Signed-off-by: Sahil Kumar <[email protected]>
This commit is contained in:
Sahil Kumar
2021-03-02 16:27:58 +01:00
committed by GitHub
parent a14e54591d
commit c5a9a42c45
2 changed files with 20 additions and 6 deletions
@@ -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<String, AttachmentBuilder> customAttachmentBuilders;
@@ -281,6 +285,7 @@ class _MessageListViewState extends State<MessageListView> {
@override
Widget build(BuildContext context) {
return MessageListCore(
messageFilter: widget.messageFilter,
loadingBuilder: widget.loadingBuilder ??
(context) {
return Center(
@@ -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<MessageListCore> {
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<MessageListCore> {
.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<List<Message>>(
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);