Files
Iris/src/js/util/selectors.js

84 lines
2.4 KiB
JavaScript
Executable File

import { createSelector } from 'reselect';
import { indexToArray } from './arrays';
import { isLoading } from './helpers';
const getItem = (state, uri) => state.core.items[uri];
const getItems = (state) => state.core.items;
const getLoadQueue = (state) => state.ui.load_queue;
const getProcesses = (state) => state.ui.processes;
const getLibrary = (state, uri) => state.core.libraries[uri];
const getLibraries = (state) => state.core.libraries;
const getSearchResults = (state) => state.core.search_results;
const getGridGlowEnabled = (state) => state.ui.grid_glow_enabled;
const makeItemSelector = (uri) => createSelector(
[getItems],
(items) => {
if (Array.isArray(uri)) {
return indexToArray(items, uri);
}
return items[uri];
},
);
const makeLoadingSelector = (keys) => createSelector(
[getLoadQueue],
(loadQueue) => isLoading(loadQueue, keys),
);
const getQueueHistory = (state) => state.mopidy.queue_history;
const queueHistorySelector = createSelector(
[getItems, getQueueHistory],
(items, queueHistory) => queueHistory.map((item) => ({
...item,
...(items[item.uri] || {}),
})),
);
const makeLibrarySelector = (uris) => createSelector(
[getLibraries, getItems],
(libraries, items) => {
const itemUris = indexToArray(libraries, uris).reduce(
(acc, library) => [...acc, ...library.items_uris],
[],
);
return indexToArray(items, itemUris);
},
);
const makeSearchResultsSelector = (term, type) => createSelector(
[getSearchResults],
(searchResults) => {
if (!searchResults || searchResults.query.term !== term) return [];
return searchResults[type] || [];
},
);
const makeProcessProgressSelector = (keys) => createSelector(
[getProcesses],
(processes) => {
const selectedProcesses = keys
.map((key) => processes[key] || {})
.filter((i) => i.status === 'running');
let total = 0;
let remaining = 0;
selectedProcesses.forEach((process) => {
if (process.total) total += process.total;
if (process.remaining) remaining += process.remaining;
});
return total && remaining ? ((total - remaining) / total).toFixed(4) : 1;
},
);
export {
getItem,
getLibrary,
getGridGlowEnabled,
makeItemSelector,
makeLibrarySelector,
makeLoadingSelector,
makeSearchResultsSelector,
makeProcessProgressSelector,
queueHistorySelector,
};