Files
Iris/src/js/services/core/reducer.js
2020-08-08 22:17:31 +12:00

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;
}
}