diff --git a/src/js/components/List.js b/src/js/components/List.js index 04f99e6d..a24303bc 100755 --- a/src/js/components/List.js +++ b/src/js/components/List.js @@ -18,7 +18,7 @@ export default class List extends React.Component{ // make sure we haven't clicked a nested link (ie Artist name) if( e.target.tagName.toLowerCase() !== 'a' ){ - hashHistory.push( this.props.link_prefix + encodeURIComponent(uri) ); + hashHistory.push( this.props.link_prefix + uri ); } } diff --git a/src/js/services/localstorage/middleware.js b/src/js/services/localstorage/middleware.js index b04cc042..435627b4 100755 --- a/src/js/services/localstorage/middleware.js +++ b/src/js/services/localstorage/middleware.js @@ -12,7 +12,7 @@ const localstorageMiddleware = (function(){ // append our state to a global variable. This gives us access to debug the store at any point window._store = store - //console.log(action) + console.log(action) switch( action.type ){ diff --git a/src/js/services/mopidy/middleware.js b/src/js/services/mopidy/middleware.js index edc1b07f..7a75229b 100755 --- a/src/js/services/mopidy/middleware.js +++ b/src/js/services/mopidy/middleware.js @@ -367,13 +367,13 @@ const MopidyMiddleware = (function(){ } } - store.dispatch({ type: 'PLAYLIST_TRACKS_RESOLVED', tracks: tracks, uri: action.uri }) + store.dispatch({ type: 'PLAYLIST_TRACKS', tracks: tracks, uri: action.uri }) }) break case 'MOPIDY_ADD_PLAYLIST_TRACKS': - instruct( socket, store, 'playlists.lookup', { uri: action.playlist_uri }) + instruct( socket, store, 'playlists.lookup', { uri: action.uri }) .then( response => { var tracks = []; for( var i = 0; i < action.tracks_uris.length; i++ ){ @@ -392,7 +392,7 @@ const MopidyMiddleware = (function(){ instruct( socket, store, 'playlists.save', { playlist: playlist } ) .then( response => { - store.dispatch({ type: 'PLAYLIST_TRACKS_ADDED', tracks_uris: action.tracks_uris }); + store.dispatch({ type: 'PLAYLIST_TRACKS_ADDED', uri: action.uri, tracks_uris: action.tracks_uris }); }) }); break @@ -406,7 +406,7 @@ const MopidyMiddleware = (function(){ var indexes = Object.assign([], action.tracks_indexes) indexes.sort(descending); - instruct( socket, store, 'playlists.lookup', { uri: action.playlist_uri }) + instruct( socket, store, 'playlists.lookup', { uri: action.uri }) .then( response => { var playlist = Object.assign({}, response) for( var i = 0; i < indexes.length; i++ ){ @@ -414,7 +414,7 @@ const MopidyMiddleware = (function(){ } instruct( socket, store, 'playlists.save', { playlist: playlist } ) .then( response => { - store.dispatch({ type: 'PLAYLIST_TRACKS_REMOVED', tracks_indexes: action.tracks_indexes }); + store.dispatch({ type: 'PLAYLIST_TRACKS_REMOVED', uri: action.uri, tracks_indexes: action.tracks_indexes }); }) }); break @@ -425,7 +425,7 @@ const MopidyMiddleware = (function(){ var playlist = Object.assign({}, response, { name: action.name }) instruct( socket, store, 'playlists.save', { playlist: playlist } ) .then( response => { - store.dispatch({ type: 'PLAYLIST_UPDATED', playlist: playlist }) + store.dispatch({ type: 'PLAYLIST_UPDATED', uri: action.uri, playlist: playlist }) }) }); break @@ -464,8 +464,7 @@ const MopidyMiddleware = (function(){ instruct( socket, store, 'playlists.save', { playlist: playlist } ) .then( response => { - // and now re-render our full track references - store.dispatch({ type: 'MOPIDY_PLAYLIST_TRACKS', tracks: playlist.tracks }) + store.dispatch({ type: 'MOPIDY_RESOLVE_PLAYLIST_TRACKS', tracks: playlist.tracks, uri: playlist.uri }) }) }); break diff --git a/src/js/services/spotify/actions.js b/src/js/services/spotify/actions.js index e6046f44..9b3db75a 100755 --- a/src/js/services/spotify/actions.js +++ b/src/js/services/spotify/actions.js @@ -345,8 +345,6 @@ export function getCategory( id ){ } ) - console.log(category) - dispatch({ type: 'SPOTIFY_CATEGORY_LOADED', data: category @@ -857,6 +855,9 @@ function loadNextPlaylistsBatch( dispatch, getState, playlists, lastResponse ){ } ) + // remove our tracklist. It'll overwrite any full records otherwise + delete playlist.tracks + dispatch({ type: 'PLAYLIST_LOADED', playlist: playlist @@ -898,12 +899,13 @@ export function toggleFollowingPlaylist( uri, method ){ } } -export function addTracksToPlaylist( playlist_uri, tracks_uris ){ +export function addTracksToPlaylist( uri, tracks_uris ){ return (dispatch, getState) => { - sendRequest( dispatch, getState, 'users/'+ helpers.getFromUri('userid',playlist_uri) + '/playlists/'+ helpers.getFromUri('playlistid',playlist_uri) + '/tracks', 'POST', { uris: tracks_uris } ) + sendRequest( dispatch, getState, 'users/'+ helpers.getFromUri('userid',uri) + '/playlists/'+ helpers.getFromUri('playlistid',uri) + '/tracks', 'POST', { uris: tracks_uris } ) .then( response => { dispatch({ type: 'PLAYLIST_TRACKS_ADDED', + uri: uri, tracks_uris: tracks_uris, snapshot_id: response.snapshot_id }); @@ -917,6 +919,7 @@ export function deleteTracksFromPlaylist( uri, snapshot_id, tracks_indexes ){ .then( response => { dispatch({ type: 'PLAYLIST_TRACKS_REMOVED', + uri: uri, tracks_indexes: tracks_indexes, snapshot_id: response.snapshot_id }); @@ -930,6 +933,7 @@ export function reorderPlaylistTracks( uri, range_start, range_length, insert_be .then( response => { dispatch({ type: 'PLAYLIST_TRACKS_REORDERED', + uri: uri, range_start: range_start, range_length: range_length, insert_before: insert_before, diff --git a/src/js/services/spotify/middleware.js b/src/js/services/spotify/middleware.js index 0ead3434..4a078ae8 100755 --- a/src/js/services/spotify/middleware.js +++ b/src/js/services/spotify/middleware.js @@ -18,8 +18,6 @@ const SpotifyMiddleware = (function(){ break case 'SPOTIFY_CREATE_PLAYLIST': - var playlist = state.ui.playlist - if( !store.getState().spotify.authorized ){ store.dispatch( uiActions.createNotification( "Must be logged in to Spotify to do that", 'bad' ) ) return @@ -28,7 +26,7 @@ const SpotifyMiddleware = (function(){ break case 'SPOTIFY_REMOVE_PLAYLIST_TRACKS': - var playlist = state.ui.playlist + var playlist = state.ui.playlists[action.uri] if( !store.getState().spotify.authorized ){ store.dispatch( uiActions.createNotification( "Must be logged in to Spotify to do that", 'bad' ) ) diff --git a/src/js/services/ui/actions.js b/src/js/services/ui/actions.js index 5fed3166..64a73951 100755 --- a/src/js/services/ui/actions.js +++ b/src/js/services/ui/actions.js @@ -147,39 +147,39 @@ export function createPlaylist( scheme, name, is_public = false ){ return false } -export function removeTracksFromPlaylist( playlist_uri, tracks_indexes ){ - switch( helpers.uriSource( playlist_uri ) ){ +export function removeTracksFromPlaylist( uri, tracks_indexes ){ + switch( helpers.uriSource( uri ) ){ case 'spotify': return { type: 'SPOTIFY_REMOVE_PLAYLIST_TRACKS', - playlist_uri: playlist_uri, + uri: uri, tracks_indexes: tracks_indexes } case 'm3u': return { type: 'MOPIDY_REMOVE_PLAYLIST_TRACKS', - playlist_uri: playlist_uri, + uri: uri, tracks_indexes: tracks_indexes } } } -export function addTracksToPlaylist( playlist_uri, tracks_uris ){ - switch( helpers.uriSource( playlist_uri ) ){ +export function addTracksToPlaylist( uri, tracks_uris ){ + switch( helpers.uriSource( uri ) ){ case 'spotify': return { type: 'SPOTIFY_ADD_PLAYLIST_TRACKS', - playlist_uri: playlist_uri, + uri: uri, tracks_uris: tracks_uris } case 'm3u': return { type: 'MOPIDY_ADD_PLAYLIST_TRACKS', - playlist_uri: playlist_uri, + uri: uri, tracks_uris: tracks_uris } } diff --git a/src/js/services/ui/reducer.js b/src/js/services/ui/reducer.js index f9d29fc3..9b62a0b6 100755 --- a/src/js/services/ui/reducer.js +++ b/src/js/services/ui/reducer.js @@ -253,17 +253,20 @@ export default function reducer(ui = {}, action){ return Object.assign({}, ui, { playlists: playlists }); case 'PLAYLIST_TRACKS_REMOVED': - var tracks = Object.assign([], ui.playlist.tracks) + var playlists = Object.assign([], ui.playlists) + var playlist = Object.assign({}, playlists[action.uri]) + var tracks = Object.assign([], playlist.tracks) var indexes = action.tracks_indexes.reverse() for( var i = 0; i < indexes.length; i++ ){ tracks.splice( indexes[i], 1 ) } var snapshot_id = null if( action.snapshot_id ) snapshot_id = action.snapshot_id - var playlist = Object.assign({}, ui.playlist, { tracks: tracks, snapshot_id: snapshot_id }) - return Object.assign({}, ui, { playlist: playlist }); + Object.assign(playlist, { tracks: tracks, snapshot_id: snapshot_id }) + playlists[action.uri] = playlist + return Object.assign({}, ui, { playlists: playlists }); - case 'PLAYLIST_TRACKS_RESOLVED': + case 'PLAYLIST_TRACKS': var playlists = Object.assign([], ui.playlists) var playlist = Object.assign({}, playlists[action.uri], { tracks: action.tracks }) @@ -271,9 +274,9 @@ export default function reducer(ui = {}, action){ return Object.assign({}, ui, { playlists: playlists }); case 'PLAYLIST_TRACKS_REORDERED': - var snapshot_id = null - if( action.snapshot_id ) snapshot_id = action.snapshot_id - var tracks = Object.assign([], ui.playlist.tracks) + var playlists = Object.assign([], ui.playlists) + var playlist = Object.assign({}, playlists[action.uri]) + var tracks = Object.assign([], playlist.tracks) // handle insert_before offset if we're moving BENEATH where we're slicing tracks var insert_before = action.insert_before @@ -287,8 +290,11 @@ export default function reducer(ui = {}, action){ tracks.splice(insert_before, 0, tracks_to_move[i]) } - var playlist = Object.assign({}, ui.playlist, { snapshot_id: snapshot_id, tracks: tracks }) - return Object.assign({}, ui, { playlist: playlist }); + var snapshot_id = null + if( action.snapshot_id ) snapshot_id = action.snapshot_id + Object.assign(playlist, { tracks: tracks, snapshot_id: snapshot_id }) + playlists[action.uri] = playlist + return Object.assign({}, ui, { playlists: playlists }); case 'PLAYLIST_FOLLOWING_LOADED': var playlists = Object.assign([], ui.playlists)