Add part7

This commit is contained in:
Richard Feldman
2018-05-05 04:54:47 -04:00
parent f6bef58e3d
commit 825dea437b
575 changed files with 79140 additions and 0 deletions

130
part7/src/Page/Home.elm Normal file
View File

@@ -0,0 +1,130 @@
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 [] yourFeed [ globalFeed ]
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 )