From 9be4d206de694cc2657d2b641e07b0fd52c1c79b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 10 Mar 2020 12:19:31 +0100 Subject: [PATCH] add channel, user and messages db --- lib/src/channel_list_view.dart | 5 ++- lib/src/channel_preview.dart | 6 ++-- lib/src/message_widget.dart | 56 +++++++++++++++++++--------------- lib/src/stream_chat.dart | 26 ++-------------- pubspec.yaml | 3 +- 5 files changed, 43 insertions(+), 53 deletions(-) diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index 329f27a5..622fc460 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -215,7 +215,10 @@ class _ChannelListViewState extends State { if (i < channels.length) { final channel = channels[i]; - final channelClient = streamChat.client.channels[channel.cid]; + final channelClient = streamChat.channels.firstWhere( + (c) => c.cid == channel.cid, + orElse: () => null, + ); ChannelTapCallback onTap; if (widget.onChannelTap != null) { diff --git a/lib/src/channel_preview.dart b/lib/src/channel_preview.dart index 93b2d3ff..27b606cc 100644 --- a/lib/src/channel_preview.dart +++ b/lib/src/channel_preview.dart @@ -110,15 +110,15 @@ class ChannelPreview extends StatelessWidget { initialData: channel.state.messages, builder: (context, snapshot) { final messages = snapshot.data; - final lastMessage = messages.isNotEmpty ? messages.last : null; + final lastMessage = messages?.isNotEmpty == true ? messages.last : null; if (lastMessage == null) { return SizedBox(); } - String text; + String text = lastMessage.text; if (lastMessage.isDeleted) { text = 'This message was deleted.'; - } else { + } else if (lastMessage.attachments != null) { final prefix = lastMessage.attachments .map((e) { if (e.type == 'image') { diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index 4e3cc042..9ec1ca7a 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -101,7 +101,7 @@ class _MessageWidgetState extends State widget.message.isDeleted ? _buildDeletedMessage(alignment) : _buildBubble(context), - if (_streamChannel.channel.config.replies) + if (_streamChannel.channel.config?.replies == true) _buildThreadIndicator(context), if (!_isNextUser) _buildTimestamp(alignment), ], @@ -146,7 +146,8 @@ class _MessageWidgetState extends State UserAvatar(user: widget.message.user), if (_isMyMessage && widget.nextMessage == null && - widget.message.status == MessageSendingStatus.SENT) + (widget.message.status == MessageSendingStatus.SENT || + widget.message.status == null)) Padding( padding: const EdgeInsets.symmetric( horizontal: 1.0, @@ -278,28 +279,30 @@ class _MessageWidgetState extends State var nOfAttachmentWidgets = 0; final column = - List.from(widget.message.attachments.map((attachment) { - nOfAttachmentWidgets++; + List.from(widget.message.attachments?.map((attachment) { + nOfAttachmentWidgets++; - Widget attachmentWidget; - if (attachment.type == 'video') { - attachmentWidget = _buildVideo(attachment); - } else if (attachment.type == 'image' || attachment.type == 'giphy') { - attachmentWidget = _buildImage(attachment); - } + Widget attachmentWidget; + if (attachment.type == 'video') { + attachmentWidget = _buildVideo(attachment); + } else if (attachment.type == 'image' || + attachment.type == 'giphy') { + attachmentWidget = _buildImage(attachment); + } - if (attachmentWidget != null) { - return _buildAttachment( - attachmentWidget, - attachment, - nOfAttachmentWidgets, - context, - ); - } + if (attachmentWidget != null) { + return _buildAttachment( + attachmentWidget, + attachment, + nOfAttachmentWidgets, + context, + ); + } - nOfAttachmentWidgets--; - return SizedBox(); - })); + nOfAttachmentWidgets--; + return SizedBox(); + }) ?? + []); if (widget.message.text.trim().isNotEmpty) { String text = widget.message.text; @@ -312,7 +315,7 @@ class _MessageWidgetState extends State ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ - if (_streamChannel.channel.config.reactions && + if (_streamChannel.channel.config?.reactions == true && nOfAttachmentWidgets == 0) Align( child: _buildReactions(), @@ -323,7 +326,9 @@ class _MessageWidgetState extends State Stack( overflow: Overflow.visible, children: [ - if (nOfAttachmentWidgets == 0) _buildReactionPaint(), + if (nOfAttachmentWidgets == 0 && + _streamChannel.channel.config?.reactions == true) + _buildReactionPaint(), _buildMessageText(nOfAttachmentWidgets, text, context), ], ), @@ -333,7 +338,8 @@ class _MessageWidgetState extends State ); } - if (_streamChannel.channel.config.reactions && nOfAttachmentWidgets > 0) { + if (_streamChannel.channel.config?.reactions == true && + nOfAttachmentWidgets > 0) { column.insert( 0, Align( @@ -991,7 +997,7 @@ class _MessageWidgetState extends State @override bool get wantKeepAlive { - return widget.message.attachments.isNotEmpty; + return widget.message.attachments?.isNotEmpty == true; } } diff --git a/lib/src/stream_chat.dart b/lib/src/stream_chat.dart index ecdcda0e..c002721b 100644 --- a/lib/src/stream_chat.dart +++ b/lib/src/stream_chat.dart @@ -171,19 +171,6 @@ class StreamChatState extends State { return theme; } - @override - void initState() { - super.initState(); - _subscriptions.add(widget.client.on('message.new').listen((Event e) { - final index = channels.indexWhere((c) => c.cid == e.cid); - if (index > 0) { - final channel = channels.removeAt(index); - channels.insert(0, channel); - _channelsController.add(channels); - } - })); - } - /// The current user User get user => widget.client.state.user; @@ -191,12 +178,10 @@ class StreamChatState extends State { Stream get userStream => widget.client.state.userStream; /// The current channel list - final List channels = []; + List get channels => client.state.channels; /// The current channel list as a stream - Stream> get channelsStream => _channelsController.stream; - - final BehaviorSubject> _channelsController = BehaviorSubject(); + Stream> get channelsStream => client.state.channelsStream; final BehaviorSubject _queryChannelsLoadingController = BehaviorSubject.seeded(false); @@ -218,16 +203,12 @@ class StreamChatState extends State { _queryChannelsLoadingController.sink.add(true); try { - final res = await widget.client.queryChannels( + await widget.client.queryChannels( filter: filter, sort: sortOptions, options: options, paginationParams: paginationParams, ); - channels.addAll(res); - _channelsController.sink.add(channels); - } catch (e) { - _channelsController.sink.addError(e); } finally { _queryChannelsLoadingController.sink.add(false); } @@ -243,7 +224,6 @@ class StreamChatState extends State { widget.client.dispose(); _subscriptions.forEach((s) => s.cancel()); _queryChannelsLoadingController.close(); - _channelsController.close(); super.dispose(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 28aa55ba..cdfce517 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,7 +20,8 @@ dependencies: file_picker: ^1.4.3+2 image_picker: ^0.6.3+4 keyboard_visibility: ^0.5.6 - stream_chat: ^0.1.18 + stream_chat: + path: ../stream_chat_dart dev_dependencies: pedantic: ^1.9.0