import PropTypes from 'prop-types'; import React, { Component } from 'react'; import ReactSlider from 'react-slider'; import formatBytes from 'Utilities/Number/formatBytes'; import roundNumber from 'Utilities/Number/roundNumber'; import { kinds, tooltipPositions } from 'Helpers/Props'; import Label from 'Components/Label'; import NumberInput from 'Components/Form/NumberInput'; import TextInput from 'Components/Form/TextInput'; import Popover from 'Components/Tooltip/Popover'; import QualityDefinitionLimits from './QualityDefinitionLimits'; import styles from './QualityDefinition.css'; const MIN = 0; const MAX = 1500; const slider = { min: MIN, max: roundNumber(Math.pow(MAX, 1 / 1.1)), step: 0.1 }; function getValue(inputValue) { if (inputValue < MIN) { return MIN; } if (inputValue > MAX) { return MAX; } return roundNumber(inputValue); } function getSliderValue(value, defaultValue) { const sliderValue = value ? Math.pow(value, 1 / 1.1) : defaultValue; return roundNumber(sliderValue); } class QualityDefinition extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { sliderMinSize: getSliderValue(props.minSize, slider.min), sliderMaxSize: getSliderValue(props.maxSize, slider.max) }; } // // Listeners onSliderChange = ([sliderMinSize, sliderMaxSize]) => { this.setState({ sliderMinSize, sliderMaxSize }); this.props.onSizeChange({ minSize: roundNumber(Math.pow(sliderMinSize, 1.1)), maxSize: sliderMaxSize === slider.max ? null : roundNumber(Math.pow(sliderMaxSize, 1.1)) }); } onAfterSliderChange = () => { const { minSize, maxSize } = this.props; this.setState({ sliderMiSize: getSliderValue(minSize, slider.min), sliderMaxSize: getSliderValue(maxSize, slider.max) }); } onMinSizeChange = ({ value }) => { const minSize = getValue(value); this.setState({ sliderMinSize: getSliderValue(minSize, slider.min) }); this.props.onSizeChange({ minSize, maxSize: this.props.maxSize }); } onMaxSizeChange = ({ value }) => { const maxSize = value === MAX ? null : getValue(value); this.setState({ sliderMaxSize: getSliderValue(maxSize, slider.max) }); this.props.onSizeChange({ minSize: this.props.minSize, maxSize }); } // // Render render() { const { id, quality, title, minSize, maxSize, advancedSettings, onTitleChange } = this.props; const { sliderMinSize, sliderMaxSize } = this.state; const minBytes = minSize * 128; const maxBytes = maxSize && maxSize * 128; const minRate = `${formatBytes(minBytes, true)}/s`; const maxRate = maxBytes ? `${formatBytes(maxBytes, true)}/s` : 'Unlimited'; return (
{quality.name}
{minRate} } title="Minimum Limits" body={ } position={tooltipPositions.BOTTOM} />
{maxRate} } title="Maximum Limits" body={ } position={tooltipPositions.BOTTOM} />
{ advancedSettings &&
Min
Max
}
); } } QualityDefinition.propTypes = { id: PropTypes.number.isRequired, quality: PropTypes.object.isRequired, title: PropTypes.string.isRequired, minSize: PropTypes.number, maxSize: PropTypes.number, advancedSettings: PropTypes.bool.isRequired, onTitleChange: PropTypes.func.isRequired, onSizeChange: PropTypes.func.isRequired }; export default QualityDefinition;