diff --git a/example/lib/main.dart b/example/lib/main.dart index 39ff4a61..0bc75cea 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -276,11 +276,15 @@ class UserMentionPage extends StatelessWidget { final user = StreamChat.of(context).user; return MessageSearchBloc( child: MessageSearchListView( - messageQuery: '@${user.name}', filters: { 'members': { - r'$in': [user.id] - } + r'$in': [user.id], + }, + }, + messageFilters: { + 'mentioned_users.id': { + r'$contains': user.id, + }, }, sortOptions: [ SortOption( diff --git a/lib/src/message_search_bloc.dart b/lib/src/message_search_bloc.dart index ab277c4c..735c1439 100644 --- a/lib/src/message_search_bloc.dart +++ b/lib/src/message_search_bloc.dart @@ -52,7 +52,7 @@ class MessageSearchBlocState extends State Stream get queryMessagesLoading => _queryMessagesLoadingController.stream; - /// Calls [Client.search] updating [queryMessagesLoading] stream + /// Calls [Client.search] updating [messageResponses] stream Future search({ Map filter, Map messageFilter, @@ -60,10 +60,31 @@ class MessageSearchBlocState extends State String query, PaginationParams pagination, }) async { - final client = StreamChat.of(context).client; + if (messageResponses?.isNotEmpty == true) return; + _messageResponses.add(null); + try { + final messages = await _search( + filter: filter, + messageFilter: messageFilter, + sort: sort, + query: query, + pagination: pagination, + ); + _messageResponses.add(messages.results); + } catch (err, stk) { + _messageResponses.addError(err, stk); + } + } - if (client.state?.user == null || - _queryMessagesLoadingController.value == true) { + /// Calls [Client.search] updating [queryMessagesLoading] stream + Future loadMore({ + Map filter, + Map messageFilter, + List sort, + String query, + PaginationParams pagination, + }) async { + if (_queryMessagesLoadingController.value == true) { return; } _queryMessagesLoadingController.add(true); @@ -74,18 +95,18 @@ class MessageSearchBlocState extends State final oldMessages = List.from(messageResponses ?? []); - final messageResponse = await client.search( - filter, - sort, - query, - pagination, - messageFilters: messageFilter, + final messages = await _search( + filter: filter, + messageFilter: messageFilter, + sort: sort, + query: query, + pagination: pagination, ); if (clear) { - _messageResponses.add(messageResponse.results); + _messageResponses.add(messages.results); } else { - final temp = oldMessages + messageResponse.results; + final temp = oldMessages + messages.results; _messageResponses.add(temp); } @@ -95,6 +116,23 @@ class MessageSearchBlocState extends State } } + Future _search({ + Map filter, + Map messageFilter, + List sort, + String query, + PaginationParams pagination, + }) { + final client = StreamChat.of(context).client; + return client.search( + filter, + sort, + query, + pagination, + messageFilters: messageFilter, + ); + } + @override Widget build(BuildContext context) { super.build(context); diff --git a/lib/src/message_search_list_view.dart b/lib/src/message_search_list_view.dart index 3ff9f151..1adb45a9 100644 --- a/lib/src/message_search_list_view.dart +++ b/lib/src/message_search_list_view.dart @@ -51,10 +51,11 @@ class MessageSearchListView extends StatefulWidget { /// Instantiate a new MessageSearchListView const MessageSearchListView({ Key key, - @required this.messageQuery, - @required this.filters, + this.messageQuery, + this.filters, this.sortOptions, this.paginationParams, + this.messageFilters, this.emptyBuilder, this.errorBuilder, this.separatorBuilder, @@ -83,6 +84,11 @@ class MessageSearchListView extends StatefulWidget { /// message_limit: how many messages should be included to each channel final PaginationParams paginationParams; + /// The message query filters to use. + /// You can query on any of the custom fields you've defined on the [Channel]. + /// You can also filter other built-in channel fields. + final Map messageFilters; + /// Builder used to create a custom item preview final MessageSearchItemBuilder itemBuilder; @@ -115,6 +121,7 @@ class _MessageSearchListViewState extends State { sort: widget.sortOptions, query: widget.messageQuery, pagination: widget.paginationParams, + messageFilter: widget.messageFilters, ); } @@ -205,9 +212,7 @@ class _MessageSearchListViewState extends State { children: [ WidgetSpan( child: Padding( - padding: const EdgeInsets.only( - right: 2.0, - ), + padding: const EdgeInsets.only(right: 2.0), child: Icon(Icons.error_outline), ), ), @@ -217,18 +222,17 @@ class _MessageSearchListViewState extends State { style: Theme.of(context).textTheme.headline6, ), Padding( - padding: const EdgeInsets.only( - top: 16.0, - ), + padding: const EdgeInsets.only(top: 16.0), child: Text(message), ), - FlatButton( + RaisedButton( onPressed: () { messageSearchBloc.search( filter: widget.filters, sort: widget.sortOptions, query: widget.messageQuery, pagination: widget.paginationParams, + messageFilter: widget.messageFilters, ); }, child: Text('Retry'), @@ -281,13 +285,14 @@ class _MessageSearchListViewState extends State { Widget child; child = LazyLoadScrollView( - onEndOfPage: () => messageSearchBloc.search( + onEndOfPage: () => messageSearchBloc.loadMore( filter: widget.filters, sort: widget.sortOptions, pagination: widget.paginationParams.copyWith( offset: messageSearchBloc.messageResponses?.length ?? 0, ), query: widget.messageQuery, + messageFilter: widget.messageFilters, ), child: ListView.separated( physics: AlwaysScrollableScrollPhysics(), @@ -344,13 +349,16 @@ class _MessageSearchListViewState extends State { jsonEncode(widget.sortOptions) != jsonEncode(oldWidget.sortOptions) || widget.paginationParams?.toJson()?.toString() != oldWidget.paginationParams?.toJson()?.toString() || - widget.messageQuery?.toString() != oldWidget.messageQuery?.toString()) { + widget.messageQuery?.toString() != oldWidget.messageQuery?.toString() || + widget.messageFilters?.toString() != + oldWidget.messageFilters?.toString()) { final messageSearchBloc = MessageSearchBloc.of(context); messageSearchBloc.search( filter: widget.filters, sort: widget.sortOptions, query: widget.messageQuery, pagination: widget.paginationParams, + messageFilter: widget.messageFilters, ); } }