SPA for part10

This commit is contained in:
Richard Feldman
2016-09-01 06:39:06 -07:00
parent 4f226ec557
commit 18b8723f16
7 changed files with 319 additions and 142 deletions

View File

@@ -1,31 +1,105 @@
port module Main exposing (..)
module Main exposing (..)
import ElmHub exposing (..)
import Pages.Home
import Pages.Repository
import Navigation
import Page exposing (Page(..))
import Tuple2
import Html exposing (Html, div, h1, header, text, span)
import Html.Attributes exposing (class)
import Html.App as Html
import Json.Decode
type Model
= Home Pages.Home.Model
| Repository Pages.Repository.Model
type Msg
= HomeMsg Pages.Home.Msg
| RepositoryMsg Pages.Repository.Msg
main : Program Never
main =
Html.program
{ view = view
, update = update githubSearch
, init = ( initialModel, githubSearch (getQueryString initialModel.query) )
, subscriptions = \_ -> githubResponse decodeResponse
Navigation.program (Navigation.makeParser Page.parser)
{ init = init
, subscriptions = subscriptions
, view = view
, update = update
, urlUpdate = urlUpdate
}
decodeResponse : Json.Decode.Value -> Msg
decodeResponse json =
case Json.Decode.decodeValue responseDecoder json of
Err err ->
HandleSearchError (Just err)
subscriptions : Model -> Sub Msg
subscriptions model =
case model of
Home pageModel ->
Pages.Home.subscriptions pageModel
|> Sub.map HomeMsg
Ok results ->
HandleSearchResponse results
Repository pageModel ->
Sub.none
port githubSearch : String -> Cmd msg
init : Result String Page -> ( Model, Cmd Msg )
init result =
Home (fst Pages.Home.init)
|> urlUpdate result
port githubResponse : (Json.Decode.Value -> msg) -> Sub msg
view : Model -> Html Msg
view model =
withHeader <|
case model of
Home pageModel ->
Pages.Home.view pageModel
|> Html.map HomeMsg
Repository pageModel ->
Pages.Repository.view pageModel
|> Html.map RepositoryMsg
withHeader : Html msg -> Html msg
withHeader innerContent =
div [ class "content" ]
[ header []
[ h1 [] [ text "ElmHub" ]
, span [ class "tagline" ] [ text "Like GitHub, but for Elm things." ]
]
, innerContent
]
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case ( msg, model ) of
( HomeMsg pageMsg, Home pageModel ) ->
Pages.Home.update pageMsg pageModel
|> Tuple2.mapEach Home (Cmd.map HomeMsg)
( RepositoryMsg pageMsg, Repository pageModel ) ->
Pages.Repository.update pageMsg pageModel
|> Tuple2.mapEach Repository (Cmd.map RepositoryMsg)
( _, _ ) ->
( model, Cmd.none )
urlUpdate : Result String Page -> Model -> ( Model, Cmd Msg )
urlUpdate result model =
case result of
Ok (Page.Home) ->
Pages.Home.init
|> Tuple2.mapEach Home (Cmd.map HomeMsg)
Ok (Page.Repository id) ->
Pages.Repository.init id
|> Tuple2.mapEach Repository (Cmd.map RepositoryMsg)
Ok NotFound ->
( model, Cmd.none )
Err _ ->
( model, Navigation.modifyUrl "/" )