Skip to content

Commit 6ec0b7c

Browse files
authored
Merge pull request #56 from Chessweeper/date-timer
Date timer
2 parents cbb370e + 2a50c5c commit 6ec0b7c

File tree

2 files changed

+21
-19
lines changed

2 files changed

+21
-19
lines changed

src/components/Timer.tsx

+12-12
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,44 @@ export interface TimerRefAttributes {
1515

1616
export const Timer = forwardRef<TimerRefAttributes>((_, ref): JSX.Element => {
1717
const { ctx } = useBoardContext();
18-
const [time, setTime] = useState(0);
18+
const [start, setStart] = useState(0);
19+
const [now, setNow] = useState(0);
1920
const intervalRef = useRef<NodeJS.Timer | null>(null);
2021

2122
useImperativeHandle(
2223
ref,
2324
() => ({
2425
start: () => {
2526
if (!intervalRef.current) {
27+
setStart(Date.now());
28+
setNow(Date.now());
2629
const intervalID = setInterval(() => {
27-
setTime((prev) => prev + 1);
28-
}, 10);
30+
setNow(Date.now());
31+
}, 100);
2932
intervalRef.current = intervalID;
3033
}
3134
},
3235

3336
isRunning: () => intervalRef.current !== null,
3437

3538
getTime: () => {
36-
return time;
39+
return Math.floor((now - start) / 10);
3740
},
3841
}),
39-
[time]
42+
[now, start]
4043
);
4144

4245
useEffect(() => {
4346
if (ctx.gameover && intervalRef.current) {
4447
clearInterval(intervalRef.current);
48+
setNow(Date.now());
4549
intervalRef.current = null;
4650
}
4751
}, [ctx.gameover, intervalRef]);
4852

49-
return (
50-
<h1 id="timer">
51-
{Math.floor(time / 100)
52-
.toString()
53-
.padStart(3, "0")}
54-
</h1>
55-
);
53+
const time = Math.floor((now - start) / 1000);
54+
55+
return <h1 id="timer">{time.toString().padStart(3, "0")}</h1>;
5656
});
5757

5858
Timer.displayName = "Timer";

test/components/Timer.test.tsx

+9-7
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ describe("Timer tests", () => {
3030
</BoardContext.Provider>
3131
);
3232

33-
timerRef.current.start();
33+
act(() => {
34+
timerRef.current.start();
35+
});
3436

3537
expect(timerRef.current.isRunning()).toBe(true);
3638
});
@@ -44,9 +46,11 @@ describe("Timer tests", () => {
4446
</BoardContext.Provider>
4547
);
4648

47-
timerRef.current.start();
48-
boardContext.ctx.gameover = { isWin: true };
49+
act(() => {
50+
timerRef.current.start();
51+
});
4952

53+
boardContext.ctx.gameover = { isWin: true };
5054
rerender(
5155
<BoardContext.Provider value={boardContext}>
5256
<Timer ref={timerRef} />
@@ -65,9 +69,8 @@ describe("Timer tests", () => {
6569
</BoardContext.Provider>
6670
);
6771

68-
timerRef.current.start();
69-
7072
act(() => {
73+
timerRef.current.start();
7174
vi.advanceTimersByTime(5000);
7275
});
7376

@@ -85,9 +88,8 @@ describe("Timer tests", () => {
8588
</BoardContext.Provider>
8689
);
8790

88-
timerRef.current.start();
89-
9091
act(() => {
92+
timerRef.current.start();
9193
vi.advanceTimersByTime(5000);
9294
});
9395

0 commit comments

Comments
 (0)