diff --git a/part5/Main.elm b/part5/Main.elm index d838db6..18024c7 100644 --- a/part5/Main.elm +++ b/part5/Main.elm @@ -1,10 +1,10 @@ module Main (..) where import Html exposing (..) -import Html.Attributes exposing (..) +import Html.Attributes exposing (class, target, href, property) import Html.Events exposing (..) import Auth -import StartApp +import StartApp.Simple as StartApp import Http import Task exposing (Task) import Effects exposing (Effects) @@ -14,38 +14,56 @@ import Json.Encode import Signal exposing (Address) -main : Signal Html main = - app.html - - -app : StartApp.App Model -app = StartApp.start { view = view , update = update - , init = ( initialModel, Effects.task (searchFeed initialModel.query) ) - , inputs = [] + , model = initialModel } -port tasks : Signal (Task Effects.Never ()) -port tasks = - app.tasks - - -searchFeed : String -> Task x Action -searchFeed query = - let - -- See https://developer.github.com/v3/search/#example for how to customize! - url = - "https://api.github.com/search/repositories?access_token=" - ++ Auth.token - ++ "&q=" - ++ query - ++ "+language:elm&sort=stars&order=desc" - in - performAction SetResults (\_ -> SetResults []) (Http.get responseDecoder url) +sampleJson : String +sampleJson = + """ + { + "total_count": 40, + "incomplete_results": false, + "items": [ + { + "id": 3081286, + "name": "Tetris", + "full_name": "dtrupenn/Tetris", + "owner": { + "login": "dtrupenn", + "id": 872147, + "avatar_url": "https://secure.gravatar.com/avatar/e7956084e75f239de85d3a31bc172ace?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png", + "gravatar_id": "", + "url": "https://api.github.com/users/dtrupenn", + "received_events_url": "https://api.github.com/users/dtrupenn/received_events", + "type": "User" + }, + "private": false, + "html_url": "https://github.com/dtrupenn/Tetris", + "description": "A C implementation of Tetris using Pennsim through LC4", + "fork": false, + "url": "https://api.github.com/repos/dtrupenn/Tetris", + "created_at": "2012-01-01T00:31:50Z", + "updated_at": "2013-01-05T17:58:47Z", + "pushed_at": "2012-01-01T00:37:02Z", + "homepage": "", + "size": 524, + "stargazers_count": 1, + "watchers_count": 1, + "language": "Assembly", + "forks_count": 0, + "open_issues_count": 0, + "master_branch": "master", + "default_branch": "master", + "score": 10.309712 + } + ] + } + """ responseDecoder : Decoder (List SearchResult) @@ -63,15 +81,6 @@ searchResultDecoder = |> hardcoded 0 -performAction : (a -> b) -> (y -> b) -> Task y a -> Task x b -performAction successToAction errorToAction task = - let - successTask = - Task.map successToAction task - in - Task.onError successTask (\err -> Task.succeed (errorToAction err)) - - type alias Model = { query : String , results : List SearchResult @@ -92,10 +101,20 @@ type alias ResultId = initialModel : Model initialModel = { query = "tutorial" - , results = [] + , results = decodeResults sampleJson } +decodeResults : String -> List SearchResult +decodeResults json = + case Json.Decode.decodeString responseDecoder json of + Ok results -> + results + + Err err -> + [] + + view : Address Action -> Model -> Html view address model = div @@ -106,7 +125,7 @@ view address model = , span [ class "tagline" ] [ text "“Like GitHub, but for Elm things.”" ] ] , input [ class "search-query", onInput address SetQuery, defaultValue model.query ] [] - , button [ class "search-button" {- TODO on click, run a search -} ] [ text "Search" ] + , button [ class "search-button" ] [ text "Search" ] , ul [ class "results" ] (List.map (viewSearchResult address) model.results) @@ -136,34 +155,27 @@ viewSearchResult address result = type Action - = Search - | SetQuery String + = SetQuery String | DeleteById ResultId | SetResults (List SearchResult) -update : Action -> Model -> ( Model, Effects Action ) +update : Action -> Model -> Model update action model = case action of - Search -> - ( model, Effects.none {- TODO use searchFeed to run a search -} ) - SetQuery query -> - ( { model | query = query }, Effects.none ) + { model | query = query } SetResults results -> let newModel = { model | results = results } in - ( newModel, Effects.none ) + newModel DeleteById idToHide -> let newResults = List.filter (\{ id } -> id /= idToHide) model.results - - newModel = - { model | results = newResults } in - ( newModel, Effects.none ) + { model | results = newResults }