Files
Iris/src/js/services/core/reducer.js
2018-04-23 08:13:24 +12:00

322 lines
11 KiB
JavaScript
Executable File

import * as helpers from '../../helpers'
export default function reducer(core = {}, action){
switch (action.type){
case 'CORE_SET':
return Object.assign({}, core, action.data)
/**
* Current track and tracklist
**/
case 'CURRENT_TRACK_LOADED':
return Object.assign({}, core, {
current_track: action.track,
current_track_uri: action.uri
});
case 'CLEAR_CURRENT_TRACK':
return Object.assign({}, core, {
current_track: null,
current_track_uri: null
});
case 'NEXT_TRACK_LOADED':
return Object.assign({}, core, {
next_track_uri: action.uri
});
case 'QUEUE_LOADED':
return Object.assign({}, core, {
queue: action.tracks
});
case 'PUSHER_QUEUE_METADATA':
case 'PUSHER_QUEUE_METADATA_CHANGED':
var tracklist = Object.assign([], core.current_tracklist)
for(var 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] = Object.assign(
{},
tracklist[i],
action.queue_metadata['tlid_'+tracklist[i].tlid],
)
}
}
return Object.assign({}, 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 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 })
/**
* Categories
**/
case 'CATEGORY_LOADED':
var categories = Object.assign([], core.categories)
if (categories[action.key]){
var category = Object.assign({}, categories[action.key], action.category)
} else {
var category = Object.assign({}, action.category)
}
categories[action.key] = category
return Object.assign({}, core, { categories: categories });
case 'CATEGORIES_LOADED':
var categories = Object.assign([], core.categories)
for (var i = 0; i < action.categories.length; i++){
var key = 'category:'+action.categories[i].id
if (categories[key]){
var category = Object.assign({}, categories[key], action.categories[i])
} else {
var category = Object.assign({}, action.categories[i])
}
categories[key] = category
}
return Object.assign({}, core, { categories: categories });
case 'CATEGORY_PLAYLISTS_LOADED':
var categories = Object.assign([], core.categories)
var playlists_uris = []
if (categories[action.key].playlists_uris) playlists_uris = categories[action.key].playlists_uris
var category = Object.assign(
{},
categories[action.key],
{
playlists_uris: [...playlists_uris, ...action.uris],
playlists_more: action.more,
playlists_total: action.total
}
)
categories[action.key] = category
return Object.assign({}, core, { categories: categories });
/**
* 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 'UPDATE_TRACKS_INDEX':
return Object.assign({}, core, { tracks: action.tracks });
case 'UPDATE_ALBUMS_INDEX':
return Object.assign({}, core, { albums: action.albums });
case 'UPDATE_ARTISTS_INDEX':
return Object.assign({}, core, { artists: action.artists });
case 'UPDATE_PLAYLISTS_INDEX':
return Object.assign({}, core, { playlists: action.playlists });
case 'UPDATE_USERS_INDEX':
return Object.assign({}, core, { users: action.users });
case 'NEW_RELEASES_LOADED':
if (!action.uris){
return Object.assign({}, core, {
new_releases: null,
new_releases_more: null,
new_releases_total: null
});
}
var new_releases = []
if (core.new_releases) new_releases = Object.assign([], core.new_releases)
return Object.assign({}, core, {
new_releases: [...new_releases, ...action.uris],
new_releases_more: action.more,
new_releases_total: action.total
});
case 'ARTIST_ALBUMS_LOADED':
var artists = Object.assign([], core.artists)
var albums_uris = []
if (artists[action.key].albums_uris) albums_uris = artists[action.key].albums_uris
var artist = Object.assign(
{},
artists[action.key],
{
albums_uris: [...albums_uris, ...action.uris],
albums_more: action.more,
albums_total: action.total
}
)
artists[action.key] = artist
return Object.assign({}, core, { artists: artists });
case 'USER_PLAYLISTS_LOADED':
var users = Object.assign([], core.users)
var playlists_uris = []
if (users[action.key] && users[action.key].playlists_uris) playlists_uris = users[action.key].playlists_uris
var artist = Object.assign(
{},
users[action.key],
{
playlists_uris: [...playlists_uris, ...action.uris],
playlists_more: action.more,
playlists_total: action.total
}
)
users[action.key] = artist
return Object.assign({}, core, { users: users });
/**
* Playlists
**/
case 'PLAYLIST_TRACKS':
var playlists = Object.assign([], core.playlists)
var playlist = Object.assign({}, playlists[action.key], { tracks_uris: action.tracks_uris })
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]
} else {
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
} 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.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
} 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.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
} 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.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
} else {
var tracks = []
}
if (action.tracks) tracks = [...tracks, ...helpers.formatTracks(action.tracks)]
// 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
}
}