Nice formatting of displayed time
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
import * as _ from 'lodash';
|
||||
import * as React from 'react';
|
||||
import { Dispatch } from 'redux';
|
||||
|
||||
import { PROGRESS_STALL_AT_PERCENTAGE, PROGRESS_TICK_INTERVAL_MS } from '../constants';
|
||||
import { Action, actions } from '../redux/actions';
|
||||
|
||||
import { ColorOption } from '../style/theme';
|
||||
import { timeUtil } from '../util/time';
|
||||
|
||||
import { Container } from './ui/container';
|
||||
import { Flex } from './ui/flex';
|
||||
@@ -106,9 +104,8 @@ export class SimulatedProgressBar extends React.Component<SimulatedProgressBarPr
|
||||
<Container marginBottom="5px">
|
||||
{/* TODO: consider moving to separate component */}
|
||||
<Flex justify="space-between">
|
||||
{/* TODO: should do nice display of these (i.e. 'minutes' and 00:xx) */}
|
||||
<Text>Est. Time ({estimatedTimeSeconds} seconds)</Text>
|
||||
<Text>Time: {elapsedTimeSeconds}</Text>
|
||||
<Text>Est. Time ({timeUtil.secondsToHumanDescription(estimatedTimeSeconds)})</Text>
|
||||
<Text>Time: {timeUtil.secondsToStopwatchTime(elapsedTimeSeconds)}</Text>
|
||||
</Flex>
|
||||
</Container>
|
||||
<Container width="100%" backgroundColor={ColorOption.lightGrey} borderRadius="6px">
|
||||
|
||||
39
packages/instant/src/util/time.ts
Normal file
39
packages/instant/src/util/time.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
const secondsToMinutesAndRemainingSeconds = (seconds: number): { minutes: number; remainingSeconds: number } => {
|
||||
const minutes = Math.floor(seconds / 60);
|
||||
const remainingSeconds = seconds - minutes * 60;
|
||||
|
||||
return {
|
||||
minutes,
|
||||
remainingSeconds,
|
||||
};
|
||||
};
|
||||
|
||||
const padZero = (aNumber: number): string => {
|
||||
return aNumber < 10 ? `0${aNumber}` : aNumber.toString();
|
||||
};
|
||||
|
||||
export const timeUtil = {
|
||||
// converts seconds to human readable version of seconds or minutes
|
||||
secondsToHumanDescription: (seconds: number): string => {
|
||||
const { minutes, remainingSeconds } = secondsToMinutesAndRemainingSeconds(seconds);
|
||||
|
||||
if (minutes === 0) {
|
||||
const suffix = seconds > 1 ? 's' : '';
|
||||
return `${seconds} second${suffix}`;
|
||||
}
|
||||
|
||||
const minuteSuffix = minutes > 1 ? 's' : '';
|
||||
const minuteText = `${minutes} minute${minuteSuffix}`;
|
||||
|
||||
const secondsSuffix = remainingSeconds > 1 ? 's' : '';
|
||||
const secondsText = remainingSeconds === 0 ? '' : ` ${remainingSeconds} second${secondsSuffix}`;
|
||||
|
||||
return `${minuteText}${secondsText}`;
|
||||
},
|
||||
// converts seconds to stopwatch time (i.e. 05:30 and 00:30)
|
||||
// only goes up to minutes, not hours
|
||||
secondsToStopwatchTime: (seconds: number): string => {
|
||||
const { minutes, remainingSeconds } = secondsToMinutesAndRemainingSeconds(seconds);
|
||||
return `${padZero(minutes)}:${padZero(remainingSeconds)}`;
|
||||
},
|
||||
};
|
||||
48
packages/instant/test/util/time.test.ts
Normal file
48
packages/instant/test/util/time.test.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { timeUtil } from '../../src/util/time';
|
||||
|
||||
describe('assetDataUtil', () => {
|
||||
describe('secondsToHumanDescription', () => {
|
||||
const numsToResults: {
|
||||
[aNumber: number]: string;
|
||||
} = {
|
||||
1: '1 second',
|
||||
59: '59 seconds',
|
||||
60: '1 minute',
|
||||
119: '1 minute 59 seconds',
|
||||
120: '2 minutes',
|
||||
121: '2 minutes 1 second',
|
||||
122: '2 minutes 2 seconds',
|
||||
};
|
||||
|
||||
const nums = Object.keys(numsToResults);
|
||||
nums.forEach(aNum => {
|
||||
const numInt = parseInt(aNum, 10);
|
||||
it(`should work for ${aNum} seconds`, () => {
|
||||
const expectedResult = numsToResults[numInt];
|
||||
expect(timeUtil.secondsToHumanDescription(numInt)).toEqual(expectedResult);
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('secondsToStopwatchTime', () => {
|
||||
const numsToResults: {
|
||||
[aNumber: number]: string;
|
||||
} = {
|
||||
1: '00:01',
|
||||
59: '00:59',
|
||||
60: '01:00',
|
||||
119: '01:59',
|
||||
120: '02:00',
|
||||
121: '02:01',
|
||||
2701: '45:01',
|
||||
};
|
||||
|
||||
const nums = Object.keys(numsToResults);
|
||||
nums.forEach(aNum => {
|
||||
const numInt = parseInt(aNum, 10);
|
||||
it(`should work for ${aNum} seconds`, () => {
|
||||
const expectedResult = numsToResults[numInt];
|
||||
expect(timeUtil.secondsToStopwatchTime(numInt)).toEqual(expectedResult);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user