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 { 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 ( Est. Time ({timeUtil.secondsToHumanDescription(estimatedTimeSeconds)}) Time: {timeUtil.secondsToStopwatchTime(this.state.elapsedSeconds)} ); } 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); } } }