Skip to content

Instantly share code, notes, and snippets.

@zerkalica
Last active February 26, 2016 19:09
Show Gist options
  • Save zerkalica/647bc3a695b91d46fee0 to your computer and use it in GitHub Desktop.
Save zerkalica/647bc3a695b91d46fee0 to your computer and use it in GitHub Desktop.
New Age of ui composition
export default new Map([
[TodoItem, TodoItemDefaultDeps],
[TodoHeader, TodoHeaderDefaultDeps],
[TodoItemList, TodoItemListDefaultDeps],
[TodoFooter, TodoFooterDefaultDeps],
[TodoMain, TodoMainDefaultDeps]
])
type TodoItemModel = {
id: string;
title: string;
}
export default function TodoItem(
item: TodoItemModel,
beginEditing: () => void,
endEditing: () => void,
editingItem: TodoItemModel,
isEditing: boolean,
setEditingItem: () => void
) {
return <div>
{isEditing
? <input type="text" value={editingItem.title} onChange={setEditingItem} onEnter={endEditing} />
: <div onDoubleClick={beginEditing}>{item.id}: {item.title}</div>
}
</div>
}
import {actions, model} from '../app'
export const TodoItemDefaultDeps = {
item: '@fromProps',
actions.beginEditing,
actions.endEditing,
model.todo.editingItem,
model.todo.isEditing,
actions.setEditingItem
}
type ITodoItem = Widget<{item: TodoItemModel}>;
export default function TodoItemList(
items: Array<TodoItemModel>,
TodoItem: ITodoItem
) {
return (
<ul>
<li>
{items.map(item =>
<TodoItem item={item}/>
)}
</li>
</ul>
)
}
import TodoItem from './TodoItem'
import {actions, model} from '../app'
export const TodoItemDefaultDeps = {
items: model.todo.todos,
TodoItem
}
export default function TodoMain(
TodoHeader: Widget<void>,
TodoItemList: Widget<void>,
TodoFooter: Widget<void>
) {
return (
<div>
<TodoHeader/>
<TodoItemList/>
<TodoFooter/>
</div>
)
}
import TodoHeader from './TodoHeader'
import TodoFooter from './TodoFooter'
import TodoItemList from './TodoItemList'
export const TodoItemDefaultDeps = {
TodoHeader,
TodoItemList,
TodoFooter
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment