feat(infinite_query): add isLoadingNextPage & remove isLoadingPage
This commit is contained in:
@@ -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(),
|
||||||
|
|||||||
Reference in New Issue
Block a user