Update README
This commit is contained in:
16
README.md
16
README.md
@@ -5,7 +5,19 @@ Getting Started
|
|||||||
|
|
||||||
1. Install [Node.js](http://nodejs.org) 7.0.0 or higher
|
1. Install [Node.js](http://nodejs.org) 7.0.0 or higher
|
||||||
|
|
||||||
2. Clone this repository
|
2. Add a plugin for your editor of choice: [Atom](https://atom.io/packages/language-elm), [Sublime Text](https://packagecontrol.io/packages/Elm%20Language%20Support), [VS Code](https://github.com/sbrink/vscode-elm), [Light Table](https://github.com/rundis/elm-light), [Vim](https://github.com/lambdatoast/elm.vim), [Emacs](https://github.com/jcollard/elm-mode), [Brackets](https://github.com/lepinay/elm-brackets)
|
||||||
|
|
||||||
|
3. Not required, but **highly** recommended: enable "[`elm-format`](https://github.com/avh4/elm-format) on save" in your editor.
|
||||||
|
|
||||||
|
4. Run the following command to install all the other Elm tools:
|
||||||
|
|
||||||
|
> **Note:** Make sure not to run this command with `sudo`! If it gives you an `EACCESS` error, apply [**this fix**](https://docs.npmjs.com/getting-started/fixing-npm-permissions#option-two-change-npms-default-directory) and then re-run the command (still without `sudo`).
|
||||||
|
|
||||||
|
```shell
|
||||||
|
npm install -g elm-test@beta elm-format@rc
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Clone this repository
|
||||||
|
|
||||||
Run this at the terminal:
|
Run this at the terminal:
|
||||||
|
|
||||||
@@ -14,4 +26,4 @@ git clone https://github.com/rtfeldman/elm-0.19-workshop.git
|
|||||||
cd elm-0.19-workshop
|
cd elm-0.19-workshop
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Continue with either the [`intro`](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/intro/README.md) or [`advanced`](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/advanced/README.md) instructions, depending on which workshop you're doing!
|
6. Continue with either the [`intro`](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/intro/README.md) or [`advanced`](https://github.com/rtfeldman/elm-0.19-workshop/blob/master/advanced/README.md) instructions, depending on which workshop you're doing!
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
module Article.Feed
|
module Article.Feed
|
||||||
exposing
|
exposing
|
||||||
( FeedConfig
|
( Model
|
||||||
, ListConfig
|
|
||||||
, Model
|
|
||||||
, Msg
|
, Msg
|
||||||
, defaultFeedConfig
|
|
||||||
, defaultListConfig
|
|
||||||
, init
|
, init
|
||||||
, selectTag
|
, selectTag
|
||||||
, update
|
, update
|
||||||
@@ -41,6 +37,24 @@ import Viewer exposing (Viewer)
|
|||||||
import Viewer.Cred as Cred exposing (Cred)
|
import Viewer.Cred as Cred exposing (Cred)
|
||||||
|
|
||||||
|
|
||||||
|
{-| NOTE: This module has its own Model, view, and update. This is not normal!
|
||||||
|
If you find yourself doing this often, please watch <https://www.youtube.com/watch?v=DoA4Txr4GUs>
|
||||||
|
|
||||||
|
This is the reusable Article Feed that appears on both the Home page as well as
|
||||||
|
on the Profile page. There's a lot of logic here, so it's more convenient to use
|
||||||
|
the heavyweight approach of giving this its own Model, view, and update.
|
||||||
|
|
||||||
|
This means callers must use Html.map and Cmd.map to use this thing, but in
|
||||||
|
this case that's totally worth it because of the amount of logic wrapped up
|
||||||
|
in this thing.
|
||||||
|
|
||||||
|
For every other reusable view in this application, this API would be totally
|
||||||
|
overkill, so we use simpler APIs instead.
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- MODEL
|
-- MODEL
|
||||||
|
|
||||||
|
|
||||||
@@ -325,34 +339,42 @@ fetch maybeCred page feedSource =
|
|||||||
offset =
|
offset =
|
||||||
(page - 1) * articlesPerPage
|
(page - 1) * articlesPerPage
|
||||||
|
|
||||||
listConfig =
|
params =
|
||||||
{ defaultListConfig | offset = offset, limit = articlesPerPage }
|
[ ( "limit", String.fromInt articlesPerPage )
|
||||||
|
, ( "offset", String.fromInt offset )
|
||||||
|
]
|
||||||
in
|
in
|
||||||
Task.map (PaginatedList.mapPage (\_ -> page)) <|
|
Task.map (PaginatedList.mapPage (\_ -> page)) <|
|
||||||
case feedSource of
|
case feedSource of
|
||||||
YourFeed cred ->
|
YourFeed cred ->
|
||||||
let
|
params
|
||||||
feedConfig =
|
|> buildFromQueryParams (Just cred) (Api.url [ "articles", "feed" ])
|
||||||
{ defaultFeedConfig | offset = offset, limit = articlesPerPage }
|
|> Cred.addHeader cred
|
||||||
in
|
|> HttpBuilder.toRequest
|
||||||
feed feedConfig cred
|
|
||||||
|> Http.toTask
|
|> Http.toTask
|
||||||
|
|
||||||
GlobalFeed ->
|
GlobalFeed ->
|
||||||
list listConfig maybeCred
|
list maybeCred params
|
||||||
|> Http.toTask
|
|
||||||
|
|
||||||
TagFeed tagName ->
|
TagFeed tagName ->
|
||||||
list { listConfig | tag = Just tagName } maybeCred
|
list maybeCred (( "tag", Tag.toString tagName ) :: params)
|
||||||
|> Http.toTask
|
|
||||||
|
|
||||||
FavoritedFeed username ->
|
FavoritedFeed username ->
|
||||||
list { listConfig | favorited = Just username } maybeCred
|
list maybeCred (( "favorited", Username.toString username ) :: params)
|
||||||
|> Http.toTask
|
|
||||||
|
|
||||||
AuthorFeed username ->
|
AuthorFeed username ->
|
||||||
list { listConfig | author = Just username } maybeCred
|
list maybeCred (( "author", Username.toString username ) :: params)
|
||||||
|> Http.toTask
|
|
||||||
|
|
||||||
|
list :
|
||||||
|
Maybe Cred
|
||||||
|
-> List ( String, String )
|
||||||
|
-> Task Http.Error (PaginatedList (Article Preview))
|
||||||
|
list maybeCred params =
|
||||||
|
buildFromQueryParams maybeCred (Api.url [ "articles" ]) params
|
||||||
|
|> Cred.addHeaderIfAvailable maybeCred
|
||||||
|
|> HttpBuilder.toRequest
|
||||||
|
|> Http.toTask
|
||||||
|
|
||||||
|
|
||||||
replaceArticle : Article a -> Article a -> Article a
|
replaceArticle : Article a -> Article a -> Article a
|
||||||
@@ -365,70 +387,6 @@ replaceArticle newArticle oldArticle =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- LIST
|
|
||||||
|
|
||||||
|
|
||||||
type alias ListConfig =
|
|
||||||
{ tag : Maybe Tag
|
|
||||||
, author : Maybe Username
|
|
||||||
, favorited : Maybe Username
|
|
||||||
, limit : Int
|
|
||||||
, offset : Int
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
defaultListConfig : ListConfig
|
|
||||||
defaultListConfig =
|
|
||||||
{ tag = Nothing
|
|
||||||
, author = Nothing
|
|
||||||
, favorited = Nothing
|
|
||||||
, limit = 20
|
|
||||||
, offset = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
list : ListConfig -> Maybe Cred -> Http.Request (PaginatedList (Article Preview))
|
|
||||||
list config maybeCred =
|
|
||||||
[ Maybe.map (\tag -> ( "tag", Tag.toString tag )) config.tag
|
|
||||||
, Maybe.map (\author -> ( "author", Username.toString author )) config.author
|
|
||||||
, Maybe.map (\favorited -> ( "favorited", Username.toString favorited )) config.favorited
|
|
||||||
, Just ( "limit", String.fromInt config.limit )
|
|
||||||
, Just ( "offset", String.fromInt config.offset )
|
|
||||||
]
|
|
||||||
|> List.filterMap identity
|
|
||||||
|> buildFromQueryParams maybeCred (Api.url [ "articles" ])
|
|
||||||
|> Cred.addHeaderIfAvailable maybeCred
|
|
||||||
|> HttpBuilder.toRequest
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- FEED
|
|
||||||
|
|
||||||
|
|
||||||
type alias FeedConfig =
|
|
||||||
{ limit : Int
|
|
||||||
, offset : Int
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
defaultFeedConfig : FeedConfig
|
|
||||||
defaultFeedConfig =
|
|
||||||
{ limit = 10
|
|
||||||
, offset = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
feed : FeedConfig -> Cred -> Http.Request (PaginatedList (Article Preview))
|
|
||||||
feed config cred =
|
|
||||||
[ ( "limit", String.fromInt config.limit )
|
|
||||||
, ( "offset", String.fromInt config.offset )
|
|
||||||
]
|
|
||||||
|> buildFromQueryParams (Just cred) (Api.url [ "articles", "feed" ])
|
|
||||||
|> Cred.addHeader cred
|
|
||||||
|> HttpBuilder.toRequest
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- SERIALIZATION
|
-- SERIALIZATION
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user