import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import Link from '../components/Link'; import ErrorMessage from '../components/ErrorMessage'; import Header from '../components/Header'; import TrackList from '../components/TrackList'; import Thumbnail from '../components/Thumbnail'; import ArtistSentence from '../components/ArtistSentence'; import ArtistGrid from '../components/ArtistGrid'; import FollowButton from '../components/Fields/FollowButton'; import LastfmLoveButton from '../components/Fields/LastfmLoveButton'; import Dater from '../components/Dater'; import LazyLoadListener from '../components/LazyLoadListener'; import ContextMenuTrigger from '../components/ContextMenuTrigger'; import URILink from '../components/URILink'; import Icon from '../components/Icon'; import Popularity from '../components/Popularity'; import * as helpers from '../helpers'; import * as coreActions from '../services/core/actions'; import * as uiActions from '../services/ui/actions'; import * as mopidyActions from '../services/mopidy/actions'; import * as spotifyActions from '../services/spotify/actions'; import * as lastfmActions from '../services/lastfm/actions'; import * as geniusActions from '../services/genius/actions'; class Track extends React.Component { constructor(props) { super(props); } componentDidMount() { this.props.coreActions.loadTrack(this.props.uri); // We already have the track in our index, so it won't fire componentWillReceiveProps if (this.props.track) { this.setWindowTitle(this.props.track); if (this.props.genius_authorized && this.props.track.artists && !this.props.track.lyrics_results) { this.props.geniusActions.findTrackLyrics(this.props.track); } } } handleContextMenu(e) { e.preventDefault(); const data = { uris: [this.props.uri] }; this.props.uiActions.showContextMenu(e, data, 'track', 'click'); } componentWillReceiveProps(nextProps) { // if our URI has changed, fetch new track if (nextProps.uri != this.props.uri) { this.props.coreActions.loadTrack(nextProps.uri); if (nextProps.genius_authorized && nextProps.tracks.artists) { this.props.geniusActions.findTrackLyrics(nextProps.track); } // if mopidy has just connected AND we're not a Spotify track, go get } else if (!this.props.mopidy_connected && nextProps.mopidy_connected) { if (helpers.uriSource(this.props.uri) != 'spotify') { this.props.coreActions.loadTrack(nextProps.uri); } } // We have just received our full track or our track artists if ((!this.props.track && nextProps.track) || (!this.props.track.artists && nextProps.track.artists)) { this.setWindowTitle(nextProps.track); // Ready to load LastFM if (nextProps.lastfm_authorized) { this.props.lastfmActions.getTrack(nextProps.track.uri); } // Ready to load lyrics if (nextProps.genius_authorized && !nextProps.track.lyrics_results) { this.props.geniusActions.findTrackLyrics(nextProps.track); } } if (!this.props.track && nextProps.track) { this.setWindowTitle(nextProps.track); } } setWindowTitle(track = this.props.track) { if (track) { let artists = ''; for (let i = 0; i < track.artists.length; i++) { if (artists != '') { artists += ', '; } artists += track.artists[i].name; } this.props.uiActions.setWindowTitle(`${track.name} by ${artists} (track)`); } else { this.props.uiActions.setWindowTitle('Track'); } } handleContextMenu(e) { const data = { e, context: 'track', items: [this.props.track], uris: [this.props.uri], }; this.props.uiActions.showContextMenu(data); } play() { this.props.mopidyActions.playURIs([this.props.uri], this.props.uri); } renderLyricsSelector() { if (this.props.track.lyrics_results === undefined || this.props.track.lyrics_results === null) { return null; } if (this.props.track.lyrics_results.length <= 0) { return (
Could not find track with URI " {encodeURIComponent(this.props.uri)} "
Want track lyrics? Authorize Genius under Settings .
) : null} {this.props.genius_authorized ? this.renderLyricsSelector() : null} {this.props.genius_authorized ? this.renderLyrics() : null}