update: use better effect pattern for sorted wishlist in edit page

This commit is contained in:
rasmusq
2025-11-27 21:21:23 +01:00
parent 93c5b839d3
commit 8dcf26b1d3

View File

@@ -23,22 +23,24 @@
let editFormElement = $state<HTMLElement | null>(null);
let searchQuery = $state("");
let sortedItems = $state<Item[]>([]);
let items = $state<Item[]>([]);
$effect.pre(() => {
const sorted = [...data.wishlist.items].sort(
(a, b) => Number(a.order) - Number(b.order),
);
items = sorted;
});
let filteredItems = $derived(
searchQuery.trim()
? sortedItems.filter(item =>
? items.filter(item =>
item.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
item.description?.toLowerCase().includes(searchQuery.toLowerCase())
)
: sortedItems
: items
);
$effect(() => {
sortedItems = [...data.wishlist.items].sort(
(a, b) => Number(a.order) - Number(b.order),
);
});
function handleItemAdded() {
showAddForm = false;
}
@@ -59,7 +61,7 @@
}
function handleColorChange(itemId: string, newColor: string) {
sortedItems = sortedItems.map((item) =>
items = items.map((item) =>
item.id === itemId ? { ...item, color: newColor } : item,
);
}
@@ -91,17 +93,16 @@
async function handlePositionChange(newPosition: number) {
if (!editingItem) return;
const currentIndex = sortedItems.findIndex(item => item.id === editingItem.id);
const currentIndex = items.findIndex(item => item.id === editingItem.id);
if (currentIndex === -1) return;
const newIndex = newPosition - 1; // Convert to 0-based index
// Reorder the array
const newItems = [...sortedItems];
const newItems = [...items];
const [movedItem] = newItems.splice(currentIndex, 1);
newItems.splice(newIndex, 0, movedItem);
sortedItems = newItems;
items = newItems;
await handleReorder(newItems);
}
</script>
@@ -150,14 +151,14 @@
onSuccess={handleItemUpdated}
onCancel={cancelEditing}
onColorChange={handleColorChange}
currentPosition={sortedItems.findIndex(item => item.id === editingItem.id) + 1}
totalItems={sortedItems.length}
currentPosition={items.findIndex(item => item.id === editingItem.id) + 1}
totalItems={items.length}
onPositionChange={handlePositionChange}
/>
</div>
{/if}
{#if sortedItems.length > 5}
{#if items.length > 5}
<SearchBar bind:value={searchQuery} />
{/if}