-
Notifications
You must be signed in to change notification settings - Fork 1
/
Main.elm
131 lines (92 loc) · 2.4 KB
/
Main.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
module Main exposing (..)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
import RemoteData exposing (..)
import Json.Decode as JD
swapi : String
swapi =
"https://swapi.co/api/"
{- Model
the state of your application
-}
type alias Model =
{ planets : WebData (List Planet) }
type alias Planet =
{ name : String
, diameter : String
}
initModel : Model
initModel =
{ planets = Loading }
type Msg
= PlanetsResp (WebData (List Planet))
planetsDecoder : JD.Decoder (List Planet)
planetsDecoder =
JD.at [ "results" ] <|
JD.list <|
JD.map2 Planet
(JD.field "name" JD.string)
(JD.field "diameter" JD.string)
getPlanets : Cmd Msg
getPlanets =
Http.get (swapi ++ "planets") planetsDecoder
|> RemoteData.sendRequest
|> Cmd.map PlanetsResp
{- Update
a way to update your state
-}
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
PlanetsResp planets ->
( { model | planets = planets }, Cmd.none )
{- View
a way to view your state as HTML
-}
view : Model -> Html Msg
view model =
case model.planets of
Success planets ->
div [] (List.map planetView planets)
Loading ->
h1 [] [ text "Loading..." ]
_ ->
text <| toString model
planetView : Planet -> Html Msg
planetView planet =
let
width =
String.toFloat planet.diameter |> Result.map ((*) 0.01)
widthPx =
case width of
Ok w ->
(toString w) ++ "px"
_ ->
"0px"
in
div
[ class "planet-wrap", style [ ( "width", widthPx ) ] ]
[ div
[ class "planet"
, style
[ ( "width", widthPx )
, ( "height", widthPx )
, ( "background-image", "-webkit-radial-gradient(45px 45px, circle cover, pink, purple)" )
]
]
[]
, h3
[]
[ text planet.name ]
]
{- Tie it all together -}
main : Program Never Model Msg
main =
program
{ update = update
, view = view
, init = ( initModel, getPlanets )
, subscriptions = always Sub.none
}