From 119fe9ca16e6d40929de565a8d3f7348d172d431 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Wed, 22 Mar 2023 13:28:05 -0400 Subject: [PATCH] Rework notifications refresh initial page algorithm to make more robust --- lib/services/notifications_manager.dart | 60 ++++++++++++++++--------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/lib/services/notifications_manager.dart b/lib/services/notifications_manager.dart index 818cafc..5877028 100644 --- a/lib/services/notifications_manager.dart +++ b/lib/services/notifications_manager.dart @@ -80,32 +80,52 @@ class NotificationsManager extends ChangeNotifier { continue; } final page = _pm.pages[i]; - PagingData? pd; if (i == 0) { - if (page.next == null) { - _logger.severe( - "Expected first page to have a next page so can query on this page of data but doesn't exist."); - continue; - } - final response = await _clientGetNotificationsRequest(page.next!); - response.match( - onSuccess: (response) => pd = response.previous, - onError: (error) => - _logger.severe('Error getting previous page: $error')); - if (pd == null && page.previous == null) { - _logger.severe( - 'Next page returned no results and no previous page so need to re-initalize'); - } else { - final response = await _clientGetNotificationsRequest(pd!); + PagingData? pd; + bool initializedFirstPage = false; + if (page.next != null) { + final response = await _clientGetNotificationsRequest(page.next!); response.match( - onSuccess: (response) => pd = response.next, + onSuccess: (response) => pd = response.previous, onError: (error) => _logger.severe('Error getting previous page: $error')); + if (pd != null) { + final response = await _clientGetNotificationsRequest(pd!); + response.match( + onSuccess: (response) { + initializedFirstPage = true; + notificationsFromRefresh.addAll(response.data); + }, + onError: (error) => + _logger.severe('Error getting previous page: $error')); + } else if (pd == null && page.previous != null) { + final response = await _clientGetNotificationsRequest( + page.previous!) + .andThenAsync((previousData) async => previousData.next != + null + ? await _clientGetNotificationsRequest(previousData.next!) + : buildErrorResult( + type: ErrorType.rangeError, + message: 'No "next" page from previous data either')); + response.match( + onSuccess: (response) { + initializedFirstPage = true; + notificationsFromRefresh.addAll(response.data); + }, + onError: (error) => + _logger.severe('Error getting previous page: $error')); + } else if (pd == null && page.previous == null) { + _logger.severe( + 'Next page returned no results and no previous page so will need to re-initalize'); + } + } else { + _logger.severe( + 'There is no next page to query so will be forced to reset'); } - if (pd == null) { + if (!initializedFirstPage) { _logger.severe( - 'Previous and next page both returned nulls so need to reinitialize'); + 'Unable to determine call to rebuild initial page so resetting'); _pm.clear(); final result = await _pm.initialize(initialPull); result.andThenSuccess( @@ -126,7 +146,7 @@ class NotificationsManager extends ChangeNotifier { onSuccess: (response) => notificationsFromRefresh.addAll(response.data), onError: (error) => - _logger.severe('Error getting previous page: $error')); + _logger.severe('Error getting next page: $error')); } }