From 78be96eab06944704c6c5256731a808ecc21bcaa Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 27 Nov 2020 12:49:17 +0100 Subject: [PATCH] use correct response model --- .gitignore | 3 +- example/lib/main.dart | 6 ++ example/lib/search_text_field.dart | 2 +- example/pubspec.yaml | 2 +- lib/src/channel_bottom_sheet.dart | 9 ++- lib/src/channel_name.dart | 87 ++++++++++++++------------- lib/src/message_search_bloc.dart | 16 ++--- lib/src/message_search_item.dart | 42 ++++++++++--- lib/src/message_search_list_view.dart | 18 +++--- pubspec.yaml | 2 +- 10 files changed, 114 insertions(+), 73 deletions(-) diff --git a/.gitignore b/.gitignore index 3a158cd4..1d3bae26 100644 --- a/.gitignore +++ b/.gitignore @@ -61,4 +61,5 @@ doc/api/ fvm google-services.json -example/ios/dist \ No newline at end of file +example/ios/dist +.vscode/ \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index 3ba3e93c..26590237 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -139,6 +139,12 @@ class _ChannelListPageState extends State { r'$in': [user.id] } }, + sortOptions: [ + SortOption( + 'created_at', + direction: SortOption.ASC, + ), + ], paginationParams: PaginationParams(limit: 20), onItemTap: (message) {}, ) diff --git a/example/lib/search_text_field.dart b/example/lib/search_text_field.dart index f46a48b0..e32bb88b 100644 --- a/example/lib/search_text_field.dart +++ b/example/lib/search_text_field.dart @@ -78,7 +78,7 @@ class SearchTextField extends StatelessWidget { Future.microtask( () => [ controller.clear(), - onChanged(''), + if (onChanged != null) onChanged(''), ], ); } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e0be8fc9..b66e085b 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,6 +1,6 @@ name: example description: A new Flutter project. -version: 1.0.78+80 +version: 1.0.80+82 environment: sdk: ">=2.2.2 <3.0.0" diff --git a/lib/src/channel_bottom_sheet.dart b/lib/src/channel_bottom_sheet.dart index 4272b0f3..48ce8887 100644 --- a/lib/src/channel_bottom_sheet.dart +++ b/lib/src/channel_bottom_sheet.dart @@ -30,10 +30,13 @@ class ChannelBottomSheet extends StatelessWidget { vertical: 2.0, ), child: Center( - child: ChannelName( + child: StreamChannel( + showLoading: false, channel: channel, - textStyle: - StreamChatTheme.of(context).channelPreviewTheme.title, + child: ChannelName( + textStyle: + StreamChatTheme.of(context).channelPreviewTheme.title, + ), ), ), ), diff --git a/lib/src/channel_name.dart b/lib/src/channel_name.dart index 337321ed..bf3eff22 100644 --- a/lib/src/channel_name.dart +++ b/lib/src/channel_name.dart @@ -12,60 +12,65 @@ class ChannelName extends StatelessWidget { /// Instantiate a new ChannelName const ChannelName({ Key key, - this.channel, this.textStyle, }) : super(key: key); - /// The channel to show the name of - final Channel channel; - /// The style of the text displayed final TextStyle textStyle; @override Widget build(BuildContext context) { final client = StreamChat.of(context); - final channel = this.channel ?? StreamChannel.of(context).channel; + final channel = StreamChannel.of(context).channel; + + return StreamBuilder>( + stream: channel.extraDataStream, + initialData: channel.extraData, + builder: (context, snapshot) { + return _buildName(snapshot.data, channel.state.members, client); + }, + ); + } + + Widget _buildName( + Map extraData, + List members, + StreamChatState client, + ) { return LayoutBuilder( builder: (context, constraints) { - return StreamBuilder>( - stream: channel.extraDataStream, - initialData: channel.extraData, - builder: (context, snapshot) { - String title; - if (snapshot.data['name'] == null) { - final otherMembers = channel.state.members - .where((member) => member.userId != client.user.id); - if (otherMembers.isNotEmpty) { - final maxWidth = constraints.maxWidth; - final maxChars = maxWidth / textStyle.fontSize; - int currentChars = 0; - final currentMembers = []; - otherMembers.forEach((element) { - final newLength = currentChars + element.user.name.length; - if (newLength < maxChars) { - currentChars = newLength; - currentMembers.add(element); - } - }); - - final exceedingMembers = - otherMembers.length - currentMembers.length; - title = - '${currentMembers.map((e) => e.user.name).join(', ')} ${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}'; - } else { - title = channel.id; + String title; + if (extraData['name'] == null) { + final otherMembers = + members.where((member) => member.userId != client.user.id); + if (otherMembers.isNotEmpty) { + final maxWidth = constraints.maxWidth; + final maxChars = maxWidth / textStyle.fontSize; + var currentChars = 0; + final currentMembers = []; + otherMembers.forEach((element) { + final newLength = currentChars + element.user.name.length; + if (newLength < maxChars) { + currentChars = newLength; + currentMembers.add(element); } - } else { - title = snapshot.data['name']; - } + }); - return Text( - title, - style: textStyle, - overflow: TextOverflow.ellipsis, - ); - }, + final exceedingMembers = + otherMembers.length - currentMembers.length; + title = + '${currentMembers.map((e) => e.user.name).join(', ')} ${exceedingMembers > 0 ? '+ $exceedingMembers' : ''}'; + } else { + title = 'No title'; + } + } else { + title = extraData['name']; + } + + return Text( + title, + style: textStyle, + overflow: TextOverflow.ellipsis, ); }, ); diff --git a/lib/src/message_search_bloc.dart b/lib/src/message_search_bloc.dart index bff2d68e..0128bb22 100644 --- a/lib/src/message_search_bloc.dart +++ b/lib/src/message_search_bloc.dart @@ -36,12 +36,14 @@ class MessageSearchBloc extends StatefulWidget { class MessageSearchBlocState extends State with AutomaticKeepAliveClientMixin { /// The current messages list - List get messages => _messagesController.value; + List get messageResponses => _messageResponses.value; /// The current messages list as a stream - Stream> get messagesStream => _messagesController.stream; + Stream> get messagesStream => + _messageResponses.stream; - final BehaviorSubject> _messagesController = BehaviorSubject(); + final BehaviorSubject> _messageResponses = + BehaviorSubject(); final BehaviorSubject _queryMessagesLoadingController = BehaviorSubject.seeded(false); @@ -69,7 +71,7 @@ class MessageSearchBlocState extends State pagination.offset == null || pagination.offset == 0; - final oldMessages = List.from(messages ?? []); + final oldMessages = List.from(messageResponses ?? []); final messageResponse = await client.search( filter, @@ -79,10 +81,10 @@ class MessageSearchBlocState extends State ); if (clear) { - _messagesController.add(messageResponse.results); + _messageResponses.add(messageResponse.results); } else { final temp = oldMessages + messageResponse.results; - _messagesController.add(temp); + _messageResponses.add(temp); } _queryMessagesLoadingController.add(false); @@ -99,7 +101,7 @@ class MessageSearchBlocState extends State @override void dispose() { - _messagesController.close(); + _messageResponses.close(); _queryMessagesLoadingController.close(); super.dispose(); } diff --git a/lib/src/message_search_item.dart b/lib/src/message_search_item.dart index a89f2ee0..8857fcb8 100644 --- a/lib/src/message_search_item.dart +++ b/lib/src/message_search_item.dart @@ -13,13 +13,13 @@ class MessageSearchItem extends StatelessWidget { /// Instantiate a new MessageSearchItem const MessageSearchItem({ Key key, - @required this.message, + @required this.getMessageResponse, this.onTap, this.showOnlineStatus = true, }) : super(key: key); /// [Message] displayed - final Message message; + final GetMessageResponse getMessageResponse; /// Function called when tapping this widget final VoidCallback onTap; @@ -29,9 +29,12 @@ class MessageSearchItem extends StatelessWidget { @override Widget build(BuildContext context) { - final data = Message.fromJson(message.extraData['message']); - final user = data.user; - debugPrint(message.toJson().toString()); + final message = getMessageResponse.message; + final channel = getMessageResponse.channel; + final channelName = channel.extraData['name']; + print('channel.extraData: ${channel.extraData}'); + print('channelName: ${channelName}'); + final user = message.user; return ListTile( onTap: onTap, leading: UserAvatar( @@ -42,15 +45,34 @@ class MessageSearchItem extends StatelessWidget { width: 40, ), ), - title: Text( - user.name, - style: StreamChatTheme.of(context).channelPreviewTheme.title, + title: Row( + children: [ + Text( + user.name, + style: StreamChatTheme.of(context).channelPreviewTheme.title, + ), + if (channelName != null) + Text( + ' in ', + style: StreamChatTheme.of(context) + .channelPreviewTheme + .title + .copyWith( + fontWeight: FontWeight.normal, + ), + ), + if (channelName != null) + Text( + channelName, + style: StreamChatTheme.of(context).channelPreviewTheme.title, + ), + ], ), subtitle: Row( children: [ - Expanded(child: _buildSubtitle(context, data)), + Expanded(child: _buildSubtitle(context, message)), SizedBox(width: 16), - _buildDate(context, data), + _buildDate(context, message), ], ), ); diff --git a/lib/src/message_search_list_view.dart b/lib/src/message_search_list_view.dart index d5a282a4..8b346570 100644 --- a/lib/src/message_search_list_view.dart +++ b/lib/src/message_search_list_view.dart @@ -8,10 +8,11 @@ import 'lazy_load_scroll_view.dart'; import 'message_search_bloc.dart'; /// Callback called when tapping on a user -typedef MessageSearchItemTapCallback = void Function(Message); +typedef MessageSearchItemTapCallback = void Function(GetMessageResponse); /// Builder used to create a custom [ListUserItem] from a [User] -typedef MessageSearchItemBuilder = Widget Function(BuildContext, Message); +typedef MessageSearchItemBuilder = Widget Function( + BuildContext, GetMessageResponse); /// /// It shows the list of searched messages. @@ -127,13 +128,14 @@ class _MessageSearchListViewState extends State { ); } - Widget _listItemBuilder(BuildContext context, Message message) { + Widget _listItemBuilder( + BuildContext context, GetMessageResponse getMessageResponse) { if (widget.itemBuilder != null) { - return widget.itemBuilder(context, message); + return widget.itemBuilder(context, getMessageResponse); } return MessageSearchItem( - message: message, - onTap: () => widget.onItemTap(message), + getMessageResponse: getMessageResponse, + onTap: () => widget.onItemTap(getMessageResponse), ); } @@ -165,7 +167,7 @@ class _MessageSearchListViewState extends State { } Widget _buildListView(MessageSearchBlocState messageSearchBloc) { - return StreamBuilder>( + return StreamBuilder>( stream: messageSearchBloc.messagesStream, builder: (context, snapshot) { if (snapshot.hasError) { @@ -276,7 +278,7 @@ class _MessageSearchListViewState extends State { filter: widget.filters, sort: widget.sortOptions, pagination: widget.paginationParams.copyWith( - offset: messageSearchBloc.messages?.length ?? 0, + offset: messageSearchBloc.messageResponses?.length ?? 0, ), query: widget.messageQuery, ), diff --git a/pubspec.yaml b/pubspec.yaml index 5ecb60de..eee90a9c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: file_picker: ^2.0.12 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.3.0 - stream_chat: ^0.2.13+1 + stream_chat: ^0.2.14 mime: ^0.9.6+3 video_compress: ^2.1.1 visibility_detector: ^0.1.5