Migrated llc Lists to be nullable instead of being an empty array

This commit is contained in:
Ayush Shekhar
2022-04-26 21:11:24 +05:30
parent 381e1c06f5
commit b6bb3608e5
23 changed files with 178 additions and 153 deletions
@@ -1259,7 +1259,9 @@ class Channel {
if (preferOffline && cid != null) {
final updatedState = await _client.chatPersistenceClient
?.getChannelStateByCid(cid!, messagePagination: messagesPagination);
if (updatedState != null && updatedState.messages.isNotEmpty) {
if (updatedState != null &&
updatedState.messages != null &&
updatedState.messages!.isNotEmpty) {
if (this.state == null) {
_initState(updatedState);
} else {
@@ -1570,7 +1572,7 @@ class ChannelClientState {
void _checkExpiredAttachmentMessages(ChannelState channelState) async {
final expiredAttachmentMessagesId = channelState.messages
.where((m) =>
?.where((m) =>
!_updatedMessagesIds.contains(m.id) &&
m.attachments.isNotEmpty &&
m.attachments.any((e) {
@@ -1597,7 +1599,8 @@ class ChannelClientState {
.map((e) => e.id)
.toList();
if (expiredAttachmentMessagesId.isNotEmpty) {
if (expiredAttachmentMessagesId != null &&
expiredAttachmentMessagesId.isNotEmpty) {
await _channel._initializedCompleter.future;
_updatedMessagesIds.addAll(expiredAttachmentMessagesId);
_channel.getMessagesById(expiredAttachmentMessagesId);
@@ -1607,9 +1610,10 @@ class ChannelClientState {
void _listenMemberAdded() {
_subscriptions.add(_channel.on(EventType.memberAdded).listen((Event e) {
final member = e.member;
final existingMembers = channelState.members ?? [];
updateChannelState(channelState.copyWith(
members: [
...channelState.members,
...existingMembers,
member!,
],
));
@@ -1619,11 +1623,13 @@ class ChannelClientState {
void _listenMemberRemoved() {
_subscriptions.add(_channel.on(EventType.memberRemoved).listen((Event e) {
final user = e.user;
final existingMembers = channelState.members ?? [];
final existingRead = channelState.read ?? [];
updateChannelState(channelState.copyWith(
members: channelState.members
members: existingMembers
.where((m) => m.userId != user!.id)
.toList(growable: false),
read: channelState.read
read: existingRead
.where((r) => r.user.id != user!.id)
.toList(growable: false),
));
@@ -1793,9 +1799,10 @@ class ChannelClientState {
updateMessage(message);
if (message.pinned) {
final _existingPinnedMessages = _channelState.pinnedMessages ?? [];
_channelState = _channelState.copyWith(
pinnedMessages: [
..._channelState.pinnedMessages,
..._existingPinnedMessages,
message,
],
);
@@ -1931,7 +1938,7 @@ class ChannelClientState {
)
.listen(
(event) {
final readList = List<Read>.from(_channelState.read);
final readList = List<Read>.from(_channelState.read ?? []);
final userReadIndex =
read.indexWhere((r) => r.user.id == event.user!.id);
@@ -1952,31 +1959,34 @@ class ChannelClientState {
}
/// Channel message list.
List<Message> get messages => _channelState.messages;
List<Message> get messages => _channelState.messages ?? <Message>[];
/// Channel message list as a stream.
Stream<List<Message>> get messagesStream => channelStateStream
.map((cs) => cs.messages)
.map((cs) => cs.messages ?? <Message>[])
.distinct(const ListEquality().equals);
/// Channel pinned message list.
List<Message> get pinnedMessages => _channelState.pinnedMessages;
List<Message> get pinnedMessages =>
_channelState.pinnedMessages ?? <Message>[];
/// Channel pinned message list as a stream.
Stream<List<Message>> get pinnedMessagesStream => channelStateStream
.map((cs) => cs.pinnedMessages)
.map((cs) => cs.pinnedMessages ?? <Message>[])
.distinct(const ListEquality().equals);
/// Get channel last message.
Message? get lastMessage =>
_channelState.messages.isNotEmpty ? _channelState.messages.last : null;
_channelState.messages != null && _channelState.messages!.isNotEmpty
? _channelState.messages!.last
: null;
/// Get channel last message.
Stream<Message?> get lastMessageStream =>
messagesStream.map((event) => event.isNotEmpty ? event.last : null);
/// Channel members list.
List<Member> get members => _channelState.members
List<Member> get members => (_channelState.members ?? <Member>[])
.map((e) => e.copyWith(user: _channel.client.state.users[e.user!.id]))
.toList();
@@ -1997,7 +2007,7 @@ class ChannelClientState {
channelStateStream.map((cs) => cs.watcherCount);
/// Channel watchers list.
List<User> get watchers => _channelState.watchers
List<User> get watchers => (_channelState.watchers ?? <User>[])
.map((e) => _channel.client.state.users[e.id] ?? e)
.toList();
@@ -2018,10 +2028,11 @@ class ChannelClientState {
String? get currentUserRole => currentUserMember?.role;
/// Channel read list.
List<Read> get read => _channelState.read;
List<Read> get read => _channelState.read ?? <Read>[];
/// Channel read list as a stream.
Stream<List<Read>> get readStream => channelStateStream.map((cs) => cs.read);
Stream<List<Read>> get readStream =>
channelStateStream.map((cs) => cs.read ?? <Read>[]);
bool _isCurrentUserRead(Read read) =>
read.user.id == _channel._client.state.currentUser!.id;
@@ -2042,7 +2053,7 @@ class ChannelClientState {
/// Setter for unread count.
set unreadCount(int count) {
final reads = [..._channelState.read];
final reads = [...read];
final currentUserReadIndex = reads.indexWhere(_isCurrentUserRead);
if (currentUserReadIndex < 0) return;
@@ -2097,31 +2108,37 @@ class ChannelClientState {
/// Update channelState with updated information.
void updateChannelState(ChannelState updatedState) {
final _existingStateMessages = _channelState.messages ?? [];
final _updatedStateMessages = updatedState.messages ?? [];
final newMessages = <Message>[
...updatedState.messages,
..._channelState.messages
..._updatedStateMessages,
..._existingStateMessages
.where((m) =>
!updatedState.messages.any((newMessage) => newMessage.id == m.id))
!_updatedStateMessages.any((newMessage) => newMessage.id == m.id))
.toList(),
]..sort(_sortByCreatedAt);
final _existingStateWatchers = _channelState.watchers ?? [];
final _updatedStateWatchers = updatedState.watchers ?? [];
final newWatchers = <User>[
...updatedState.watchers,
..._channelState.watchers
..._updatedStateWatchers,
..._existingStateWatchers
.where((w) =>
!updatedState.watchers.any((newWatcher) => newWatcher.id == w.id))
!_updatedStateWatchers.any((newWatcher) => newWatcher.id == w.id))
.toList(),
];
final newMembers = <Member>[
...updatedState.members,
...updatedState.members ?? [],
];
final _existingStateRead = _channelState.read ?? [];
final _updatedStateRead = updatedState.read ?? [];
final newReads = <Read>[
...updatedState.read,
..._channelState.read
..._updatedStateRead,
..._existingStateRead
.where((r) =>
!updatedState.read.any((newRead) => newRead.user.id == r.user.id))
!_updatedStateRead.any((newRead) => newRead.user.id == r.user.id))
.toList(),
];
@@ -2273,9 +2290,9 @@ class ChannelClientState {
_pinnedMessagesTimer = Timer.periodic(const Duration(seconds: 30), (_) {
final now = DateTime.now();
var expiredMessages = channelState.pinnedMessages
.where((m) => m.pinExpires?.isBefore(now) == true)
?.where((m) => m.pinExpires?.isBefore(now) == true)
.toList();
if (expiredMessages.isNotEmpty) {
if (expiredMessages != null && expiredMessages.isNotEmpty) {
expiredMessages = expiredMessages
.map((m) => m.copyWith(
pinExpires: null,
@@ -623,7 +623,7 @@ class StreamChatClient {
final channels = res.channels;
final users = channels
.expand((it) => it.members)
.expand((it) => it.members ?? <Member>[])
.map((it) => it.user)
.toList(growable: false);