fix: List item UI improvements

This commit is contained in:
2026-09-04 10:35:06 +02:00
parent 73663543fd
commit 47034e111c
14 changed files with 374 additions and 86 deletions
+7 -8
View File
@@ -109,7 +109,7 @@ const listsApiMocks = vi.hoisted(() => ({
createListApi: vi.fn<() => Promise<unknown>>(),
getListItemsApi: vi.fn<() => Promise<unknown>>(),
createListItemApi: vi.fn<() => Promise<unknown>>(),
updateListItemApi: vi.fn<() => Promise<unknown>>(),
updateListItemTitleApi: vi.fn<() => Promise<unknown>>(),
setListItemCompletedApi: vi.fn<() => Promise<unknown>>(),
addUserToListApi: vi.fn<() => Promise<unknown>>(),
removeUserFromListApi: vi.fn<() => Promise<unknown>>(),
@@ -211,29 +211,28 @@ describe('useListsStore', () => {
expect(store.error).toBe('Network error')
})
it('updates a list item locally and pushes the change to the server', async () => {
it('updates a list item title locally and pushes the change via the dedicated endpoint', async () => {
listsApiMocks.createListItemApi.mockResolvedValueOnce({
id: 'server-item-2',
list_id: '',
title: 'Eggs',
is_completed: false,
})
listsApiMocks.updateListItemApi.mockResolvedValueOnce(undefined)
listsApiMocks.updateListItemTitleApi.mockResolvedValueOnce(undefined)
const store = useListsStore()
await store.createListItem('list-1', 'Eggs')
await store.sync()
const created = store.listItems.find((entry) => entry.title === 'Eggs')!
await store.updateListItem(created.id, { is_completed: true })
await store.updateListItemTitle(created.id, 'Free-range eggs')
await store.sync()
expect(listsApiMocks.updateListItemApi).toHaveBeenCalledWith({
list_item_id: created.id,
is_completed: true,
expect(listsApiMocks.updateListItemTitleApi).toHaveBeenCalledWith(created.id, {
title: 'Free-range eggs',
})
const updated = store.listItems.find((entry) => entry.id === created.id)
expect(updated?.is_completed).toBe(true)
expect(updated?.title).toBe('Free-range eggs')
expect(updated?.pendingSync).toBe(false)
})
+10 -14
View File
@@ -13,7 +13,7 @@ import {
createListApi,
getListItemsApi,
createListItemApi,
updateListItemApi,
updateListItemTitleApi,
setListItemCompletedApi,
addUserToListApi,
removeUserFromListApi,
@@ -180,12 +180,9 @@ export const useListsStore = defineStore('lists', () => {
return localItem
}
async function updateListItem(
itemId: string,
changes: { title?: string; is_completed?: boolean },
) {
async function updateListItemTitle(itemId: string, title: string) {
const patch = {
...changes,
title,
modified_at: new Date().toISOString(),
pendingSync: true,
}
@@ -193,8 +190,8 @@ export const useListsStore = defineStore('lists', () => {
const existingItem = listItems.value.find((entry) => entry.id === itemId)
if (existingItem) Object.assign(existingItem, patch)
await enqueue({
type: 'updateListItem',
payload: { list_item_id: itemId, ...changes },
type: 'updateListItemTitle',
payload: { title },
localListItemId: itemId,
})
scheduleSync()
@@ -357,11 +354,10 @@ export const useListsStore = defineStore('lists', () => {
}
break
}
case 'updateListItem': {
await updateListItemApi(entry.payload)
if (entry.localListItemId) {
await markListItemSynced(entry.localListItemId)
}
case 'updateListItemTitle': {
if (!entry.localListItemId) break
await updateListItemTitleApi(entry.localListItemId, entry.payload)
await markListItemSynced(entry.localListItemId)
break
}
case 'setListItemCompleted': {
@@ -570,7 +566,7 @@ export const useListsStore = defineStore('lists', () => {
refresh,
createList,
createListItem,
updateListItem,
updateListItemTitle,
setListItemCompleted,
addUserToList,
removeUserFromList,