Refactor of isLoading for array of matches now staggered

This commit is contained in:
James Barnsley
2021-01-31 13:33:24 +13:00
parent 40e6ed5045
commit 1d77d497be
11 changed files with 142 additions and 147 deletions

View File

@ -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

View File

@ -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',
});

View File

@ -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(

View File

@ -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));
}
},
);

View File

@ -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');

View File

@ -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;
};

View File

@ -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;
}

View File

@ -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,

View File

@ -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;

View File

@ -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,