Rename 12 to 14 and 11 to 13
This commit is contained in:
136
part14/Page/Repository.elm
Normal file
136
part14/Page/Repository.elm
Normal file
@@ -0,0 +1,136 @@
|
||||
module Page.Repository exposing (..)
|
||||
|
||||
import Html exposing (..)
|
||||
import Html.Attributes exposing (class, target, href, property, defaultValue, src)
|
||||
import Auth
|
||||
import Http
|
||||
import Task
|
||||
import Json.Decode exposing (Decoder, int, string, list)
|
||||
import Json.Decode.Pipeline exposing (decode, required)
|
||||
|
||||
|
||||
type alias Model =
|
||||
{ repoOwner : String
|
||||
, repoName : String
|
||||
, repository : Maybe Repository
|
||||
}
|
||||
|
||||
|
||||
type alias Repository =
|
||||
{ id : Int
|
||||
, issues : Int
|
||||
, forks : Int
|
||||
, watchers : Int
|
||||
, owner : User
|
||||
, description : String
|
||||
}
|
||||
|
||||
|
||||
type alias User =
|
||||
{ id : Int
|
||||
, username : String
|
||||
, avatarUrl : String
|
||||
, profileUrl : String
|
||||
}
|
||||
|
||||
|
||||
userDecoder : Decoder User
|
||||
userDecoder =
|
||||
decode User
|
||||
|> required "id" int
|
||||
|> required "login" string
|
||||
|> required "avatar_url" string
|
||||
|> required "url" string
|
||||
|
||||
|
||||
repoDecoder : Decoder Repository
|
||||
repoDecoder =
|
||||
decode Repository
|
||||
|> required "id" int
|
||||
|> required "open_issues_count" int
|
||||
|> required "forks" int
|
||||
|> required "watchers" int
|
||||
|> required "owner" userDecoder
|
||||
|> required "description" string
|
||||
|
||||
|
||||
init : String -> String -> ( Model, Cmd Msg )
|
||||
init repoOwner repoName =
|
||||
( { repoOwner = repoOwner
|
||||
, repoName = repoName
|
||||
, repository = Nothing
|
||||
}
|
||||
, getRepoInfo repoOwner repoName
|
||||
)
|
||||
|
||||
|
||||
view : Model -> Html Msg
|
||||
view model =
|
||||
let
|
||||
ownerUrl =
|
||||
"https://github.com/" ++ model.repoOwner
|
||||
|
||||
repoUrl =
|
||||
ownerUrl ++ "/" ++ model.repoName
|
||||
|
||||
details =
|
||||
model.repository
|
||||
|> Maybe.map viewDetails
|
||||
|> Maybe.withDefault (text "")
|
||||
in
|
||||
div []
|
||||
[ h2 []
|
||||
[ a [ href repoUrl ] [ text model.repoName ] ]
|
||||
, details
|
||||
]
|
||||
|
||||
|
||||
viewDetails : Repository -> Html Msg
|
||||
viewDetails repo =
|
||||
div []
|
||||
[ p [ class "repo-description" ] [ text repo.description ]
|
||||
, h3 []
|
||||
[ a [ href repo.owner.profileUrl ]
|
||||
[ img [ class "profile-photo", src repo.owner.avatarUrl ] []
|
||||
, text repo.owner.username
|
||||
]
|
||||
]
|
||||
, table []
|
||||
[ tbody []
|
||||
[ tr [] [ th [] [ text "issues" ], td [] [ text (toString repo.issues) ] ]
|
||||
, tr [] [ th [] [ text "forks" ], td [] [ text (toString repo.forks) ] ]
|
||||
, tr [] [ th [] [ text "watchers" ], td [] [ text (toString repo.watchers) ] ]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
|
||||
type Msg
|
||||
= HandleRepoError Http.Error
|
||||
| HandleRepoResponse Repository
|
||||
|
||||
|
||||
getRepoInfo : String -> String -> Cmd Msg
|
||||
getRepoInfo repoOwner repoName =
|
||||
let
|
||||
url =
|
||||
"https://api.github.com/repos/"
|
||||
++ repoOwner
|
||||
++ "/"
|
||||
++ repoName
|
||||
++ "?access_token="
|
||||
++ Auth.token
|
||||
|> Debug.log "getRepoInfo"
|
||||
in
|
||||
Http.get repoDecoder url
|
||||
|> Task.perform HandleRepoError HandleRepoResponse
|
||||
|
||||
|
||||
update : Msg -> Model -> ( Model, Cmd Msg )
|
||||
update msg model =
|
||||
case msg of
|
||||
HandleRepoError err ->
|
||||
( model, Cmd.none )
|
||||
|
||||
HandleRepoResponse repository ->
|
||||
( { model | repository = Just repository }, Cmd.none )
|
||||
Reference in New Issue
Block a user