2016-10-03 21:21:14 +13:00
|
|
|
|
|
|
|
|
import React, { PropTypes } from 'react'
|
2016-11-19 13:06:08 +13:00
|
|
|
import { Link } from 'react-router'
|
2017-02-28 16:13:27 +13:00
|
|
|
|
2016-10-06 16:38:06 +13:00
|
|
|
import FontAwesome from 'react-fontawesome'
|
2016-10-25 21:36:33 +13:00
|
|
|
import ArtistSentence from './ArtistSentence'
|
2016-10-31 16:49:42 +13:00
|
|
|
import Dater from './Dater'
|
2016-11-19 13:06:08 +13:00
|
|
|
import * as helpers from '../helpers'
|
2016-10-03 21:21:14 +13:00
|
|
|
|
|
|
|
|
export default class Track extends React.Component{
|
|
|
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-15 17:08:21 +13:00
|
|
|
handleMouseDown(e){
|
2016-11-16 14:58:08 +13:00
|
|
|
var target = $(e.target);
|
|
|
|
|
if( !target.is('a') && target.closest('a').length <= 0 ){
|
|
|
|
|
this.props.handleMouseDown(e);
|
|
|
|
|
}
|
2016-11-15 17:08:21 +13:00
|
|
|
}
|
2016-11-10 16:17:10 +13:00
|
|
|
|
2016-12-12 09:07:47 +13:00
|
|
|
handleTouchEnd(e){
|
|
|
|
|
var target = $(e.target);
|
|
|
|
|
if( !target.is('a') && target.closest('a').length <= 0 ){
|
|
|
|
|
this.props.handleTouchEnd(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-27 10:02:12 +13:00
|
|
|
handleContextMenu(e){
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
this.props.handleContextMenu(e);
|
|
|
|
|
}
|
|
|
|
|
|
2016-10-03 21:21:14 +13:00
|
|
|
render(){
|
2016-11-08 13:36:13 +13:00
|
|
|
if( !this.props.track ) return null
|
2016-10-06 16:38:06 +13:00
|
|
|
|
2016-11-08 13:36:13 +13:00
|
|
|
var track = this.props.track;
|
2016-10-21 23:27:50 +13:00
|
|
|
var className = 'list-item track';
|
2016-10-31 16:49:42 +13:00
|
|
|
if( typeof(track.selected) !== 'undefined' && track.selected ) className += ' selected';
|
2017-02-10 09:06:41 +13:00
|
|
|
if( typeof(track.type) !== 'undefined' ) className += ' '+track.type;
|
2016-10-31 16:49:42 +13:00
|
|
|
if( track.playing ) className += ' playing';
|
2017-03-23 11:51:04 +13:00
|
|
|
|
2016-12-05 10:20:01 +13:00
|
|
|
var album = '-'
|
|
|
|
|
if( track.album ){
|
|
|
|
|
if( track.album.uri ){
|
2016-12-21 15:24:07 +13:00
|
|
|
album = <Link to={global.baseURL+'album/'+track.album.uri}>{track.album.name}</Link>
|
2016-12-05 10:20:01 +13:00
|
|
|
} else {
|
|
|
|
|
album = <span>{track.album.name}</span>
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-14 20:24:35 +13:00
|
|
|
if (track.type == 'history'){
|
2017-02-10 09:06:41 +13:00
|
|
|
|
2017-02-14 20:24:35 +13:00
|
|
|
var track_columns = (
|
|
|
|
|
<span>
|
|
|
|
|
<span className="col name">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.name ? track.name : <span className="grey-text">{track.uri}</span>}
|
2017-02-10 09:06:41 +13:00
|
|
|
</span>
|
2017-03-14 08:00:39 +13:00
|
|
|
<span className="col source">
|
|
|
|
|
{helpers.uriSource(track.uri)}
|
|
|
|
|
</span>
|
2017-02-14 20:24:35 +13:00
|
|
|
<span className="col played_at">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.played_at ? <span><Dater type="ago" data={track.played_at} /> ago</span> : null}
|
2017-02-14 20:24:35 +13:00
|
|
|
</span>
|
|
|
|
|
</span>
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
} else if (this.props.context == 'queue'){
|
|
|
|
|
|
|
|
|
|
if (track.added_from && track.added_by){
|
2017-06-15 08:41:55 +12:00
|
|
|
var type = (track.added_from ? helpers.uriType(track.added_from) : null)
|
|
|
|
|
if (type == 'discover'){
|
|
|
|
|
var link = <Link to={global.baseURL+'discover/recommendations/'+helpers.getFromUri('seeds',track.added_from)}>discover</Link>
|
|
|
|
|
} else {
|
|
|
|
|
var link = <Link to={global.baseURL+type+'/'+track.added_from}>{type}</Link>
|
|
|
|
|
}
|
|
|
|
|
var added = <span>{track.added_by} <span className="grey-text"> (from {link})</span></span>
|
2017-02-14 20:24:35 +13:00
|
|
|
|
|
|
|
|
} else if (track.added_by){
|
|
|
|
|
var added = track.added_by
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
var added = '-'
|
|
|
|
|
}
|
2017-02-10 09:06:41 +13:00
|
|
|
|
|
|
|
|
var track_columns = (
|
|
|
|
|
<span>
|
|
|
|
|
<span className="col name">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.name ? track.name : <span className="grey-text">{track.uri}</span>}
|
|
|
|
|
{track.explicit ? <span className="flag dark">EXPLICIT</span> : null}
|
2017-02-10 09:06:41 +13:00
|
|
|
</span>
|
2017-03-27 09:17:05 +13:00
|
|
|
{this.props.show_source_icon ? <FontAwesome name={helpers.sourceIcon(track.uri)} className="source" fixedWidth /> : null}
|
2017-02-10 09:06:41 +13:00
|
|
|
<span className="col artists">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.artists ? <ArtistSentence artists={track.artists} /> : '-'}
|
2017-02-10 09:06:41 +13:00
|
|
|
</span>
|
|
|
|
|
<span className="col album">
|
|
|
|
|
{album}
|
|
|
|
|
</span>
|
2017-02-14 20:24:35 +13:00
|
|
|
<span className="col added">
|
|
|
|
|
{added}
|
|
|
|
|
</span>
|
2017-02-10 09:06:41 +13:00
|
|
|
<span className="col duration">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.duration_ms ? <Dater type="length" data={track.duration_ms} /> : null}
|
|
|
|
|
{track.length ? <Dater type="length" data={track.length} /> : null}
|
2017-02-10 09:06:41 +13:00
|
|
|
</span>
|
|
|
|
|
</span>
|
|
|
|
|
)
|
2017-02-14 20:24:35 +13:00
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
var track_columns = (
|
|
|
|
|
<span>
|
|
|
|
|
<span className="col name">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.name ? track.name : <span className="grey-text">{track.uri}</span>}
|
|
|
|
|
{track.explicit ? <span className="flag dark">EXPLICIT</span> : null}
|
2017-02-14 20:24:35 +13:00
|
|
|
</span>
|
2017-03-27 09:17:05 +13:00
|
|
|
{this.props.show_source_icon ? <FontAwesome name={helpers.sourceIcon(track.uri)} className="source" fixedWidth /> : null}
|
2017-02-14 20:24:35 +13:00
|
|
|
<span className="col artists">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.artists ? <ArtistSentence artists={track.artists} /> : '-'}
|
2017-02-14 20:24:35 +13:00
|
|
|
</span>
|
|
|
|
|
<span className="col album">
|
|
|
|
|
{album}
|
|
|
|
|
</span>
|
|
|
|
|
<span className="col duration">
|
2017-06-21 09:12:14 +12:00
|
|
|
{track.duration_ms ? <Dater type="length" data={track.duration_ms} /> : null}
|
|
|
|
|
{track.length ? <Dater type="length" data={track.length} /> : null}
|
2017-02-14 20:24:35 +13:00
|
|
|
</span>
|
|
|
|
|
</span>
|
|
|
|
|
)
|
2017-02-10 09:06:41 +13:00
|
|
|
}
|
|
|
|
|
|
2016-10-06 16:38:06 +13:00
|
|
|
return (
|
2016-10-16 12:37:37 +13:00
|
|
|
<div
|
2016-10-21 09:56:07 +13:00
|
|
|
className={className}
|
2016-12-06 16:54:48 +13:00
|
|
|
onTouchStart={ e => this.props.handleTouchStart(e) }
|
2016-12-12 09:07:47 +13:00
|
|
|
onTouchEnd={ e => this.handleTouchEnd(e) }
|
2016-11-15 17:08:21 +13:00
|
|
|
onMouseDown={ e => this.handleMouseDown(e) }
|
2016-12-06 16:54:48 +13:00
|
|
|
onMouseUp={ e => this.props.handleMouseUp(e) }
|
|
|
|
|
onDoubleClick={ e => this.props.handleDoubleClick(e) }
|
2016-11-10 16:17:10 +13:00
|
|
|
onContextMenu={ e => this.handleContextMenu(e) }>
|
2017-05-17 09:07:09 +12:00
|
|
|
<span className="state-icon">
|
2017-06-23 08:03:28 +12:00
|
|
|
{this.props.track.selected ? <FontAwesome name="check" className="selected" fixedWidth /> : null}
|
2017-05-17 09:07:09 +12:00
|
|
|
</span>
|
2017-02-10 09:06:41 +13:00
|
|
|
{ track_columns }
|
2016-10-06 16:38:06 +13:00
|
|
|
</div>
|
|
|
|
|
);
|
2016-10-03 21:21:14 +13:00
|
|
|
}
|
|
|
|
|
}
|