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 DateTime updatedAt;
final Duration staleDuration; final Duration staleDuration;
final bool _loading;
const InfiniteQueryPage({ const InfiniteQueryPage({
required this.page, required this.page,
this.data, this.data,
this.error, this.error,
required this.updatedAt, required this.updatedAt,
required this.staleDuration, required this.staleDuration,
}); bool loading = false,
}) : _loading = loading;
InfiniteQueryPage<DataType, ErrorType, PageType> copyWith({ InfiniteQueryPage<DataType, ErrorType, PageType> copyWith({
DataType? data, DataType? data,
ErrorType? error, ErrorType? error,
bool? loading,
}) { }) {
return InfiniteQueryPage<DataType, ErrorType, PageType>( return InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page, page: page,
@@ -48,6 +52,7 @@ class InfiniteQueryPage<DataType, ErrorType, PageType> with Invalidation {
staleDuration: staleDuration, staleDuration: staleDuration,
data: data ?? this.data, data: data ?? this.data,
error: error ?? this.error, error: error ?? this.error,
loading: loading ?? _loading,
); );
} }
@@ -70,7 +75,8 @@ class InfiniteQueryState<DataType, ErrorType, PageType> {
required this.pages, 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( InfiniteQueryState<DataType, ErrorType, PageType> copyWith(
{Set<InfiniteQueryPage<DataType, ErrorType, PageType>>? pages}) { {Set<InfiniteQueryPage<DataType, ErrorType, PageType>>? pages}) {
@@ -243,8 +249,16 @@ class InfiniteQuery<DataType, ErrorType, PageType>
return _nextPage(lastPage, lastPageData); return _nextPage(lastPage, lastPageData);
} }
bool get isLoadingPage => !hasPageData && !hasPageError && _mutex.isLocked; bool get isLoadingNextPage {
bool get isRefreshingPage => (hasPageData || hasPageError) && _mutex.isLocked; 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 isInactive => !hasListeners;
bool get hasPages => pages.isNotEmpty; bool get hasPages => pages.isNotEmpty;
@@ -261,21 +275,27 @@ class InfiniteQuery<DataType, ErrorType, PageType>
return; return;
} }
return _mutex.protect(() async { 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( _operation = cancellableRetryOperation(
() => _queryFn(page), () => _queryFn(page),
config: retryConfig, config: retryConfig,
onSuccessful: (data) async { onSuccessful: (data) async {
final dataPage = state.pages final dataPage =
.firstWhere( storedPage.copyWith(data: data, error: null, loading: false);
(e) => e.page == page,
orElse: () => InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
updatedAt: DateTime.now(),
staleDuration: refreshConfig.staleDuration,
),
)
.copyWith(data: data, error: null);
state = state.copyWith( state = state.copyWith(
pages: {...state.pages..remove(dataPage), dataPage}, pages: {...state.pages..remove(dataPage), dataPage},
); );
@@ -297,16 +317,7 @@ class InfiniteQuery<DataType, ErrorType, PageType>
} }
}, },
onFailed: (error) { onFailed: (error) {
final errorPage = state.pages final errorPage = storedPage.copyWith(error: error, loading: false);
.firstWhere(
(e) => e.page == page,
orElse: () => InfiniteQueryPage<DataType, ErrorType, PageType>(
page: page,
updatedAt: DateTime.now(),
staleDuration: refreshConfig.staleDuration,
),
)
.copyWith(error: error);
state = state.copyWith( state = state.copyWith(
pages: { pages: {
...state.pages..remove(errorPage), ...state.pages..remove(errorPage),
@@ -407,7 +418,7 @@ class InfiniteQuery<DataType, ErrorType, PageType>
staleDuration: refreshConfig.staleDuration, staleDuration: refreshConfig.staleDuration,
), ),
) )
.copyWith(data: data); .copyWith(data: data, loading: false);
state = state.copyWith( state = state.copyWith(
pages: { pages: {
@@ -37,7 +37,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
return QueryTile( return QueryTile(
title: query.key, title: query.key,
isLoading: query.isLoadingPage, isLoading: query.isLoadingNextPage,
hasError: query.hasErrors, hasError: query.hasErrors,
onTap: () { onTap: () {
setState(() { setState(() {
@@ -63,7 +63,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
_selectedQueryKey ?? '', _selectedQueryKey ?? '',
builder: (context, query) { builder: (context, query) {
if (query == null) { if (query == null) {
return SizedBox.shrink(); return const SizedBox.shrink();
} }
return ExplorerView( return ExplorerView(
@@ -78,7 +78,7 @@ class _InfiniteQueryTabState extends State<InfiniteQueryTab> {
"updatedAt": page.updatedAt.toString(), "updatedAt": page.updatedAt.toString(),
}; };
}).toList(), }).toList(),
'isLoadingPage': query.isLoadingPage, 'isLoadingNextPage': query.isLoadingNextPage,
'isRefreshingPage': query.isRefreshingPage, 'isRefreshingPage': query.isRefreshingPage,
'isInactive': query.isInactive, 'isInactive': query.isInactive,
'refreshConfig': query.refreshConfig.toJson(), 'refreshConfig': query.refreshConfig.toJson(),