73 lines
2.1 KiB
Elm
73 lines
2.1 KiB
Elm
module Article.Preview exposing (view)
|
|
|
|
{-| A preview of an individual article, excluding its body.
|
|
-}
|
|
|
|
import Article exposing (Article)
|
|
import Author
|
|
import Avatar exposing (Avatar)
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (attribute, class, classList, href, id, placeholder, src)
|
|
import Profile
|
|
import Route exposing (Route)
|
|
import Time
|
|
import Timestamp
|
|
import Viewer.Cred exposing (Cred)
|
|
|
|
|
|
|
|
-- VIEW
|
|
|
|
|
|
view : Maybe { cred : Cred, favorite : msg, unfavorite : msg } -> Time.Zone -> Article a -> Html msg
|
|
view config timeZone article =
|
|
let
|
|
{ title, description, createdAt } =
|
|
Article.metadata article
|
|
|
|
author =
|
|
Article.author article
|
|
|
|
profile =
|
|
Author.profile author
|
|
|
|
username =
|
|
Author.username author
|
|
|
|
faveButton =
|
|
case config of
|
|
Just { favorite, unfavorite, cred } ->
|
|
let
|
|
{ favoritesCount, favorited } =
|
|
Article.metadata article
|
|
|
|
viewButton =
|
|
if favorited then
|
|
Article.unfavoriteButton cred unfavorite
|
|
|
|
else
|
|
Article.favoriteButton cred favorite
|
|
in
|
|
viewButton [ class "pull-xs-right" ]
|
|
[ text (" " ++ String.fromInt favoritesCount) ]
|
|
|
|
Nothing ->
|
|
text ""
|
|
in
|
|
div [ class "article-preview" ]
|
|
[ div [ class "article-meta" ]
|
|
[ a [ Route.href (Route.Profile username) ]
|
|
[ img [ Avatar.src (Profile.avatar profile) ] [] ]
|
|
, div [ class "info" ]
|
|
[ Author.view username
|
|
, Timestamp.view timeZone createdAt
|
|
]
|
|
, faveButton
|
|
]
|
|
, a [ class "preview-link", Route.href (Route.Article (Article.slug article)) ]
|
|
[ h1 [] [ text title ]
|
|
, p [] [ text description ]
|
|
, span [] [ text "Read more..." ]
|
|
]
|
|
]
|