Files
Iris/src/js/components/TrackList.js

155 lines
3.4 KiB
JavaScript
Raw Normal View History

2016-10-03 14:44:27 +13:00
import React, { PropTypes } from 'react'
2016-10-14 18:15:34 +13:00
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import * as mopidyActions from '../services/mopidy/actions'
2016-10-14 18:15:34 +13:00
2016-10-03 21:21:14 +13:00
import Track from './Track'
2016-10-03 14:44:27 +13:00
2016-10-14 18:15:34 +13:00
class TrackList extends React.Component{
2016-10-03 14:44:27 +13:00
constructor(props) {
super(props);
2016-10-06 16:38:06 +13:00
this.state = {
tracks: this.props.tracks,
lastSelectedTrack: false
2016-10-06 16:38:06 +13:00
}
2016-10-03 14:44:27 +13:00
}
componentWillReceiveProps( nextProps ){
this.setState({ tracks: nextProps.tracks });
}
handleClick( e, index ){
2016-10-06 16:38:06 +13:00
var tracks = this.state.tracks;
if( e.ctrlKey ){
tracks[index].selected = !tracks[index].selected;
}else if( e.shiftKey ){
if( this.state.lastSelectedTrack < index ){
var start = this.state.lastSelectedTrack;
var end = index;
}else{
var start = index;
var end = this.state.lastSelectedTrack;
}
for( var i = start; i <= end; i++ ){
tracks[i].selected = true;
}
}else{
for( var i = 0; i < tracks.length; i++ ){
tracks[i].selected = false;
}
tracks[index].selected = !tracks[index].selected;
}
this.setState({ tracks: tracks, lastSelectedTrack: index });
}
handleDoubleClick( e, index ){
var tracks = this.state.tracks;
this.playTrack( tracks[index] )
}
2016-10-19 14:09:34 +13:00
selectedTracks(){
function isSelected( track ){
return ( typeof(track.selected) !== 'undefined' && track.selected );
}
2016-10-19 14:09:34 +13:00
return this.state.tracks.filter(isSelected)
}
playTracks(){
var tracks = this.selectedTracks();
if( typeof(this.props.playTracks) !== 'undefined' ){
return this.props.playTracks( tracks );
}
var uris = [];
for( var i = 0; i < tracks.length; i++ ){
uris.push( tracks[i].uri )
}
return this.props.mopidyActions.playTracks( uris )
2016-10-19 14:09:34 +13:00
}
playTrack( track ){
if( typeof(this.props.playTrack) !== 'undefined' ){
return this.props.playTrack( this.selectedTracks() );
}
var uris = [track.uri];
this.props.mopidyActions.playTracks( uris )
2016-10-19 14:09:34 +13:00
}
2016-10-19 14:09:34 +13:00
removeTracks(){
2016-10-03 14:44:27 +13:00
var tracks = this.selectedTracks();
if( typeof(this.props.removeTracks) !== 'undefined' ){
return this.props.removeTracks( tracks );
}
2016-10-06 16:38:06 +13:00
}
render(){
let self = this;
if( this.state.tracks ){
2016-10-03 14:44:27 +13:00
return (
<div>
<ul>
{
this.state.tracks.map(
(track, index) => {
// flatten nested track objects (as in the case of TlTracks)
if( typeof(track.track) !== 'undefined' ){
for( var property in track.track ){
if( track.track.hasOwnProperty(property) ){
track[property] = track.track[property]
}
2016-10-06 16:38:06 +13:00
}
}
return <Track
key={index+'_'+track.uri}
track={track}
handleDoubleClick={(e) => self.handleDoubleClick(e, index)}
handleClick={(e) => self.handleClick(e, index)} />
2016-10-03 21:21:14 +13:00
}
)
}
</ul>
2016-10-19 14:09:34 +13:00
<button onClick={() => this.removeTracks()}>Delete selected</button>
<button onClick={() => this.playTracks()}>Play selected</button>
</div>
2016-10-03 14:44:27 +13:00
);
}
return null;
}
2016-10-14 18:15:34 +13:00
}
/**
* Export our component
*
* We also integrate our global store, using connect()
**/
const mapStateToProps = (state, ownProps) => {
return state;
}
const mapDispatchToProps = (dispatch) => {
return {
mopidyActions: bindActionCreators(mopidyActions, dispatch)
2016-10-14 18:15:34 +13:00
}
}
export default connect(mapStateToProps, mapDispatchToProps)(TrackList)