Files
elm-0.19-workshop/part10/Main.elm
Richard Feldman 18b8723f16 SPA for part10
2016-09-01 06:39:06 -07:00

106 lines
2.5 KiB
Elm

module Main 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
type Model
= Home Pages.Home.Model
| Repository Pages.Repository.Model
type Msg
= HomeMsg Pages.Home.Msg
| RepositoryMsg Pages.Repository.Msg
main : Program Never
main =
Navigation.program (Navigation.makeParser Page.parser)
{ init = init
, subscriptions = subscriptions
, view = view
, update = update
, urlUpdate = urlUpdate
}
subscriptions : Model -> Sub Msg
subscriptions model =
case model of
Home pageModel ->
Pages.Home.subscriptions pageModel
|> Sub.map HomeMsg
Repository pageModel ->
Sub.none
init : Result String Page -> ( Model, Cmd Msg )
init result =
Home (fst Pages.Home.init)
|> urlUpdate result
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 "/" )