Files
Iris/src/js/services/ui/middleware.js

321 lines
12 KiB
JavaScript
Raw Normal View History

2016-11-11 16:47:32 +13:00
2017-01-04 15:24:13 +13:00
import ReactGA from 'react-ga'
2016-11-11 16:47:32 +13:00
2016-12-14 08:29:24 +13:00
var uiActions = require('./actions.js')
var mopidyActions = require('../mopidy/actions.js')
2016-11-11 16:47:32 +13:00
var spotifyActions = require('../spotify/actions.js')
var helpers = require('../../helpers.js')
const UIMiddleware = (function(){
/**
* The actual middleware inteceptor
**/
return store => next => action => {
switch(action.type){
2017-01-04 15:24:13 +13:00
case 'MOPIDY_CONNECTED':
ReactGA.event({ category: 'Mopidy', action: 'Connected', label: window.location.hostname })
next(action)
break
case 'PUSHER_CONNECTED':
2017-02-19 21:27:43 +13:00
ReactGA.event({ category: 'Pusher', action: 'Connected', label: action.connection_id+'/'+action.username })
2017-01-04 15:24:13 +13:00
next(action)
break
case 'SPOTIFY_CONNECTED':
var label = null
if (store.getState().spotify.me) label = store.getState().spotify.me.id
ReactGA.event({ category: 'Spotify', action: 'Connected', label: label })
next(action)
break
case 'SPOTIFY_AUTHORIZATION_GRANTED':
ReactGA.event({ category: 'Spotify', action: 'Authorization granted' })
next(action)
break
case 'SPOTIFY_AUTHORIZATION_REVOKED':
var label = null
if (store.getState().spotify.me) label = store.getState().spotify.me.id
ReactGA.event({ category: 'Spotify', action: 'Authorization revoked', label: label })
next(action)
break
case 'SPOTIFY_ME_LOADED':
ReactGA.event({ category: 'Spotify', action: 'Authorization verified', label: action.data.id })
next(action)
break
case 'MOPIDY_ALBUM_LOADED':
case 'SPOTIFY_ALBUM_LOADED':
if (action.data) ReactGA.event({ category: 'Album', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_ARTIST_LOADED':
case 'SPOTIFY_ARTIST_LOADED':
if (action.data) ReactGA.event({ category: 'Artist', action: 'Load', label: action.data.uri })
next(action)
break
case 'SPOTIFY_USER_LOADED':
if (action.data) ReactGA.event({ category: 'User', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_DIRECTORY':
if (action.data) ReactGA.event({ category: 'Directory', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_PLAYLIST_LOADED':
case 'SPOTIFY_PLAYLIST_LOADED':
if (action.data) ReactGA.event({ category: 'Playlist', action: 'Load', label: action.data.uri })
next(action)
break
case 'MOPIDY_SAVE_PLAYLIST':
case 'SPOTIFY_SAVE_PLAYLIST':
2017-01-19 13:19:11 +13:00
ReactGA.event({ category: 'Playlist', action: 'Save', label: action.key })
2017-01-04 15:24:13 +13:00
next(action)
break
case 'MOPIDY_CREATE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Create', label: 'Mopidy,'+action.name })
next(action)
break
case 'SPOTIFY_CREATE_PLAYLIST':
ReactGA.event({ category: 'Playlist', action: 'Create', label: 'Spotify,'+action.name })
next(action)
break
case 'MOPIDY_REORDER_PLAYLIST_TRACKS':
case 'SPOTIFY_REORDER_PLAYLIST_TRACKS':
2017-01-19 13:19:11 +13:00
ReactGA.event({ category: 'Playlist', action: 'Reorder tracks', label: action.key })
2017-01-04 15:24:13 +13:00
next(action)
break
case 'MOPIDY_ADD_PLAYLIST_TRACKS':
case 'SPOTIFY_ADD_PLAYLIST_TRACKS':
ReactGA.event({ category: 'Playlist', action: 'Add tracks', label: action.playlist_uri })
next(action)
break
case 'MOPIDY_REMOVE_PLAYLIST_TRACKS':
case 'SPOTIFY_REMOVE_PLAYLIST_TRACKS':
ReactGA.event({ category: 'Playlist', action: 'Remove tracks', label: action.playlist_uri })
next(action)
break
case 'SEARCH_STARTED':
ReactGA.event({ category: 'Search', action: 'Started', label: action.type+': '+action.query })
2017-03-24 23:05:43 +13:00
var state = store.getState()
2017-03-24 23:05:43 +13:00
if (state.ui.search_settings){
var uri_schemes = state.ui.search_settings.uri_schemes
} else {
var uri_schemes = state.mopidy.uri_schemes
}
// initiate spotify searching
if (!action.only_mopidy){
if (!state.ui.search_settings || state.ui.search_settings.spotify){
store.dispatch(spotifyActions.getSearchResults(action.query))
}
}
// backend searching (mopidy)
if (state.mopidy.connected){
2017-03-24 16:06:49 +13:00
switch (action.search_type){
case 'playlists':
store.dispatch(mopidyActions.getPlaylistSearchResults(action.query))
break
case 'artists':
store.dispatch(mopidyActions.getArtistSearchResults(action.query))
break
case 'albums':
store.dispatch(mopidyActions.getAlbumSearchResults(action.query))
break
2017-03-24 23:05:43 +13:00
case 'tracks':
for (var i = 0; i < uri_schemes.length; i++){
store.dispatch(mopidyActions.getTrackSearchResults(action.query,100,[uri_schemes[i]]))
}
break
2017-03-24 16:06:49 +13:00
default:
2017-03-24 23:05:43 +13:00
store.dispatch(mopidyActions.getPlaylistSearchResults(action.query,6))
store.dispatch(mopidyActions.getArtistSearchResults(action.query,6))
store.dispatch(mopidyActions.getAlbumSearchResults(action.query,6))
2017-03-24 16:06:49 +13:00
// wrap each uri scheme in it's own search request
// this means slow backends won't hold up the whole request
for (var i = 0; i < uri_schemes.length; i++){
2017-03-24 23:05:43 +13:00
store.dispatch(mopidyActions.getTrackSearchResults(action.query,100,[uri_schemes[i]]))
2017-03-24 16:06:49 +13:00
}
}
}
2017-01-04 15:24:13 +13:00
next(action)
break
case 'PUSHER_START_RADIO':
ReactGA.event({ category: 'Pusher', action: 'Start radio', label: action.uris.join() })
next(action)
break
case 'PUSHER_STOP_RADIO':
ReactGA.event({ category: 'Pusher', action: 'Stop radio' })
next(action)
break
case 'PUSHER_UPGRADING':
ReactGA.event({ category: 'Pusher', action: 'Upgrade', label: action.data })
next(action)
break
case 'RESTART':
location.reload()
break
2017-01-24 10:13:12 +13:00
case 'OPEN_MODAL':
$('body').addClass('modal-open')
next(action)
break
case 'CLOSE_MODAL':
$('body').removeClass('modal-open')
next(action)
break
case 'BROWSER_NOTIFICATION':
var notification = window.Notification || window.mozNotification || window.webkitNotification;
if ('undefined' === typeof notification) return false;
if ('undefined' !== typeof notification) notification.requestPermission(function(permission){});
// handle nested data objects
var data = {}
if( typeof(action.data) ) data = action.data
if( typeof(data.data) ) data = Object.assign({}, data, data.data)
// construct our browser notification
var title = '';
var options = {
body: '',
dir: 'auto',
lang: 'EN',
tag: 'iris'
};
if( data.title ) title = data.title;
if( data.body ) options.body = data.body;
if( data.icon ) options.icon = data.icon;
// make it so
var notification = new notification( title, options );
break
2016-12-13 11:08:13 +13:00
case 'CREATE_NOTIFICATION':
// start a timeout to remove this notification
var timeout = setTimeout(
function(){
2016-12-14 08:29:24 +13:00
store.dispatch(uiActions.removeNotification(action.notification.id))
2016-12-13 11:08:13 +13:00
},
3000
)
next(action)
break
2016-12-14 08:29:24 +13:00
case 'PLAYLIST_TRACKS_ADDED':
store.dispatch(uiActions.createNotification('Added '+action.tracks_uris.length+' tracks to playlist'))
switch(helpers.uriSource(action.key)){
case 'spotify':
store.dispatch(spotifyActions.getPlaylist(action.key))
break
case 'm3u':
if( store.getState().mopidy.connected ) store.dispatch(mopidyActions.getPlaylist(action.key))
break
}
2016-12-15 12:54:41 +13:00
next(action)
break
case 'PLAYLIST_LOADED':
var playlist = Object.assign({}, action.playlist)
switch (helpers.uriSource(playlist.uri)){
case 'm3u':
playlist.can_edit = true
break
case 'spotify':
if (store.getState().spotify.authorized && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
// proceed as usual
action.playlist = playlist
next(action)
break
case 'PLAYLISTS_LOADED':
var playlists = []
for (var i = 0; i < action.playlists.length; i++){
var playlist = Object.assign({}, action.playlists[i])
switch (helpers.uriSource(playlist.uri)){
case 'm3u':
playlist.can_edit = true
break
case 'spotify':
if (store.getState().spotify.authorized && store.getState().spotify.me){
playlist.can_edit = (helpers.getFromUri('playlistowner',playlist.uri) == store.getState().spotify.me.id)
}
}
playlists.push(playlist)
}
// proceed as usual
action.playlists = playlists
next(action)
break
2016-12-15 12:54:41 +13:00
case 'MOPIDY_STATE':
helpers.setWindowTitle(store.getState().ui.current_track, action.data)
next(action)
break
case 'MOPIDY_CURRENTTLTRACK':
if( action.data && action.data.track ) helpers.setWindowTitle(action.data.track, store.getState().mopidy.play_state)
2016-12-14 08:29:24 +13:00
next(action)
break
case 'VERSION':
2017-02-18 22:04:05 +13:00
if( action.version.upgrade_available )
store.dispatch( uiActions.createNotification( 'Version '+action.version.latest+' is available. See settings to upgrade.' ) )
next( action )
break
2016-11-11 16:47:32 +13:00
// This action is irrelevant to us, pass it on to the next middleware
default:
2016-12-13 11:08:13 +13:00
return next(action)
2016-11-11 16:47:32 +13:00
}
}
})();
export default UIMiddleware