diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 449a5267..6117b5d7 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -618,16 +618,26 @@ class Channel { } } - final response = await _client.post(path, data: payload); - final updatedState = _client.decode(response.data, ChannelState.fromJson); + try { + final response = await _client.post(path, data: payload); + final updatedState = _client.decode(response.data, ChannelState.fromJson); - if (_id == null) { - _id = updatedState.channel.id; - _cid = updatedState.channel.cid; + if (_id == null) { + _id = updatedState.channel.id; + _cid = updatedState.channel.cid; + } + + state?.updateChannelState(updatedState); + return updatedState; + } catch (e) { + if (!_client.persistenceEnabled) { + rethrow; + } + return _client.chatPersistenceClient?.getChannelStateByCid( + cid, + messagePagination: messagesPagination, + ); } - - state?.updateChannelState(updatedState); - return updatedState; } /// Query channel members diff --git a/packages/stream_chat/lib/src/db/chat_persistence_client.dart b/packages/stream_chat/lib/src/db/chat_persistence_client.dart index a2a4d313..ac65783d 100644 --- a/packages/stream_chat/lib/src/db/chat_persistence_client.dart +++ b/packages/stream_chat/lib/src/db/chat_persistence_client.dart @@ -173,8 +173,10 @@ abstract class ChatPersistenceClient { final reactions = channelStates.expand((it) => it.messages).expand((it) { return [ - ...it.ownReactions.where((r) => r.userId != null), - ...it.latestReactions.where((r) => r.userId != null) + if (it.ownReactions != null) + ...it.ownReactions.where((r) => r.userId != null), + if (it.latestReactions != null) + ...it.latestReactions.where((r) => r.userId != null) ]; }).where((it) => it != null); @@ -184,12 +186,14 @@ abstract class ChatPersistenceClient { ...cs.messages?.map((m) { return [ m.user, - ...m.latestReactions?.map((r) => r.user), - ...m.ownReactions?.map((r) => r.user), + if (m.latestReactions != null) + ...m.latestReactions.map((r) => r.user), + if (m.ownReactions != null) + ...m.ownReactions.map((r) => r.user), ]; })?.expand((v) => v), - ...cs.read?.map((r) => r.user), - ...cs.members?.map((m) => m.user), + if (cs.read != null) ...cs.read.map((r) => r.user), + if (cs.members != null) ...cs.members.map((m) => m.user), ]) .expand((it) => it) .where((it) => it != null); @@ -202,7 +206,7 @@ abstract class ChatPersistenceClient { final updateReadsFuture = channelStates.map((it) { final cid = it.channel.cid; - final reads = it.read.where((it) => it != null); + final reads = it.read?.where((it) => it != null) ?? []; return updateReads(cid, reads.toList(growable: false)); }).toList(growable: false); diff --git a/packages/stream_chat_persistence/example/lib/main.dart b/packages/stream_chat_persistence/example/lib/main.dart index 6d47d254..82dc1dc9 100644 --- a/packages/stream_chat_persistence/example/lib/main.dart +++ b/packages/stream_chat_persistence/example/lib/main.dart @@ -7,6 +7,8 @@ Future main() async { /// project dashboard. final client = StreamChatClient('b67pax5b2wdq'); + WidgetsFlutterBinding.ensureInitialized(); + /// Set the chatPersistenceClient for offline support client.chatPersistenceClient = StreamChatPersistenceClient( logLevel: Level.INFO, diff --git a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart index 97122232..c207ae20 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -3,6 +3,7 @@ import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; import 'package:stream_chat_persistence/src/entity/messages.dart'; import 'package:stream_chat_persistence/src/entity/users.dart'; + import '../mapper/mapper.dart'; part 'message_dao.g.dart'; @@ -136,7 +137,11 @@ class MessageDao extends DatabaseAccessor /// Updates the message data of a particular channel with /// the new [messageList] data - Future updateMessages(String cid, List messageList) { + Future updateMessages(String cid, List messageList) async { + if (messageList == null) { + return; + } + return batch((batch) { batch.insertAll( messages, diff --git a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart index 510675e6..5ad92ddd 100644 --- a/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart +++ b/packages/stream_chat_persistence/lib/src/mapper/message_mapper.dart @@ -47,7 +47,7 @@ extension MessageX on Message { MessageEntity toEntity({String cid}) { return MessageEntity( id: id, - attachments: attachments.map((it) => jsonEncode(it)).toList(), + attachments: attachments?.map((it) => jsonEncode(it))?.toList() ?? [], channelCid: cid, type: type, parentId: parentId,