]> git.proxmox.com Git - flutter/pve_flutter_frontend.git/commitdiff
fix infinite task scrolling with updates
authorTim Marx <t.marx@proxmox.com>
Wed, 15 Apr 2020 10:39:52 +0000 (12:39 +0200)
committerTim Marx <t.marx@proxmox.com>
Wed, 15 Apr 2020 10:39:52 +0000 (12:39 +0200)
Signed-off-by: Tim Marx <t.marx@proxmox.com>
lib/bloc/pve_task_log_bloc.dart
lib/widgets/pve_task_log_widget.dart

index 77bb30cb0f1bb19a4eb1ee5fe073338a4df7cc85..5863690aa3b437df88c71d8fedf7fa5d2a9ae412 100644 (file)
@@ -19,7 +19,7 @@ class PveTaskLogBloc extends ProxmoxBaseBloc<PVETaskLogEvent, PveTaskLogState> {
   @override
   void doOnListen() {
     updateTasks = Timer.periodic(Duration(seconds: 4), (timer) {
-        events.add(LoadTasks());
+      events.add(LoadTasks());
     });
   }
 
@@ -36,21 +36,33 @@ class PveTaskLogBloc extends ProxmoxBaseBloc<PVETaskLogEvent, PveTaskLogState> {
     yield latestState.rebuild((b) => b..isBlank = false);
 
     if (event is LoadTasks) {
-      final nodeTaskResponse = await getNodeTasks(latestState);
+      var nodeTaskResponse;
+      yield latestState.rebuild((b) => b..isLoading = true);
+
+      if (latestState.tasks.length > 0) {
+        nodeTaskResponse =
+            await getNodeTasks(latestState, limit: latestState.tasks.length);
+      } else {
+        nodeTaskResponse = await getNodeTasks(latestState);
+      }
 
       yield latestState.rebuild((b) => b
         ..tasks.replace(nodeTaskResponse.tasks)
-        ..total = nodeTaskResponse.total);
+        ..total = nodeTaskResponse.total
+        ..isLoading = false);
     }
 
     if (event is LoadMoreTasks) {
-      if (latestState.total > latestState.tasks.length) {
+      if ((latestState.total > latestState.tasks.length) &&
+          !latestState.isLoading) {
+        yield latestState.rebuild((b) => b..isLoading = true);
         final nodeTaskResponse =
-            await getNodeTasks(latestState, nextPage: latestState.tasks.length);
+            await getNodeTasks(latestState, start: latestState.tasks.length);
 
         yield latestState.rebuild((b) => b
           ..tasks.addAll(nodeTaskResponse.tasks)
-          ..total = nodeTaskResponse.total);
+          ..total = nodeTaskResponse.total
+          ..isLoading = false);
       }
     }
 
@@ -76,16 +88,16 @@ class PveTaskLogBloc extends ProxmoxBaseBloc<PVETaskLogEvent, PveTaskLogState> {
   }
 
   Future<NodeTasksResponse> getNodeTasks(PveTaskLogState state,
-      {int nextPage}) async {
+      {int start, int limit = 50}) async {
     return await apiClient.getNodeTasks(
       state.nodeID,
-      limit: state.limit?.toString(),
+      limit: limit?.toString(),
       guestId: state.guestID,
       source: state.source,
       userfilter: state.userFilter,
       typefilter: state.typeFilter,
       errors: state.onlyErrors,
-      start: nextPage?.toString(),
+      start: start?.toString(),
     );
   }
 }
index cd42fc1e83965f94fb33aa18c7530fe687664369..b25611288d852397000a2ac05bcf079492086594 100644 (file)
@@ -116,9 +116,11 @@ class PveTaskLog extends StatelessWidget {
                 ),
                 body: NotificationListener<ScrollNotification>(
                   onNotification: (ScrollNotification scrollInfo) {
-                    if (scrollInfo.metrics.pixels ==
-                        scrollInfo.metrics.maxScrollExtent) {
-                      bloc.events.add(LoadMoreTasks());
+                    if (scrollInfo.metrics.pixels >=
+                        (0.9 * scrollInfo.metrics.maxScrollExtent)) {
+                      if (!state.isLoading) {
+                        bloc.events.add(LoadMoreTasks());
+                      }
                     }
                     return false;
                   },