Nice formatting of displayed time
This commit is contained in:
		@@ -1,11 +1,9 @@
 | 
				
			|||||||
import * as _ from 'lodash';
 | 
					import * as _ from 'lodash';
 | 
				
			||||||
import * as React from 'react';
 | 
					import * as React from 'react';
 | 
				
			||||||
import { Dispatch } from 'redux';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { PROGRESS_STALL_AT_PERCENTAGE, PROGRESS_TICK_INTERVAL_MS } from '../constants';
 | 
					import { PROGRESS_STALL_AT_PERCENTAGE, PROGRESS_TICK_INTERVAL_MS } from '../constants';
 | 
				
			||||||
import { Action, actions } from '../redux/actions';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import { ColorOption } from '../style/theme';
 | 
					import { ColorOption } from '../style/theme';
 | 
				
			||||||
 | 
					import { timeUtil } from '../util/time';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { Container } from './ui/container';
 | 
					import { Container } from './ui/container';
 | 
				
			||||||
import { Flex } from './ui/flex';
 | 
					import { Flex } from './ui/flex';
 | 
				
			||||||
@@ -106,9 +104,8 @@ export class SimulatedProgressBar extends React.Component<SimulatedProgressBarPr
 | 
				
			|||||||
                <Container marginBottom="5px">
 | 
					                <Container marginBottom="5px">
 | 
				
			||||||
                    {/* TODO: consider moving to separate component */}
 | 
					                    {/* TODO: consider moving to separate component */}
 | 
				
			||||||
                    <Flex justify="space-between">
 | 
					                    <Flex justify="space-between">
 | 
				
			||||||
                        {/* TODO: should do nice display of these (i.e. 'minutes' and 00:xx) */}
 | 
					                        <Text>Est. Time ({timeUtil.secondsToHumanDescription(estimatedTimeSeconds)})</Text>
 | 
				
			||||||
                        <Text>Est. Time ({estimatedTimeSeconds} seconds)</Text>
 | 
					                        <Text>Time: {timeUtil.secondsToStopwatchTime(elapsedTimeSeconds)}</Text>
 | 
				
			||||||
                        <Text>Time: {elapsedTimeSeconds}</Text>
 | 
					 | 
				
			||||||
                    </Flex>
 | 
					                    </Flex>
 | 
				
			||||||
                </Container>
 | 
					                </Container>
 | 
				
			||||||
                <Container width="100%" backgroundColor={ColorOption.lightGrey} borderRadius="6px">
 | 
					                <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