/// import { Cell, Default, handler, NAME, pattern, UI } from "commontools"; interface Item { text: Default; } interface InputSchema { title: Default; items: Default; } type InputEventType = { detail: { message: string; }; }; interface ListState { items: Cell; } const addItem = handler( (event: InputEventType, state: ListState) => { state.items.push({ text: event.detail.message }); }, ); const removeItem = handler< unknown, { items: Cell>>; item: Cell } >((_event, { items, item }) => { const currentItems = items.get(); const index = currentItems.findIndex((el) => el.equals(item)); if (index >= 0) { items.set(currentItems.toSpliced(index, 1)); } }); const updateItem = handler< { detail: { value: string } }, { items: Cell; index: number } >(({ detail: { value } }, { items, index }) => { const itemsCopy = items.get().slice(); if (index >= 0 && index < itemsCopy.length) { itemsCopy[index] = { text: value }; items.set(itemsCopy); } }); export default pattern(({ title, items }) => { return { [NAME]: title, [UI]: (

{title}

Editable Array with Remove

{items.map((item, index) => (
Remove
))}
), title, items, addItem: addItem({ items }), updateItem, }; });