/// import { Cell, Default, handler, NAME, pattern, UI } from "commontools"; interface SubItem { label: string; count: Default; } interface Item { name: string; value: Default; subItems: Default; } interface Input { title: Default; globalCounter: Default; items: Default; } // Root level: increment global counter const incrementGlobal = handler }>( (_event, { globalCounter }) => { globalCounter.set(globalCounter.get() + 1); }, ); // Root level: add new item const addItem = handler }>( (_event, { items }) => { const current = items.get(); items.set([ ...current, { name: `Item ${current.length + 1}`, value: 0, subItems: [] }, ]); }, ); // Item level: increment item value const incrementItem = handler }>( (_event, { item }) => { const current = item.get(); item.set({ ...current, value: current.value + 1 }); }, ); // Item level: add sub-item const addSubItem = handler }>( (_event, { item }) => { const current = item.get(); item.set({ ...current, subItems: [ ...current.subItems, { label: `Sub ${current.subItems.length + 1}`, count: 0 }, ], }); }, ); // Item level: remove item from list const removeItem = handler< unknown, { items: Cell>>; item: Cell } >((_event, { items, item }) => { const current = items.get(); const index = current.findIndex((el) => el.equals(item)); if (index >= 0) { items.set(current.toSpliced(index, 1)); } }); // Sub-item level: increment sub-item count const incrementSubItem = handler }>( (_event, { subItem }) => { const current = subItem.get(); subItem.set({ ...current, count: current.count + 1 }); }, ); export default pattern(({ title, globalCounter, items }) => { return { [NAME]: title, [UI]: (

{title}

{/* Root level mutation */}
Global Counter: {globalCounter}
{/* Root level: add items */}
{/* Item level */}
{items.map((item) => (
{item.name} - Value: {item.value}
{/* Sub-item level */}
{item.subItems.map((subItem) => (
{subItem.label}: {subItem.count}
))}
))}
), title, globalCounter, items, }; });