From db67f289d60a0526b957f3ab3fbff6296b824194 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 21 Aug 2019 08:50:31 +0200 Subject: [PATCH] Refactor todo item --- examples/todo/src/Item.ts | 50 +++++++++++++++------------------------ 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/examples/todo/src/Item.ts b/examples/todo/src/Item.ts index d6e0b1d..5be6d13 100644 --- a/examples/todo/src/Item.ts +++ b/examples/todo/src/Item.ts @@ -7,6 +7,7 @@ import { setItemIO, itemBehavior, removeItemIO } from "./localstorage"; const enter = 13; const esc = 27; +export const itemIdToPersistKey = (id: number) => `todoItem:${id}`; export type Props = { name: string; @@ -19,11 +20,10 @@ type FromView = { toggleTodo: H.Stream; taskName: H.Behavior; startEditing: H.Stream; - nameBlur: H.Stream; deleteClicked: H.Stream; - cancel: H.Stream; - enter: H.Stream; - newNameInput: H.Stream; + stopEditing: H.Stream; + newName: H.Behavior; + editing: H.Behavior; }; export type Output = { @@ -35,34 +35,20 @@ export type Output = { export default (props: Props) => component( fgo(function*(on) { - const enterNotPressed = yield H.toggle(true, on.startEditing, on.enter); - const notCancelled = yield H.toggle(true, on.startEditing, on.cancel); - const stopEditing = combine( - on.enter, - H.keepWhen(on.nameBlur, enterNotPressed), - on.cancel - ); - const editing = yield H.toggle(false, on.startEditing, stopEditing); - const newName = yield H.stepper( - props.name, - combine( - on.newNameInput.map((ev) => ev.target.value), - H.snapshot(on.taskName, on.cancel) - ) - ); - const nameChange = H.snapshot( - newName, - H.keepWhen(stopEditing, notCancelled) - ); - // Restore potentially persisted todo item - const persistKey = "todoItem:" + props.id; + const persistKey = itemIdToPersistKey(props.id); const savedItem = yield H.sample(itemBehavior(persistKey)); const initial = savedItem === null ? { taskName: props.name, completed: false } : savedItem; + const editing = yield H.toggle(false, on.startEditing, on.stopEditing); + const nameChange = H.snapshot( + on.newName, + on.stopEditing.filter((b) => b) + ); + // Initialize task to restored values const taskName: H.Behavior = yield H.stepper( initial.taskName, @@ -111,16 +97,18 @@ export default (props: Props) => ]), input({ class: "edit", - value: taskName, + value: H.snapshot(on.taskName, on.startEditing), actions: { focus: on.startEditing } }).output((o) => ({ - newNameInput: o.input, - nameBlur: o.blur, - enter: o.keyup.filter((ev) => ev.keyCode === enter), - cancel: o.keyup.filter((ev) => ev.keyCode === esc) + newName: o.value, + stopEditing: H.combine( + o.keyup.filter((ev) => ev.keyCode === enter).mapTo(true), + H.keepWhen(o.blur, editing).mapTo(true), + o.keyup.filter((ev) => ev.keyCode === esc).mapTo(false) + ) })) ]) - .output(() => ({ taskName })) + .output(() => ({ taskName, editing })) .result({ destroyItemId, completed, id: props.id }); }) );