@@ -4,6 +4,8 @@ import Browser
44import  Html  exposing  (..)
55import  Html.Attributes  exposing  (..)
66import  Html.Events  exposing  (onClick )
7+ import  Http 
8+ import  Json.Decode  as  Decode 
79
810
911
@@ -25,44 +27,129 @@ main =
2527
2628type alias  Model  = 
2729 { :  List  Game 
30+  , :  List  Player 
2831 } 
2932
3033
3134type alias  Game  = 
32-  { :  String 
33-  , :  String 
35+  { :  String 
36+  , :  Bool 
37+  , :  Int 
38+  , :  String 
39+  , :  String 
40+  } 
41+ 42+ 43+ type alias  Player  = 
44+  { :  Maybe  String 
45+  , :  Int 
46+  , :  Int 
47+  , :  String 
3448 } 
3549
3650
3751initialModel  :  Model 
3852initialModel  = 
3953 { =  [] 
54+  , =  [] 
4055 } 
4156
4257
4358initialCommand  :  Cmd  Msg 
4459initialCommand  = 
45-  Cmd . none
60+  Cmd . batch
61+  [ 
62+  , 
63+  ] 
4664
4765
48- init  :  ( Model , Cmd  Msg  )
49- init  = 
66+ init  :  ()  ->  (  Model , Cmd  Msg  )
67+ init  _  = 
5068 (  initialModel, ) 
5169
5270
5371
72+ --  API
73+ 74+ 75+ fetchGamesList  :  Cmd  Msg 
76+ fetchGamesList  = 
77+  Http . get
78+  { =  " /api/games" 
79+  , =  Http . expectJson FetchGamesList  decodeGamesList
80+  } 
81+ 82+ 83+ fetchPlayersList  :  Cmd  Msg 
84+ fetchPlayersList  = 
85+  Http . get
86+  { =  " /api/players" 
87+  , =  Http . expectJson FetchPlayersList  decodePlayersList
88+  } 
89+ 90+ 91+ decodeGamesList  :  Decode .Decoder  (List  Game )
92+ decodeGamesList  = 
93+  decodeGame
94+  |>  Decode . list
95+  |>  Decode . at [ " data" ] 
96+ 97+ 98+ decodeGame  :  Decode .Decoder  Game 
99+ decodeGame  = 
100+  Decode . map5 Game 
101+  ( Decode . field " description" Decode . string) 
102+  ( Decode . field " featured" Decode . bool) 
103+  ( Decode . field " id" Decode . int) 
104+  ( Decode . field " thumbnail" Decode . string) 
105+  ( Decode . field " title" Decode . string) 
106+ 107+ 108+ decodePlayersList  :  Decode .Decoder  (List  Player )
109+ decodePlayersList  = 
110+  decodePlayer
111+  |>  Decode . list
112+  |>  Decode . at [ " data" ] 
113+ 114+ 115+ decodePlayer  :  Decode .Decoder  Player 
116+ decodePlayer  = 
117+  Decode . map4 Player 
118+  ( Decode . maybe ( Decode . field " display_name" Decode . string)) 
119+  ( Decode . field " id" Decode . int) 
120+  ( Decode . field " score" Decode . int) 
121+  ( Decode . field " username" Decode . string) 
122+ 123+ 124+ 54125--  UPDATE
55126
56127
57128type  Msg 
58-  =  FetchGamesList 
129+  =  FetchGamesList  ( Result  Http . Error  ( List  Game )) 
130+  |  FetchPlayersList  ( Result  Http . Error  ( List  Player )) 
59131
60132
61133update  :  Msg  ->  Model  ->  ( Model , Cmd  Msg  )
62134update  msg model = 
63135 case  msg of 
64-  FetchGamesList  -> 
65-  (  { |  gamesList =  [] }, Cmd . none ) 
136+  FetchGamesList  result -> 
137+  case  result of 
138+  Ok  games -> 
139+  (  { |  gamesList =  games }, Cmd . none ) 
140+ 141+  Err  _ -> 
142+  Debug . log " Error fetching games from API." 
143+  (  model, Cmd . none ) 
144+ 145+  FetchPlayersList  result -> 
146+  case  result of 
147+  Ok  players -> 
148+  (  { |  playersList =  players }, Cmd . none ) 
149+ 150+  Err  _ -> 
151+  Debug . log " Error fetching players from API." 
152+  (  model, Cmd . none ) 
66153
67154
68155
@@ -80,11 +167,79 @@ subscriptions model =
80167
81168view  :  Model  ->  Html  Msg 
82169view  model = 
170+  div [] 
171+  [ 
172+  , 
173+  ] 
174+ 175+ 176+ 177+ --  GAMES
178+ 179+ 180+ gamesIndex  :  Model  ->  Html  msg 
181+ gamesIndex  model = 
83182 if  List . isEmpty model. gamesList then 
84183 div [] [] 
85184
86185 else 
87-  div [] 
88-  [ [ " games-section" ] [ " Games" ] 
89-  , 
186+  div [ " games-index" ] 
187+  [ [] [ " Games" ] 
188+  , . gamesList
189+  ] 
190+ 191+ 192+ gamesList  :  List  Game  ->  Html  msg 
193+ gamesList  games = 
194+  ul [ " games-list" ] ( List . map gamesListItem games) 
195+ 196+ 197+ gamesListItem  :  Game  ->  Html  msg 
198+ gamesListItem  game = 
199+  li [ " game-item" ] 
200+  [ [] [ . title ] 
201+  , [] [ . description ] 
202+  ] 
203+ 204+ 205+ 206+ --  PLAYERS
207+ 208+ 209+ playersIndex  :  Model  ->  Html  msg 
210+ playersIndex  model = 
211+  if  List . isEmpty model. playersList then 
212+  div [] [] 
213+ 214+  else 
215+  div [ " players-index" ] 
216+  [ [] [ " Players" ] 
217+  , . playersList
218+  |>  playersSortedByScore
219+  |>  playersList
90220 ] 
221+ 222+ 223+ playersSortedByScore  :  List  Player  ->  List  Player 
224+ playersSortedByScore  players = 
225+  players
226+  |>  List . sortBy . score
227+  |>  List . reverse
228+ 229+ 230+ playersList  :  List  Player  ->  Html  msg 
231+ playersList  players = 
232+  ul [ " players-list" ] ( List . map playersListItem players) 
233+ 234+ 235+ playersListItem  :  Player  ->  Html  msg 
236+ playersListItem  player = 
237+  li [ " player-item" ] 
238+  [ case  player. displayName of 
239+  Just  displayName -> 
240+  strong [] [ ] 
241+ 242+  Nothing  -> 
243+  strong [] [ . username ] 
244+  , [] [ ( String . fromInt player. score)  ] 
245+  ] 
0 commit comments