fix: default message filter

This commit is contained in:
Gordon Hayes
2021-10-19 18:02:03 +02:00
parent 0c864a1453
commit b41b08cf34
2 changed files with 22 additions and 14 deletions
@@ -306,7 +306,12 @@ class _MessageListViewState extends State<MessageListView> {
final initialScrollIndex = widget.initialScrollIndex; final initialScrollIndex = widget.initialScrollIndex;
if (initialScrollIndex != null) return initialScrollIndex; if (initialScrollIndex != null) return initialScrollIndex;
if (streamChannel!.initialMessageId != null) { if (streamChannel!.initialMessageId != null) {
final messages = streamChannel!.channel.state!.messages; final messages = streamChannel!.channel.state!.messages
.where(widget.messageFilter ??
defaultMessageFilter(
streamChannel!.channel.client.state.currentUser!.id,
))
.toList(growable: false);
final totalMessages = messages.length; final totalMessages = messages.length;
final messageIndex = final messageIndex =
messages.indexWhere((e) => e.id == streamChannel!.initialMessageId); messages.indexWhere((e) => e.id == streamChannel!.initialMessageId);
@@ -9,6 +9,14 @@ import 'package:stream_chat_flutter_core/src/better_stream_builder.dart';
import 'package:stream_chat_flutter_core/src/stream_channel.dart'; import 'package:stream_chat_flutter_core/src/stream_channel.dart';
import 'package:stream_chat_flutter_core/src/typedef.dart'; import 'package:stream_chat_flutter_core/src/typedef.dart';
/// Default filter for the message list
bool Function(Message) defaultMessageFilter(String currentUserId) =>
(Message m) {
final isMyMessage = m.user?.id == currentUserId;
if (m.shadowed && !isMyMessage) return false;
return true;
};
/// [MessageListCore] is a simplified class that allows fetching a list of /// [MessageListCore] is a simplified class that allows fetching a list of
/// messages while exposing UI builders. /// messages while exposing UI builders.
/// ///
@@ -132,25 +140,20 @@ class MessageListCoreState extends State<MessageListCore> {
? _streamChannel!.channel.state?.threads[widget.parentMessage!.id] ? _streamChannel!.channel.state?.threads[widget.parentMessage!.id]
: _streamChannel!.channel.state?.messages; : _streamChannel!.channel.state?.messages;
bool defaultFilter(Message m) {
final isMyMessage = m.user?.id == _currentUser?.id;
if (m.shadowed && !isMyMessage) return false;
return true;
}
return BetterStreamBuilder<List<Message>>( return BetterStreamBuilder<List<Message>>(
initialData: initialData, initialData: initialData,
comparator: const ListEquality().equals, comparator: const ListEquality().equals,
stream: messagesStream!.map( stream: messagesStream,
(messages) =>
messages?.where(widget.messageFilter ?? defaultFilter).toList(
growable: false,
),
),
errorBuilder: widget.errorBuilder, errorBuilder: widget.errorBuilder,
noDataBuilder: widget.loadingBuilder, noDataBuilder: widget.loadingBuilder,
builder: (context, data) { builder: (context, data) {
final messageList = data.reversed.toList(growable: false); final messageList = data
.where(
widget.messageFilter ?? defaultMessageFilter(_currentUser!.id),
)
.toList(growable: false)
.reversed
.toList(growable: false);
if (messageList.isEmpty && !_isThreadConversation) { if (messageList.isEmpty && !_isThreadConversation) {
if (_upToDate) { if (_upToDate) {
return widget.emptyBuilder(context); return widget.emptyBuilder(context);