JSFiddle - React, Tailwind, and code Playground

by joplomacedo

JavaScript

const convertUnit= ( () => {
		function splitIntoNumAndUnit( numAndUnit ) {
        let fromNum = '';
        let fromUnit = '';

        numAndUnit.split('').forEach( v => {
            if ( !isNaN(+v) ) {
                fromNum += v;
            } else {
                fromUnit += v;
            }
        })

        fromNum = fromNum;

        return [ fromNum, fromUnit ]
    }
    
    
   const minToMax = [
     { m: 1,     unit: 'ms'  },
     { m: 1000,  unit: 's'   },
     { m: 60,    unit: 'm' },
     { m: 60,    unit: 'h'   },
     { m: 24,    unit: 'd'   }
   ]
   
   const unitsAliases = {
   		'ms': ['millisecs', 'millisecs', 'millisecond', 'milliseconds'],
   		's': ['secs', 'sec', 'second', 'seconds'],
    	'm': ['min', 'mins', 'minute', 'minutes'],
     	'h': ['hour', 'hours'],
     	'd': ['day', 'days'],
   };
   
   function getUnitFromInputUnit( inputUnit ) {
      for ( const [unit, unitAliases] of Object.entries(unitsAliases) ) {
          if ( [unit, ...unitAliases].includes(inputUnit) ) {
            return unit;
          }
      }
      
      return null;
   }

   return function (fromNumAndUnit, _toUnit) {
        const [ fromNum, _fromUnit ] = splitIntoNumAndUnit(fromNumAndUnit);
        
        const toUnit = getUnitFromInputUnit(_toUnit);
        const fromUnit = getUnitFromInputUnit(_fromUnit);
        
        if ( isNaN(+fromNum) || !toUnit || !fromUnit ) {
        	console.error('convertUnit called with invalid inputs!')
        	return;
        }

        const fromUnitIdx = minToMax.findIndex( ({unit}) => unit === fromUnit );
        const toUnitIdx = minToMax.findIndex( ({unit}) => unit === toUnit );

        const [startIdx, endIdx] = [fromUnitIdx, toUnitIdx].sort().map( v => v + 1 )
        
        const multiplier = minToMax.slice(startIdx, endIdx).reduce( (res, {m}) => res * m, 1);

        if ( fromUnitIdx > toUnitIdx ) {
            return fromNum * multiplier;
        } else {
            return fromNum /...