BloomInfiniteQuery<TPage, TParam> constructor

BloomInfiniteQuery<TPage, TParam>({
  1. required List key,
  2. required InfiniteQueryFn<TPage, TParam> fetch,
  3. required TParam initialPageParam,
  4. required GetNextPageParamFn<TPage, TParam> getNextPageParam,
  5. Duration staleTime = const Duration(minutes: 5),
  6. Duration cacheTime = const Duration(minutes: 30),
  7. bool enabled = true,
  8. List getItems(
    1. TPage page
    )?,
  9. List<TPage>? initialData,
})

Creates a BloomInfiniteQuery and checks cache freshness or initiates an initial fetch.

Implementation

BloomInfiniteQuery({
  required this.key,
  required this.fetch,
  required this.initialPageParam,
  required this.getNextPageParam,
  this.staleTime = const Duration(minutes: 5),
  this.cacheTime = const Duration(minutes: 30),
  this.enabled = true,
  this.getItems,
  List<TPage>? initialData,
}) {
  final rawEntry = BloomData.getEntry<dynamic>(key);
  List<TPage>? initialPages;
  bool isStaleInitial = true;

  if (rawEntry != null && rawEntry.data != null) {
    if (rawEntry.data is List<TPage>) {
      initialPages = rawEntry.data as List<TPage>;
    } else if (rawEntry.data is List) {
      initialPages = (rawEntry.data as List).cast<TPage>();
    }
    isStaleInitial = rawEntry.shouldRevalidate;
  } else if (initialData != null && initialData.isNotEmpty) {
    initialPages = initialData;
    isStaleInitial = false;
    BloomData.putEntry<List<TPage>>(
      QueryCacheEntry<List<TPage>>(
        key: key,
        data: initialData,
        updatedAt: DateTime.now(),
        staleTime: staleTime,
        cacheTime: cacheTime,
        isStale: false,
      ),
    );
  }

  _data = signal<List<TPage>?>(initialPages);
  _status = signal<QueryStatus>(
    initialPages != null && initialPages.isNotEmpty
        ? QueryStatus.success
        : QueryStatus.idle,
  );
  _error = signal<Object?>(null);
  _isFetching = signal<bool>(false);
  _isFetchingNextPage = signal<bool>(false);
  _isStale = signal<bool>(isStaleInitial);

  if (initialPages != null && initialPages.isNotEmpty) {
    _pageParams = [initialPageParam];
    _nextPageParam = getNextPageParam(initialPages.last, initialPages);
    _hasNextPage = signal<bool>(_nextPageParam != null);
  } else {
    _nextPageParam = initialPageParam;
    _hasNextPage = signal<bool>(false);
  }

  _invalidationSub = BloomData.onInvalidated(key).listen((_) {
    _isStale.value = true;
    if (enabled && !_isDisposed) {
      refetch();
    }
  });

  if (enabled) {
    if (rawEntry == null || rawEntry.shouldRevalidate) {
      if (initialPages == null || isStaleInitial) {
        _executeInitialFetch();
      }
    }
  }
}