feat(infinite_query): add isLoadingNextPage & remove isLoadingPage

This commit is contained in:
Kingkor Roy Tirtho
2023-10-06 11:15:59 +06:00
parent 9581e276b9
commit ab1479c0eb
2 changed files with 40 additions and 29 deletions
@@ -30,17 +30,21 @@ class InfiniteQueryPage<DataType, ErrorType, PageType> with Invalidation {
final DateTime updatedAt;
final Duration staleDuration;
final bool _loading;
const InfiniteQueryPage({
required this.page,
this.data,
this.error,
required this.updatedAt,
required this.staleDuration,
});
bool loading = false,
}) : _loading = loading;
InfiniteQueryPage<DataType, ErrorType, PageType> copyWith({
DataType? data,
ErrorType? error,
bool? loading,
}) {
return InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
@@ -48,6 +52,7 @@ class InfiniteQueryPage<DataType, ErrorType, PageType> with Invalidation {
staleDuration: staleDuration,
data: data ?? this.data,
error: error ?? this.error,
loading: loading ?? _loading,
);
}
@@ -70,7 +75,8 @@ class InfiniteQueryState<DataType, ErrorType, PageType> {
required this.pages,
});
PageType get lastPage => pages.last.page;
PageType get lastPage =>
pages.whereNot((e) => e.data == null && e.error == null).last.page;
InfiniteQueryState<DataType, ErrorType, PageType> copyWith(
{Set<InfiniteQueryPage<DataType, ErrorType, PageType>>? pages}) {
@@ -243,8 +249,16 @@ class InfiniteQuery<DataType, ErrorType, PageType>
return _nextPage(lastPage, lastPageData);
}
bool get isLoadingPage => !hasPageData && !hasPageError && _mutex.isLocked;
bool get isRefreshingPage => (hasPageData || hasPageError) && _mutex.isLocked;
bool get isLoadingNextPage {
final nextPage = state.pages.firstWhereOrNull((p) => p.page == getNextPage);
return nextPage?._loading == true;
}
bool get isRefreshingPage {
final currentPage = state.pages.firstWhereOrNull((p) => p.page == lastPage);
return currentPage?._loading == true;
}
bool get isInactive => !hasListeners;
bool get hasPages => pages.isNotEmpty;
@@ -261,21 +275,27 @@ class InfiniteQuery<DataType, ErrorType, PageType>
return;
}
return _mutex.protect(() async {
state = state.copyWith();
final storedPage = state.pages.firstWhere(
(e) => e.page == page,
orElse: () => InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
updatedAt: DateTime.now(),
staleDuration: refreshConfig.staleDuration,
loading: true,
),
);
state = state.copyWith(
pages: {
...state.pages..remove(storedPage),
storedPage,
},
);
_operation = cancellableRetryOperation(
() => _queryFn(page),
config: retryConfig,
onSuccessful: (data) async {
final dataPage = state.pages
.firstWhere(
(e) => e.page == page,
orElse: () => InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
updatedAt: DateTime.now(),
staleDuration: refreshConfig.staleDuration,
),
)
.copyWith(data: data, error: null);
final dataPage =
storedPage.copyWith(data: data, error: null, loading: false);
state = state.copyWith(
pages: {...state.pages..remove(dataPage), dataPage},
);
@@ -297,16 +317,7 @@ class InfiniteQuery<DataType, ErrorType, PageType>
}
},
onFailed: (error) {
final errorPage = state.pages
.firstWhere(
(e) => e.page == page,
orElse: () => InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
updatedAt: DateTime.now(),
staleDuration: refreshConfig.staleDuration,
),
)
.copyWith(error: error);
final errorPage = storedPage.copyWith(error: error, loading: false);
state = state.copyWith(
pages: {
...state.pages..remove(errorPage),
@@ -407,7 +418,7 @@ class InfiniteQuery<DataType, ErrorType, PageType>
staleDuration: refreshConfig.staleDuration,
),
)
.copyWith(data: data);
.copyWith(data: data, loading: false);
state = state.copyWith(
pages: {
@@ -37,7 +37,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
return QueryTile(
title: query.key,
isLoading: query.isLoadingPage,
isLoading: query.isLoadingNextPage,
hasError: query.hasErrors,
onTap: () {
setState(() {
@@ -63,7 +63,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
_selectedQueryKey ?? '',
builder: (context, query) {
if (query == null) {
return SizedBox.shrink();
return const SizedBox.shrink();
}
return ExplorerView(
@@ -78,7 +78,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
"updatedAt": page.updatedAt.toString(),
};
}).toList(),
'isLoadingPage': query.isLoadingPage,
'isLoadingNextPage': query.isLoadingNextPage,
'isRefreshingPage': query.isRefreshingPage,
'isInactive': query.isInactive,
'refreshConfig': query.refreshConfig.toJson(),