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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user