@@ -14,85 +14,73 @@ export interface SingleStats {
1414export interface AllStats {
1515 lastRating : number | undefined
1616 rating : number | undefined
17- sessionStats : SingleStats
18- lifetimeStats : SingleStats | undefined
17+ session : SingleStats
18+ lifetime : SingleStats | undefined
1919}
2020
2121type IncrementStatsFunction = ( gamesPlayed : number , gamesWon : number ) => void
22+ type UpdateStatsFunction = ( newRating : number ) => void
2223
2324export const useStats = (
2425 apiCall : ( ) => Promise < ApiResult > ,
25- ) : [ AllStats , IncrementStatsFunction , ( ) => void ] => {
26- const [ statsInvalidated , setStatsInvalidated ] = useState < boolean > ( true )
27- const [ statsLoading , setStatsLoading ] = useState < boolean > ( false )
28-
29- const [ lastRating , setLastRating ] = useState < number | undefined > ( undefined )
30- const [ rating , setRating ] = useState < number | undefined > ( undefined )
31- const [ gamesPlayed , setGamesPlayed ] = useState < number | undefined > ( undefined )
32- const [ gamesWon , setGamesWon ] = useState < number | undefined > ( undefined )
33-
34- const [ sessionGamesPlayed , setSessionGamesPlayed ] = useState < number > ( 0 )
35- const [ sessionGamesWon , setSessionGamesWon ] = useState < number > ( 0 )
36-
37- const [ unloadedGamesPlayed , setUnloadedGamesPlayed ] = useState < number > ( 0 )
38- const [ unloadedGamesWon , setUnloadedGamesWon ] = useState < number > ( 0 )
39-
40- const stats : AllStats = {
41- lastRating : statsInvalidated ? rating : lastRating ,
42- rating : statsInvalidated ? undefined : rating ,
43- sessionStats : {
44- gamesPlayed : sessionGamesPlayed ,
45- gamesWon : sessionGamesWon ,
26+ ) : [ AllStats , IncrementStatsFunction , UpdateStatsFunction ] => {
27+ const [ stats , setStats ] = useState < AllStats > ( {
28+ rating : undefined ,
29+ lastRating : undefined ,
30+ session : {
31+ gamesPlayed : 0 ,
32+ gamesWon : 0 ,
4633 } ,
47- lifetimeStats :
48- gamesPlayed === undefined || gamesWon === undefined
49- ? undefined
50- : {
51- gamesPlayed : gamesPlayed + unloadedGamesPlayed ,
52- gamesWon : gamesWon + unloadedGamesWon ,
53- } ,
54- }
34+ lifetime : undefined ,
35+ } )
5536
5637 useEffect ( ( ) => {
57- if ( statsInvalidated && ! statsLoading ) {
58- const statsLoader = async ( ) => {
59- const loadedStats = await apiCall ( )
60-
61- setLastRating ( rating )
62- setRating ( loadedStats . rating )
63-
64- setGamesPlayed ( loadedStats . gamesPlayed )
65- setGamesWon ( loadedStats . gamesWon )
66-
67- setUnloadedGamesPlayed ( 0 )
68- setUnloadedGamesWon ( 0 )
69-
70- setStatsInvalidated ( false )
71- setStatsLoading ( false )
72- }
73-
74- statsLoader ( )
75- setStatsLoading ( true )
38+ const statsLoader = async ( ) => {
39+ const loadedStats = await apiCall ( )
40+
41+ setStats ( ( s ) => ( {
42+ ...stats ,
43+ rating : loadedStats . rating ,
44+ lastRating : stats . rating ,
45+ lifetime : {
46+ gamesPlayed : loadedStats . gamesPlayed ,
47+ gamesWon : loadedStats . gamesWon ,
48+ } ,
49+ } ) )
7650 }
77- } , [ apiCall , gamesPlayed , gamesWon , rating , statsInvalidated , statsLoading ] )
51+
52+ statsLoader ( )
53+ } , [ ] )
7854
7955 const incrementStats : IncrementStatsFunction = useCallback (
8056 ( gamesPlayed : number , gamesWon : number ) => {
81- setSessionGamesPlayed (
82- ( sessionGamesPlayed ) => sessionGamesPlayed + gamesPlayed ,
83- )
84- setSessionGamesWon ( ( sessionGamesWon ) => sessionGamesWon + gamesWon )
85- setUnloadedGamesPlayed ( gamesPlayed )
86- setUnloadedGamesWon ( gamesWon )
87- setStatsInvalidated ( true )
57+ setStats ( ( s ) => ( {
58+ ...s ,
59+ session : {
60+ gamesPlayed : s . session . gamesPlayed + gamesPlayed ,
61+ gamesWon : s . session . gamesWon + gamesWon ,
62+ } ,
63+ lifetime : s . lifetime
64+ ? {
65+ gamesPlayed : s . lifetime . gamesPlayed + gamesPlayed ,
66+ gamesWon : s . lifetime . gamesWon + gamesWon ,
67+ }
68+ : {
69+ gamesPlayed,
70+ gamesWon,
71+ } ,
72+ } ) )
8873 } ,
89- // This needs to not have any dependencies to avoid extra games being added
9074 [ ] ,
9175 )
9276
93- const resetLastRating = useCallback ( ( ) => {
94- setLastRating ( undefined )
77+ const updateRating = useCallback ( ( newRating : number ) => {
78+ setStats ( ( s ) => ( {
79+ ...s ,
80+ rating : newRating ,
81+ lastRating : s . rating ,
82+ } ) )
9583 } , [ ] )
9684
97- return [ stats , incrementStats , resetLastRating ]
85+ return [ stats , incrementStats , updateRating ]
9886}
0 commit comments