{
+ let queueItems: ShoppingListItemOut[];
+ try {
+ queueItems = getQueueItems(itemQueueType);
+ if (!queueItems.length) {
+ return true;
+ }
+ } catch (error) {
+ console.log(`Error fetching queue items of type ${itemQueueType}:`, error);
+ clearQueueItems(itemQueueType);
+ return false;
}
- const itemsToProcess = [...queueItems];
- await action(itemsToProcess)
- .then((response) => {
- handleResponse(response);
- if (!isOffline.value) {
- clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id));
- }
- });
+ try {
+ const itemsToProcess = [...queueItems];
+ await action(itemsToProcess)
+ .then(() => {
+ if (window.$nuxt.isOnline) {
+ clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id));
+ }
+ });
+ } catch (error) {
+ console.log(`Error processing queue items of type ${itemQueueType}:`, error);
+ clearQueueItems(itemQueueType);
+ return false;
+ }
+
+ return true;
}
async function process() {
- if(
- !queue.create.length &&
- !queue.update.length &&
- !queue.delete.length
- ) {
+ if(queueEmpty.value) {
+ queue.lastUpdate = Date.now();
return;
}
@@ -135,26 +197,23 @@ export function useShoppingListItemActions(shoppingListId: string) {
if (!data) {
return;
}
+ checkUpdateState(data);
- const cutoffDate = new Date(queue.lastUpdate + queueTimeout).toISOString();
- if (data.updateAt && data.updateAt > cutoffDate) {
- // If the queue is too far behind the shopping list to reliably do updates, we clear the queue
- clearQueueItems("all");
- } else {
- // We send each bulk request one at a time, since the backend may merge items
- await processQueueItems((items) => api.shopping.items.deleteMany(items), "delete");
- await processQueueItems((items) => api.shopping.items.updateMany(items), "update");
- await processQueueItems((items) => api.shopping.items.createMany(items), "create");
- }
+ // We send each bulk request one at a time, since the backend may merge items
+ // "failures" here refers to an actual error, rather than failing to reach the backend
+ let failures = 0;
+ if (!(await processQueueItems((items) => api.shopping.items.deleteMany(items), "delete"))) failures++;
+ if (!(await processQueueItems((items) => api.shopping.items.updateMany(items), "update"))) failures++;
+ if (!(await processQueueItems((items) => api.shopping.items.createMany(items), "create"))) failures++;
- // If we're online, the queue is fully processed, so we're up to date
- if (!isOffline.value) {
+ // If we're online, or the queue is empty, the queue is fully processed, so we're up to date
+ // Otherwise, if all three queue processes failed, we've already reset the queue, so we need to reset the date
+ if (window.$nuxt.isOnline || queueEmpty.value || failures === 3) {
queue.lastUpdate = Date.now();
}
}
return {
- isOffline,
getList,
createItem,
updateItem,
diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue
index c7be3ace5343..e852b05e9f3b 100644
--- a/frontend/pages/shopping-lists/_id.vue
+++ b/frontend/pages/shopping-lists/_id.vue
@@ -28,7 +28,7 @@
{{ shoppingList.name }}
@@ -46,7 +46,6 @@
:units="allUnits || []"
:foods="allFoods || []"
:recipes="recipeMap"
- :is-offline="isOffline"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
@@ -75,7 +74,6 @@
:units="allUnits || []"
:foods="allFoods || []"
:recipes="recipeMap"
- :is-offline="isOffline"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
@@ -132,7 +130,6 @@
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
- :is-offline="isOffline"
@delete="createEditorOpen = false"
@cancel="createEditorOpen = false"
@save="createListItem"
@@ -141,7 +138,7 @@
{{ $globals.icons.tags }}
{{ $t('shopping-list.reorder-labels') }}
@@ -221,7 +218,6 @@
:labels="allLabels || []"
:units="allUnits || []"
:foods="allFoods || []"
- :is-offline="isOffline"
@checked="saveListItem"
@save="saveListItem"
@delete="deleteListItem(item)"
@@ -244,10 +240,10 @@
{{ $tc('shopping-list.linked-recipes-count', shoppingList.recipeReferences ? shoppingList.recipeReferences.length : 0) }}
-
+
-
+
{{ $globals.icons.minus }}
@@ -255,7 +251,7 @@
{{ shoppingList.recipeReferences[index].recipeQuantity }}
-
+
{{ $globals.icons.createAlt }}
@@ -268,7 +264,7 @@
{{ $globals.icons.cog }}
@@ -278,7 +274,7 @@
-