Moving selector outside of mapStateToProps (d'oh)

This commit is contained in:
James Barnsley
2021-03-05 23:10:41 +13:00
parent 5b8627e2ef
commit f383ac0ee1
14 changed files with 151 additions and 128 deletions

View File

@ -133803,6 +133803,26 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
var onProfileRender = function onProfileRender(id, // the "id" prop of the Profiler tree that has just committed
phase, // either "mount" (if the tree just mounted) or "update" (if it re-rendered)
actualDuration, // time spent rendering the committed update
baseDuration, // estimated time to render the entire subtree without memoization
startTime, // when React began rendering this update
commitTime, // when React committed this update
interactions) // the Set of interactions belonging to this update
{
console.debug({
id: id,
phase: phase,
actualDuration: actualDuration,
baseDuration: baseDuration,
startTime: startTime,
commitTime: commitTime,
interactions: interactions
});
};
var App = /*#__PURE__*/function (_React$Component) {
_inherits(App, _React$Component);
@ -140802,6 +140822,7 @@ var Grid = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_0__["memo"])(funct
itemHeight = _useState2[0],
setItemHeight = _useState2[1];
console.debug('Render Grid');
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: "grid grid--".concat(items[0].type, "s ").concat(className, " ").concat(mini ? 'grid--mini' : ''),
"data-qa-node": "div",
@ -163905,7 +163926,7 @@ var ensureLoaded = function ensureLoaded(_ref3) {
/*!**********************************!*\
!*** ./src/js/util/selectors.js ***!
\**********************************/
/*! exports provided: getItem, getLibrary, getGridGlowEnabled, makeItemSelector, makeLibrarySelector, makeLoadingSelector, makeSearchResultsSelector, makeProcessProgressSelector, queueHistorySelector */
/*! exports provided: getItem, getLibrary, getGridGlowEnabled, getLibrarySource, makeItemSelector, makeLibrarySelector, makeLoadingSelector, makeSearchResultsSelector, makeProcessProgressSelector, queueHistorySelector */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -163913,6 +163934,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getItem", function() { return getItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibrary", function() { return getLibrary; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getGridGlowEnabled", function() { return getGridGlowEnabled; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLibrarySource", function() { return getLibrarySource; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeItemSelector", function() { return makeItemSelector; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeLibrarySelector", function() { return makeLibrarySelector; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "makeLoadingSelector", function() { return makeLoadingSelector; });
@ -164003,8 +164025,21 @@ var queueHistorySelector = Object(reselect__WEBPACK_IMPORTED_MODULE_0__["createS
});
});
var makeLibrarySelector = function makeLibrarySelector(uris) {
return Object(reselect__WEBPACK_IMPORTED_MODULE_0__["createSelector"])([getLibraries, getItems], function (libraries, items) {
var getLibrarySource = function getLibrarySource(state, name) {
return state.ui["library_".concat(name, "_source")] || 'all';
};
var makeLibrarySelector = function makeLibrarySelector(name) {
return Object(reselect__WEBPACK_IMPORTED_MODULE_0__["createSelector"])([getLibraries, getItems, getLibrarySource], function (libraries, items, source) {
console.debug('Running library selector', {
libraries: libraries,
items: items,
source: source
});
var uris = [];
if (source === 'all' || source === 'local') uris.push("mopidy:library:".concat(name));
if (source === 'all' || source === 'spotify') uris.push("spotify:library:".concat(name));
if (source === 'all' || source === 'google') uris.push("google:library:".concat(name));
var itemUris = Object(_arrays__WEBPACK_IMPORTED_MODULE_1__["indexToArray"])(libraries, uris).reduce(function (acc, library) {
return [].concat(_toConsumableArray(acc), _toConsumableArray(library.items_uris));
}, []);
@ -172568,22 +172603,18 @@ var LibraryAlbums = /*#__PURE__*/function (_React$Component) {
return LibraryAlbums;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_18__["makeLibrarySelector"])('albums');
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_18__["makeProcessProgressSelector"])(processKeys);
var mapStateToProps = function mapStateToProps(state) {
var source = state.ui.library_albums_source ? state.ui.library_albums_source : 'all';
var libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:albums');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:albums');
if (source === 'all' || source === 'google') libraryUris.push('google:library:albums');
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_18__["makeLibrarySelector"])(libraryUris);
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_18__["makeProcessProgressSelector"])(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
albums: librarySelector(state),
albums: librarySelector(state, 'albums'),
google_available: state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:'),
spotify_available: state.spotify.access_token,
view: state.ui.library_albums_view,
source: source,
source: Object(_util_selectors__WEBPACK_IMPORTED_MODULE_18__["getLibrarySource"])(state, 'albums'),
sort: state.ui.library_albums_sort,
sort_reverse: state.ui.library_albums_sort_reverse
};
@ -172999,21 +173030,17 @@ var LibraryArtists = /*#__PURE__*/function (_React$Component) {
return LibraryArtists;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_15__["makeLibrarySelector"])('artists');
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_15__["makeProcessProgressSelector"])(processKeys);
var mapStateToProps = function mapStateToProps(state) {
var source = state.ui.library_artists_source || 'all';
var libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:artists');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:artists');
if (source === 'all' || source === 'google') libraryUris.push('google:library:artists');
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_15__["makeLibrarySelector"])(libraryUris);
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_15__["makeProcessProgressSelector"])(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
google_available: state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:'),
spotify_available: state.spotify.access_token,
artists: librarySelector(state),
source: source,
artists: librarySelector(state, 'artists'),
source: Object(_util_selectors__WEBPACK_IMPORTED_MODULE_15__["getLibrarySource"])(state, 'artists'),
sort: state.ui.library_artists_sort ? state.ui.library_artists_sort : null,
sort_reverse: state.ui.library_artists_sort_reverse ? state.ui.library_artists_sort_reverse : false,
view: state.ui.library_artists_view
@ -173262,13 +173289,14 @@ var LibraryBrowse = /*#__PURE__*/function (_React$Component) {
return LibraryBrowse;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_11__["makeLoadingSelector"])(['(.*)mopidy_library.browse(.*)']);
var mapStateToProps = function mapStateToProps(state) {
var _state$mopidy$directo = state.mopidy.directory,
_directory = _state$mopidy$directo === void 0 ? {} : _state$mopidy$directo,
view = state.ui.library_directory_view;
var directory = _directory && _directory.uri === null ? _directory : null;
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_11__["makeLoadingSelector"])(['(.*)mopidy_library.browse(.*)']);
return {
loading: loadingSelector(state),
directory: directory,
@ -173691,6 +173719,8 @@ var LibraryBrowseDirectory = /*#__PURE__*/function (_React$Component) {
return LibraryBrowseDirectory;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_20__["makeLoadingSelector"])(['mopidy_library.(browse|lookup)']);
var mapStateToProps = function mapStateToProps(state, ownProps) {
var _state$mopidy$directo = state.mopidy.directory,
_directory = _state$mopidy$directo === void 0 ? {} : _state$mopidy$directo,
@ -173700,7 +173730,6 @@ var mapStateToProps = function mapStateToProps(state, ownProps) {
var uriMatcher = [uri, decodeURIComponent(uri)]; // Lenient matching due to encoding diffs
var directory = _directory && uriMatcher.includes(_directory.uri) ? _directory : undefined;
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_20__["makeLoadingSelector"])(['mopidy_library.(browse|lookup)']);
return {
uri: uri,
name: decodeURIComponent(ownProps.match.params.name),
@ -174142,24 +174171,20 @@ var LibraryPlaylists = /*#__PURE__*/function (_React$Component) {
return LibraryPlaylists;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeLibrarySelector"])('playlists');
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeProcessProgressSelector"])(processKeys);
var mapStateToProps = function mapStateToProps(state) {
var source = state.ui.library_playlists_source || 'all';
var _state$spotify$me = state.spotify.me;
_state$spotify$me = _state$spotify$me === void 0 ? {} : _state$spotify$me;
var me_id = _state$spotify$me.id;
var libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:playlists');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:playlists');
if (source === 'all' || source === 'google') libraryUris.push('google:library:playlists');
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeLibrarySelector"])(libraryUris);
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeProcessProgressSelector"])(processKeys);
return {
slim_mode: state.ui.slim_mode,
mopidy_uri_schemes: state.mopidy.uri_schemes,
spotify_available: state.spotify.access_token,
playlists: librarySelector(state),
playlists: librarySelector(state, 'playlists'),
loading_progress: processProgressSelector(state),
source: source,
source: Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["getLibrarySource"])(state, 'playlists'),
me_id: me_id,
view: state.ui.library_playlists_view,
sort: state.ui.library_playlists_sort ? state.ui.library_playlists_sort : null,
@ -174577,20 +174602,17 @@ var LibraryTracks = /*#__PURE__*/function (_React$Component) {
return LibraryTracks;
}(react__WEBPACK_IMPORTED_MODULE_0___default.a.Component);
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeLibrarySelector"])('tracks');
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeProcessProgressSelector"])(processKeys);
var mapStateToProps = function mapStateToProps(state) {
var source = state.ui.library_tracks_source ? state.ui.library_tracks_source : 'all';
var libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:tracks');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:tracks');
var librarySelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeLibrarySelector"])(libraryUris);
var processProgressSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["makeProcessProgressSelector"])(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
tracks: librarySelector(state),
spotify_available: state.spotify.access_token,
view: state.ui.library_tracks_view,
source: source,
source: Object(_util_selectors__WEBPACK_IMPORTED_MODULE_17__["getLibrarySource"])(state, 'tracks'),
sort: state.ui.library_tracks_sort,
sort_reverse: state.ui.library_tracks_sort_reverse
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -106,7 +106,7 @@
// Release details
// These are automatically injected to built HTML
var build = "1614758372";
var build = "1614938361";
var version = "3.56.1";
// Construct the script tag

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, { Profiler } from 'react';
import { bindActionCreators } from 'redux';
import { Route, Switch } from 'react-router-dom';
import { connect } from 'react-redux';
@ -66,6 +66,26 @@ import * as geniusActions from './services/genius/actions';
import * as snapcastActions from './services/snapcast/actions';
import MediaSession from './components/MediaSession';
const onProfileRender = (
id, // the "id" prop of the Profiler tree that has just committed
phase, // either "mount" (if the tree just mounted) or "update" (if it re-rendered)
actualDuration, // time spent rendering the committed update
baseDuration, // estimated time to render the entire subtree without memoization
startTime, // when React began rendering this update
commitTime, // when React committed this update
interactions, // the Set of interactions belonging to this update
) => {
console.debug({
id,
phase,
actualDuration,
baseDuration,
startTime,
commitTime,
interactions,
});
};
export class App extends React.Component {
constructor(props) {
super(props);

View File

@ -11,6 +11,8 @@ const Grid = memo(({
if (!items || !items.length) return null;
const [itemHeight, setItemHeight] = useState(0);
console.debug('Render Grid')
return (
<div className={`grid grid--${items[0].type}s ${className} ${mini ? 'grid--mini' : ''}`}>
<ErrorBoundary>

View File

@ -1,4 +1,4 @@
import React, { useEffect } from 'react';
import React, { useEffect, memo } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import handleViewport from 'react-in-viewport';
import { scrollTo, sourceIcon } from '../util/helpers';

View File

@ -38,9 +38,16 @@ const queueHistorySelector = createSelector(
},
);
const makeLibrarySelector = (uris) => createSelector(
[getLibraries, getItems],
(libraries, items) => {
const getLibrarySource = (state, name) => state.ui[`library_${name}_source`] || 'all';
const makeLibrarySelector = (name) => createSelector(
[getLibraries, getItems, getLibrarySource],
(libraries, items, source) => {
console.debug('Running library selector', { libraries, items, source})
const uris = [];
if (source === 'all' || source === 'local') uris.push(`mopidy:library:${name}`);
if (source === 'all' || source === 'spotify') uris.push(`spotify:library:${name}`);
if (source === 'all' || source === 'google') uris.push(`google:library:${name}`);
const itemUris = indexToArray(libraries, uris).reduce(
(acc, library) => [...acc, ...library.items_uris],
[],
@ -84,6 +91,7 @@ export {
getItem,
getLibrary,
getGridGlowEnabled,
getLibrarySource,
makeItemSelector,
makeLibrarySelector,
makeLoadingSelector,

View File

@ -19,6 +19,7 @@ import Loader from '../../components/Loader';
import {
makeLibrarySelector,
makeProcessProgressSelector,
getLibrarySource,
} from '../../util/selectors';
const processKeys = [
@ -329,29 +330,19 @@ class LibraryAlbums extends React.Component {
}
}
const mapStateToProps = (state) => {
const source = state.ui.library_albums_source ? state.ui.library_albums_source : 'all';
const libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:albums');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:albums');
if (source === 'all' || source === 'google') libraryUris.push('google:library:albums');
const librarySelector = makeLibrarySelector(libraryUris);
const processProgressSelector = makeProcessProgressSelector(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
albums: librarySelector(state),
google_available: (state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:')),
spotify_available: state.spotify.access_token,
view: state.ui.library_albums_view,
source,
sort: state.ui.library_albums_sort,
sort_reverse: state.ui.library_albums_sort_reverse,
};
};
const librarySelector = makeLibrarySelector('albums');
const processProgressSelector = makeProcessProgressSelector(processKeys);
const mapStateToProps = (state) => ({
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
albums: librarySelector(state, 'albums'),
google_available: (state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:')),
spotify_available: state.spotify.access_token,
view: state.ui.library_albums_view,
source: getLibrarySource(state, 'albums'),
sort: state.ui.library_albums_sort,
sort_reverse: state.ui.library_albums_sort_reverse,
});
const mapDispatchToProps = (dispatch) => ({
coreActions: bindActionCreators(coreActions, dispatch),
uiActions: bindActionCreators(uiActions, dispatch),

View File

@ -16,6 +16,7 @@ import Loader from '../../components/Loader';
import {
makeLibrarySelector,
makeProcessProgressSelector,
getLibrarySource,
} from '../../util/selectors';
const processKeys = [
@ -298,28 +299,19 @@ class LibraryArtists extends React.Component {
}
}
const mapStateToProps = (state) => {
const source = state.ui.library_artists_source || 'all';
const libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:artists');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:artists');
if (source === 'all' || source === 'google') libraryUris.push('google:library:artists');
const librarySelector = makeLibrarySelector(libraryUris);
const processProgressSelector = makeProcessProgressSelector(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
google_available: (state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:')),
spotify_available: (state.spotify.access_token),
artists: librarySelector(state),
source,
sort: (state.ui.library_artists_sort ? state.ui.library_artists_sort : null),
sort_reverse: (state.ui.library_artists_sort_reverse ? state.ui.library_artists_sort_reverse : false),
view: state.ui.library_artists_view,
};
};
const librarySelector = makeLibrarySelector('artists');
const processProgressSelector = makeProcessProgressSelector(processKeys);
const mapStateToProps = (state) => ({
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
google_available: (state.mopidy.uri_schemes && state.mopidy.uri_schemes.includes('gmusic:')),
spotify_available: (state.spotify.access_token),
artists: librarySelector(state, 'artists'),
source: getLibrarySource(state, 'artists'),
sort: (state.ui.library_artists_sort ? state.ui.library_artists_sort : null),
sort_reverse: (state.ui.library_artists_sort_reverse ? state.ui.library_artists_sort_reverse : false),
view: state.ui.library_artists_view,
});
const mapDispatchToProps = (dispatch) => ({
uiActions: bindActionCreators(uiActions, dispatch),

View File

@ -126,6 +126,7 @@ class LibraryBrowse extends React.Component {
}
}
const loadingSelector = makeLoadingSelector(['(.*)mopidy_library.browse(.*)']);
const mapStateToProps = (state) => {
const {
mopidy: {
@ -136,7 +137,6 @@ const mapStateToProps = (state) => {
},
} = state;
const directory = _directory && _directory.uri === null ? _directory : null;
const loadingSelector = makeLoadingSelector(['(.*)mopidy_library.browse(.*)']);
return {
loading: loadingSelector(state),

View File

@ -280,6 +280,7 @@ class LibraryBrowseDirectory extends React.Component {
}
}
const loadingSelector = makeLoadingSelector(['mopidy_library.(browse|lookup)']);
const mapStateToProps = (state, ownProps) => {
const {
mopidy: {
@ -294,7 +295,6 @@ const mapStateToProps = (state, ownProps) => {
const directory = _directory && uriMatcher.includes(_directory.uri)
? _directory
: undefined;
const loadingSelector = makeLoadingSelector(['mopidy_library.(browse|lookup)']);
return {
uri,

View File

@ -18,6 +18,7 @@ import Loader from '../../components/Loader';
import {
makeLibrarySelector,
makeProcessProgressSelector,
getLibrarySource,
} from '../../util/selectors';
const processKeys = [
@ -304,8 +305,9 @@ class LibraryPlaylists extends React.Component {
}
}
const librarySelector = makeLibrarySelector('playlists');
const processProgressSelector = makeProcessProgressSelector(processKeys);
const mapStateToProps = (state) => {
const source = state.ui.library_playlists_source || 'all';
const {
spotify: {
me: {
@ -314,20 +316,13 @@ const mapStateToProps = (state) => {
},
} = state;
const libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:playlists');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:playlists');
if (source === 'all' || source === 'google') libraryUris.push('google:library:playlists');
const librarySelector = makeLibrarySelector(libraryUris);
const processProgressSelector = makeProcessProgressSelector(processKeys);
return {
slim_mode: state.ui.slim_mode,
mopidy_uri_schemes: state.mopidy.uri_schemes,
spotify_available: state.spotify.access_token,
playlists: librarySelector(state),
playlists: librarySelector(state, 'playlists'),
loading_progress: processProgressSelector(state),
source,
source: getLibrarySource(state, 'playlists'),
me_id,
view: state.ui.library_playlists_view,
sort: (state.ui.library_playlists_sort ? state.ui.library_playlists_sort : null),

View File

@ -18,6 +18,7 @@ import Loader from '../../components/Loader';
import {
makeLibrarySelector,
makeProcessProgressSelector,
getLibrarySource,
} from '../../util/selectors';
const processKeys = [
@ -312,26 +313,18 @@ class LibraryTracks extends React.Component {
}
}
const mapStateToProps = (state) => {
const source = state.ui.library_tracks_source ? state.ui.library_tracks_source : 'all';
const libraryUris = [];
if (source === 'all' || source === 'local') libraryUris.push('mopidy:library:tracks');
if (source === 'all' || source === 'spotify') libraryUris.push('spotify:library:tracks');
const librarySelector = makeLibrarySelector(libraryUris);
const processProgressSelector = makeProcessProgressSelector(processKeys);
return {
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
tracks: librarySelector(state),
spotify_available: state.spotify.access_token,
view: state.ui.library_tracks_view,
source,
sort: state.ui.library_tracks_sort,
sort_reverse: state.ui.library_tracks_sort_reverse,
};
};
const librarySelector = makeLibrarySelector('tracks');
const processProgressSelector = makeProcessProgressSelector(processKeys);
const mapStateToProps = (state) => ({
loading_progress: processProgressSelector(state),
mopidy_uri_schemes: state.mopidy.uri_schemes,
tracks: librarySelector(state),
spotify_available: state.spotify.access_token,
view: state.ui.library_tracks_view,
source: getLibrarySource(state, 'tracks'),
sort: state.ui.library_tracks_sort,
sort_reverse: state.ui.library_tracks_sort_reverse,
});
const mapDispatchToProps = (dispatch) => ({
coreActions: bindActionCreators(coreActions, dispatch),