1- import { useEffect } from 'react'
1+ import { useEffect , useState } from 'react'
22import { useNavigate , useParams } from 'react-router-dom'
33import ErrorMessage from '../components/ErrorMessage'
44import TableCell from '../components/tables/TableCell'
@@ -14,20 +14,31 @@ import usePlayer from '../utils/usePlayer'
1414import Table from '../components/tables/Table'
1515import { useRecoilValue } from 'recoil'
1616import activeGameState , { SelectedActiveGame } from '../state/activeGameState'
17+ import Button from '../components/Button'
18+ import { IconPencil } from '@tabler/icons-react'
19+ import { PlayerGameStat } from '../entities/playerGameStat'
20+ import UpdateStatValue from '../modals/UpdateStatValue'
21+ import { PermissionBasedAction } from '../utils/canPerformAction'
22+ import canPerformAction from '../utils/canPerformAction'
23+ import userState from '../state/userState'
24+ import { AuthedUser } from '../state/userState'
1725
1826export default function PlayerStats ( ) {
27+ const user = useRecoilValue ( userState ) as AuthedUser
1928 const activeGame = useRecoilValue ( activeGameState ) as SelectedActiveGame
2029
2130 const { id : playerId } = useParams ( )
2231 const [ player ] = usePlayer ( )
2332
24- const { stats, loading : statsLoading , error, errorStatusCode } = usePlayerStats ( activeGame , playerId ! )
33+ const { stats, loading : statsLoading , error, errorStatusCode, mutate } = usePlayerStats ( activeGame , playerId ! )
2534 const sortedStats = useSortedItems ( stats , 'updatedAt' )
2635
2736 const navigate = useNavigate ( )
2837
2938 const loading = ! player || statsLoading
3039
40+ const [ editingStat , setEditingStat ] = useState < PlayerGameStat | null > ( null )
41+
3142 useEffect ( ( ) => {
3243 if ( errorStatusCode === 404 ) {
3344 navigate ( routes . players , { replace : true } )
@@ -52,7 +63,20 @@ export default function PlayerStats() {
5263 { ( playerStat ) => (
5364 < >
5465 < TableCell className = 'min-w-60' > { playerStat . stat . name } </ TableCell >
55- < TableCell className = 'min-w-40' > { playerStat . value } </ TableCell >
66+ < TableCell className = 'min-w-40 flex items-center space-x-2' >
67+ < >
68+ < span > { playerStat . value } </ span >
69+ { canPerformAction ( user , PermissionBasedAction . UPDATE_PLAYER_STAT ) &&
70+ < Button
71+ variant = 'icon'
72+ className = 'p-1 rounded-full bg-indigo-900'
73+ onClick = { ( ) => setEditingStat ( playerStat ) }
74+ icon = { < IconPencil size = { 16 } /> }
75+ extra = { { 'aria-label' : 'Edit game name' } }
76+ />
77+ }
78+ </ >
79+ </ TableCell >
5680 < DateCell > { format ( new Date ( playerStat . createdAt ) , 'dd MMM Y, HH:mm' ) } </ DateCell >
5781 < DateCell > { format ( new Date ( playerStat . updatedAt ) , 'dd MMM Y, HH:mm' ) } </ DateCell >
5882 </ >
@@ -61,6 +85,15 @@ export default function PlayerStats() {
6185 </ Table >
6286 }
6387
88+ { editingStat &&
89+ < UpdateStatValue
90+ modalState = { [ true , ( ) => setEditingStat ( null ) ] }
91+ mutate = { mutate }
92+ editingStat = { editingStat }
93+ player = { player }
94+ />
95+ }
96+
6497 { error && < ErrorMessage error = { error } /> }
6598 </ Page >
6699 )
0 commit comments