An Introduction to Elm Series: Solution to ‘HTTP’ example 5
In the http://guide.elm-lang.org/architecture/effects/http.html, we were given a sample that loads random images from a web application on another service thought HTTP requests.
We were asked to print the error message of the request (if any) and update the UI to allow changing the topic (a parameter of the web call) either through an input field or a drop down list.
We wrote a message that accepts as string the new topic, that message is used both in the case of the input and in the case of the select list. Finally, we made sure that the ‘Please Wait’ image is shown while loading the new image from the remote server. The path for the ‘Please Wait’ image was added to a custom function to emulate a public static string value.
import Html exposing (..) import Html.App as Html import Html.Attributes exposing (..) import Html.Events exposing (..) import Http import Json.Decode as Json import Task main = Html.program { init = init "cats" , view = view , update = update , subscriptions = subscriptions } -- MODEL type alias Model = { topic : String , gifUrl : String , error : String } waitingImage : String waitingImage = "5-http/waiting.png" init : String -> (Model, Cmd Msg) init topic = ( Model topic waitingImage "" , getRandomGif topic ) -- UPDATE type Msg = MorePlease | FetchSucceed String | FetchFail Http.Error | NewTopic String update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of MorePlease -> ({ model | gifUrl = waitingImage }, getRandomGif model.topic) FetchSucceed newUrl -> (Model model.topic newUrl "", Cmd.none) FetchFail error -> (Model model.topic waitingImage (toString error), Cmd.none) NewTopic newTopic -> ({ model | topic = newTopic }, Cmd.none) -- VIEW view : Model -> Html Msg view model = div [] [ h2 [] [text model.topic] , input [ type' "text", placeholder "Topic", onInput NewTopic ] [] , select [ onInput NewTopic ] [ option [] [ text "Pokemon" ] , option [] [ text "SuperCars" ] , option [] [ text "Cyprus" ] , option [] [ text "Cats" ] , option [] [ text "Dogs" ] ] , button [ onClick MorePlease ] [ text "More Please!" ] , br [] [] , img [src model.gifUrl] [] , br [] [] , div [] [text model.error] ] -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions model = Sub.none -- HTTP getRandomGif : String -> Cmd Msg getRandomGif topic = let url = "//api.giphy.com/v1/gifs/random?api_key=dc6zaTOxFJmzC&tag=" ++ topic in Task.perform FetchFail FetchSucceed (Http.get decodeGifUrl url) decodeGifUrl : Json.Decoder String decodeGifUrl = Json.at ["data", "image_url"] Json.string
You can download the solution from here [download id=”1811″]