forked from evancz/elm-architecture-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 1
/
RandomGifList.elm
125 lines (96 loc) · 2.92 KB
/
RandomGifList.elm
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
module RandomGifList where
import Effects exposing (Effects, map, batch, Never)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Json.Decode as Json
import RandomGif
-- MODEL
type alias Model =
{ topic : String
, gifList : List (Int, RandomGif.Model)
, uid : Int
}
init : (Model, Effects Action)
init =
( Model "" [] 0
, Effects.none
)
-- UPDATE
type Action
= Topic String
| Create
| SubMsg Int RandomGif.Action
update : Action -> Model -> (Model, Effects Action)
update message model =
case message of
Topic topic ->
( { model | topic <- topic }
, Effects.none
)
Create ->
let
(newRandomGif, fx) =
RandomGif.init model.topic
newModel =
Model "" (model.gifList ++ [(model.uid, newRandomGif)]) (model.uid + 1)
in
( newModel
, map (SubMsg model.uid) fx
)
SubMsg msgId msg ->
let
subUpdate ((id, randomGif) as entry) =
if id == msgId then
let
(newRandomGif, fx) = RandomGif.update msg randomGif
in
( (id, newRandomGif)
, map (SubMsg id) fx
)
else
(entry, Effects.none)
(newGifList, fxList) =
model.gifList
|> List.map subUpdate
|> List.unzip
in
( { model | gifList <- newGifList }
, batch fxList
)
-- VIEW
(=>) = (,)
view : Signal.Address Action -> Model -> Html
view address model =
div []
[ input
[ placeholder "What kind of gifs do you want?"
, value model.topic
, onEnter address Create
, on "input" targetValue (Signal.message address << Topic)
, inputStyle
]
[]
, div [ style [ "display" => "flex", "flex-wrap" => "wrap" ] ]
(List.map (elementView address) model.gifList)
]
elementView : Signal.Address Action -> (Int, RandomGif.Model) -> Html
elementView address (id, model) =
RandomGif.view (Signal.forwardTo address (SubMsg id)) model
inputStyle : Attribute
inputStyle =
style
[ ("width", "100%")
, ("height", "40px")
, ("padding", "10px 0")
, ("font-size", "2em")
, ("text-align", "center")
]
onEnter : Signal.Address a -> a -> Attribute
onEnter address value =
on "keydown"
(Json.customDecoder keyCode is13)
(\_ -> Signal.message address value)
is13 : Int -> Result String ()
is13 code =
if code == 13 then Ok () else Err "not the right key code"