-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathTodoList.purs
More file actions
78 lines (69 loc) · 1.76 KB
/
TodoList.purs
File metadata and controls
78 lines (69 loc) · 1.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
module Example.TodoList where
import Prelude
import Effect (Effect)
import Data.Array (filter)
import Data.Maybe (Maybe)
import React as React
import React.DOM as DOM
import React.DOM.Props as Props
import Example.TodoForm (todoFormClass)
import Example.TodoItem (todoItemClass)
import Example.Types (Todo(..), TodoStatus(..))
type TodoListProps
= { todos :: Array Todo
, todo :: Maybe Todo
, onAdd :: Todo -> Effect Unit
, onEdit :: Todo -> Effect Unit
, onDone :: Todo -> Effect Unit
, onClear :: Todo -> Effect Unit
}
todoListClass :: React.ReactClass TodoListProps
todoListClass = React.component "TodoList" component
where
component this =
pure { state: {}
, render: render <$> React.getProps this
}
where
render
{ todos
, todo
, onAdd
, onEdit
, onDone
, onClear
} =
DOM.div
[ ]
[ React.createLeafElement todoFormClass
{ todo
, onEdit
, onAdd
}
, DOM.ol
[ ]
(renderItem <$> todos')
]
where
todos' = filter (\(Todo { status }) -> TodoCleared /= status) todos
renderItem todo' @ Todo { status } =
DOM.li
[ ]
[ React.createLeafElement todoItemClass { todo: todo' }
, DOM.button
[ Props._type "button"
, Props.onClick onClick
]
[ DOM.text text ]
]
where
text =
case status of
TodoPending -> "Done"
TodoDone -> "Clear"
_ -> ""
onClick event =
case status of
TodoPending -> onDone todo'
TodoDone -> onClear todo'
_ -> pure unit