search method

Future<void> search({
  1. required Filter filter,
  2. Filter? messageFilter,
  3. List<SortOption>? sort,
  4. String? query,
  5. PaginationParams pagination = const PaginationParams(limit: 30),
})

Implementation

Future<void> search({
  required Filter filter,
  Filter? messageFilter,
  List<SortOption>? sort,
  String? query,
  PaginationParams pagination = const PaginationParams(limit: 30),
}) async {
  final client = _streamChatCoreState.client;

  var clear = false;
  if (sort != null) {
    clear |= pagination.next == null;
  } else {
    final offset = pagination.offset;
    clear |= offset == null || offset == 0;
  }

  if (clear && _paginationEnded) {
    _paginationEnded = false;
  }

  if ((!clear && _paginationEnded) || _queryMessagesLoadingController.value) {
    return;
  }

  if (_messageResponses.hasValue) {
    _queryMessagesLoadingController.safeAdd(true);
  }
  try {
    final oldMessages = List<GetMessageResponse>.from(messageResponses ?? []);

    final response = await client.search(
      filter,
      sort: sort,
      query: query,
      paginationParams: pagination,
      messageFilters: messageFilter,
    );

    final next = response.next;
    final previous = response.previous;

    nextId = next != null && next.isNotEmpty
        ? next
        : /*reset nextId if we get nothing*/ null;
    previousId = previous != null && previous.isNotEmpty
        ? previous
        : /*reset previousId if we get nothing*/ null;

    final newMessages = response.results;
    if (clear) {
      _messageResponses.safeAdd(newMessages);
    } else {
      final temp = oldMessages + newMessages;
      _messageResponses.safeAdd(temp);
    }
    if (_messageResponses.hasValue && _queryMessagesLoadingController.value) {
      _queryMessagesLoadingController.safeAdd(false);
    }
    if (newMessages.isEmpty || newMessages.length < pagination.limit) {
      _paginationEnded = true;
    }
  } catch (e, stk) {
    // reset loading controller
    _queryMessagesLoadingController.safeAdd(false);
    if (_messageResponses.hasValue) {
      _queryMessagesLoadingController.safeAddError(e, stk);
    } else {
      _messageResponses.safeAddError(e, stk);
    }
  }
}