module Page.Home exposing (Model, Msg, init, update, view) {-| The homepage. You can get here via either the / or /#/ routes. -} import Data.Article as Article exposing (Tag) import Data.Session exposing (Session) import Html exposing (..) import Html.Attributes exposing (attribute, class, classList, href, id, placeholder) import Html.Events exposing (onClick) import Http import Page.Errored exposing (PageLoadError, pageLoadError) import Request.Article import SelectList exposing (SelectList) import Task exposing (Task) import Views.Article.Feed as Feed exposing (FeedSource, globalFeed, tagFeed, yourFeed) import Views.Page as Page -- MODEL -- type alias Model = { tags : List Tag , feed : Feed.Model } init : Session -> Task PageLoadError Model init session = let feedSources = if session.user == Nothing then SelectList.singleton globalFeed else SelectList.fromLists [] globalFeed [ yourFeed ] loadTags = Request.Article.tags |> Http.toTask loadSources = Feed.init session feedSources handleLoadError _ = pageLoadError Page.Home "Homepage is currently unavailable." in Task.map2 Model loadTags loadSources |> Task.mapError handleLoadError -- VIEW -- view : Session -> Model -> Html Msg view session model = div [ class "home-page" ] [ viewBanner , div [ class "container page" ] [ div [ class "row" ] [ div [ class "col-md-9" ] (viewFeed model.feed) , div [ class "col-md-3" ] [ div [ class "sidebar" ] [ p [] [ text "Popular Tags" ] , viewTags model.tags ] ] ] ] ] viewBanner : Html msg viewBanner = div [ class "banner" ] [ div [ class "container" ] [ h1 [ class "logo-font" ] [ text "conduit" ] , p [] [ text "A place to share your knowledge." ] ] ] viewFeed : Feed.Model -> List (Html Msg) viewFeed feed = div [ class "feed-toggle" ] [ Feed.viewFeedSources feed |> Html.map FeedMsg ] :: (Feed.viewArticles feed |> List.map (Html.map FeedMsg)) viewTags : List Tag -> Html Msg viewTags tags = div [ class "tag-list" ] (List.map viewTag tags) viewTag : Tag -> Html Msg viewTag tagName = a [ class "tag-pill tag-default" , href "javascript:void(0)" , onClick (SelectTag tagName) ] [ text (Article.tagToString tagName) ] -- UPDATE -- type Msg = FeedMsg Feed.Msg | SelectTag Tag update : Session -> Msg -> Model -> ( Model, Cmd Msg ) update session msg model = case msg of FeedMsg subMsg -> let ( newFeed, subCmd ) = Feed.update session subMsg model.feed in ( { model | feed = newFeed }, Cmd.map FeedMsg subCmd ) SelectTag tagName -> let subCmd = Feed.selectTag (Maybe.map .token session.user) tagName in ( model, Cmd.map FeedMsg subCmd )