Cleaning up index modification

This commit is contained in:
James Barnsley
2017-11-09 09:12:23 +13:00
parent ec41eb5271
commit 8ecd13684f
9 changed files with 209 additions and 185 deletions

View File

@ -68,12 +68,12 @@ class AddSeedField extends React.Component{
switch (helpers.uriType(item.uri)){
case 'artist':
this.props.coreActions.artistLoaded(item.uri,item)
break
this.props.coreActions.artistsLoaded(item);
break;
case 'track':
this.props.coreActions.trackLoaded(item.uri,item)
break
this.props.coreActions.tracksLoaded(item);
break;
}
}

View File

@ -221,11 +221,10 @@ export function getLibraryArtists(){
* Assets loaded
**/
export function albumLoaded(key,album){
export function tracksLoaded(tracks){
return {
type: 'ALBUM_LOADED',
key: key,
album: album
type: 'TRACKS_LOADED',
tracks: tracks
}
}
@ -236,14 +235,6 @@ export function albumsLoaded(albums){
}
}
export function artistLoaded(key,artist){
return {
type: 'ARTIST_LOADED',
key: key,
artist: artist
}
}
export function artistsLoaded(artists){
return {
type: 'ALBUMS_LOADED',
@ -251,17 +242,16 @@ export function artistsLoaded(artists){
}
}
export function trackLoaded(key,track){
export function playlistsLoaded(playlists){
return {
type: 'TRACK_LOADED',
key: key,
track: track
type: 'PLAYLISTS_LOADED',
playlists: playlists
}
}
export function tracksLoaded(tracks){
export function usersLoaded(users){
return {
type: 'TRACKS_LOADED',
tracks: tracks
type: 'USERS_LOADED',
users: users
}
}

View File

@ -98,7 +98,6 @@ const CoreMiddleware = (function(){
case 'CORE_START_SERVICES':
store.dispatch(mopidyActions.connect());
store.dispatch(pusherActions.connect());
store.dispatch(lastfmActions.connect());
next(action)
break
@ -306,27 +305,69 @@ const CoreMiddleware = (function(){
* These modify our asset indexes, which are used globally
**/
// Array wrapper for TRACKS_LOADED
case 'TRACK_LOADED':
if (action.track.album && action.track.album.images && action.track.album.images.length > 0){
action.track.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.track.album.images);
}
store.dispatch({
type: 'TRACKS_LOADED',
tracks: [action.track]
})
next(action);
break;
var tracks = Object.assign({}, core.tracks)
if (tracks[action.key]){
var track = Object.assign(
{},
tracks[action.key],
helpers.formatTracks(action.track)
);
} else {
var track = Object.assign(
{},
helpers.formatTracks(action.track)
);
// Array wrapper for ALBUMS_LOADED
case 'ALBUM_LOADED':
store.dispatch({
type: 'ALBUMS_LOADED',
albums: [action.album]
});
next(action);
break;
// Array wrapper for ARTISTS_LOADED
case 'ARTIST_LOADED':
store.dispatch({
type: 'ARTISTS_LOADED',
artists: [action.artist]
});
next(action);
break;
// Array wrapper for PLAYLISTS_LOADED
case 'PLAYLIST_LOADED':
store.dispatch({
type: 'PLAYLISTS_LOADED',
playlists: [action.playlist]
});
next(action);
break;
// Array wrapper for USERS_LOADED
case 'USER_LOADED':
store.dispatch({
type: 'USERS_LOADED',
users: [action.user]
});
next(action);
break;
case 'TRACKS_LOADED':
var tracks = Object.assign({}, core.tracks);
for (var i = 0; i < action.tracks.length; i++){
var track = Object.assign({}, helpers.formatTracks(action.tracks[i]));
if (tracks[track.uri]){
track = Object.assign({}, tracks[track.uri], track);
}
if (track.album && track.album.images && track.album.images.length > 0){
track.album.images = helpers.digestMopidyImages(store.getState().mopidy, track.album.images);
}
tracks[track.uri] = track;
}
// Update index
tracks[action.key] = track;
store.dispatch({
type: 'UPDATE_TRACKS_INDEX',
tracks: tracks
@ -335,97 +376,85 @@ const CoreMiddleware = (function(){
next(action);
break;
case 'TRACKS_LOADED':
for (var i = 0; i < action.tracks.length; i++){
store.dispatch({
type: 'TRACK_LOADED',
key: action.tracks[i].uri,
track: action.tracks[i]
});
}
next(action);
break;
case 'ALBUMS_LOADED':
var albums = Object.assign({}, core.albums);
var tracks_loaded = [];
case 'ALBUM_LOADED':
var albums = Object.assign({}, core.albums)
for (var i = 0; i < action.albums.length; i++){
var album = Object.assign({}, action.albums[i]);
if (albums[action.key]){
var album = Object.assign({}, albums[action.key], action.album)
} else {
var album = Object.assign({}, action.album)
if (albums[album.uri]){
album = Object.assign({}, albums[album.uri], album);
}
if (album.images && album.images.length > 0){
album.images = helpers.digestMopidyImages(store.getState().mopidy, album.images);
}
// Load our tracks
if (album.tracks){
var tracks = helpers.formatTracks(album.tracks);
var tracks_uris = helpers.arrayOf('uri', tracks);
album.tracks_uris = tracks_uris;
delete album.tracks;
tracks_loaded = [...tracks_loaded, ...tracks];
}
albums[album.uri] = album;
}
if (action.album.images && action.album.images.length > 0){
action.album.images = helpers.digestMopidyImages(store.getState().mopidy, action.album.images);
}
// Load our tracks
if (album.tracks){
var tracks = helpers.formatTracks(album.tracks);
var tracks_uris = helpers.arrayOf('uri', tracks);
album.tracks_uris = tracks_uris;
delete album.tracks;
store.dispatch({
type: 'TRACKS_LOADED',
tracks: tracks
});
}
// Load these new tracks
store.dispatch({
type: 'TRACKS_LOADED',
tracks: tracks_loaded
});
// Update index
albums[action.key] = album;
store.dispatch({
type: 'UPDATE_ALBUMS_INDEX',
albums: albums
});
next(action);
break;
case 'ALBUMS_LOADED':
for (var i = 0; i < action.albums.length; i++){
store.dispatch({
type: 'ALBUM_LOADED',
key: action.albums[i].uri,
album: action.albums[i]
});
}
next(action);
break
case 'ARTIST_LOADED':
var artists = Object.assign({}, core.artists)
case 'ARTISTS_LOADED':
var artists = Object.assign({}, core.artists);
var tracks_loaded = [];
if (artists[action.key]){
for (var i = 0; i < action.artists.length; i++){
var artist = action.artists[i];
// if we've already got images, remove and add as additional_images
// this is to prevent LastFM overwriting Spotify images
if (artists[action.key].images){
action.artist.images_additional = action.artist.images
delete action.artist.images
if (artists[artist.uri]){
// if we've already got images, remove and add as additional_images
// this is to prevent LastFM overwriting Spotify images
if (artists[artist.uri].images){
artist.images_additional = artist.images
delete artist.images
}
artist = Object.assign({}, artists[artist.uri], artist);
}
var artist = Object.assign({}, artists[action.key], action.artist)
if (artist.tracks){
artist.tracks = helpers.formatTracks(artist.tracks);
}
} else {
var artist = Object.assign({}, action.artist)
if (artist.tracks){
artist.tracks = helpers.formatTracks(artist.tracks);
var tracks = helpers.formatTracks(artist.tracks);
var tracks_uris = helpers.arrayOf('uri', tracks);
artist.tracks_uris = tracks_uris;
delete artist.tracks;
tracks_loaded = [...tracks_loaded, ...tracks];
}
// Update index
artists[artist.uri] = artist;
}
// Load our tracks
if (artist.tracks){
store.dispatch({
type: 'TRACKS_LOADED',
tracks: artist.tracks
});
}
store.dispatch({
type: 'TRACKS_LOADED',
tracks: tracks_loaded
});
// Update index
artists[action.key] = artist;
store.dispatch({
type: 'UPDATE_ARTISTS_INDEX',
artists: artists
@ -434,69 +463,61 @@ const CoreMiddleware = (function(){
next(action);
break;
case 'ARTISTS_LOADED':
for (var i = 0; i < action.artists.length; i++){
store.dispatch({
type: 'ARTIST_LOADED',
key: action.artists[i].uri,
artist: action.artists[i]
});
}
next(action);
break;
case 'PLAYLIST_LOADED':
var playlist = Object.assign({}, action.playlist);
case 'PLAYLISTS_LOADED':
var playlists = Object.assign({}, core.playlists);
var tracks_loaded = [];
// Detect editability
switch (helpers.uriSource(playlist.uri)){
for (var i = 0; i < action.playlists.length; i++){
var playlist = Object.assign({}, action.playlists[i]);
case 'm3u':
playlist.can_edit = true
break
// Detect editability
switch (helpers.uriSource(playlist.uri)){
case 'spotify':
if (store.getState().spotify.authorization && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
case 'm3u':
playlist.can_edit = true
break
if (playlists[action.key] !== undefined){
var existing_playlist = playlists[action.key];
if (existing_playlist.tracks && playlist.tracks){
var tracks = [...existing_playlist.tracks, ...playlist.tracks];
} else if (existing_playlist.tracks){
var tracks = existing_playlist.tracks;
} else if (action.playlist.tracks){
var tracks = playlist.tracks;
} else {
var tracks = [];
case 'spotify':
if (store.getState().spotify.authorization && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
playlist = Object.assign(
{},
existing_playlist,
playlist
)
if (playlists[playlist.uri] !== undefined){
var existing_playlist = playlists[playlist.uri];
if (existing_playlist.tracks && playlist.tracks){
var tracks = [...existing_playlist.tracks, ...playlist.tracks];
} else if (existing_playlist.tracks){
var tracks = existing_playlist.tracks;
} else if (action.playlist.tracks){
var tracks = playlist.tracks;
} else {
var tracks = [];
}
playlist = Object.assign({tracks: tracks}, existing_playlist, playlist);
}
// Load our tracks
if (playlist.tracks){
var tracks = helpers.formatTracks(playlist.tracks);
var tracks_uris = helpers.arrayOf('uri', tracks);
playlist.tracks_uris = tracks_uris;
delete playlist.tracks;
tracks_loaded = [...tracks_loaded, ...tracks];
}
// Update index
playlists[playlist.uri] = playlist;
}
// Load our tracks
if (playlist.tracks){
var tracks = helpers.formatTracks(playlist.tracks);
var tracks_uris = helpers.arrayOf('uri', tracks);
playlist.tracks_uris = tracks_uris;
delete playlist.tracks;
store.dispatch({
type: 'TRACKS_LOADED',
tracks: tracks_loaded
});
store.dispatch({
type: 'TRACKS_LOADED',
tracks: tracks
});
}
// Update index
playlists[action.key] = playlist;
store.dispatch({
type: 'UPDATE_PLAYLISTS_INDEX',
playlists: playlists
@ -505,17 +526,20 @@ const CoreMiddleware = (function(){
next(action);
break;
case 'USER_LOADED':
var users = Object.assign([], core.users)
case 'USERS_LOADED':
var users = Object.assign([], core.users);
if (users[action.key]){
var user = Object.assign({}, users[action.key], action.user)
} else {
var user = Object.assign({}, action.user)
for (var i = 0; i < action.users.length; i++){
var user = Object.assign({}, action.users[i]);
if (users[user.uri]){
user = Object.assign({}, users[user.uri], user);
}
users[action.key] = user;
}
// Update index
users[action.key] = user;
store.dispatch({
type: 'UPDATE_USERS_INDEX',
users: users

View File

@ -64,8 +64,8 @@ export function getTrackLyrics(uri, url){
dispatch({
type: 'TRACK_LOADED',
key: uri,
track: {
uri: uri,
lyrics: null,
lyrics_url: null
}
@ -89,8 +89,8 @@ export function getTrackLyrics(uri, url){
dispatch({
type: 'TRACK_LOADED',
key: uri,
track: {
uri: uri,
lyrics: lyrics_html,
lyrics_url: url
}
@ -131,8 +131,8 @@ export function findTrackLyrics(track){
}
dispatch({
type: 'TRACK_LOADED',
key: track.uri,
track: {
uri: track.uri,
lyrics_results: lyrics_results
}
});

View File

@ -189,8 +189,8 @@ export function loveTrack(uri, artist, track){
response => {
dispatch({
type: 'TRACK_LOADED',
key: uri,
track: {
uri: uri,
userloved: true
}
});
@ -208,8 +208,8 @@ export function unloveTrack(uri, artist, track){
response => {
dispatch({
type: 'TRACK_LOADED',
key: uri,
track: {
uri: uri,
userloved: false
}
});
@ -255,8 +255,8 @@ export function getArtist(uri, artist, mbid = false){
if (response.artist){
dispatch({
type: 'ARTIST_LOADED',
key: uri,
artist: {
uri: uri,
images: response.artist.image,
bio: response.artist.bio,
listeners: parseInt(response.artist.stats.listeners),
@ -315,12 +315,14 @@ export function getTrack(track, artist_name = null, track_name = null){
if (response.track){
var merged_track = Object.assign(
{},
{
uri: track.uri
},
response.track,
track
);
dispatch({
type: 'TRACK_LOADED',
key: merged_track.uri,
track: merged_track
});
}

View File

@ -25,9 +25,8 @@ const LastfmMiddleware = (function(){
}
);
store.dispatch({
type: "USER_LOADED",
key: user.uri,
user: user
type: "USERS_LOADED",
users: [user]
});
next(action);
break;

View File

@ -1166,9 +1166,8 @@ export function getUser(uri){
.then(
response => {
dispatch({
type: 'USER_LOADED',
key: response.uri,
user: response
type: 'USERS_LOADED',
users: [response]
});
},
error => {

View File

@ -413,9 +413,8 @@ const SpotifyMiddleware = (function(){
ReactGA.event({category: 'Spotify', action: 'Authorization verified', label: action.data.id});
store.dispatch({
type: 'USER_LOADED',
key: action.data.uri,
user: action.data
type: 'USERS_LOADED',
users: [action.data]
})
next(action);

View File

@ -167,6 +167,16 @@ class Playlist extends React.Component{
)
}
var tracks = [];
if (this.props.playlist.tracks_uris && this.props.tracks){
for (var i = 0; i < this.props.playlist.tracks_uris.length; i++){
var uri = this.props.playlist.tracks_uris[i]
if (this.props.tracks.hasOwnProperty(uri)){
tracks.push(this.props.tracks[uri])
}
}
}
return (
<div className="view playlist-view content-wrapper">
<div className="thumbnail-wrapper">
@ -183,8 +193,8 @@ class Playlist extends React.Component{
{ this.props.playlist.followers ? <li>{this.props.playlist.followers.total.toLocaleString()} followers</li> : null }
{ this.props.playlist.last_modified ? <li>Edited <Dater type="ago" data={this.props.playlist.last_modified} /></li> : null }
<li>
{ this.props.playlist.tracks_total ? this.props.playlist.tracks_total : '0'} tracks,&nbsp;
{ this.props.playlist.tracks ? <Dater type="total-time" data={this.props.playlist.tracks} /> : '0 mins' }
{ this.props.playlist.tracks_total ? this.props.playlist.tracks_total : tracks.length} tracks,&nbsp;
<Dater type="total-time" data={tracks} />
</li>
</ul>
</div>
@ -192,7 +202,7 @@ class Playlist extends React.Component{
{ this.renderActions() }
<section className="list-wrapper">
{ this.props.playlist.tracks ? <TrackList uri={this.props.params.uri} className="playlist-track-list" context={context} tracks={this.props.playlist.tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } /> : null }
<TrackList uri={this.props.params.uri} className="playlist-track-list" context={context} tracks={tracks} removeTracks={ tracks_indexes => this.removeTracks(tracks_indexes) } reorderTracks={ (indexes, index) => this.reorderTracks(indexes, index) } />
<LazyLoadListener loading={this.props.playlist.tracks_more} loadMore={ () => this.loadMore() }/>
</section>
</div>
@ -212,6 +222,7 @@ const mapStateToProps = (state, ownProps) => {
return {
slim_mode: state.ui.slim_mode,
load_queue: state.ui.load_queue,
tracks: state.core.tracks,
playlist: (state.core.playlists && state.core.playlists[uri] !== undefined ? state.core.playlists[uri] : false ),
spotify_library_playlists: state.spotify.library_playlists,
local_library_playlists: state.mopidy.library_playlists,