@@ -1685,8 +1685,7 @@ class ChannelClientState {
|
||||
...messages!,
|
||||
];
|
||||
|
||||
newThreads[parentId]!
|
||||
.sort(_sortByCreatedAt as int Function(Message, Message)?);
|
||||
newThreads[parentId]!.sort(_sortByCreatedAt);
|
||||
} else {
|
||||
newThreads[parentId] = messages;
|
||||
}
|
||||
@@ -1713,7 +1712,7 @@ class ChannelClientState {
|
||||
.any((newMessage) => newMessage.id == m.id) !=
|
||||
true)
|
||||
.toList(),
|
||||
]..sort(_sortByCreatedAt as int Function(Message, Message)?);
|
||||
]..sort(_sortByCreatedAt);
|
||||
|
||||
final newWatchers = <User>[
|
||||
...updatedState.watchers,
|
||||
@@ -1752,17 +1751,8 @@ class ChannelClientState {
|
||||
);
|
||||
}
|
||||
|
||||
int? _sortByCreatedAt(a, b) {
|
||||
if (a.createdAt == null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (b.createdAt == null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return a.createdAt.compareTo(b.createdAt);
|
||||
}
|
||||
int _sortByCreatedAt(Message a, Message b) =>
|
||||
a.createdAt.compareTo(b.createdAt);
|
||||
|
||||
/// The channel state related to this client
|
||||
ChannelState get _channelState => _channelStateController.value!;
|
||||
|
||||
@@ -7,6 +7,7 @@ import 'package:stream_chat/src/models/message.dart';
|
||||
import 'package:stream_chat/src/models/reaction.dart';
|
||||
import 'package:stream_chat/src/models/read.dart';
|
||||
import 'package:stream_chat/src/models/user.dart';
|
||||
import 'package:stream_chat/src/extensions/iterable_extension.dart';
|
||||
|
||||
/// A simple client used for persisting chat data locally.
|
||||
abstract class ChatPersistenceClient {
|
||||
@@ -78,7 +79,7 @@ abstract class ChatPersistenceClient {
|
||||
return ChannelState(
|
||||
members: data[0] as List<Member>,
|
||||
read: data[1] as List<Read>,
|
||||
channel: data[2] as ChannelModel,
|
||||
channel: data[2] as ChannelModel?,
|
||||
messages: data[3] as List<Message>,
|
||||
pinnedMessages: data[4] as List<Message>,
|
||||
);
|
||||
@@ -192,17 +193,17 @@ abstract class ChatPersistenceClient {
|
||||
deleteMembers,
|
||||
]);
|
||||
|
||||
final channels = cleanedChannelStates
|
||||
.map((it) => it.channel)
|
||||
.where((it) => it != null) as Iterable<ChannelModel>;
|
||||
final channels = cleanedChannelStates.map((it) => it.channel).withNullifyer;
|
||||
|
||||
final reactions =
|
||||
cleanedChannelStates.expand((it) => it.messages).expand((it) => [
|
||||
final reactions = cleanedChannelStates
|
||||
.expand((it) => it.messages)
|
||||
.expand((it) => [
|
||||
if (it.ownReactions != null)
|
||||
...it.ownReactions!.where((r) => r.userId != null),
|
||||
if (it.latestReactions != null)
|
||||
...it.latestReactions!.where((r) => r.userId != null),
|
||||
]);
|
||||
])
|
||||
.withNullifyer;
|
||||
|
||||
final users = cleanedChannelStates
|
||||
.map((cs) => [
|
||||
@@ -220,7 +221,7 @@ abstract class ChatPersistenceClient {
|
||||
...cs.members.map((m) => m.user),
|
||||
])
|
||||
.expand((it) => it)
|
||||
.where((it) => it != null) as Iterable<User>;
|
||||
.withNullifyer;
|
||||
|
||||
final updateMessagesFuture = cleanedChannelStates.map((it) {
|
||||
final cid = it.channel!.cid;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/// Useful extension functions for [Iterable]
|
||||
extension IterableX<T> on Iterable<T?> {
|
||||
/// Removes all the null values
|
||||
/// and converts `Iterable<T?>` into `Iterable<T>`
|
||||
Iterable<T> get withNullifyer => [
|
||||
for (final item in this)
|
||||
if (item != null) item
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user