@@ -2,98 +2,123 @@ import React, { useCallback, useMemo } from "react"
2
2
import DataTable , { TableColumn } from "react-data-table-component"
3
3
import TrophyImage from "../../assets/icons/trophy.png"
4
4
import { useAppSelector } from "../../caches/hooks"
5
- import { getGame } from "../../caches/GameSlice"
5
+ import {
6
+ getGame ,
7
+ getGamePlayers ,
8
+ getRound ,
9
+ isGameFinished ,
10
+ } from "../../caches/GameSlice"
6
11
import { getPlayerProfiles } from "../../caches/PlayerProfilesSlice"
7
12
import { GameStatus } from "../../model/Game"
8
13
import { compareScore , compareTeamIds } from "../../utils/PlayerUtils"
9
- import { Player , Team } from "../../model/Player"
14
+ import { Player } from "../../model/Player"
10
15
import { customStyles } from "../Tables/CustomStyles"
11
16
17
+ interface LeaderBoardPlayer {
18
+ cardsBought ?: number
19
+ name : string
20
+ picture : string
21
+ previousCard ?: string
22
+ }
23
+
24
+ interface DoublesLeaderboardItem {
25
+ teamId : string
26
+ score : number
27
+ rings : number
28
+ player1 : LeaderBoardPlayer
29
+ player2 : LeaderBoardPlayer
30
+ winner : boolean
31
+ }
32
+
12
33
const DoublesLeaderboard = ( ) => {
13
- const game = useAppSelector ( getGame )
34
+ const round = useAppSelector ( getRound )
35
+ const players = useAppSelector ( getGamePlayers )
14
36
const playerProfiles = useAppSelector ( getPlayerProfiles )
37
+ const gameOver = useAppSelector ( isGameFinished )
15
38
16
39
const previousHand = useMemo ( ( ) => {
17
- if ( game . round )
18
- return game . round . completedHands [
19
- game . round . completedHands . length - 1
20
- ]
21
- } , [ game ] )
22
-
23
- const gameOver = useMemo ( ( ) => game . status === GameStatus . FINISHED , [ game ] )
40
+ if ( round ) return round . completedHands [ round . completedHands . length - 1 ]
41
+ } , [ round ] )
24
42
25
43
const getProfile = useCallback (
26
44
( player : Player ) =>
27
45
playerProfiles . find ( p => p . id === player . id , [ playerProfiles ] ) ,
28
46
[ playerProfiles ] ,
29
47
)
30
48
31
- const teams = useMemo < Team [ ] > ( ( ) => {
32
- const ps = game . players . sort ( compareTeamIds )
49
+ const mapToLeaderboard = useCallback (
50
+ ( player : Player ) : LeaderBoardPlayer => {
51
+ const profile = getProfile ( player )
52
+ if ( ! profile ) throw Error ( "No profile for player" )
53
+ const previousCard = previousHand ?. playedCards . find (
54
+ c => c . playerId === player . id ,
55
+ )
56
+ return {
57
+ cardsBought : player . cardsBought ,
58
+ name : profile . name ,
59
+ picture : profile . picture ,
60
+ previousCard : previousCard ?. card ,
61
+ }
62
+ } ,
63
+ [ previousHand ] ,
64
+ )
65
+
66
+ const leaderboardData = useMemo < DoublesLeaderboardItem [ ] > ( ( ) => {
67
+ const ps = [ ...players ] . sort ( compareTeamIds )
33
68
34
69
if ( ! ps ) {
35
70
return [ ]
36
71
}
37
- const teams : Team [ ] = [
72
+ const items : DoublesLeaderboardItem [ ] = [
38
73
{
39
- id : ps [ 0 ] . teamId ,
74
+ teamId : ps [ 0 ] . teamId ,
40
75
score : ps [ 0 ] . score ,
41
76
rings : ps [ 0 ] . rings ,
42
- player1 : ps [ 0 ] ,
43
- player2 : ps [ 1 ] ,
77
+ player1 : mapToLeaderboard ( ps [ 0 ] ) ,
78
+ player2 : mapToLeaderboard ( ps [ 1 ] ) ,
44
79
winner : ps [ 0 ] . winner ,
45
80
} ,
46
81
{
47
- id : ps [ 2 ] . teamId ,
82
+ teamId : ps [ 2 ] . teamId ,
48
83
score : ps [ 2 ] . score ,
49
84
rings : ps [ 2 ] . rings ,
50
- player1 : ps [ 2 ] ,
51
- player2 : ps [ 3 ] ,
85
+ player1 : mapToLeaderboard ( ps [ 2 ] ) ,
86
+ player2 : mapToLeaderboard ( ps [ 3 ] ) ,
52
87
winner : ps [ 2 ] . winner ,
53
88
} ,
54
89
{
55
- id : ps [ 4 ] . teamId ,
90
+ teamId : ps [ 4 ] . teamId ,
56
91
score : ps [ 4 ] . score ,
57
92
rings : ps [ 4 ] . rings ,
58
- player1 : ps [ 4 ] ,
59
- player2 : ps [ 5 ] ,
93
+ player1 : mapToLeaderboard ( ps [ 4 ] ) ,
94
+ player2 : mapToLeaderboard ( ps [ 5 ] ) ,
60
95
winner : ps [ 4 ] . winner ,
61
96
} ,
62
97
]
63
98
64
- return teams . sort ( compareScore )
65
- } , [ ] )
99
+ return items . sort ( compareScore )
100
+ } , [ players ] )
66
101
67
- const columns : TableColumn < Team > [ ] = [
102
+ const columns : TableColumn < DoublesLeaderboardItem > [ ] = [
68
103
{
69
104
name : "Player 1" ,
70
105
cell : row => (
71
106
< >
72
107
< div >
73
108
< img
74
109
alt = "Image Preview"
75
- src = { getProfile ( row . player1 ) ! . picture }
110
+ src = { row . player1 . picture }
76
111
className = "avatar"
77
112
/>
78
113
79
- { ! gameOver && ! ! previousHand ? (
114
+ { ! gameOver && ! ! row . player1 . previousCard ? (
80
115
< div >
81
116
{ previousHand ? (
82
117
< img
83
- alt = {
84
- previousHand . playedCards . find (
85
- p =>
86
- p . playerId ===
87
- row . player1 . id ,
88
- ) ?. card
89
- }
118
+ alt = { row . player1 . previousCard }
90
119
src = {
91
120
"/cards/thumbnails/" +
92
- previousHand . playedCards . find (
93
- p =>
94
- p . playerId ===
95
- row . player1 . id ,
96
- ) ?. card +
121
+ row . player1 . previousCard +
97
122
".png"
98
123
}
99
124
className = "thumbnail_size_small cardNotSelected"
@@ -119,24 +144,18 @@ const DoublesLeaderboard = () => {
119
144
< div >
120
145
< img
121
146
alt = "Image Preview"
122
- src = { getProfile ( row . player2 ) ! . picture }
147
+ src = { row . player2 . picture }
123
148
className = "avatar"
124
149
/>
125
150
126
151
{ ! gameOver && previousHand ? (
127
152
< div >
128
153
{ previousHand ? (
129
154
< img
130
- alt = {
131
- previousHand . playedCards . find (
132
- p => p . playerId === row . player2 . id ,
133
- ) ?. card
134
- }
155
+ alt = { row . player2 . previousCard }
135
156
src = {
136
157
"/cards/thumbnails/" +
137
- previousHand . playedCards . find (
138
- p => p . playerId === row . player1 . id ,
139
- ) ?. card +
158
+ row . player2 . previousCard +
140
159
".png"
141
160
}
142
161
className = "thumbnail_size_small cardNotSelected"
@@ -180,12 +199,7 @@ const DoublesLeaderboard = () => {
180
199
} ,
181
200
]
182
201
183
- if (
184
- ! game ||
185
- ! game . status ||
186
- ! playerProfiles ||
187
- playerProfiles . length === 0
188
- ) {
202
+ if ( ! playerProfiles || playerProfiles . length === 0 ) {
189
203
return null
190
204
}
191
205
@@ -194,7 +208,7 @@ const DoublesLeaderboard = () => {
194
208
< DataTable
195
209
noHeader
196
210
theme = "solarized"
197
- data = { teams }
211
+ data = { leaderboardData }
198
212
columns = { columns }
199
213
highlightOnHover
200
214
customStyles = { customStyles }
0 commit comments