loadEntities<T> method

Future<EntitiesResponse<T>> loadEntities<T>({
  1. required Uri uri,
  2. ApptiveGridLayout layout = ApptiveGridLayout.field,
  3. List<ApptiveGridSorting>? sorting,
  4. ApptiveGridFilter? filter,
  5. bool isRetry = false,
  6. Map<String, String> headers = const {},
})

Load Entities of a Grid that are accessed by uri the layout in which the entities will be returned is determined by layout

sorting allows to apply custom sorting filter allows to get custom filters headers will be added in addition to ApptiveGridClient.defaultHeaders

Implementation

Future<EntitiesResponse<T>> loadEntities<T>({
  required Uri uri,
  ApptiveGridLayout layout = ApptiveGridLayout.field,
  List<ApptiveGridSorting>? sorting,
  ApptiveGridFilter? filter,
  bool isRetry = false,
  Map<String, String> headers = const {},
}) async {
  final baseUrl = Uri.parse(options.environment.url);
  final requestUri = uri.replace(
    scheme: baseUrl.scheme,
    host: baseUrl.host,
    queryParameters: {
      ...uri.queryParameters,
      'layout': layout.queryParameter,
      if (sorting != null)
        'sorting':
            jsonEncode(sorting.map((e) => e.toRequestObject()).toList()),
      if (filter != null) 'filter': jsonEncode(filter.toJson()),
    },
  );

  final response = await _client.get(
    requestUri,
    headers: _createHeadersWithDefaults(headers),
  );

  if (response.statusCode >= 400) {
    if (response.statusCode == 401 && !isRetry) {
      await authenticator.checkAuthentication();
      return loadEntities<T>(
        uri: uri,
        layout: layout,
        sorting: sorting,
        filter: filter,
        isRetry: true,
      );
    }
    throw response;
  }

  final decodedResponse = jsonDecode(response.body);
  if (decodedResponse is List) {
    return EntitiesResponse(items: decodedResponse.cast<T>());
  } else {
    // Preparation for Paging
    return EntitiesResponse(items: decodedResponse['items']);
  }
}