@@ -7,30 +7,36 @@ import Prim
77
88import Data.Array ((:))
99import Data.Foldable (for_)
10−import Data.Maybe (Maybe(..))
1110import Data.URL as URL
1211import Effect (Effect)
1312import Plum as Plum
1413import PureStack.Client (client)
15−import Unsafe.Coerce (unsafeCoerce)
1614
17−type Model = { newTodo :: String, todos :: Array String }
15+type Model = { newTodo :: String, todos :: Array TodoItem }
1816
1917data Msg
2018 = UpdateNewTodo String
19+ | SetTodos (Array TodoItem)
2120 | AddNewTodo
2221 | TodoAdded
2322
2423main :: Effect Unit
2524main = do
25+ origin <- Plum.currentOrigin
26+ let api = getApi (origin `URL.addSegment` "api")
2627 Plum.run @Model @Msg "plum"
27− { init: \_runMsg -> pure { newTodo: "", todos: [] }
28+ { init: \runMsg -> do
29+ runMsg $ SetTodos <$> api.getTodos
30+ pure { newTodo: "", todos: [] }
2831 , update: \runMsg msg model -> case msg of
2932 UpdateNewTodo newTodo -> pure model { newTodo = newTodo }
3033 AddNewTodo -> do
3134 runMsg $ api.createTodo (TodoItem { text: model.newTodo, done: false }) $> TodoAdded
32− pure model { newTodo = "", todos = model.newTodo : model.todos }
33− TodoAdded -> pure model
35+ pure model
36+ TodoAdded -> do
37+ runMsg $ SetTodos <$> api.getTodos
38+ pure model
39+ SetTodos todos -> pure model { todos = todos }
3440 , view: \model -> column do
3541 font "sans-serif"
3642
@@ -46,13 +52,9 @@ main = do
4652
4753 onKey "Enter" AddNewTodo
4854
49− for_ model.todos $ \todo -> do
50− text todo mempty
55+ for_ model.todos $ \(TodoItem todo) -> do
56+ text todo.text mempty
5157 }
5258
53−url = case URL.fromString "http://localhost" of
54− Just x -> x
55− Nothing -> unsafeCoerce unit
56−
57−api = client @API url
59+getApi = client @API
5860