fix: Stabilize shopping list queuing (#6498)

This commit is contained in:
Michael Genson
2025-11-03 18:38:33 -06:00
committed by GitHub
parent 3a4875a54f
commit 7bb0f0801a
2 changed files with 26 additions and 17 deletions

View File

@@ -97,13 +97,8 @@ export function useShoppingListCrud(
.sort(sortCheckedItems); .sort(sortCheckedItems);
} }
// Update the item if it's checked, otherwise updateUncheckedListItems will handle it
if (item.checked) {
shoppingListItemActions.updateItem(item); shoppingListItemActions.updateItem(item);
}
updateListItemOrder(); updateListItemOrder();
updateUncheckedListItems();
} }
function deleteListItem(item: ShoppingListItemOut) { function deleteListItem(item: ShoppingListItemOut) {

View File

@@ -112,34 +112,46 @@ export function useShoppingListItemActions(shoppingListId: string) {
async function getList() { async function getList() {
const response = await api.shopping.lists.getOne(shoppingListId); const response = await api.shopping.lists.getOne(shoppingListId);
if (!isOnline.value && response.data) { if (response.data) {
// Merge pending local changes (both online and offline)
const createAndUpdateQueues = mergeListItemsByLatest(queue.update, queue.create); const createAndUpdateQueues = mergeListItemsByLatest(queue.update, queue.create);
response.data.listItems = mergeListItemsByLatest(response.data.listItems ?? [], createAndUpdateQueues); const deleteQueueIds = new Set(queue.delete.map(item => item.id));
const filteredLocalChanges = createAndUpdateQueues.filter(item => !deleteQueueIds.has(item.id));
let mergedItems = mergeListItemsByLatest(response.data.listItems ?? [], filteredLocalChanges);
mergedItems = mergedItems.filter(item => !deleteQueueIds.has(item.id));
response.data.listItems = mergedItems;
} }
return response.data; return response.data;
} }
function createItem(item: ShoppingListItemOut) { function createItem(item: ShoppingListItemOut) {
removeFromQueue(queue.create, item); removeFromQueue(queue.create, item);
removeFromQueue(queue.update, item);
removeFromQueue(queue.delete, item);
queue.create.push(item); queue.create.push(item);
} }
function updateItem(item: ShoppingListItemOut) { function updateItem(item: ShoppingListItemOut) {
const removedFromCreate = removeFromQueue(queue.create, item); const removedFromCreate = removeFromQueue(queue.create, item);
if (removedFromCreate) {
// this item hasn't been created yet, so we don't need to update it
queue.create.push(item);
return;
}
removeFromQueue(queue.update, item); removeFromQueue(queue.update, item);
removeFromQueue(queue.delete, item);
if (removedFromCreate) {
// This item hasn't been created yet, so keep it in create queue with updated data
queue.create.push(item);
}
else {
queue.update.push(item); queue.update.push(item);
} }
}
function deleteItem(item: ShoppingListItemOut) { function deleteItem(item: ShoppingListItemOut) {
const removedFromCreate = removeFromQueue(queue.create, item); const removedFromCreate = removeFromQueue(queue.create, item);
if (removedFromCreate) { if (removedFromCreate) {
// this item hasn't been created yet, so we don't need to delete it // This item hasn't been created yet, so we don't need to delete it
return; return;
} }
@@ -198,10 +210,12 @@ export function useShoppingListItemActions(shoppingListId: string) {
try { try {
const itemsToProcess = [...queueItems]; const itemsToProcess = [...queueItems];
const itemIdsToProcess = itemsToProcess.map(item => item.id);
await action(itemsToProcess) await action(itemsToProcess)
.then(() => { .then(() => {
if (isOnline.value) { if (isOnline.value) {
clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id)); clearQueueItems(itemQueueType, itemIdsToProcess);
} }
}); });
} }