-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathTodoList.purs
More file actions
79 lines (69 loc) · 1.67 KB
/
TodoList.purs
File metadata and controls
79 lines (69 loc) · 1.67 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
79
module Example.TodoList where
import Prelude
import Effect (Effect)
import Data.Array (filter)
import Data.Maybe (Maybe)
import React as React
import React.Context as Context
import React.Hook (Hook)
import React.DOM as DOM
import React.DOM.Props as Props
import Example.TodoContext as TodoContext
import Example.TodoForm (todoForm)
import Example.TodoItem (todoItem)
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
}
todoList :: TodoListProps -> Hook React.ReactElement
todoList
{ todos
, todo
, onAdd
, onEdit
, onDone
, onClear
} = pure $
React.createElement provider
{ value:
{ backgroundColor: "lightblue"
}
}
[ React.createHookLeafElement todoForm
{ todo
, onEdit
, onAdd
}
, DOM.ol
[ ]
(renderItem <$> todos')
]
where
provider = Context.getProvider TodoContext.todoContext
todos' = filter (\(Todo { status }) -> TodoCleared /= status) todos
renderItem todo' @ Todo { status } =
DOM.li
[ ]
[ React.createHookLeafElement todoItem { 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