2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
import * as helpers from '../../helpers'
|
|
|
|
|
|
|
|
|
|
export default function reducer(core = {}, action){
|
2017-10-10 13:05:28 +13:00
|
|
|
switch (action.type){
|
2017-08-02 10:53:30 +12:00
|
|
|
|
2017-08-05 22:25:25 +12:00
|
|
|
case 'CORE_SET':
|
|
|
|
|
return Object.assign({}, core, action.data)
|
|
|
|
|
|
2018-07-02 21:37:24 +12:00
|
|
|
case 'CACHEBUST_HTTP_STREAM':
|
|
|
|
|
return Object.assign({}, core, {http_streaming_cachebuster: new Date().getTime()})
|
|
|
|
|
|
2017-08-02 10:53:30 +12:00
|
|
|
/**
|
|
|
|
|
* Current track and tracklist
|
|
|
|
|
**/
|
|
|
|
|
|
2017-11-10 15:56:01 +13:00
|
|
|
case 'CURRENT_TRACK_LOADED':
|
|
|
|
|
return Object.assign({}, core, {
|
2018-04-12 15:55:39 +12:00
|
|
|
current_track: action.track,
|
|
|
|
|
current_track_uri: action.uri
|
|
|
|
|
});
|
|
|
|
|
|
2018-04-23 08:13:24 +12:00
|
|
|
case 'CLEAR_CURRENT_TRACK':
|
|
|
|
|
return Object.assign({}, core, {
|
|
|
|
|
current_track: null,
|
|
|
|
|
current_track_uri: null
|
|
|
|
|
});
|
|
|
|
|
|
2018-04-12 15:55:39 +12:00
|
|
|
case 'NEXT_TRACK_LOADED':
|
|
|
|
|
return Object.assign({}, core, {
|
|
|
|
|
next_track_uri: action.uri
|
2017-11-10 15:56:01 +13:00
|
|
|
});
|
2017-08-02 10:53:30 +12:00
|
|
|
|
2017-11-10 15:56:01 +13:00
|
|
|
case 'QUEUE_LOADED':
|
2017-08-02 10:53:30 +12:00
|
|
|
return Object.assign({}, core, {
|
2017-11-17 20:25:43 +13:00
|
|
|
queue: action.tracks
|
2017-08-02 10:53:30 +12:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
case 'PUSHER_QUEUE_METADATA':
|
|
|
|
|
case 'PUSHER_QUEUE_METADATA_CHANGED':
|
|
|
|
|
var tracklist = Object.assign([], core.current_tracklist)
|
2017-10-10 13:05:28 +13:00
|
|
|
for(var i = 0; i < tracklist.length; i++){
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
// load our metadata (if we have any for that tlid)
|
2018-04-01 21:26:42 +12:00
|
|
|
if (action.queue_metadata['tlid_'+tracklist[i].tlid] !== undefined){
|
2017-08-02 10:53:30 +12:00
|
|
|
tracklist[i] = Object.assign(
|
|
|
|
|
{},
|
|
|
|
|
tracklist[i],
|
|
|
|
|
action.queue_metadata['tlid_'+tracklist[i].tlid],
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return Object.assign({}, core, { current_tracklist: tracklist, queue_metadata: action.queue_metadata });
|
|
|
|
|
|
2018-04-01 21:26:42 +12:00
|
|
|
case 'PUSHER_RADIO_LOADED':
|
2017-08-02 10:53:30 +12:00
|
|
|
case 'PUSHER_RADIO_STARTED':
|
|
|
|
|
case 'PUSHER_RADIO_CHANGED':
|
|
|
|
|
case 'PUSHER_RADIO_STOPPED':
|
|
|
|
|
return Object.assign({}, core, { seeds_resolved: false }, { radio: action.radio })
|
|
|
|
|
|
|
|
|
|
case 'RADIO_SEEDS_RESOLVED':
|
|
|
|
|
var radio = Object.assign({}, core.radio, { resolved_seeds: action.resolved_seeds })
|
|
|
|
|
return Object.assign({}, core, { radio: radio })
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2017-11-08 21:13:32 +13:00
|
|
|
* Index updates
|
|
|
|
|
* These actions are only ever called by middleware after we've digested one more many assets
|
|
|
|
|
* and appended to their relevant index.
|
2017-08-02 10:53:30 +12:00
|
|
|
**/
|
|
|
|
|
|
2018-08-12 20:59:00 +12:00
|
|
|
case 'TRACKS_LOADED':
|
|
|
|
|
var tracks = Object.assign({}, core.tracks);
|
2018-08-31 16:04:55 +12:00
|
|
|
for (var track of action.tracks){
|
2018-08-12 20:59:00 +12:00
|
|
|
tracks[track.uri] = track;
|
2018-08-31 16:04:55 +12:00
|
|
|
}
|
2018-08-12 20:59:00 +12:00
|
|
|
return Object.assign({}, core, { tracks: tracks });
|
2017-10-18 17:03:59 +13:00
|
|
|
|
2018-08-12 20:59:00 +12:00
|
|
|
case 'ALBUMS_LOADED':
|
|
|
|
|
var albums = Object.assign({}, core.albums);
|
2018-08-31 16:04:55 +12:00
|
|
|
for (var album of action.albums){
|
2018-08-12 20:59:00 +12:00
|
|
|
albums[album.uri] = album;
|
2018-08-31 16:04:55 +12:00
|
|
|
}
|
2018-08-12 20:59:00 +12:00
|
|
|
return Object.assign({}, core, { albums: albums });
|
2017-08-02 10:53:30 +12:00
|
|
|
|
2018-08-12 20:59:00 +12:00
|
|
|
case 'ARTISTS_LOADED':
|
|
|
|
|
var artists = Object.assign({}, core.artists);
|
2018-08-31 16:04:55 +12:00
|
|
|
for (var artist of action.artists){
|
2018-08-12 20:59:00 +12:00
|
|
|
artists[artist.uri] = artist;
|
2018-08-31 16:04:55 +12:00
|
|
|
}
|
2018-08-12 20:59:00 +12:00
|
|
|
return Object.assign({}, core, { artists: artists });
|
2017-08-02 10:53:30 +12:00
|
|
|
|
2018-08-12 20:59:00 +12:00
|
|
|
case 'PLAYLISTS_LOADED':
|
|
|
|
|
var playlists = Object.assign({}, core.playlists);
|
2018-08-31 16:04:55 +12:00
|
|
|
for (var playlist of action.playlists){
|
2018-08-12 20:59:00 +12:00
|
|
|
playlists[playlist.uri] = playlist;
|
2018-08-31 16:04:55 +12:00
|
|
|
}
|
2018-08-12 20:59:00 +12:00
|
|
|
return Object.assign({}, core, { playlists: playlists });
|
2017-10-18 17:03:59 +13:00
|
|
|
|
2018-08-12 20:59:00 +12:00
|
|
|
case 'USERS_LOADED':
|
|
|
|
|
var users = Object.assign({}, core.users);
|
2018-08-31 16:04:55 +12:00
|
|
|
for (var user of action.users){
|
2018-08-12 20:59:00 +12:00
|
|
|
users[user.uri] = user;
|
2018-08-31 16:04:55 +12:00
|
|
|
}
|
2018-08-12 20:59:00 +12:00
|
|
|
return Object.assign({}, core, { users: users });
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
|
|
|
|
|
case 'ARTIST_ALBUMS_LOADED':
|
2018-08-12 20:59:00 +12:00
|
|
|
var artists = Object.assign({}, core.artists)
|
|
|
|
|
var albums_uris = [];
|
|
|
|
|
if (artists[action.artist_uri].albums_uris){
|
|
|
|
|
albums_uris = artists[action.artist_uri].albums_uris;
|
|
|
|
|
}
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
var artist = Object.assign(
|
|
|
|
|
{},
|
2018-08-12 20:59:00 +12:00
|
|
|
artists[action.artist_uri],
|
2017-08-02 10:53:30 +12:00
|
|
|
{
|
2018-08-12 20:59:00 +12:00
|
|
|
albums_uris: [...albums_uris, ...action.albums_uris],
|
2017-08-02 10:53:30 +12:00
|
|
|
albums_more: action.more,
|
|
|
|
|
albums_total: action.total
|
|
|
|
|
}
|
|
|
|
|
)
|
2018-08-12 20:59:00 +12:00
|
|
|
artists[action.artist_uri] = artist
|
2017-08-02 10:53:30 +12:00
|
|
|
return Object.assign({}, core, { artists: artists });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case 'USER_PLAYLISTS_LOADED':
|
2018-08-12 20:59:00 +12:00
|
|
|
var users = Object.assign({}, core.users)
|
2018-08-31 16:04:55 +12:00
|
|
|
var existing_playlists_uris = [];
|
|
|
|
|
if (users[action.uri] && users[action.uri].playlists_uris){
|
|
|
|
|
existing_playlists_uris = users[action.uri].playlists_uris;
|
|
|
|
|
}
|
2017-08-02 10:53:30 +12:00
|
|
|
|
2018-08-31 16:04:55 +12:00
|
|
|
var playlists_uris = [...existing_playlists_uris, ...helpers.arrayOf('uri',action.playlists)]
|
|
|
|
|
|
|
|
|
|
var user = Object.assign(
|
2017-08-02 10:53:30 +12:00
|
|
|
{},
|
2018-08-31 16:04:55 +12:00
|
|
|
users[action.uri],
|
2017-08-02 10:53:30 +12:00
|
|
|
{
|
2018-08-31 16:04:55 +12:00
|
|
|
playlists_uris: playlists_uris,
|
2017-08-02 10:53:30 +12:00
|
|
|
playlists_more: action.more,
|
|
|
|
|
playlists_total: action.total
|
|
|
|
|
}
|
|
|
|
|
)
|
2018-08-31 16:04:55 +12:00
|
|
|
users[action.uri] = user;
|
2017-08-02 10:53:30 +12:00
|
|
|
return Object.assign({}, core, { users: users });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-02-01 10:19:21 +13:00
|
|
|
/**
|
|
|
|
|
* Remove an item from an index
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
case 'REMOVE_FROM_INDEX':
|
|
|
|
|
var index = Object.assign({}, core[action.index_name]);
|
|
|
|
|
|
|
|
|
|
// We have a new key to redirect to
|
|
|
|
|
if (action.new_key){
|
|
|
|
|
index[action.key] = {
|
|
|
|
|
moved_to: action.new_key
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// No redirection, so just a clean delete
|
|
|
|
|
} else {
|
|
|
|
|
delete index[action.key];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var updated_core = {};
|
|
|
|
|
updated_core[action.index_name] = index;
|
|
|
|
|
|
|
|
|
|
return Object.assign({}, core, updated_core);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Playlists
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
case 'PLAYLIST_TRACKS':
|
2018-08-12 20:59:00 +12:00
|
|
|
var playlists = Object.assign({}, core.playlists)
|
2017-12-21 08:38:21 +13:00
|
|
|
var playlist = Object.assign({}, playlists[action.key], { tracks_uris: action.tracks_uris })
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
playlists[action.key] = playlist
|
|
|
|
|
return Object.assign({}, core, { playlists: playlists });
|
|
|
|
|
|
|
|
|
|
case 'LIBRARY_PLAYLISTS_LOADED':
|
|
|
|
|
if (core.library_playlists){
|
|
|
|
|
var library_playlists = [...core.library_playlists, ...action.uris]
|
2017-10-10 13:32:04 +13:00
|
|
|
} else {
|
2017-08-02 10:53:30 +12:00
|
|
|
var library_playlists = action.uris
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
library_playlists = helpers.removeDuplicates(library_playlists)
|
|
|
|
|
|
|
|
|
|
return Object.assign({}, core, {
|
|
|
|
|
library_playlists: library_playlists,
|
|
|
|
|
library_playlists_started: true
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Genres
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
case 'SPOTIFY_GENRES_LOADED':
|
|
|
|
|
return Object.assign({}, core, {genres: action.genres})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Search results
|
|
|
|
|
**/
|
|
|
|
|
|
|
|
|
|
case 'SEARCH_STARTED':
|
|
|
|
|
return Object.assign({}, core, {
|
|
|
|
|
search_results: {
|
|
|
|
|
artists_uris: [],
|
|
|
|
|
albums_uris: [],
|
|
|
|
|
playlists_uris: [],
|
|
|
|
|
tracks: [],
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
case 'SEARCH_RESULTS_LOADED':
|
|
|
|
|
|
|
|
|
|
// artists
|
|
|
|
|
if (core.search_results && core.search_results.artists_uris){
|
|
|
|
|
var artists_uris = core.search_results.artists_uris
|
2017-10-10 13:32:04 +13:00
|
|
|
} else {
|
2017-08-02 10:53:30 +12:00
|
|
|
var artists_uris = []
|
|
|
|
|
}
|
|
|
|
|
if (action.artists_uris) artists_uris = [...artists_uris, ...action.artists_uris]
|
|
|
|
|
|
|
|
|
|
// more tracks
|
|
|
|
|
if (typeof(action.artists_more) !== 'undefined') var artists_more = action.artists_more
|
|
|
|
|
else if (core.search_results && core.search_results.artists_more) var artists_more = core.search_results.artists_more
|
|
|
|
|
else var artists_more = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// albums
|
|
|
|
|
if (core.search_results && core.search_results.albums_uris){
|
|
|
|
|
var albums_uris = core.search_results.albums_uris
|
2017-10-10 13:32:04 +13:00
|
|
|
} else {
|
2017-08-02 10:53:30 +12:00
|
|
|
var albums_uris = []
|
|
|
|
|
}
|
|
|
|
|
if (action.albums_uris) albums_uris = [...albums_uris, ...action.albums_uris]
|
|
|
|
|
|
|
|
|
|
// more tracks
|
|
|
|
|
if (typeof(action.albums_more) !== 'undefined') var albums_more = action.albums_more
|
|
|
|
|
else if (core.search_results && core.search_results.albums_more) var albums_more = core.search_results.albums_more
|
|
|
|
|
else var albums_more = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// playlists
|
|
|
|
|
if (core.search_results && core.search_results.playlists_uris){
|
|
|
|
|
var playlists_uris = core.search_results.playlists_uris
|
2017-10-10 13:32:04 +13:00
|
|
|
} else {
|
2017-08-02 10:53:30 +12:00
|
|
|
var playlists_uris = []
|
|
|
|
|
}
|
|
|
|
|
if (action.playlists_uris) playlists_uris = [...playlists_uris, ...action.playlists_uris]
|
|
|
|
|
|
|
|
|
|
// more tracks
|
|
|
|
|
if (typeof(action.playlists_more) !== 'undefined') var playlists_more = action.playlists_more
|
|
|
|
|
else if (core.search_results && core.search_results.playlists_more) var playlists_more = core.search_results.playlists_more
|
|
|
|
|
else var playlists_more = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// tracks
|
|
|
|
|
if (core.search_results && core.search_results.tracks){
|
|
|
|
|
var tracks = core.search_results.tracks
|
2017-10-10 13:32:04 +13:00
|
|
|
} else {
|
2017-08-02 10:53:30 +12:00
|
|
|
var tracks = []
|
|
|
|
|
}
|
2017-10-18 17:03:59 +13:00
|
|
|
if (action.tracks) tracks = [...tracks, ...helpers.formatTracks(action.tracks)]
|
2017-08-02 10:53:30 +12:00
|
|
|
|
|
|
|
|
// more tracks
|
|
|
|
|
if (typeof(action.tracks_more) !== 'undefined') var tracks_more = action.tracks_more
|
|
|
|
|
else if (core.search_results && core.search_results.tracks_more) var tracks_more = core.search_results.tracks_more
|
|
|
|
|
else var tracks_more = null
|
|
|
|
|
|
|
|
|
|
return Object.assign({}, core, {
|
|
|
|
|
search_results: {
|
|
|
|
|
artists_more: artists_more,
|
|
|
|
|
artists_uris: helpers.removeDuplicates(artists_uris),
|
|
|
|
|
albums_more: albums_more,
|
|
|
|
|
albums_uris: helpers.removeDuplicates(albums_uris),
|
|
|
|
|
playlists_more: playlists_more,
|
|
|
|
|
playlists_uris: helpers.removeDuplicates(playlists_uris),
|
|
|
|
|
tracks: tracks,
|
|
|
|
|
tracks_more: tracks_more
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return core
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|