307 lines
8.6 KiB
JavaScript
Executable File
307 lines
8.6 KiB
JavaScript
Executable File
|
|
import { removeDuplicates, arrayOf } from '../../util/arrays';
|
|
import { formatTracks } from '../../util/format';
|
|
|
|
export default function reducer(core = {}, action) {
|
|
switch (action.type) {
|
|
case 'CORE_SET':
|
|
return { ...core, ...action.data };
|
|
|
|
case 'CACHEBUST_HTTP_STREAM':
|
|
return { ...core, http_streaming_cachebuster: new Date().getTime() };
|
|
|
|
/**
|
|
* Current track and tracklist
|
|
* */
|
|
|
|
case 'CURRENT_TRACK_LOADED':
|
|
return {
|
|
...core,
|
|
current_track: action.track,
|
|
current_track_uri: action.uri,
|
|
};
|
|
|
|
case 'CLEAR_CURRENT_TRACK':
|
|
return {
|
|
...core,
|
|
current_track: null,
|
|
current_track_uri: null,
|
|
};
|
|
|
|
case 'NEXT_TRACK_LOADED':
|
|
return { ...core, next_track_uri: action.uri };
|
|
|
|
case 'QUEUE_LOADED':
|
|
return { ...core, queue: action.tracks };
|
|
|
|
case 'PUSHER_QUEUE_METADATA':
|
|
case 'PUSHER_QUEUE_METADATA_CHANGED':
|
|
var tracklist = Object.assign([], core.current_tracklist);
|
|
for (let i = 0; i < tracklist.length; i++) {
|
|
// load our metadata (if we have any for that tlid)
|
|
if (action.queue_metadata[`tlid_${tracklist[i].tlid}`] !== undefined) {
|
|
tracklist[i] = {
|
|
|
|
...tracklist[i],
|
|
...action.queue_metadata[`tlid_${tracklist[i].tlid}`],
|
|
};
|
|
}
|
|
}
|
|
return { ...core, current_tracklist: tracklist, queue_metadata: action.queue_metadata };
|
|
|
|
case 'PUSHER_RADIO_LOADED':
|
|
case 'PUSHER_RADIO_STARTED':
|
|
case 'PUSHER_RADIO_CHANGED':
|
|
case 'PUSHER_RADIO_STOPPED':
|
|
return { ...core, seeds_resolved: false, radio: action.radio };
|
|
|
|
case 'RADIO_SEEDS_RESOLVED':
|
|
var radio = { ...core.radio, resolved_seeds: action.resolved_seeds };
|
|
return { ...core, radio };
|
|
|
|
|
|
/**
|
|
* Index updates
|
|
* These actions are only ever called by middleware after we've digested one more many assets
|
|
* and appended to their relevant index.
|
|
* */
|
|
|
|
case 'TRACKS_LOADED':
|
|
var tracks = { ...core.tracks };
|
|
for (const track of action.tracks) {
|
|
tracks[track.uri] = track;
|
|
}
|
|
return { ...core, tracks };
|
|
|
|
case 'ALBUMS_LOADED':
|
|
var albums = { ...core.albums };
|
|
for (const album of action.albums) {
|
|
albums[album.uri] = album;
|
|
}
|
|
return { ...core, albums };
|
|
|
|
case 'ARTISTS_LOADED':
|
|
var artists = { ...core.artists };
|
|
for (var artist of action.artists) {
|
|
artists[artist.uri] = artist;
|
|
}
|
|
return { ...core, artists };
|
|
|
|
case 'PLAYLISTS_LOADED':
|
|
var playlists = { ...core.playlists };
|
|
for (var playlist of action.playlists) {
|
|
playlists[playlist.uri] = playlist;
|
|
}
|
|
return { ...core, playlists };
|
|
|
|
case 'USERS_LOADED':
|
|
var users = { ...core.users };
|
|
for (var user of action.users) {
|
|
users[user.uri] = user;
|
|
}
|
|
return { ...core, users };
|
|
|
|
|
|
case 'ARTIST_ALBUMS_LOADED':
|
|
var artists = { ...core.artists };
|
|
var albums_uris = [];
|
|
if (artists[action.artist_uri].albums_uris) {
|
|
albums_uris = artists[action.artist_uri].albums_uris;
|
|
}
|
|
|
|
var artist = {
|
|
|
|
...artists[action.artist_uri],
|
|
albums_uris: [...albums_uris, ...action.albums_uris],
|
|
albums_more: action.more,
|
|
albums_total: action.total,
|
|
};
|
|
artists[action.artist_uri] = artist;
|
|
return { ...core, artists };
|
|
|
|
|
|
case 'USER_PLAYLISTS_LOADED':
|
|
var users = { ...core.users };
|
|
var existing_playlists_uris = [];
|
|
if (users[action.uri] && users[action.uri].playlists_uris) {
|
|
existing_playlists_uris = users[action.uri].playlists_uris;
|
|
}
|
|
|
|
var playlists_uris = [...existing_playlists_uris, ...arrayOf('uri', action.playlists)];
|
|
|
|
var user = {
|
|
|
|
...users[action.uri],
|
|
playlists_uris,
|
|
playlists_more: action.more,
|
|
playlists_total: action.total,
|
|
};
|
|
users[action.uri] = user;
|
|
return { ...core, users };
|
|
|
|
|
|
/**
|
|
* Remove an item from an index
|
|
* */
|
|
|
|
case 'REMOVE_FROM_INDEX':
|
|
var index = { ...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 { ...core, ...updated_core };
|
|
|
|
|
|
/**
|
|
* Playlists
|
|
* */
|
|
|
|
case 'PLAYLIST_TRACKS':
|
|
var playlists = { ...core.playlists };
|
|
var playlist = { ...playlists[action.key], tracks_uris: action.tracks_uris };
|
|
|
|
playlists[action.key] = playlist;
|
|
return { ...core, playlists };
|
|
|
|
case 'LIBRARY_PLAYLISTS_LOADED':
|
|
if (core.library_playlists) {
|
|
var library_playlists = [...core.library_playlists, ...action.uris];
|
|
} else {
|
|
var library_playlists = action.uris;
|
|
}
|
|
|
|
library_playlists = removeDuplicates(library_playlists);
|
|
|
|
return {
|
|
...core,
|
|
library_playlists,
|
|
library_playlists_started: true,
|
|
};
|
|
|
|
|
|
/**
|
|
* Genres
|
|
* */
|
|
|
|
case 'SPOTIFY_GENRES_LOADED':
|
|
return { ...core, genres: action.genres };
|
|
|
|
case 'VIEW_DATA_LOADED':
|
|
return {
|
|
...core,
|
|
view: {
|
|
...(core.view ? core.view : {}),
|
|
...action.data,
|
|
},
|
|
};
|
|
|
|
|
|
/**
|
|
* Search results
|
|
* */
|
|
|
|
case 'SEARCH_STARTED':
|
|
return {
|
|
...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;
|
|
} else {
|
|
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;
|
|
else if (core.search_results && core.search_results.artists_more) var { artists_more } = core.search_results;
|
|
else var artists_more = null;
|
|
|
|
|
|
// albums
|
|
if (core.search_results && core.search_results.albums_uris) {
|
|
var { albums_uris } = core.search_results;
|
|
} else {
|
|
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;
|
|
else if (core.search_results && core.search_results.albums_more) var { albums_more } = core.search_results;
|
|
else var albums_more = null;
|
|
|
|
|
|
// playlists
|
|
if (core.search_results && core.search_results.playlists_uris) {
|
|
var { playlists_uris } = core.search_results;
|
|
} else {
|
|
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;
|
|
else if (core.search_results && core.search_results.playlists_more) var { playlists_more } = core.search_results;
|
|
else var playlists_more = null;
|
|
|
|
|
|
// tracks
|
|
if (core.search_results && core.search_results.tracks) {
|
|
var { tracks } = core.search_results;
|
|
} else {
|
|
var tracks = [];
|
|
}
|
|
if (action.tracks) tracks = [...tracks, ...formatTracks(action.tracks)];
|
|
|
|
// more tracks
|
|
if (typeof (action.tracks_more) !== 'undefined') var { tracks_more } = action;
|
|
else if (core.search_results && core.search_results.tracks_more) var { tracks_more } = core.search_results;
|
|
else var tracks_more = null;
|
|
|
|
return {
|
|
...core,
|
|
search_results: {
|
|
artists_more,
|
|
artists_uris: removeDuplicates(artists_uris),
|
|
albums_more,
|
|
albums_uris: removeDuplicates(albums_uris),
|
|
playlists_more,
|
|
playlists_uris: removeDuplicates(playlists_uris),
|
|
tracks,
|
|
tracks_more,
|
|
},
|
|
};
|
|
|
|
case 'UPDATE_PINNED':
|
|
return {
|
|
...core,
|
|
pinned: action.pinned,
|
|
};
|
|
|
|
default:
|
|
return core;
|
|
}
|
|
}
|