forked from rtfeldman/elm-in-action
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PhotoGroove.elm
145 lines (112 loc) · 3.17 KB
/
PhotoGroove.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
module PhotoGroove exposing (..)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Html.App
import Array exposing (Array)
import Random
urlPrefix : String
urlPrefix =
"http://elm-in-action.com/"
type ThumbnailSize
= Small
| Medium
| Large
view : Model -> Html Msg
view model =
div [ class "content" ]
[ h1 [] [ text "Photo Groove" ]
, button
[ onClick SurpriseMe ]
[ text "Surprise Me!" ]
, h3 [] [ text "Thumbnail Size:" ]
, div [ id "choose-size" ]
(List.map viewSizeChooser [ Small, Medium, Large ])
, div [ id "thumbnails", class (sizeToString model.chosenSize) ]
(List.map (viewThumbnail model.selectedUrl) model.photos)
, viewLarge model.selectedUrl
]
viewLarge : Maybe String -> Html Msg
viewLarge maybeUrl =
case maybeUrl of
Nothing ->
text ""
Just url ->
img
[ class "large"
, src (urlPrefix ++ "large/" ++ url)
]
[]
viewThumbnail : Maybe String -> Photo -> Html Msg
viewThumbnail selectedUrl thumbnail =
img
[ src (urlPrefix ++ thumbnail.url)
, classList [ ( "selected", selectedUrl == Just thumbnail.url ) ]
, onClick (SelectByUrl thumbnail.url)
]
[]
viewSizeChooser : ThumbnailSize -> Html Msg
viewSizeChooser size =
label []
[ input [ type' "radio", name "size", onClick (SetSize size) ] []
, text (sizeToString size)
]
sizeToString : ThumbnailSize -> String
sizeToString size =
case size of
Small ->
"small"
Medium ->
"med"
Large ->
"large"
type alias Photo =
{ url : String }
type alias Model =
{ photos : List Photo
, selectedUrl : Maybe String
, loadingError : Maybe String
, chosenSize : ThumbnailSize
}
initialModel : Model
initialModel =
{ photos = []
, selectedUrl = Nothing
, loadingError = Nothing
, chosenSize = Medium
}
type Msg
= SelectByUrl String
| SelectByIndex Int
| SurpriseMe
| SetSize ThumbnailSize
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
SelectByIndex index ->
let
newSelectedUrl =
model.photos
|> Array.fromList
|> Array.get index
|> Maybe.map .url
in
( { model | selectedUrl = newSelectedUrl }, Cmd.none )
SelectByUrl url ->
( { model | selectedUrl = Just url }, Cmd.none )
SurpriseMe ->
let
randomPhotoPicker =
Random.int 0 (List.length model.photos - 1)
in
( model, Random.generate SelectByIndex randomPhotoPicker )
SetSize size ->
( { model | chosenSize = size }, Cmd.none )
main : Program Never
main =
Html.App.program
{ init = ( initialModel, Cmd.none )
, view = view
, update = update
, subscriptions = (\model -> Sub.none)
}