[MessageSearchListView] Add support for messageFilters
Signed-off-by: Sahil Kumar <[email protected]>
This commit is contained in:
@@ -276,11 +276,15 @@ class UserMentionPage extends StatelessWidget {
|
|||||||
final user = StreamChat.of(context).user;
|
final user = StreamChat.of(context).user;
|
||||||
return MessageSearchBloc(
|
return MessageSearchBloc(
|
||||||
child: MessageSearchListView(
|
child: MessageSearchListView(
|
||||||
messageQuery: '@${user.name}',
|
|
||||||
filters: {
|
filters: {
|
||||||
'members': {
|
'members': {
|
||||||
r'$in': [user.id]
|
r'$in': [user.id],
|
||||||
}
|
},
|
||||||
|
},
|
||||||
|
messageFilters: {
|
||||||
|
'mentioned_users.id': {
|
||||||
|
r'$contains': user.id,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
sortOptions: [
|
sortOptions: [
|
||||||
SortOption(
|
SortOption(
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
|
|||||||
Stream<bool> get queryMessagesLoading =>
|
Stream<bool> get queryMessagesLoading =>
|
||||||
_queryMessagesLoadingController.stream;
|
_queryMessagesLoadingController.stream;
|
||||||
|
|
||||||
/// Calls [Client.search] updating [queryMessagesLoading] stream
|
/// Calls [Client.search] updating [messageResponses] stream
|
||||||
Future<void> search({
|
Future<void> search({
|
||||||
Map<String, dynamic> filter,
|
Map<String, dynamic> filter,
|
||||||
Map<String, dynamic> messageFilter,
|
Map<String, dynamic> messageFilter,
|
||||||
@@ -60,10 +60,31 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
|
|||||||
String query,
|
String query,
|
||||||
PaginationParams pagination,
|
PaginationParams pagination,
|
||||||
}) async {
|
}) 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 ||
|
/// Calls [Client.search] updating [queryMessagesLoading] stream
|
||||||
_queryMessagesLoadingController.value == true) {
|
Future<void> loadMore({
|
||||||
|
Map<String, dynamic> filter,
|
||||||
|
Map<String, dynamic> messageFilter,
|
||||||
|
List<SortOption> sort,
|
||||||
|
String query,
|
||||||
|
PaginationParams pagination,
|
||||||
|
}) async {
|
||||||
|
if (_queryMessagesLoadingController.value == true) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_queryMessagesLoadingController.add(true);
|
_queryMessagesLoadingController.add(true);
|
||||||
@@ -74,18 +95,18 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
|
|||||||
|
|
||||||
final oldMessages = List<GetMessageResponse>.from(messageResponses ?? []);
|
final oldMessages = List<GetMessageResponse>.from(messageResponses ?? []);
|
||||||
|
|
||||||
final messageResponse = await client.search(
|
final messages = await _search(
|
||||||
filter,
|
filter: filter,
|
||||||
sort,
|
messageFilter: messageFilter,
|
||||||
query,
|
sort: sort,
|
||||||
pagination,
|
query: query,
|
||||||
messageFilters: messageFilter,
|
pagination: pagination,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (clear) {
|
if (clear) {
|
||||||
_messageResponses.add(messageResponse.results);
|
_messageResponses.add(messages.results);
|
||||||
} else {
|
} else {
|
||||||
final temp = oldMessages + messageResponse.results;
|
final temp = oldMessages + messages.results;
|
||||||
_messageResponses.add(temp);
|
_messageResponses.add(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +116,23 @@ class MessageSearchBlocState extends State<MessageSearchBloc>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<SearchMessagesResponse> _search({
|
||||||
|
Map<String, dynamic> filter,
|
||||||
|
Map<String, dynamic> messageFilter,
|
||||||
|
List<SortOption> sort,
|
||||||
|
String query,
|
||||||
|
PaginationParams pagination,
|
||||||
|
}) {
|
||||||
|
final client = StreamChat.of(context).client;
|
||||||
|
return client.search(
|
||||||
|
filter,
|
||||||
|
sort,
|
||||||
|
query,
|
||||||
|
pagination,
|
||||||
|
messageFilters: messageFilter,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
super.build(context);
|
super.build(context);
|
||||||
|
|||||||
@@ -51,10 +51,11 @@ class MessageSearchListView extends StatefulWidget {
|
|||||||
/// Instantiate a new MessageSearchListView
|
/// Instantiate a new MessageSearchListView
|
||||||
const MessageSearchListView({
|
const MessageSearchListView({
|
||||||
Key key,
|
Key key,
|
||||||
@required this.messageQuery,
|
this.messageQuery,
|
||||||
@required this.filters,
|
this.filters,
|
||||||
this.sortOptions,
|
this.sortOptions,
|
||||||
this.paginationParams,
|
this.paginationParams,
|
||||||
|
this.messageFilters,
|
||||||
this.emptyBuilder,
|
this.emptyBuilder,
|
||||||
this.errorBuilder,
|
this.errorBuilder,
|
||||||
this.separatorBuilder,
|
this.separatorBuilder,
|
||||||
@@ -83,6 +84,11 @@ class MessageSearchListView extends StatefulWidget {
|
|||||||
/// message_limit: how many messages should be included to each channel
|
/// message_limit: how many messages should be included to each channel
|
||||||
final PaginationParams paginationParams;
|
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<String, dynamic> messageFilters;
|
||||||
|
|
||||||
/// Builder used to create a custom item preview
|
/// Builder used to create a custom item preview
|
||||||
final MessageSearchItemBuilder itemBuilder;
|
final MessageSearchItemBuilder itemBuilder;
|
||||||
|
|
||||||
@@ -115,6 +121,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
|
|||||||
sort: widget.sortOptions,
|
sort: widget.sortOptions,
|
||||||
query: widget.messageQuery,
|
query: widget.messageQuery,
|
||||||
pagination: widget.paginationParams,
|
pagination: widget.paginationParams,
|
||||||
|
messageFilter: widget.messageFilters,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,9 +212,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
|
|||||||
children: [
|
children: [
|
||||||
WidgetSpan(
|
WidgetSpan(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(right: 2.0),
|
||||||
right: 2.0,
|
|
||||||
),
|
|
||||||
child: Icon(Icons.error_outline),
|
child: Icon(Icons.error_outline),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -217,18 +222,17 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
|
|||||||
style: Theme.of(context).textTheme.headline6,
|
style: Theme.of(context).textTheme.headline6,
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(top: 16.0),
|
||||||
top: 16.0,
|
|
||||||
),
|
|
||||||
child: Text(message),
|
child: Text(message),
|
||||||
),
|
),
|
||||||
FlatButton(
|
RaisedButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
messageSearchBloc.search(
|
messageSearchBloc.search(
|
||||||
filter: widget.filters,
|
filter: widget.filters,
|
||||||
sort: widget.sortOptions,
|
sort: widget.sortOptions,
|
||||||
query: widget.messageQuery,
|
query: widget.messageQuery,
|
||||||
pagination: widget.paginationParams,
|
pagination: widget.paginationParams,
|
||||||
|
messageFilter: widget.messageFilters,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Text('Retry'),
|
child: Text('Retry'),
|
||||||
@@ -281,13 +285,14 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
|
|||||||
|
|
||||||
Widget child;
|
Widget child;
|
||||||
child = LazyLoadScrollView(
|
child = LazyLoadScrollView(
|
||||||
onEndOfPage: () => messageSearchBloc.search(
|
onEndOfPage: () => messageSearchBloc.loadMore(
|
||||||
filter: widget.filters,
|
filter: widget.filters,
|
||||||
sort: widget.sortOptions,
|
sort: widget.sortOptions,
|
||||||
pagination: widget.paginationParams.copyWith(
|
pagination: widget.paginationParams.copyWith(
|
||||||
offset: messageSearchBloc.messageResponses?.length ?? 0,
|
offset: messageSearchBloc.messageResponses?.length ?? 0,
|
||||||
),
|
),
|
||||||
query: widget.messageQuery,
|
query: widget.messageQuery,
|
||||||
|
messageFilter: widget.messageFilters,
|
||||||
),
|
),
|
||||||
child: ListView.separated(
|
child: ListView.separated(
|
||||||
physics: AlwaysScrollableScrollPhysics(),
|
physics: AlwaysScrollableScrollPhysics(),
|
||||||
@@ -344,13 +349,16 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
|
|||||||
jsonEncode(widget.sortOptions) != jsonEncode(oldWidget.sortOptions) ||
|
jsonEncode(widget.sortOptions) != jsonEncode(oldWidget.sortOptions) ||
|
||||||
widget.paginationParams?.toJson()?.toString() !=
|
widget.paginationParams?.toJson()?.toString() !=
|
||||||
oldWidget.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);
|
final messageSearchBloc = MessageSearchBloc.of(context);
|
||||||
messageSearchBloc.search(
|
messageSearchBloc.search(
|
||||||
filter: widget.filters,
|
filter: widget.filters,
|
||||||
sort: widget.sortOptions,
|
sort: widget.sortOptions,
|
||||||
query: widget.messageQuery,
|
query: widget.messageQuery,
|
||||||
pagination: widget.paginationParams,
|
pagination: widget.paginationParams,
|
||||||
|
messageFilter: widget.messageFilters,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user