mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-11-18 18:02:24 -05:00
fix: Stabilize shopping list queuing (#6498)
This commit is contained in:
@@ -97,13 +97,8 @@ export function useShoppingListCrud(
|
|||||||
.sort(sortCheckedItems);
|
.sort(sortCheckedItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the item if it's checked, otherwise updateUncheckedListItems will handle it
|
shoppingListItemActions.updateItem(item);
|
||||||
if (item.checked) {
|
|
||||||
shoppingListItemActions.updateItem(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateListItemOrder();
|
updateListItemOrder();
|
||||||
updateUncheckedListItems();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteListItem(item: ShoppingListItemOut) {
|
function deleteListItem(item: ShoppingListItemOut) {
|
||||||
|
|||||||
@@ -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);
|
||||||
queue.update.push(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user