Rename more stuff
This commit is contained in:
130
intro/part9/src/Page/Home.elm
Normal file
130
intro/part9/src/Page/Home.elm
Normal 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 [] 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 )
|
||||
Reference in New Issue
Block a user