/
Main.elm
121 lines (80 loc) · 1.99 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
port module Main exposing (..)
import Html exposing (..)
import Html.Events exposing (..)
import Html.Attributes exposing (..)
import Http
main : Program Never Model Msg
main =
Html.program
{ init = init
, update = update
, subscriptions = \_ -> Sub.none
, view = view
}
{-
MODEL
* Model type
* Initialize model with empty values
-}
type alias Model =
{ quote : String
}
init : (Model, Cmd Msg)
init =
( Model "", fetchRandomQuoteCmd )
{-
UPDATE
* API routes
* GET
* Messages
* Update case
-}
-- API request URLs
api : String
api =
"http://localhost:3001/"
randomQuoteUrl : String
randomQuoteUrl =
api ++ "api/random-quote"
-- GET a random quote (unauthenticated)
fetchRandomQuote : Http.Request String
fetchRandomQuote =
Http.getString randomQuoteUrl
fetchRandomQuoteCmd : Cmd Msg
fetchRandomQuoteCmd =
Http.send FetchRandomQuoteCompleted fetchRandomQuote
fetchRandomQuoteCompleted : Model -> Result Http.Error String -> ( Model, Cmd Msg )
fetchRandomQuoteCompleted model result =
case result of
Ok newQuote ->
( { model | quote = newQuote }, Cmd.none )
Err _ ->
( model, Cmd.none )
-- Messages
type Msg
= GetQuote
| FetchRandomQuoteCompleted (Result Http.Error String)
-- Update
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
GetQuote ->
( model, fetchRandomQuoteCmd )
FetchRandomQuoteCompleted result ->
fetchRandomQuoteCompleted model result
{-
VIEW
* Get a quote
-}
view : Model -> Html Msg
view model =
div [ class "container" ] [
h2 [ class "text-center" ] [ text "Chuck Norris Quotes" ]
, p [ class "text-center" ] [
button [ class "btn btn-success", onClick GetQuote ] [ text "Grab a quote!" ]
]
-- Blockquote with quote
, blockquote [] [
p [] [text model.quote]
]
]