Update advanced/part6
This commit is contained in:
@@ -49,9 +49,9 @@ type Status a
|
|||||||
|
|
||||||
|
|
||||||
type FeedTab
|
type FeedTab
|
||||||
= YourFeed Cred
|
= YourFeed
|
||||||
| GlobalFeed
|
| GlobalFeed
|
||||||
| TagFeed Tag
|
| TagFeed String
|
||||||
|
|
||||||
|
|
||||||
init : Session -> ( Model, Cmd Msg )
|
init : Session -> ( Model, Cmd Msg )
|
||||||
@@ -59,8 +59,8 @@ init session =
|
|||||||
let
|
let
|
||||||
feedTab =
|
feedTab =
|
||||||
case Session.cred session of
|
case Session.cred session of
|
||||||
Just cred ->
|
Just _ ->
|
||||||
YourFeed cred
|
YourFeed
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
GlobalFeed
|
GlobalFeed
|
||||||
@@ -103,10 +103,7 @@ view model =
|
|||||||
Loaded feed ->
|
Loaded feed ->
|
||||||
[ div [ class "feed-toggle" ] <|
|
[ div [ class "feed-toggle" ] <|
|
||||||
List.concat
|
List.concat
|
||||||
[ [ viewTabs
|
[ [ viewTabs (Session.cred model.session /= Nothing) model.feedTab ]
|
||||||
(Session.cred model.session)
|
|
||||||
model.feedTab
|
|
||||||
]
|
|
||||||
, Feed.viewArticles model.timeZone feed
|
, Feed.viewArticles model.timeZone feed
|
||||||
|> List.map (Html.map GotFeedMsg)
|
|> List.map (Html.map GotFeedMsg)
|
||||||
, [ Feed.viewPagination ClickedFeedPage feed ]
|
, [ Feed.viewPagination ClickedFeedPage feed ]
|
||||||
@@ -158,40 +155,63 @@ viewBanner =
|
|||||||
-- TABS
|
-- TABS
|
||||||
|
|
||||||
|
|
||||||
viewTabs : Maybe Cred -> FeedTab -> Html Msg
|
{-| TODO: Have viewTabs render all the tabs, using `activeTab` as the
|
||||||
viewTabs maybeCred tab =
|
single source of truth for their state.
|
||||||
case tab of
|
|
||||||
YourFeed cred ->
|
The specification for how the tabs work is:
|
||||||
Feed.viewTabs [] (yourFeed cred) [ globalFeed ]
|
|
||||||
|
1. If the user is logged in, render `yourFeed` as the first tab. Examples:
|
||||||
|
|
||||||
|
"Your Feed" "Global Feed"
|
||||||
|
"Your Feed" "Global Feed" "#dragons"
|
||||||
|
|
||||||
|
2. If the user is NOT logged in, do not render `yourFeed` at all. Examples:
|
||||||
|
|
||||||
|
"Global Feed"
|
||||||
|
"Global Feed" "#dragons"
|
||||||
|
|
||||||
|
3. If the active tab is a `TagFeed`, render that tab last. Show the tag it contains with a "#" in front.
|
||||||
|
|
||||||
|
"Global Feed" "#dragons"
|
||||||
|
"Your Feed" "Global Feed" "#dragons"
|
||||||
|
|
||||||
|
3. If the active tab is NOT a `TagFeed`, do not render a tag tab at all.
|
||||||
|
|
||||||
|
"Your Feed" "Global Feed"
|
||||||
|
"Global Feed"
|
||||||
|
|
||||||
|
💡 HINT: The 4 declarations after `viewTabs` may be helpful!
|
||||||
|
|
||||||
|
-}
|
||||||
|
viewTabs : Bool -> FeedTab -> Html Msg
|
||||||
|
viewTabs isLoggedIn activeTab =
|
||||||
|
ul [ class "nav nav-pills outline-active" ] <|
|
||||||
|
case activeTab of
|
||||||
|
YourFeed ->
|
||||||
|
[]
|
||||||
|
|
||||||
GlobalFeed ->
|
GlobalFeed ->
|
||||||
let
|
|
||||||
otherTabs =
|
|
||||||
case maybeCred of
|
|
||||||
Just cred ->
|
|
||||||
[ yourFeed cred ]
|
|
||||||
|
|
||||||
Nothing ->
|
|
||||||
[]
|
[]
|
||||||
in
|
|
||||||
Feed.viewTabs otherTabs globalFeed []
|
|
||||||
|
|
||||||
TagFeed tag ->
|
TagFeed tagName ->
|
||||||
let
|
[]
|
||||||
otherTabs =
|
|
||||||
case maybeCred of
|
|
||||||
Just cred ->
|
|
||||||
[ yourFeed cred, globalFeed ]
|
|
||||||
|
|
||||||
Nothing ->
|
|
||||||
[ globalFeed ]
|
|
||||||
in
|
|
||||||
Feed.viewTabs otherTabs (tagFeed tag) []
|
|
||||||
|
|
||||||
|
|
||||||
yourFeed : Cred -> ( String, Msg )
|
viewTab : Bool -> String -> msg -> Html msg
|
||||||
yourFeed cred =
|
viewTab isActive tabName msg =
|
||||||
( "Your Feed", ClickedTab (YourFeed cred) )
|
li [ class "nav-item" ]
|
||||||
|
[ a
|
||||||
|
[ classList [ ( "nav-link", True ), ( "active", isActive ) ]
|
||||||
|
, onClick msg
|
||||||
|
, href ""
|
||||||
|
]
|
||||||
|
[ text tabName ]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
yourFeed : ( String, Msg )
|
||||||
|
yourFeed =
|
||||||
|
( "Your Feed", ClickedTab YourFeed )
|
||||||
|
|
||||||
|
|
||||||
globalFeed : ( String, Msg )
|
globalFeed : ( String, Msg )
|
||||||
@@ -199,9 +219,9 @@ globalFeed =
|
|||||||
( "Global Feed", ClickedTab GlobalFeed )
|
( "Global Feed", ClickedTab GlobalFeed )
|
||||||
|
|
||||||
|
|
||||||
tagFeed : Tag -> ( String, Msg )
|
tagFeed : String -> ( String, Msg )
|
||||||
tagFeed tag =
|
tagFeed tag =
|
||||||
( "#" ++ Tag.toString tag, ClickedTab (TagFeed tag) )
|
( "#" ++ tag, ClickedTab (TagFeed tag) )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -247,7 +267,7 @@ update msg model =
|
|||||||
ClickedTag tag ->
|
ClickedTag tag ->
|
||||||
let
|
let
|
||||||
feedTab =
|
feedTab =
|
||||||
TagFeed tag
|
TagFeed (Tag.toString tag)
|
||||||
in
|
in
|
||||||
( { model | feedTab = feedTab }
|
( { model | feedTab = feedTab }
|
||||||
, fetchFeed model.session feedTab 1
|
, fetchFeed model.session feedTab 1
|
||||||
@@ -342,21 +362,21 @@ fetchFeed session feedTabs page =
|
|||||||
|
|
||||||
builder =
|
builder =
|
||||||
case feedTabs of
|
case feedTabs of
|
||||||
YourFeed cred ->
|
YourFeed ->
|
||||||
Api.url [ "articles", "feed" ]
|
Api.url [ "articles", "feed" ]
|
||||||
|> HttpBuilder.get
|
|> HttpBuilder.get
|
||||||
|> Cred.addHeader cred
|
|> Cred.addHeaderIfAvailable maybeCred
|
||||||
|
|
||||||
GlobalFeed ->
|
GlobalFeed ->
|
||||||
Api.url [ "articles" ]
|
Api.url [ "articles" ]
|
||||||
|> HttpBuilder.get
|
|> HttpBuilder.get
|
||||||
|> Cred.addHeaderIfAvailable maybeCred
|
|> Cred.addHeaderIfAvailable maybeCred
|
||||||
|
|
||||||
TagFeed tag ->
|
TagFeed tagName ->
|
||||||
Api.url [ "articles" ]
|
Api.url [ "articles" ]
|
||||||
|> HttpBuilder.get
|
|> HttpBuilder.get
|
||||||
|> Cred.addHeaderIfAvailable maybeCred
|
|> Cred.addHeaderIfAvailable maybeCred
|
||||||
|> HttpBuilder.withQueryParam "tag" (Tag.toString tag)
|
|> HttpBuilder.withQueryParam "tag" tagName
|
||||||
in
|
in
|
||||||
builder
|
builder
|
||||||
|> HttpBuilder.withExpect (Http.expectJson (Feed.decoder maybeCred articlesPerPage))
|
|> HttpBuilder.withExpect (Http.expectJson (Feed.decoder maybeCred articlesPerPage))
|
||||||
|
|||||||
Reference in New Issue
Block a user