| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | import PropTypes from 'prop-types';
import React, { Component } from 'react';
/**
 * Used to modify initialValue, which is expected to be a decimal value between
 * 0 and 1, and converts it to a number representable by an input slider, which
 * recognizes whole numbers.
 */
const VOLUME_SLIDER_SCALE = 100;
/**
 * Implements a React {@link Component} which displays an input slider for
 * adjusting the local volume of a remote participant.
 *
 * @extends Component
 */
class VolumeSlider extends Component {
    /**
     * {@code VolumeSlider} component's property types.
     *
     * @static
     */
    static propTypes = {
        /**
         * The value of the audio slider should display at when the component
         * first mounts. Changes will be stored in state. The value should be a
         * number between 0 and 1.
         */
        initialValue: PropTypes.number,
        /**
         * The callback to invoke when the audio slider value changes.
         */
        onChange: PropTypes.func
    };
    /**
     * Initializes a new {@code VolumeSlider} instance.
     *
     * @param {Object} props - The read-only properties with which the new
     * instance is to be initialized.
     */
    constructor(props) {
        super(props);
        this.state = {
            /**
             * The volume of the participant's audio element. The value will
             * be represented by a slider.
             *
             * @type {Number}
             */
            volumeLevel: (props.initialValue || 0) * VOLUME_SLIDER_SCALE
        };
        // Bind event handlers so they are only bound once for every instance.
        this._onVolumeChange = this._onVolumeChange.bind(this);
    }
    /**
     * Implements React's {@link Component#render()}.
     *
     * @inheritdoc
     * @returns {ReactElement}
     */
    render() {
        return (
            <li className = 'popupmenu__item'>
                <div className = 'popupmenu__contents'>
                    <span className = 'popupmenu__icon'>
                        <i className = 'icon-volume' />
                    </span>
                    <div className = 'popupmenu__slider_container'>
                        <input
                            className = 'popupmenu__slider'
                            max = { VOLUME_SLIDER_SCALE }
                            min = { 0 }
                            onChange = { this._onVolumeChange }
                            type = 'range'
                            value = { this.state.volumeLevel } />
                    </div>
                </div>
            </li>
        );
    }
    /**
     * Sets the internal state of the volume level for the volume slider.
     * Invokes the prop onVolumeChange to notify of volume changes.
     *
     * @param {Object} event - DOM Event for slider change.
     * @private
     * @returns {void}
     */
    _onVolumeChange(event) {
        const volumeLevel = event.currentTarget.value;
        this.props.onChange(volumeLevel / VOLUME_SLIDER_SCALE);
        this.setState({ volumeLevel });
    }
}
export default VolumeSlider;
 |