-
Notifications
You must be signed in to change notification settings - Fork 4
/
HandleHttpError.elm
120 lines (83 loc) · 2.11 KB
/
HandleHttpError.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
import Html exposing (..)
import Html.App as Html
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as Json exposing ((:=))
import Task
main =
Html.program
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
-- MODEL
type alias Model =
{ url : String
, result : String
, error : Maybe String
}
initialModel : Model
initialModel = {
url = ""
, result = ""
, error = Nothing
}
init : (Model, Cmd Msg)
init =
(initialModel, Cmd.none)
-- UPDATE
type Msg
= StoreURL String
| FetchTitle
| FetchSucceed String
| FetchFail Http.Error
update : Msg -> Model -> (Model, Cmd Msg)
update action model =
case action of
StoreURL url ->
({ model | url = url }, Cmd.none)
FetchTitle ->
(model, makeRequest model.url)
FetchSucceed str ->
({ model | result = str }, Cmd.none)
-- handle Http.Error
-- http://package.elm-lang.org/packages/evancz/elm-http/3.0.1/Http#Error
FetchFail err ->
case err of
Http.Timeout ->
({ model | error = Just "Timeout" }, Cmd.none)
Http.NetworkError ->
({ model | error = Just "Network Error" }, Cmd.none)
Http.UnexpectedPayload error ->
({ model | error = Just error }, Cmd.none)
Http.BadResponse code error ->
({ model | error = Just error }, Cmd.none)
-- VIEW
view : Model -> Html Msg
view model =
div []
[ h1 [] [ text "Http Error"]
, p [] [ text "Enter any random string"]
, input [
placeholder "Enter a URL",
onInput StoreURL
] []
, button [ onClick FetchTitle ] [ text "Fetch!" ]
, p [] [ text (Maybe.withDefault "" model.error) ]
, div [] [ text (toString model) ]
]
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- HTTP
makeRequest : String -> Cmd Msg
makeRequest url =
Task.perform FetchFail FetchSucceed (Http.get decodeTitle url)
-- decodeTitle
-- return the string from 'title'
decodeTitle : Json.Decoder String
decodeTitle =
Json.at ["title"] Json.string