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