import React from 'react'; import PropTypes from 'prop-types'; import { Scrollbars } from 'react-custom-scrollbars'; import Tracklist from './Tracklist'; export default class TracklistWrap extends React.Component { componentWillReceiveProps(nextProps) { const { activeTrackIndex, limitTracklistHeight } = this.props; if ( activeTrackIndex !== nextProps.activeTrackIndex && limitTracklistHeight ) { this.scrollToTrack(nextProps.activeTrackIndex); } } scrollToTrack(trackIndex) { const { tracks } = this.props; const trackHeight = this.scrollbarsRef.getScrollHeight() / tracks.length; if (!this.isTrackVisible(trackIndex)) { this.scrollbarsRef.scrollTop(trackHeight * trackIndex); } } isTrackVisible(trackIndex) { const { tracks } = this.props; const trackHeight = this.scrollbarsRef.getScrollHeight() / tracks.length; const trackPosition = trackHeight * trackIndex; const scrollTop = this.scrollbarsRef.getScrollTop(); const scrollBottom = scrollTop + this.scrollbarsRef.getClientHeight(); return !(trackPosition < scrollTop || trackPosition > scrollBottom); } renderTracklist() { return ( ); } render() { const { isOpen, limitTracklistHeight, tracklistHeight } = this.props; return (
{limitTracklistHeight ? ( (this.scrollbarsRef = ref)} // eslint-disable-line no-return-assign style={{ height: tracklistHeight }} > {this.renderTracklist()} ) : ( this.renderTracklist() )}
); } } TracklistWrap.propTypes = { tracks: PropTypes.arrayOf(PropTypes.object).isRequired, activeTrackIndex: PropTypes.number.isRequired, onTrackClick: PropTypes.func.isRequired, isOpen: PropTypes.bool, className: PropTypes.string, trackClassName: PropTypes.string, reverseTrackOrder: PropTypes.bool, displayTrackNo: PropTypes.bool, limitTracklistHeight: PropTypes.bool, tracklistHeight: PropTypes.number, displayBuyButtons: PropTypes.bool, buyButtonsTarget: PropTypes.bool, displayCovers: PropTypes.bool, displayArtistNames: PropTypes.bool, onTrackLoop: PropTypes.func, repeatingTrackIndex: PropTypes.number, };