import * as helpers from '../../helpers' export default function reducer(ui = {}, action){ switch (action.type) { case 'LAZY_LOADING': return Object.assign({}, ui, { lazy_loading: action.start }); /** * Context menu **/ case 'SHOW_CONTEXT_MENU': return Object.assign({}, ui, { context_menu: { show: true, position_x: action.position_x, position_y: action.position_y, context: action.context, data: action.data } }); case 'HIDE_CONTEXT_MENU': return Object.assign({}, ui, { context_menu: { show: false } }); /** * Dragging **/ case 'DRAG_START': return Object.assign({}, ui, { dragger: { dragging: true, active: false, context: action.context, victims: action.victims, victims_indexes: action.victims_indexes, start_x: action.start_x, start_y: action.start_y } }); case 'DRAG_ACTIVE': var dragger = Object.assign({}, ui.dragger, { active: true }) return Object.assign({}, ui, { dragger: dragger }); case 'DRAG_END': return Object.assign({}, ui, { dragger: false }); /** * Current track and tracklist **/ case 'MOPIDY_TLTRACKS': if( !action.data ) return ui var tracklist = [] for( var i = 0; i < action.data.length; i++ ){ var track = Object.assign( {}, action.data[i].track, { tlid: action.data[i].tlid, playing: ( ui.current_track && action.data[i].tlid == ui.current_track.tlid ) }) tracklist.push( track ) } return Object.assign({}, ui, { current_tracklist: tracklist }); case 'SPOTIFY_TRACK_LOADED': if( !action.data ) return ui var current_track = Object.assign({}, ui.current_track, action.data) return Object.assign({}, ui, { current_track: current_track }); case 'MOPIDY_CURRENTTLTRACK': if( !action.data ) return ui var current_tracklist = [] Object.assign(current_tracklist, ui.current_tracklist) for( var i = 0; i < current_tracklist.length; i++ ){ Object.assign( current_tracklist[i], { playing: ( current_tracklist[i].tlid == action.data.tlid ) } ) } var current_track = action.data.track Object.assign(current_track, { tlid: action.data.tlid }) return Object.assign({}, ui, { current_track: current_track }); /** * Albums **/ case 'MOPIDY_ALBUM_LOADED': if( !action.data ) return Object.assign({}, ui, { album: false }) return Object.assign({}, ui, { album: action.data }); case 'LASTFM_ALBUM_LOADED': if( !action.data.image ) return ui var album = Object.assign({}, ui.album, { images: action.data.image }) return Object.assign({}, ui, { album: album }); case 'SPOTIFY_ALBUM_LOADED': if( !action.data ) return Object.assign({}, ui, { album: false }) var album = Object.assign({}, { images: [] }, action.data, { tracks: action.data.tracks.items, tracks_total: action.data.tracks.total, tracks_more: action.data.tracks.next }) return Object.assign({}, ui, { album: album }) case 'SPOTIFY_ALBUM_LOADED_MORE': var album = Object.assign({}, ui.album, { tracks: [ ...ui.album.tracks, ...action.data.items ], tracks_more: action.data.next }) return Object.assign({}, ui, { album: album }); /** * Artists **/ case 'MOPIDY_ARTIST_LOADED': if( !action.data ) return Object.assign({}, ui, { artist: false }) return Object.assign({}, ui, { artist: action.data }) case 'LASTFM_ARTIST_LOADED': if( !action.data.image ) return ui var artist = Object.assign({}, ui.artist, { images: action.data.image, bio: action.data.bio }) return Object.assign({}, ui, { artist: artist }); case 'SPOTIFY_ARTIST_LOADED': if( !action.data ) return Object.assign({}, ui, { artist: false }) return Object.assign({}, ui, { artist: action.data }) case 'SPOTIFY_ARTIST_ALBUMS_LOADED_MORE': var artist = Object.assign({}, ui.artist, { albums: [ ...ui.artist.albums, ...action.data.items ], albums_more: action.data.next }) return Object.assign({}, ui, { artist: artist }); /** * Playlists **/ case 'PLAYLIST_UPDATED': var playlist = Object.assign({}, ui.playlist, action.playlist) return Object.assign({}, ui, { playlist: playlist }) case 'MOPIDY_PLAYLIST_LOADED': if( !action.data ) return Object.assign({}, ui, { playlist: false }) return Object.assign({}, ui, { playlist: action.data }) case 'SPOTIFY_PLAYLIST_LOADED': if( !action.data ) return Object.assign({}, ui, { playlist: false }) var tracks = [] for( var i = 0; i < action.data.tracks.items.length; i++ ){ tracks.push( Object.assign( {}, action.data.tracks.items[i].track, { added_by: action.data.tracks.items[i].added_by, added_at: action.data.tracks.items[i].added_at } )) } var playlist = Object.assign({}, action.data, { tracks: tracks, tracks_more: action.data.tracks.next, tracks_total: action.data.tracks.total }) return Object.assign({}, ui, { playlist: playlist }); case 'SPOTIFY_PLAYLIST_LOADED_MORE': var tracks = [] for( var i = 0; i < action.data.items.length; i++ ){ tracks.push( Object.assign( {}, action.data.items[i].track, { added_by: action.data.items[i].added_by, added_at: action.data.items[i].added_at } )) } var playlist = Object.assign({}, ui.playlist, { tracks: [...ui.playlist.tracks, ...tracks], tracks_more: action.data.next }) return Object.assign({}, ui, { playlist: playlist }); case 'SPOTIFY_PLAYLIST_FOLLOWING': var playlist = Object.assign({}, ui.playlist, { following: action.data }) return Object.assign({}, ui, { playlist: playlist }); case 'PLAYLIST_TRACKS_REMOVED': var tracks = Object.assign([], ui.playlist.tracks) var indexes = action.tracks_indexes.reverse() for( var i = 0; i < indexes.length; i++ ){ tracks.splice( indexes[i], 1 ) } var snapshot_id = null if( action.snapshot_id ) snapshot_id = action.snapshot_id var playlist = Object.assign({}, ui.playlist, { tracks: tracks, snapshot_id: snapshot_id }) return Object.assign({}, ui, { playlist: playlist }); case 'PLAYLIST_TRACKS_LOADED': var playlist = Object.assign({}, ui.playlist, { tracks: action.tracks }) return Object.assign({}, ui, { playlist: playlist }); /* case 'PLAYLIST_TRACKS_REORDERED': var snapshot_id = null if( action.snapshot_id ) snapshot_id = action.snapshot_id var playlist = Object.assign({}, ui.playlist, { tracks: action.tracks, snapshot_id: snapshot_id }) return Object.assign({}, ui, { playlist: playlist }); */ /** * Library Playlists **/ case 'MOPIDY_PLAYLISTS_LOADED': case 'SPOTIFY_LIBRARY_PLAYLISTS_LOADED': if( !action.data ) return ui var playlists = [...ui.playlists, ...action.data] playlists = helpers.mergeDuplicates(playlists, 'uri') return Object.assign({}, ui, { playlists: playlists }); /** * Search results **/ case 'SEARCH_STARTED': return Object.assign({}, ui, { search_results: action.data }) case 'MOPIDY_SEARCH': // collate all our different sources into one array var tracks = [] for( var i = 0; i < action.data.length; i++ ){ if( action.data[i].tracks ) tracks = [...tracks, ...action.data[i].tracks] } // merge our results with all our other tracks var results = Object.assign({}, ui.search_results, { tracks: [...ui.search_results.tracks, ...tracks] }) return Object.assign({}, ui, { search_results: results }) case 'SPOTIFY_SEARCH_RESULTS_LOADED': if( !action.data ) return ui return Object.assign({}, ui, { search_results: { artists: [ ...ui.search_results.artists, ...action.data.artists.items ], albums: [ ...ui.search_results.albums, ...action.data.albums.items ], playlists: [ ...ui.search_results.playlists, ...action.data.playlists.items ], tracks: [ ...ui.search_results.tracks, ...action.data.tracks.items ], artists_more: action.data.artists.next, albums_more: action.data.albums.next, playlists_more: action.data.playlists.next, tracks_more: action.data.tracks.next }}); case 'SPOTIFY_SEARCH_RESULTS_LOADED_MORE_ARTISTS': var artists = [...ui.search_results.artists, ...action.data.artists.items] var results = Object.assign({}, ui.search_results, { artists: artists, artists_more: action.data.artists.next }) return Object.assign({}, ui, { search_results: results }) case 'SPOTIFY_SEARCH_RESULTS_LOADED_MORE_ALBUMS': var albums = [...ui.search_results.albums, ...action.data.albums.items] var results = Object.assign({}, ui.search_results, { albums: albums, albums_more: action.data.albums.next }) return Object.assign({}, ui, { search_results: results }) case 'SPOTIFY_SEARCH_RESULTS_LOADED_MORE_PLAYLISTS': var playlists = [...ui.search_results.playlists, ...action.data.playlists.items] var results = Object.assign({}, ui.search_results, { playlists: playlists, playlists_more: action.data.playlists.next }) return Object.assign({}, ui, { search_results: results }) case 'SPOTIFY_SEARCH_RESULTS_LOADED_MORE_TRACKS': var tracks = [...ui.search_results.tracks, ...action.data.tracks.items] var results = Object.assign({}, ui.search_results, { tracks: tracks, tracks_more: action.data.tracks.next }) return Object.assign({}, ui, { search_results: results }) /** * Modals **/ case 'OPEN_MODAL': return Object.assign({}, ui, { modal: action.modal }) case 'CLOSE_MODAL': return Object.assign({}, ui, { modal: false }) default: return ui } }