@appearhere/bloom
Version:
Appear Here's pattern library and styleguide
59 lines (49 loc) • 1.59 kB
JavaScript
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import css from './InputRange.css';
import InputRange from './InputRange';
/* eslint-disable arrow-body-style */
export const getVerticalScale = data => data
.reduce((currentHighestValue, datum) => {
return datum >= currentHighestValue
? datum
: currentHighestValue;
}, 0);
/* eslint-enable arrow-body-style */
export const getPointWidth = data => 100 / data.length;
const defaultValueSelector = value => value;
export default class InputRangeWithHistogram extends Component {
static propTypes = {
name: PropTypes.string,
data: PropTypes.array.isRequired,
valueSelector: PropTypes.func,
};
static defaultProps = {
valueSelector: defaultValueSelector,
};
render() {
const { valueSelector, data, name, ...rest } = this.props;
const pointData = data.map((datum) => valueSelector(datum));
const maxPointHeight = getVerticalScale(pointData);
const pointWidth = getPointWidth(pointData);
return (
<div className={ css.container }>
<div className={ css.histogram }>
{ pointData.map((datum, i) => (
<div
key={ `${name}-${i}` }
className={ css.barContainer }
style={ {
width: `${pointWidth}%`,
height: `${(datum / maxPointHeight) * 100}%`,
} }
>
<div className={ css.bar } />
</div>
)) }
</div>
<InputRange name={ name } { ...rest } />
</div>
);
}
}