diff --git a/src/js/bootstrap.js b/src/js/bootstrap.js index 651f19db..fcd4052b 100755 --- a/src/js/bootstrap.js +++ b/src/js/bootstrap.js @@ -61,7 +61,6 @@ var initialState = { track: {} }, spotify: { - enabled: true, connected: false, me: false, autocomplete_results: {}, diff --git a/src/js/components/SpotifyAuthenticationFrame.js b/src/js/components/SpotifyAuthenticationFrame.js index f78fcf83..438850c4 100755 --- a/src/js/components/SpotifyAuthenticationFrame.js +++ b/src/js/components/SpotifyAuthenticationFrame.js @@ -100,7 +100,7 @@ class SpotifyAuthenticationFrame extends React.Component{ } } - renderAuthorizeButton(){ + render(){ if (this.state.authorizing){ return ( - ); - } else { - return ( - - ) - } - } - - render(){ - return ( - - { this.renderAuthorizeButton() } - { this.renderRefreshButton() } - - ); - } } const mapStateToProps = (state, ownProps) => { return { authorization_url: state.spotify.authorization_url, authorized: state.spotify.authorization, - authorizing: state.spotify.authorizing, - refreshing_token: state.spotify.refreshing_token + authorizing: state.spotify.authorizing } } diff --git a/src/js/services/core/middleware.js b/src/js/services/core/middleware.js index 3e827292..55e3c8af 100755 --- a/src/js/services/core/middleware.js +++ b/src/js/services/core/middleware.js @@ -22,10 +22,7 @@ const CoreMiddleware = (function(){ store.dispatch(mopidyActions.connect()) store.dispatch(pusherActions.connect()) store.dispatch(lastfmActions.connect()) - - if (store.getState().spotify.enabled){ - store.dispatch(spotifyActions.connect()) - } + store.dispatch(spotifyActions.connect()) next(action) break diff --git a/src/js/services/spotify/actions.js b/src/js/services/spotify/actions.js index 77082198..44dd073b 100755 --- a/src/js/services/spotify/actions.js +++ b/src/js/services/spotify/actions.js @@ -149,15 +149,24 @@ function refreshToken( dispatch, getState ){ }) .then( response => { - var token = response.spotify_token - token.token_expiry = new Date().getTime() + ( token.expires_in * 1000 ); - token.source = 'mopidy'; - dispatch({ - type: 'SPOTIFY_TOKEN_REFRESHED', - access_token_provider: 'backend', - data: token - }); - resolve(token); + if (response.type == 'error'){ + dispatch({ type: 'SPOTIFY_DISCONNECTED' }) + dispatch(uiActions.createNotification(response.message,'bad')) + console.error('Could not refresh token', response) + reject(response) + + } else { + var token = response.spotify_token + token.token_expiry = new Date().getTime() + ( token.expires_in * 1000 ); + token.source = 'mopidy'; + dispatch({ + type: 'SPOTIFY_TOKEN_REFRESHED', + access_token_provider: 'backend', + data: token + }); + resolve(token); + } + }, error => { dispatch({ type: 'SPOTIFY_DISCONNECTED' }) @@ -943,7 +952,7 @@ export function playArtistTopTracks(uri){ * ====================================================================================== **/ -export function getUser( uri ){ +export function getUser(uri){ return (dispatch, getState) => { // get the user @@ -956,8 +965,15 @@ export function getUser( uri ){ }); }) + dispatch(getUserPlaylists(uri)) + } +} + +export function getUserPlaylists(user_uri){ + return (dispatch, getState) => { + // get the first page of playlists - sendRequest( dispatch, getState, 'users/'+ helpers.getFromUri('userid', uri) +'/playlists?limit=40' ) + sendRequest( dispatch, getState, 'users/'+ helpers.getFromUri('userid', user_uri) +'/playlists?limit=40' ) .then( response => { var playlists = [] @@ -979,7 +995,7 @@ export function getUser( uri ){ dispatch({ type: 'SPOTIFY_USER_PLAYLISTS_LOADED', - key: uri, + key: user_uri, data: response }); }) diff --git a/src/js/services/spotify/middleware.js b/src/js/services/spotify/middleware.js index 8791fb2d..fabdda9d 100755 --- a/src/js/services/spotify/middleware.js +++ b/src/js/services/spotify/middleware.js @@ -16,10 +16,6 @@ const SpotifyMiddleware = (function(){ switch(action.type){ - case 'SPOTIFY_CONNECT': - store.dispatch( spotifyActions.getMe() ) - break - case 'SPOTIFY_CONNECTED': var label = null if (store.getState().spotify.me) label = store.getState().spotify.me.id @@ -31,6 +27,9 @@ const SpotifyMiddleware = (function(){ store.dispatch(spotifyActions.getAllLibraryPlaylists()) } + // Get the current logged-in user + store.dispatch(spotifyActions.getMe()) + next(action) break @@ -400,6 +399,13 @@ const SpotifyMiddleware = (function(){ store.dispatch(pusherActions.setUsername(name)) } ReactGA.event({ category: 'Spotify', action: 'Authorization verified', label: action.data.id }) + + store.dispatch({ + type: 'USER_LOADED', + key: action.data.uri, + user: action.data + }) + next(action) break; diff --git a/src/js/views/Settings.js b/src/js/views/Settings.js index 4061015e..43471183 100755 --- a/src/js/views/Settings.js +++ b/src/js/views/Settings.js @@ -156,7 +156,7 @@ class Settings extends React.Component { renderServiceStatus(service){ - let colour = 'grey' + let colour = 'red' let icon = 'close' let name = service.charAt(0).toUpperCase() + service.slice(1).toLowerCase() let text = 'Disconnected' @@ -165,12 +165,13 @@ class Settings extends React.Component { if (service.connecting){ icon = 'plug' + colour = 'grey' text = 'Connecting' } else if (name == 'Spotify' && (!this.props.mopidy.uri_schemes || !this.props.mopidy.uri_schemes.includes('spotify:'))){ icon = 'exclamation-triangle' colour = 'orange' text = 'Mopidy-Spotify not detected' - } else if (name == 'Spotify' && !service.authorization){ + } else if (service.connected && name == 'Spotify' && !service.authorization){ icon = 'lock' colour = 'orange' text = 'Limited access' @@ -364,6 +365,7 @@ class Settings extends React.Component {
Reset
this.resetAllSettings()} /> +
diff --git a/src/js/views/User.js b/src/js/views/User.js index e8e8e7fd..48995b8f 100755 --- a/src/js/views/User.js +++ b/src/js/views/User.js @@ -27,11 +27,20 @@ class User extends React.Component{ } componentWillReceiveProps( nextProps ){ - if( nextProps.params.uri != this.props.params.uri ) this.loadUser( nextProps ) + if (nextProps.params.uri != this.props.params.uri ){ + this.loadUser( nextProps ) + } } loadUser( props = this.props ){ - if (!props.user) this.props.spotifyActions.getUser( props.params.uri ) + if (!props.user){ + this.props.spotifyActions.getUser(props.params.uri) + } + + // We got a user, but we haven't fetched their playlists yet + if (props.user && !props.user.playlists_uris){ + this.props.spotifyActions.getUserPlaylists(props.params.uri) + } } loadMore(){ diff --git a/src/js/views/library/LibraryAlbums.js b/src/js/views/library/LibraryAlbums.js index 3995525e..d138c8f9 100755 --- a/src/js/views/library/LibraryAlbums.js +++ b/src/js/views/library/LibraryAlbums.js @@ -91,15 +91,7 @@ class LibraryAlbums extends React.Component{ link_prefix={global.baseURL+"album/"} /> ) - }else if( this.props.view == 'thumbnails' ){ - return ( -
- this.handleContextMenu(e,item)} - albums={albums} /> -
- ) - }else{ + }else if( this.props.view == 'detail' ){ return (
{ @@ -124,6 +116,14 @@ class LibraryAlbums extends React.Component{ }
) + }else{ + return ( +
+ this.handleContextMenu(e,item)} + albums={albums} /> +
+ ) } } @@ -155,14 +155,14 @@ class LibraryAlbums extends React.Component{ } var view_options = [ - { - value: 'detail', - label: 'Detail' - }, { value: 'thumbnails', label: 'Thumbnails' }, + { + value: 'detail', + label: 'Detail' + }, { value: 'list', label: 'List'