import React, { PropTypes } from 'react' import { connect } from 'react-redux' import { Link, hashHistory } from 'react-router' import { bindActionCreators } from 'redux' import FontAwesome from 'react-fontawesome' import ReactGA from 'react-ga' import Header from '../components/Header' import DropdownField from '../components/DropdownField' import TrackList from '../components/TrackList' import ArtistGrid from '../components/ArtistGrid' import AlbumGrid from '../components/AlbumGrid' import PlaylistGrid from '../components/PlaylistGrid' import LazyLoadListener from '../components/LazyLoadListener' import SearchForm from '../components/SearchForm' import URILink from '../components/URILink' 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' class Search extends React.Component{ constructor(props){ super(props); } componentDidMount(){ var context = "all"; var term = null; if (this.props.params && this.props.params.query && this.props.params.query !== ''){ context = helpers.getFromUri("searchcontext",this.props.params.query); term = helpers.getFromUri("searchterm",this.props.params.query); } // Auto-focus on the input field $(document).find('.search-form input').focus(); if (context && term){ if (this.props.mopidy_connected && this.props.search_uri_schemes){ this.props.mopidyActions.getSearchResults(context, term) } if (this.props.search_uri_schemes && this.props.search_uri_schemes.includes('spotify:')){ this.props.spotifyActions.getSearchResults(context, term) } } } componentWillReceiveProps(newProps){ if (this.props.params && this.props.params.query && this.props.params.query !== ''){ var old_context = helpers.getFromUri("searchcontext",this.props.params.query); var old_term = helpers.getFromUri("searchterm",this.props.params.query); } else { var old_context = "all"; var old_term = null; } if (newProps.params && newProps.params.query && newProps.params.query !== ''){ var context = helpers.getFromUri("searchcontext",newProps.params.query); var term = helpers.getFromUri("searchterm",newProps.params.query); } else { var context = "all"; var term = null; } // Search changed if (term && context && (term !== old_term || context !== old_context)){ this.props.mopidyActions.clearSearchResults(); this.props.spotifyActions.clearSearchResults(); if (this.props.mopidy_connected && this.props.search_uri_schemes){ this.props.mopidyActions.getSearchResults(context, term) } if (this.props.mopidy_connected && this.props.search_uri_schemes && this.props.search_uri_schemes.includes('spotify:')){ this.props.spotifyActions.getSearchResults(context, term) } } } loadMore(type){ alert('load more: '+type) //this.props.spotifyActions.getURL(this.props['spotify_'+type+'_more'], 'SPOTIFY_SEARCH_RESULTS_LOADED_MORE_'+type.toUpperCase()); } setSort(value){ var reverse = false if (this.props.sort == value ) reverse = !this.props.sort_reverse var data = { search_results_sort_reverse: reverse, search_results_sort: value } this.props.uiActions.set(data) } renderResults(){ var context = helpers.getFromUri("searchcontext",this.props.params.query); var term = helpers.getFromUri("searchterm",this.props.params.query); if (!context){ context = "all"; } var spotify_search_enabled = (this.props.search_settings && this.props.search_settings.spotify); if (this.props.sort == 'uri'){ var sort_map = this.props.search_uri_schemes; } else { var sort_map = null; } var artists = []; if (this.props.mopidy_search_results.artists){ artists = [...artists, ...helpers.getIndexedRecords(this.props.artists,this.props.mopidy_search_results.artists)]; } if (this.props.spotify_search_results.artists){ artists = [...artists, ...helpers.getIndexedRecords(this.props.artists,this.props.spotify_search_results.artists)]; } artists = helpers.sortItems(artists, this.props.sort, this.props.sort_reverse, sort_map); var albums = []; if (this.props.mopidy_search_results.albums){ albums = [...albums, ...helpers.getIndexedRecords(this.props.albums,this.props.mopidy_search_results.albums)]; } if (this.props.spotify_search_results.albums){ albums = [...albums, ...helpers.getIndexedRecords(this.props.albums,this.props.spotify_search_results.albums)] } albums = helpers.sortItems(albums, this.props.sort, this.props.sort_reverse, sort_map); var playlists = [] if (this.props.mopidy_search_results.playlists){ playlists = [...playlists, ...helpers.getIndexedRecords(this.props.playlists,this.props.mopidy_search_results.playlists)]; } if (this.props.spotify_search_results.playlists){ playlists = [...playlists, ...helpers.getIndexedRecords(this.props.playlists,this.props.spotify_search_results.playlists)]; } playlists = helpers.sortItems(playlists, this.props.sort, this.props.sort_reverse, sort_map); var tracks = []; if (this.props.mopidy_search_results.tracks){ tracks = [...tracks, ...this.props.mopidy_search_results.tracks]; } if (this.props.spotify_search_results.tracks){ tracks = [...tracks, ...this.props.spotify_search_results.tracks]; } tracks = helpers.sortItems(tracks, this.props.sort, this.props.sort_reverse, sort_map); switch (context){ case 'artist': return (

Search     Artists

this.loadMore('artists') }/>
) break; case 'album': return (

Search     Albums

this.loadMore('albums') }/>
) break; case 'playlist': return (

Search     Playlists

this.loadMore('playlists') }/>
) break; case 'track': return (

Search     Tracks

this.loadMore('tracks') }/>
) break; case 'all': default: if (artists.length > 0){ var artists_section = (

Artists

{artists.length > 4 ? All artists ({artists.length}) : null}
) } else { var artists_section = null; } if (albums.length > 0){ var albums_section = (

Albums

{albums.length > 4 ? All albums ({albums.length}) : null}
) } else { var albums_section = null; } if (playlists.length > 0){ var playlists_section = (

Playlists

{playlists.length > 4 ? All playlists ({playlists.length}) : null}
) } else { var playlists_section = null; } if (tracks.length > 0){ var tracks_section = (
this.loadMore('tracks') }/>
) } else { var tracks_section = null; } return (
{artists_section} {albums_section} {playlists_section}
{tracks_section}
) } } render(){ var sort_options = [ { value: 'name', label: 'Name' }, { value: 'artists.name', label: 'Artist' }, { value: 'duration', label: 'Duration' }, { value: 'uri', label: 'Source' } ]; var options = ( {this.setSort(val); this.props.uiActions.hideContextMenu() }} /> ) return (
{ this.renderResults() }
); } } const mapStateToProps = (state, ownProps) => { return { mopidy_connected: state.mopidy.connected, albums: (state.core.albums ? state.core.albums : []), artists: (state.core.artists ? state.core.artists : []), playlists: (state.core.playlists ? state.core.playlists : []), tracks: (state.core.tracks ? state.core.tracks : []), search_uri_schemes: (state.ui.search_uri_schemes ? state.ui.search_uri_schemes : []), mopidy_search_results: (state.mopidy.search_results ? state.mopidy.search_results : {}), spotify_search_results: (state.spotify.search_results ? state.spotify.search_results : {}), sort: (state.ui.search_results_sort ? state.ui.search_results_sort : 'name'), sort_reverse: (state.ui.search_results_sort_reverse ? true : false), } } const mapDispatchToProps = (dispatch) => { return { coreActions: bindActionCreators(coreActions, dispatch), uiActions: bindActionCreators(uiActions, dispatch), mopidyActions: bindActionCreators(mopidyActions, dispatch), spotifyActions: bindActionCreators(spotifyActions, dispatch) } } export default connect(mapStateToProps, mapDispatchToProps)(Search)