aboutsummaryrefslogtreecommitdiff
path: root/src/Page.purs
blob: f7c04c286a674debdcee8306f6b5401c372d76b6 (plain)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
module Page
  ( component
  , Query
  ) where

import Control.Monad.Aff (Aff)
import Data.Array (sortBy, filter)
import Data.Maybe (Maybe(..))
import Data.String (contains, Pattern(..))
import DOM (DOM)
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Prelude

import Food (Aliment)
import Food as Food
import Format as Format
import Indicator as Indicator

data Query a =
  NoOp a
  | UpdateSearch String a

type State = String

type Message = Unit

component :: forall eff. H.Component HH.HTML Query State Message (Aff (dom :: DOM | eff))
component =
  H.component
    { initialState: const ""
    , render
    , eval
    , receiver: const Nothing
    }
  where
    render :: State -> H.ComponentHTML Query
    render state =
      HH.div
        [ HP.class_ $ HH.ClassName "page" ]
        [ renderHeader state
        , HH.div
            [ HP.class_ $ HH.ClassName "aliments" ]
            ( Food.all
                # filter (\a -> contains (Pattern $ Format.string state) (Format.string a.name))
                # sortBy (\a b -> compare (Format.string a.name) (Format.string b.name))
                # map renderAliment
            )
        ]

    eval :: Query ~> H.ComponentDSL State Query Message (Aff (dom :: DOM | eff))
    eval = case _ of
      NoOp next -> pure next
      UpdateSearch search next -> do
        H.put search
        pure next

renderHeader :: String -> H.ComponentHTML Query
renderHeader search =
  HH.div
    [ HP.class_ $ HH.ClassName "header" ]
    [ HH.div
        [ HP.class_ $ HH.ClassName "title line" ]
        [ HH.div
            []
            [ HH.text "Aliment" ]
        , HH.div
            []
            [ HH.text "Index glycémique" ]
        , HH.div
            []
            [ HH.text "Glucides pour 100 g" ]
        , HH.div
            []
            [ HH.text "Charge glycémique" ]
        ]
    , HH.input
        [ HP.class_ $ HH.ClassName "search line"
        , HP.placeholder "Rechercher…"
        , HE.onValueInput (HE.input UpdateSearch)
        , HP.value search
        ]
    ]

renderAliment :: Aliment -> H.ComponentHTML Query
renderAliment aliment =
  HH.div
    [ HP.class_ $ HH.ClassName "aliment line" ]
    [ HH.div
        []
        [ HH.text aliment.name ]
    , HH.div
        [ HP.class_ $ HH.ClassName "number" ]
        [ HH.text (show aliment.glycemicIndex) ]
    , HH.div
        [ HP.class_ $ HH.ClassName "number" ]
        [ HH.text (show aliment.carbohydrates <> " g") ]
    , let glycemicLoad = Food.glycemicLoad aliment
      in  HH.div
            [ HP.class_ $ HH.ClassName ("number " <> (Indicator.className $ Indicator.fromGlycemicLoad glycemicLoad)) ]
            [ HH.text (Format.number 2 glycemicLoad) ]
    ]