import * as React from 'react'; import { ONE_SECOND_MS } from '../constants'; import { ColorOption } from '../style/theme'; import { timeUtil } from '../util/time'; import { Container } from './ui/container'; import { Flex } from './ui/flex'; import { Text } from './ui/text'; export interface TimeCounterProps { estimatedTimeMs: number; hasEnded: boolean; } interface TimeCounterState { elapsedSeconds: number; } export class TimeCounter extends React.PureComponent { public state = { elapsedSeconds: 0, }; private _timerId?: number; public componentDidMount(): void { this._setupTimerBasedOnProps(); } public componentWillUnmount(): void { this._clearTimer(); } public componentDidUpdate(prevProps: TimeCounterProps): void { if (prevProps.hasEnded !== this.props.hasEnded) { this._setupTimerBasedOnProps(); } } public render(): React.ReactNode { const estimatedTimeSeconds = this.props.estimatedTimeMs / ONE_SECOND_MS; return ( Est. Time ({timeUtil.secondsToHumanDescription(estimatedTimeSeconds)}) Time: {timeUtil.secondsToStopwatchTime(this.state.elapsedSeconds)} ); } private _setupTimerBasedOnProps(): void { this.props.hasEnded ? this._clearTimer() : this._newTimer(); } private _newTimer(): void { this._clearTimer(); this._timerId = window.setInterval(() => { this.setState({ elapsedSeconds: this.state.elapsedSeconds + 1, }); }, ONE_SECOND_MS); } private _clearTimer(): void { if (this._timerId) { window.clearInterval(this._timerId); } } }