Skip to content

Commit 78c31bc

Browse files
committed
Wrap game time into a subcomponent
To avoid re-rendering the whole sidebar twice a second. Also, stop the timer when the game ends.
1 parent 4bc2a85 commit 78c31bc

2 files changed

Lines changed: 16 additions & 9 deletions

File tree

src/components/GameSidebar.js

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,20 @@ const useStyles = makeStyles((theme) => ({
4848
},
4949
}));
5050

51-
function GameSidebar({ game, scores, leaderboard, pause, endedAt }) {
52-
const classes = useStyles();
53-
const { pathname } = useLocation();
54-
const time = useMoment(500);
51+
function GameTime({ startedAt, endedAt, pause }) {
52+
const time = useMoment(endedAt ? 0 : 500);
5553
const gameTime = endedAt || time;
5654
const pauseEnd = pause?.end ?? gameTime;
5755
const pauseTime =
5856
(pause?.previous ?? 0) +
5957
(pause?.start < pauseEnd ? pauseEnd - pause.start : 0);
58+
// Hide the sub-second time resolution while game is active.
59+
return <>{formatTime(gameTime - startedAt - pauseTime, !endedAt)}</>;
60+
}
61+
62+
function GameSidebar({ game, scores, leaderboard, pause, endedAt }) {
63+
const classes = useStyles();
64+
const { pathname } = useLocation();
6065

6166
return (
6267
<Paper className={classes.sidebar}>
@@ -82,9 +87,11 @@ function GameSidebar({ game, scores, leaderboard, pause, endedAt }) {
8287
/>
8388
)}
8489
<Typography variant="h4" align="center">
85-
{/* Hide the sub-second time resolution while game is active to
86-
avoid stressing beginners. */}
87-
{formatTime(gameTime - game.startedAt - pauseTime, !endedAt)}
90+
<GameTime
91+
startedAt={game.startedAt}
92+
endedAt={endedAt}
93+
pause={pause}
94+
/>
8895
</Typography>
8996
</div>
9097
<Divider style={{ margin: "8px 0" }} />

src/hooks/useMoment.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ function useMoment(delay = 1000) {
88
const [offset] = useFirebaseRef(".info/serverTimeOffset");
99

1010
useEffect(() => {
11+
if (!delay) return;
12+
1113
const id = setInterval(() => {
1214
setTime(moment(Date.now() + offset));
1315
}, delay);
14-
15-
// Clear any intervals that saw stale offsets
1616
return () => clearInterval(id);
1717
}, [offset, delay]);
1818

0 commit comments

Comments
 (0)