Home Reference Source

src/components/controls/Slider/utils.js

import React from 'react';
import {
  omit,
  pick,
  isEmpty,
  forEach,
  isString,
  isArray,
  isNaN,
  map,
  merge,
} from 'lodash';

export const parseToFloat = value =>
  !isNaN(parseFloat(value)) ? parseFloat(value) : undefined;

export const parseToInt = value =>
  !isNaN(parseInt(value)) ? parseInt(value) : undefined;

const convertStrToFloatOrInt = value => {
  if (isString(value)) {
    if (value.includes('.')) {
      return parseToFloat(value);
    }
    return parseToInt(value);
  }
  return value;
};
/**
 * HOC для преобразования заданных пропсов из строки в число
 * @param convertProps - список свойств
 * @return {function}
 */
export const stringConverter = (convertProps = []) => WrapperComponent => ({
  stringMode,
  ...rest
}) => {
  const convertPropsObj = pick(rest, stringMode ? convertProps : []);

  const resultConverted = {};

  if (!isEmpty(convertPropsObj)) {
    forEach(convertPropsObj, (value, key) => {
      if (isString(value)) {
        resultConverted[key] = convertStrToFloatOrInt(value);
      } else if (isArray(value)) {
        resultConverted[key] = map(value, convertStrToFloatOrInt);
      } else {
        resultConverted[key] = value;
      }
    });
  }

  return (
    <WrapperComponent {...omit(rest, convertProps)} {...resultConverted} />
  );
};

/**
 * Кастомный стиль если vertical=true
 * @param vertical - установлен ли вертикальный режим
 * @param style - стили для мерджа
 * @return {*}
 */
export const prepareStyle = (vertical = false, style = {}) => {
  const fromVerticalStyle = {
    float: 'left',
    height: 400,
    marginLeft: 50,
  };

  if (vertical) {
    return merge(fromVerticalStyle, style);
  }
  return style;
};