Files
Iris/src/js/store/index.js

252 lines
6.1 KiB
JavaScript
Executable File

import { createStore, applyMiddleware, combineReducers } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import localForage from 'localforage';
import thunk from 'redux-thunk';
import { generateGuid } from '../util/helpers';
import core from '../services/core/reducer';
import ui from '../services/ui/reducer';
import pusher from '../services/pusher/reducer';
import mopidy from '../services/mopidy/reducer';
import lastfm from '../services/lastfm/reducer';
import spotify from '../services/spotify/reducer';
import snapcast from '../services/snapcast/reducer';
import genius from '../services/genius/reducer';
import migration from './migration';
import coreMiddleware from '../services/core/middleware';
import uiMiddleware from '../services/ui/middleware';
import pusherMiddleware from '../services/pusher/middleware';
import mopidyMiddleware from '../services/mopidy/middleware';
import lastfmMiddleware from '../services/lastfm/middleware';
import geniusMiddleware from '../services/genius/middleware';
import spotifyMiddleware from '../services/spotify/middleware';
import snapcastMiddleware from '../services/snapcast/middleware';
let initialState = {
core: {
outputs: [],
queue: [],
queue_metadata: {},
current_track: null,
pinned: [],
albums: {},
artists: {},
playlists: {},
users: {},
tracks: {},
items: {},
libraries: {},
},
ui: {
language: 'en',
theme: 'auto',
smooth_scrolling_enabled: true,
hotkeys_enabled: true,
playback_controls_touch_enabled: true,
allow_reporting: true,
wide_scrollbar_enabled: false,
window_focus: true,
slim_mode: false,
selected_tracks: [],
notifications: {},
processes: {},
suppressed_broadcasts: [],
grid_glow_enabled: true,
},
mopidy: {
connected: false,
host: window.location.hostname,
port: (window.location.port ? window.location.port : (window.location.protocol === 'https:' ? '443' : '80')),
ssl: window.location.protocol === 'https:',
current_server: 'default',
servers: {
default: {
id: 'default',
name: 'Default',
host: window.location.hostname,
port: (window.location.port ? window.location.port : (window.location.protocol === 'https:' ? '443' : '80')),
ssl: window.location.protocol === 'https:',
},
},
mute: false,
volume: 0,
progress: 0,
play_state: null,
uri_schemes: [],
library_albums_uri: 'local:directory?type=album',
library_artists_uri: 'local:directory?type=artist&role=albumartist',
library_tracks_uri: 'local:directory?type=track',
},
pusher: {
connected: false,
username: generateGuid(),
client_id: generateGuid(),
connections: {},
version: {
current: null,
},
config: {},
},
lastfm: {
authorization_url: 'https://jamesbarnsley.co.nz/iris/auth_lastfm.php',
},
genius: {
authorization_url: 'https://jamesbarnsley.co.nz/iris/auth_genius.php',
},
spotify: {
autocomplete_results: {},
authorization_url: 'https://jamesbarnsley.co.nz/iris/auth_spotify.php',
},
snapcast: {
enabled: false,
connected: false,
host: window.location.hostname,
port: '1780',
ssl: (window.location.protocol === 'https:'),
streams: {},
groups: {},
clients: {},
server: null,
commands: {},
},
};
// Run any migrations
initialState = migration(initialState);
const corePersistConfig = {
key: 'core',
storage: localForage,
debug: window.test_mode,
blacklist: [
'items',
'albums',
'artists',
'playlists',
'search_results',
'users',
'tracks',
'libraries', // We manually hydrate this, so we can handle the rehydration of library items
],
};
const geniusPersistConfig = {
key: 'genius',
storage: localForage,
debug: window.test_mode,
};
const lastfmPersistConfig = {
key: 'lastfm',
storage: localForage,
debug: window.test_mode,
};
const snapcastPersistConfig = {
key: 'snapcast',
storage: localForage,
debug: window.test_mode,
};
const pusherPersistConfig = {
key: 'pusher',
storage: localForage,
blacklist: [
'connected',
'connections',
],
debug: window.test_mode,
};
const mopidyPersistConfig = {
key: 'mopidy',
storage: localForage,
debug: window.test_mode,
blacklist: [
'connected',
],
};
const spotifyPersistConfig = {
key: 'spotify',
storage: localForage,
debug: window.test_mode,
whitelist: [
'access_token',
'authorization',
'country',
'enabled',
'locale',
'me',
'refresh_token',
'token_expiry',
],
};
const uiPersistConfig = {
key: 'ui',
storage: localForage,
blacklist: [
'debug_response',
'load_queue',
'notifications',
'processes',
'context_menu',
'current_track_transition',
'dragger',
'selected_tracks',
'sidebar_open',
'window_focus',
],
debug: window.test_mode,
};
const appReducer = combineReducers({
core: persistReducer(corePersistConfig, core),
ui: persistReducer(uiPersistConfig, ui),
mopidy: persistReducer(mopidyPersistConfig, mopidy),
spotify: persistReducer(spotifyPersistConfig, spotify),
pusher: persistReducer(pusherPersistConfig, pusher),
genius: persistReducer(geniusPersistConfig, genius),
lastfm: persistReducer(lastfmPersistConfig, lastfm),
snapcast: persistReducer(snapcastPersistConfig, snapcast),
});
const rootReducer = (state, action) => {
let nextState = state;
if (action.type === 'RESET_STATE') {
console.log(action);
const { stateKeysToReset } = action;
const resetStates = {};
stateKeysToReset.forEach((key) => {
resetStates[key] = initialState[key];
});
nextState = {
...state,
...resetStates,
};
}
return appReducer(nextState, action);
};
const store = createStore(
rootReducer,
initialState,
applyMiddleware(
thunk,
coreMiddleware,
uiMiddleware,
mopidyMiddleware,
pusherMiddleware,
spotifyMiddleware,
lastfmMiddleware,
geniusMiddleware,
snapcastMiddleware,
),
);
const persistor = persistStore(store);
export default { store, persistor };
export { store, persistor };