Refactor of isLoading for array of matches now staggered
This commit is contained in:
@ -115820,19 +115820,22 @@ var CoreMiddleware = function () {
|
||||
|
||||
case 'LOAD_TRACK':
|
||||
{
|
||||
var uri = action.uri,
|
||||
_options2 = action.options;
|
||||
|
||||
var _fetch = function _fetch() {
|
||||
switch (Object(_util_helpers__WEBPACK_IMPORTED_MODULE_6__["uriSource"])(action.uri)) {
|
||||
case 'spotify':
|
||||
store.dispatch(spotifyActions.getTrack(action.uri, action.options));
|
||||
store.dispatch(spotifyActions.getTrack(uri, _options2));
|
||||
|
||||
if (spotify.me) {
|
||||
store.dispatch(spotifyActions.following(action.uri));
|
||||
store.dispatch(spotifyActions.following(uri));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
store.dispatch(mopidyActions.getTrack(action.uri, action.options));
|
||||
store.dispatch(mopidyActions.getTrack(uri, _options2));
|
||||
break;
|
||||
}
|
||||
};
|
||||
@ -115842,7 +115845,7 @@ var CoreMiddleware = function () {
|
||||
action: action,
|
||||
fetch: _fetch,
|
||||
dependents: ['images'],
|
||||
fullDependents: ['lyrics_results'],
|
||||
fullDependents: _options2.lyrics ? ['lyrics_results'] : [],
|
||||
type: 'track'
|
||||
});
|
||||
next(action);
|
||||
@ -119684,9 +119687,12 @@ var MopidyMiddleware = function () {
|
||||
|
||||
case 'MOPIDY_GET_TRACKS':
|
||||
{
|
||||
var full = action.options.full;
|
||||
var _uris = action.uris,
|
||||
_action$options = action.options,
|
||||
full = _action$options.full,
|
||||
lyrics = _action$options.lyrics;
|
||||
request(store, 'library.lookup', {
|
||||
uris: action.uris
|
||||
uris: _uris
|
||||
}).then(function (_response) {
|
||||
if (!_response) return;
|
||||
var tracks = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["compact"])(Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["indexToArray"])(_response).map(function (results) {
|
||||
@ -119694,18 +119700,17 @@ var MopidyMiddleware = function () {
|
||||
}));
|
||||
store.dispatch(coreActions.itemsLoaded(tracks));
|
||||
store.dispatch(mopidyActions.getImages(Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["arrayOf"])('uri', tracks)));
|
||||
|
||||
if (full) {
|
||||
tracks.forEach(function (track) {
|
||||
tracks.forEach(function (track) {
|
||||
if (full) {
|
||||
if (store.getState().lastfm.authorization) {
|
||||
store.dispatch(lastfmActions.getTrack(track.uri));
|
||||
}
|
||||
}
|
||||
|
||||
if (store.getState().genius.authorization) {
|
||||
store.dispatch(geniusActions.findTrackLyrics(track.uri));
|
||||
}
|
||||
});
|
||||
}
|
||||
if (lyrics && store.getState().genius.authorization) {
|
||||
store.dispatch(geniusActions.findTrackLyrics(track.uri));
|
||||
}
|
||||
});
|
||||
}, function (error) {
|
||||
store.dispatch(coreActions.handleException("Mopidy: ".concat(error.message ? error.message : 'Could not get track'), error));
|
||||
});
|
||||
@ -119743,10 +119748,10 @@ var MopidyMiddleware = function () {
|
||||
|
||||
case 'MOPIDY_GET_IMAGES':
|
||||
{
|
||||
var _uris = action.uris;
|
||||
if (!_uris) break;
|
||||
var _uris2 = action.uris;
|
||||
if (!_uris2) break;
|
||||
request(store, 'library.getImages', {
|
||||
uris: _uris
|
||||
uris: _uris2
|
||||
}).then(function (response) {
|
||||
var itemsWithImages = [];
|
||||
Object.keys(response).forEach(function (uri) {
|
||||
@ -120003,7 +120008,7 @@ var MopidyMiddleware = function () {
|
||||
|
||||
var run = function run() {
|
||||
if (allUris.length) {
|
||||
var _uris2 = allUris.splice(0, 100);
|
||||
var _uris3 = allUris.splice(0, 100);
|
||||
|
||||
var processor = store.getState().ui.processes[action.type];
|
||||
|
||||
@ -120017,7 +120022,7 @@ var MopidyMiddleware = function () {
|
||||
remaining: allUris.length
|
||||
}));
|
||||
request(store, 'library.lookup', {
|
||||
uris: _uris2
|
||||
uris: _uris3
|
||||
}).then(function (lookupResponse) {
|
||||
var libraryItems = Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["indexToArray"])(lookupResponse).map(function (tracks) {
|
||||
return _objectSpread({
|
||||
@ -120061,7 +120066,7 @@ var MopidyMiddleware = function () {
|
||||
|
||||
var run = function run() {
|
||||
if (allUris.length) {
|
||||
var _uris3 = allUris.splice(0, 100);
|
||||
var _uris4 = allUris.splice(0, 100);
|
||||
|
||||
var processor = store.getState().ui.processes[action.type];
|
||||
|
||||
@ -120075,7 +120080,7 @@ var MopidyMiddleware = function () {
|
||||
remaining: allUris.length
|
||||
}));
|
||||
request(store, 'library.lookup', {
|
||||
uris: _uris3
|
||||
uris: _uris4
|
||||
}).then(function (lookupResponse) {
|
||||
var libraryItems = Object(lodash__WEBPACK_IMPORTED_MODULE_3__["compact"])(Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["indexToArray"])(lookupResponse).map(function (results) {
|
||||
return results.length ? Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["formatTrack"])(results[0]) : null;
|
||||
@ -122630,6 +122635,10 @@ var request = function request(_ref) {
|
||||
var loaderId = Object(_util_helpers__WEBPACK_IMPORTED_MODULE_2__["generateGuid"])();
|
||||
var loaderKey = "spotify_".concat(uri ? "uri_".concat(uri) : '', "_endpoint_").concat(endpoint);
|
||||
dispatch(uiActions.startLoading(loaderId, loaderKey));
|
||||
console.debug({
|
||||
loaderId: loaderId,
|
||||
loaderKey: loaderKey
|
||||
});
|
||||
return new Promise(function (resolve, reject) {
|
||||
getToken(dispatch, getState).then(function (response) {
|
||||
// prepend the API baseurl, unless the endpoint already has it (ie pagination requests)
|
||||
@ -122872,7 +122881,8 @@ function getMe() {
|
||||
}
|
||||
function getTrack(uri, _ref2) {
|
||||
var forceRefetch = _ref2.forceRefetch,
|
||||
full = _ref2.full;
|
||||
full = _ref2.full,
|
||||
lyrics = _ref2.lyrics;
|
||||
return function (dispatch, getState) {
|
||||
var endpoint = "tracks/".concat(Object(_util_helpers__WEBPACK_IMPORTED_MODULE_2__["getFromUri"])('trackid', uri));
|
||||
if (forceRefetch) endpoint += "?refetch=".concat(Date.now());
|
||||
@ -122889,10 +122899,10 @@ function getTrack(uri, _ref2) {
|
||||
if (getState().lastfm.authorization) {
|
||||
dispatch(lastfmActions.getTrack(uri));
|
||||
}
|
||||
}
|
||||
|
||||
if (getState().genius.authorization) {
|
||||
dispatch(geniusActions.findTrackLyrics(uri));
|
||||
}
|
||||
if (lyrics && getState().genius.authorization) {
|
||||
dispatch(geniusActions.findTrackLyrics(uri));
|
||||
}
|
||||
});
|
||||
};
|
||||
@ -126667,18 +126677,14 @@ var formatSimpleObjects = function formatSimpleObjects() {
|
||||
/**
|
||||
* Prepare a URI for use in a URL
|
||||
*
|
||||
* Needs to have all special characters encoded to avoid being parsed incorrectly, especially
|
||||
* '/' as this is a URL parameter delimiter
|
||||
* Simple alias to encodeURIComponent so this can be extended as needed
|
||||
* @param {String} uri
|
||||
*/
|
||||
|
||||
|
||||
var encodeUri = function encodeUri() {
|
||||
var rawUri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
||||
var uri = encodeURIComponent(rawUri); // Double-encode percent symbol as Mopidy requires some encoded elements
|
||||
//uri = uri.replace(/%/g, '%25');
|
||||
|
||||
return uri;
|
||||
return encodeURIComponent(rawUri);
|
||||
};
|
||||
/**
|
||||
* Rebuild a URI with some ugly-ass handling of encoding.
|
||||
@ -126712,6 +126718,7 @@ var decodeUri = function decodeUri() {
|
||||
uri = uri.replace(/@/g, '%40');
|
||||
uri = uri.replace(/#/g, '%23');
|
||||
uri = uri.replace(/\$/g, '%24');
|
||||
uri = uri.replace(/&/g, '%26');
|
||||
uri = uri.replace(/'/g, '%27');
|
||||
uri = uri.replace(/,/g, '%2C');
|
||||
uri = uri.replace(/ /g, '%20');
|
||||
@ -127927,16 +127934,31 @@ var isNumeric = function isNumeric(value) {
|
||||
var isObject = function isObject(value) {
|
||||
return value instanceof Object && value.constructor === Object;
|
||||
};
|
||||
/**
|
||||
* Convert an array of strings to an array of RegExp objects
|
||||
*
|
||||
* @param {Array} keys
|
||||
*/
|
||||
|
||||
|
||||
var toRegExp = function toRegExp(keys) {
|
||||
return keys.map(function (key) {
|
||||
try {
|
||||
return new RegExp(key);
|
||||
} catch (_unused) {
|
||||
// Fucks with unit tests, but helpful for debugging.
|
||||
// console.error('Could not convert string to RegEx', key);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
};
|
||||
/**
|
||||
* Detect if an item is in the loading queue. We simply loop all load items to
|
||||
* see if any items contain our searched key.
|
||||
* see if any load queue keys match our 'includes' expression AND our 'excludes' expression(s)
|
||||
*
|
||||
* TODO: Explore performance of this
|
||||
* TODO: Allow wildcards
|
||||
*
|
||||
* @param load_queue = obj (passed from store)
|
||||
* @param key = string (the string to lookup)
|
||||
* @return boolean
|
||||
* @param {Object} load_queue (passed from store)
|
||||
* @param {Array} keys array of regex strings
|
||||
* @return {Boolean}
|
||||
* */
|
||||
|
||||
|
||||
@ -127944,22 +127966,14 @@ var isLoading = function isLoading() {
|
||||
var load_queue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||||
var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
||||
if (!load_queue || !keys) return false;
|
||||
var expressions = toRegExp(keys);
|
||||
var queue = Object(_arrays__WEBPACK_IMPORTED_MODULE_0__["indexToArray"])(load_queue);
|
||||
var matches = keys.reduce(function (acc, key) {
|
||||
var regex = '';
|
||||
|
||||
try {
|
||||
regex = new RegExp(key);
|
||||
} catch (_unused) {
|
||||
// Fucks with unit tests, but helpful for debugging.
|
||||
// console.error('Invalid regular expression', keys);
|
||||
return acc;
|
||||
}
|
||||
|
||||
return [].concat(_toConsumableArray(acc), _toConsumableArray(queue.filter(function (qk) {
|
||||
return qk.match(regex);
|
||||
})));
|
||||
}, []);
|
||||
var matches = queue.filter(function (qk) {
|
||||
var matchingExpressions = keys.filter(function (exp) {
|
||||
return qk.match(exp);
|
||||
});
|
||||
return matchingExpressions.length === expressions.length;
|
||||
});
|
||||
return matches.length > 0;
|
||||
};
|
||||
/**
|
||||
@ -130766,7 +130780,7 @@ var ensureLoaded = function ensureLoaded(_ref3) {
|
||||
var uris = dependentUris(item);
|
||||
|
||||
if (uris.length) {
|
||||
console.log("Loading ".concat(uris.length, " dependents"));
|
||||
console.info("Loading ".concat(uris.length, " dependents"));
|
||||
store.dispatch(coreActions.loadItems(type, uris));
|
||||
}
|
||||
|
||||
@ -131590,7 +131604,7 @@ var Album = /*#__PURE__*/function (_React$Component) {
|
||||
var mapStateToProps = function mapStateToProps(state, ownProps) {
|
||||
var uri = decodeURIComponent(ownProps.match.params.uri);
|
||||
var itemSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeItemSelector"])(uri);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeLoadingSelector"])(["^(.*)".concat(uri, "(.*)(?!contains)(.*)$")]);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeLoadingSelector"])(["(.*)".concat(uri, "(.*)"), '^((?!contains).)*$', '^((?!me/albums).)*$']);
|
||||
return {
|
||||
uri: uri,
|
||||
slim_mode: state.ui.slim_mode,
|
||||
@ -132484,7 +132498,7 @@ var Artist = /*#__PURE__*/function (_React$Component) {
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state, ownProps) {
|
||||
var uri = decodeURIComponent(ownProps.match.params.uri);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_27__["makeLoadingSelector"])(["(.*)".concat(uri, "(.*)")]);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_27__["makeLoadingSelector"])(["(.*)".concat(uri, "(.*)"), '^((?!contains).)*$', '^((?!/albums).)*$', '^((?!related-artists).)*$', '^((?!top-tracks).)*$']);
|
||||
var artistSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_27__["makeItemSelector"])(uri);
|
||||
var artist = artistSelector(state);
|
||||
var albums = null;
|
||||
@ -136555,22 +136569,13 @@ var Track = /*#__PURE__*/function (_React$Component) {
|
||||
var _this$props = _this.props,
|
||||
uri = _this$props.uri,
|
||||
track = _this$props.track,
|
||||
genius_authorized = _this$props.genius_authorized,
|
||||
lastfm_authorized = _this$props.lastfm_authorized,
|
||||
loadTrack = _this$props.coreActions.loadTrack,
|
||||
findTrackLyrics = _this$props.geniusActions.findTrackLyrics,
|
||||
getTrack = _this$props.lastfmActions.getTrack;
|
||||
loadTrack = _this$props.coreActions.loadTrack;
|
||||
|
||||
if (prevUri !== uri) {
|
||||
loadTrack(Object(_util_format__WEBPACK_IMPORTED_MODULE_24__["decodeUri"])(uri));
|
||||
} // We have just received our full track or our track artists
|
||||
|
||||
|
||||
if (!prevTrack && track || prevTrack && !prevTrack.artists && track.artists) {
|
||||
_this.setWindowTitle(track);
|
||||
|
||||
if (lastfm_authorized) getTrack(track.uri);
|
||||
if (genius_authorized && !track.lyrics_results) findTrackLyrics(track);
|
||||
loadTrack(Object(_util_format__WEBPACK_IMPORTED_MODULE_24__["decodeUri"])(uri), {
|
||||
full: true,
|
||||
lyrics: true
|
||||
});
|
||||
}
|
||||
|
||||
if (!prevTrack && track) _this.setWindowTitle(track);
|
||||
@ -136804,7 +136809,10 @@ var Track = /*#__PURE__*/function (_React$Component) {
|
||||
uri = _this$props5.uri,
|
||||
track = _this$props5.track,
|
||||
loadTrack = _this$props5.coreActions.loadTrack;
|
||||
loadTrack(Object(_util_format__WEBPACK_IMPORTED_MODULE_24__["decodeUri"])(uri));
|
||||
loadTrack(Object(_util_format__WEBPACK_IMPORTED_MODULE_24__["decodeUri"])(uri), {
|
||||
full: true,
|
||||
lyrics: true
|
||||
});
|
||||
|
||||
if (track) {
|
||||
this.setWindowTitle(track);
|
||||
@ -136817,9 +136825,10 @@ var Track = /*#__PURE__*/function (_React$Component) {
|
||||
|
||||
var mapStateToProps = function mapStateToProps(state, ownProps) {
|
||||
var uri = Object(_util_format__WEBPACK_IMPORTED_MODULE_24__["decodeUri"])(ownProps.match.params.uri);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeLoadingSelector"])(["^(?!genius)(.*)".concat(uri, "(.*)$")]);
|
||||
var loadingSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeLoadingSelector"])(["(.*)".concat(uri, "(.*)"), '^((?!genius).)*$', '^((?!contains).)*$']);
|
||||
var loadingLyricsSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeLoadingSelector"])(["^genius_(.*)lyrics_".concat(uri, "$")]);
|
||||
var trackSelector = Object(_util_selectors__WEBPACK_IMPORTED_MODULE_23__["makeItemSelector"])(uri);
|
||||
console.debug("^(?!genius)(.*)".concat(uri, "(.*)(?!contains)(.*)$"));
|
||||
return {
|
||||
uri: uri,
|
||||
slim_mode: state.ui.slim_mode,
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -390,18 +390,20 @@ const CoreMiddleware = (function () {
|
||||
}
|
||||
|
||||
case 'LOAD_TRACK': {
|
||||
const { uri, options } = action;
|
||||
|
||||
const fetch = () => {
|
||||
switch (uriSource(action.uri)) {
|
||||
case 'spotify':
|
||||
store.dispatch(spotifyActions.getTrack(action.uri, action.options));
|
||||
store.dispatch(spotifyActions.getTrack(uri, options));
|
||||
|
||||
if (spotify.me) {
|
||||
store.dispatch(spotifyActions.following(action.uri));
|
||||
store.dispatch(spotifyActions.following(uri));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
store.dispatch(mopidyActions.getTrack(action.uri, action.options));
|
||||
store.dispatch(mopidyActions.getTrack(uri, options));
|
||||
break;
|
||||
}
|
||||
};
|
||||
@ -410,7 +412,7 @@ const CoreMiddleware = (function () {
|
||||
action,
|
||||
fetch,
|
||||
dependents: ['images'],
|
||||
fullDependents: ['lyrics_results'],
|
||||
fullDependents: options.lyrics ? ['lyrics_results'] : [],
|
||||
type: 'track',
|
||||
});
|
||||
|
||||
|
||||
@ -1530,8 +1530,8 @@ const MopidyMiddleware = (function () {
|
||||
break;
|
||||
|
||||
case 'MOPIDY_GET_TRACKS': {
|
||||
const { options: { full } } = action;
|
||||
request(store, 'library.lookup', { uris: action.uris })
|
||||
const { uris, options: { full, lyrics } } = action;
|
||||
request(store, 'library.lookup', { uris })
|
||||
.then(
|
||||
(_response) => {
|
||||
if (!_response) return;
|
||||
@ -1542,16 +1542,16 @@ const MopidyMiddleware = (function () {
|
||||
store.dispatch(coreActions.itemsLoaded(tracks));
|
||||
store.dispatch(mopidyActions.getImages(arrayOf('uri', tracks)));
|
||||
|
||||
if (full) {
|
||||
tracks.forEach((track) => {
|
||||
tracks.forEach((track) => {
|
||||
if (full) {
|
||||
if (store.getState().lastfm.authorization) {
|
||||
store.dispatch(lastfmActions.getTrack(track.uri));
|
||||
}
|
||||
if (store.getState().genius.authorization) {
|
||||
store.dispatch(geniusActions.findTrackLyrics(track.uri));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (lyrics && store.getState().genius.authorization) {
|
||||
store.dispatch(geniusActions.findTrackLyrics(track.uri));
|
||||
}
|
||||
});
|
||||
},
|
||||
(error) => {
|
||||
store.dispatch(coreActions.handleException(
|
||||
|
||||
@ -56,6 +56,8 @@ const request = ({
|
||||
const loaderKey = `spotify_${uri ? `uri_${uri}` : ''}_endpoint_${endpoint}`;
|
||||
dispatch(uiActions.startLoading(loaderId, loaderKey));
|
||||
|
||||
console.debug({ loaderId, loaderKey })
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
getToken(dispatch, getState)
|
||||
.then(
|
||||
@ -332,7 +334,7 @@ export function getMe() {
|
||||
};
|
||||
}
|
||||
|
||||
export function getTrack(uri, { forceRefetch, full }) {
|
||||
export function getTrack(uri, { forceRefetch, full, lyrics }) {
|
||||
return (dispatch, getState) => {
|
||||
let endpoint = `tracks/${getFromUri('trackid', uri)}`;
|
||||
if (forceRefetch) endpoint += `?refetch=${Date.now()}`;
|
||||
@ -350,9 +352,9 @@ export function getTrack(uri, { forceRefetch, full }) {
|
||||
if (getState().lastfm.authorization) {
|
||||
dispatch(lastfmActions.getTrack(uri));
|
||||
}
|
||||
if (getState().genius.authorization) {
|
||||
dispatch(geniusActions.findTrackLyrics(uri));
|
||||
}
|
||||
}
|
||||
if (lyrics && getState().genius.authorization) {
|
||||
dispatch(geniusActions.findTrackLyrics(uri));
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@ -278,18 +278,10 @@ const formatSimpleObjects = function (records = []) {
|
||||
/**
|
||||
* Prepare a URI for use in a URL
|
||||
*
|
||||
* Needs to have all special characters encoded to avoid being parsed incorrectly, especially
|
||||
* '/' as this is a URL parameter delimiter
|
||||
* Simple alias to encodeURIComponent so this can be extended as needed
|
||||
* @param {String} uri
|
||||
*/
|
||||
const encodeUri = (rawUri = '') => {
|
||||
let uri = encodeURIComponent(rawUri);
|
||||
|
||||
// Double-encode percent symbol as Mopidy requires some encoded elements
|
||||
//uri = uri.replace(/%/g, '%25');
|
||||
|
||||
return uri;
|
||||
};
|
||||
const encodeUri = (rawUri = '') => encodeURIComponent(rawUri);
|
||||
|
||||
/**
|
||||
* Rebuild a URI with some ugly-ass handling of encoding.
|
||||
@ -320,6 +312,7 @@ const decodeUri = (rawUri = '') => {
|
||||
uri = uri.replace(/@/g, '%40');
|
||||
uri = uri.replace(/#/g, '%23');
|
||||
uri = uri.replace(/\$/g, '%24');
|
||||
uri = uri.replace(/&/g, '%26');
|
||||
uri = uri.replace(/'/g, '%27');
|
||||
uri = uri.replace(/,/g, '%2C');
|
||||
uri = uri.replace(/ /g, '%20');
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { indexToArray } from "./arrays";
|
||||
import { indexToArray, arrayOf } from "./arrays";
|
||||
import { encodeUri } from "./format";
|
||||
|
||||
/**
|
||||
@ -370,37 +370,42 @@ let isObject = function (value) {
|
||||
return value instanceof Object && value.constructor === Object;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert an array of strings to an array of RegExp objects
|
||||
*
|
||||
* @param {Array} keys
|
||||
*/
|
||||
const toRegExp = function (keys) {
|
||||
return keys.map((key) => {
|
||||
try {
|
||||
return new RegExp(key);
|
||||
} catch {
|
||||
// Fucks with unit tests, but helpful for debugging.
|
||||
// console.error('Could not convert string to RegEx', key);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Detect if an item is in the loading queue. We simply loop all load items to
|
||||
* see if any items contain our searched key.
|
||||
* see if any load queue keys match our 'includes' expression AND our 'excludes' expression(s)
|
||||
*
|
||||
* TODO: Explore performance of this
|
||||
* TODO: Allow wildcards
|
||||
*
|
||||
* @param load_queue = obj (passed from store)
|
||||
* @param key = string (the string to lookup)
|
||||
* @return boolean
|
||||
* @param {Object} load_queue (passed from store)
|
||||
* @param {Array} keys array of regex strings
|
||||
* @return {Boolean}
|
||||
* */
|
||||
const isLoading = function (load_queue = {}, keys = []) {
|
||||
if (!load_queue || !keys) return false;
|
||||
|
||||
const expressions = toRegExp(keys);
|
||||
const queue = indexToArray(load_queue);
|
||||
const matches = keys.reduce((acc, key) => {
|
||||
let regex = '';
|
||||
try {
|
||||
regex = new RegExp(key);
|
||||
} catch {
|
||||
// Fucks with unit tests, but helpful for debugging.
|
||||
// console.error('Invalid regular expression', keys);
|
||||
return acc;
|
||||
}
|
||||
|
||||
return [
|
||||
...acc,
|
||||
...(queue.filter((qk) => qk.match(regex))),
|
||||
];
|
||||
}, []);
|
||||
const matches = queue.filter((qk) => {
|
||||
const matchingExpressions = keys.filter((exp) => qk.match(exp));
|
||||
|
||||
return (matchingExpressions.length === expressions.length);
|
||||
});
|
||||
|
||||
return matches.length > 0;
|
||||
};
|
||||
|
||||
@ -115,7 +115,7 @@ const ensureLoaded = ({
|
||||
|
||||
const uris = dependentUris(item);
|
||||
if (uris.length) {
|
||||
console.log(`Loading ${uris.length} dependents`);
|
||||
console.info(`Loading ${uris.length} dependents`);
|
||||
store.dispatch(coreActions.loadItems(type, uris));
|
||||
}
|
||||
return;
|
||||
@ -124,10 +124,7 @@ const ensureLoaded = ({
|
||||
|
||||
// What about in the coldstore?
|
||||
localForage.getItem(uri).then((restoredItem) => {
|
||||
if (
|
||||
!restoredItem ||
|
||||
missingDependents(restoredItem).length > 0
|
||||
) {
|
||||
if (!restoredItem || missingDependents(restoredItem).length > 0) {
|
||||
fetch();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -366,7 +366,7 @@ class Album extends React.Component {
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
const uri = decodeURIComponent(ownProps.match.params.uri);
|
||||
const itemSelector = makeItemSelector(uri);
|
||||
const loadingSelector = makeLoadingSelector([`^(.*)${uri}(.*)(?!contains)(.*)$`]);
|
||||
const loadingSelector = makeLoadingSelector([`(.*)${uri}(.*)`, '^((?!contains).)*$', '^((?!me/albums).)*$']);
|
||||
return {
|
||||
uri,
|
||||
slim_mode: state.ui.slim_mode,
|
||||
|
||||
@ -604,7 +604,7 @@ class Artist extends React.Component {
|
||||
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
const uri = decodeURIComponent(ownProps.match.params.uri);
|
||||
const loadingSelector = makeLoadingSelector([`(.*)${uri}(.*)`]);
|
||||
const loadingSelector = makeLoadingSelector([`(.*)${uri}(.*)`, '^((?!contains).)*$', '^((?!/albums).)*$', '^((?!related-artists).)*$', '^((?!top-tracks).)*$']);
|
||||
const artistSelector = makeItemSelector(uri);
|
||||
const artist = artistSelector(state);
|
||||
let albums = null;
|
||||
|
||||
@ -143,7 +143,7 @@ class Track extends React.Component {
|
||||
},
|
||||
} = this.props;
|
||||
|
||||
loadTrack(decodeUri(uri));
|
||||
loadTrack(decodeUri(uri), { full: true, lyrics: true });
|
||||
|
||||
if (track) {
|
||||
this.setWindowTitle(track);
|
||||
@ -157,28 +157,13 @@ class Track extends React.Component {
|
||||
const {
|
||||
uri,
|
||||
track,
|
||||
genius_authorized,
|
||||
lastfm_authorized,
|
||||
coreActions: {
|
||||
loadTrack,
|
||||
},
|
||||
geniusActions: {
|
||||
findTrackLyrics,
|
||||
},
|
||||
lastfmActions: {
|
||||
getTrack,
|
||||
},
|
||||
} = this.props;
|
||||
|
||||
if (prevUri !== uri) {
|
||||
loadTrack(decodeUri(uri));
|
||||
}
|
||||
|
||||
// We have just received our full track or our track artists
|
||||
if ((!prevTrack && track) || (prevTrack && !prevTrack.artists && track.artists)) {
|
||||
this.setWindowTitle(track);
|
||||
if (lastfm_authorized) getTrack(track.uri);
|
||||
if (genius_authorized && !track.lyrics_results) findTrackLyrics(track);
|
||||
loadTrack(decodeUri(uri), { full: true, lyrics: true });
|
||||
}
|
||||
|
||||
if (!prevTrack && track) this.setWindowTitle(track);
|
||||
@ -339,10 +324,12 @@ class Track extends React.Component {
|
||||
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
const uri = decodeUri(ownProps.match.params.uri);
|
||||
const loadingSelector = makeLoadingSelector([`^(?!genius)(.*)${uri}(.*)$`]);
|
||||
const loadingSelector = makeLoadingSelector([`(.*)${uri}(.*)`, '^((?!genius).)*$', '^((?!contains).)*$']);
|
||||
const loadingLyricsSelector = makeLoadingSelector([`^genius_(.*)lyrics_${uri}$`]);
|
||||
const trackSelector = makeItemSelector(uri);
|
||||
|
||||
console.debug(`^(?!genius)(.*)${uri}(.*)(?!contains)(.*)$`)
|
||||
|
||||
return {
|
||||
uri,
|
||||
slim_mode: state.ui.slim_mode,
|
||||
|
||||
Reference in New Issue
Block a user