406 lines
15 KiB
JavaScript
Executable File
406 lines
15 KiB
JavaScript
Executable File
|
|
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 });
|
|
|
|
|
|
/**
|
|
* UI views and view modes
|
|
**/
|
|
|
|
case 'SET_VIEW':
|
|
return Object.assign({}, ui, action.view)
|
|
|
|
case 'TOGGLE_SIDEBAR':
|
|
return Object.assign({}, ui, { sidebar_open : !ui.sidebar_open })
|
|
|
|
|
|
/**
|
|
* 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
|
|
});
|
|
|
|
case 'FOLLOWING_LOADING':
|
|
return Object.assign({}, ui, { following_loading: true })
|
|
|
|
|
|
|
|
|
|
/**
|
|
* 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 });
|
|
|
|
case 'ALBUM_FOLLOWING_LOADED':
|
|
var album = Object.assign({}, ui.album, { following: action.is_following })
|
|
return Object.assign({}, ui, { album: album, following_loading: false });
|
|
|
|
|
|
|
|
/**
|
|
* 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
|
|
|
|
// if we already have images, don't overwrite them
|
|
var images = ui.artist.images
|
|
if( images.length <= 0 ) images = action.data.image
|
|
|
|
var artist = Object.assign({}, ui.artist, { images: images, bio: action.data.bio, listeners: parseInt(action.data.stats.listeners), on_tour: action.data.ontour }, )
|
|
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 });
|
|
|
|
case 'ARTIST_FOLLOWING_LOADED':
|
|
var artist = Object.assign({}, ui.artist, { following: action.is_following })
|
|
return Object.assign({}, ui, { artist: artist, following_loading: false });
|
|
|
|
|
|
/**
|
|
* User
|
|
**/
|
|
|
|
case 'SPOTIFY_USER_LOADED':
|
|
if( !action.data ) return Object.assign({}, ui, { user: false })
|
|
return Object.assign({}, ui, { user: action.data })
|
|
|
|
case 'SPOTIFY_USER_PLAYLISTS_LOADED_MORE':
|
|
var user = Object.assign({}, ui.user, {
|
|
playlists: [ ...ui.user.playlists, ...action.data.items ],
|
|
playlists_more: action.data.next
|
|
})
|
|
return Object.assign({}, ui, { user: user });
|
|
|
|
case 'USER_FOLLOWING_LOADED':
|
|
var user = Object.assign({}, ui.user, { following: action.is_following })
|
|
return Object.assign({}, ui, { user: user, following_loading: false });
|
|
|
|
|
|
/**
|
|
* 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 '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 tracks = Object.assign([], ui.playlist.tracks)
|
|
|
|
// handle insert_before offset if we're moving BENEATH where we're slicing tracks
|
|
var insert_before = action.insert_before
|
|
if( insert_before > action.range_start ) insert_before = insert_before - action.range_length
|
|
|
|
// cut our moved tracks into a new array
|
|
var tracks_to_move = tracks.splice(action.range_start, action.range_length)
|
|
tracks_to_move.reverse()
|
|
|
|
for( i = 0; i < tracks_to_move.length; i++ ){
|
|
tracks.splice(insert_before, 0, tracks_to_move[i])
|
|
}
|
|
|
|
var playlist = Object.assign({}, ui.playlist, { snapshot_id: snapshot_id, tracks: tracks })
|
|
return Object.assign({}, ui, { playlist: playlist });
|
|
|
|
case 'PLAYLIST_FOLLOWING_LOADED':
|
|
var playlist = Object.assign({}, ui.playlist, { following: action.is_following })
|
|
return Object.assign({}, ui, { playlist: playlist, following_loading: false });
|
|
|
|
|
|
/**
|
|
* 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
|
|
}
|
|
}
|
|
|
|
|
|
|