blob: 26deb82bde14377be051725297c39524e46e397c (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
import * as React from 'react';
import { timeUtil } from '../util/time';
import { Flex } from './ui/flex';
import { Text } from './ui/text';
export interface TimeCounterProps {
estimatedTimeMs: number;
ended: boolean;
}
interface TimeCounterState {
elapsedSeconds: number;
}
export class TimeCounter extends React.Component<TimeCounterProps, TimeCounterState> {
public state = {
elapsedSeconds: 0,
};
private _timerId?: number;
public componentDidMount(): void {
this._setupTimerBasedOnProps();
}
public componentWillUnmount(): void {
this._clearTimer();
}
public componentDidUpdate(prevProps: TimeCounterProps): void {
if (prevProps.ended !== this.props.ended) {
this._setupTimerBasedOnProps();
}
}
public render(): React.ReactNode {
const estimatedTimeSeconds = this.props.estimatedTimeMs / 1000;
return (
<Flex justify="space-between">
<Text>Est. Time ({timeUtil.secondsToHumanDescription(estimatedTimeSeconds)})</Text>
<Text>Time: {timeUtil.secondsToStopwatchTime(this.state.elapsedSeconds)}</Text>
</Flex>
);
}
private _setupTimerBasedOnProps(): void {
this.props.ended ? this._clearTimer() : this._newTimer();
}
private _newTimer(): void {
this._clearTimer();
this._timerId = window.setInterval(() => {
this.setState({
elapsedSeconds: this.state.elapsedSeconds + 1,
});
}, 1000);
}
private _clearTimer(): void {
if (this._timerId) {
window.clearInterval(this._timerId);
}
}
}
|