Break up parts 5 and 6 a bit.

This commit is contained in:
Richard Feldman
2016-04-02 16:14:04 -07:00
parent fa7dc4ca91
commit 08abf49174

View File

@@ -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 }