Removing iris:browse: URI prefix, fixes #829

This commit is contained in:
James Barnsley
2022-09-04 20:47:38 +12:00
parent 0f950ed50c
commit e3989c2d15
3 changed files with 35 additions and 84 deletions

View File

@ -1,5 +1,4 @@
import React, { useEffect } from 'react'; import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import URILink from './URILink'; import URILink from './URILink';
import { I18n, i18n } from '../locale'; import { I18n, i18n } from '../locale';
import { import {
@ -16,7 +15,7 @@ export default ({
}) => { }) => {
if (!from) return null; if (!from) return null;
const { uri, name } = from; const { uri, name } = from;
const type = uriType(uri); const type = from?.type || uriType(uri);
let link = null; let link = null;
switch (type) { switch (type) {
case 'discover': case 'discover':
@ -29,8 +28,8 @@ export default ({
case 'browse': case 'browse':
let directory = ''; let directory = '';
if (uri.indexOf('file://')) { if (uri.indexOf('file://') > -1) {
directory = uri.substr(uri.lastIndexOf('/'), uri.length); directory = decodeURIComponent(uri.substr(uri.lastIndexOf('/'), uri.length));
} }
link = ( link = (
<URILink type={type} uri={uri} suffix={directory}> <URILink type={type} uri={uri} suffix={directory}>

View File

@ -122,8 +122,9 @@ class BrowseDirectory extends React.Component {
playURIs({ playURIs({
uris: arrayOf('uri', sortItems(tracks, 'name')), uris: arrayOf('uri', sortItems(tracks, 'name')),
from: { from: {
name: 'Directory', name: 'Browse',
uri: `iris:browse:${uri}`, type: 'browse',
uri,
}, },
}); });
hideContextMenu(); hideContextMenu();
@ -233,7 +234,7 @@ class BrowseDirectory extends React.Component {
<TrackList <TrackList
context={{ context={{
uri: `iris:browse:${uri}`, uri,
name: 'Browse', name: 'Browse',
type: 'browse', type: 'browse',
}} }}
@ -250,6 +251,7 @@ class BrowseDirectory extends React.Component {
const loadingSelector = makeLoadingSelector(['mopidy_library.(browse|lookup)']); const loadingSelector = makeLoadingSelector(['mopidy_library.(browse|lookup)']);
const mapStateToProps = (state, ownProps) => { const mapStateToProps = (state, ownProps) => {
console.debug('browser directory', ownProps)
const { const {
mopidy: { mopidy: {
directory: _directory = {}, directory: _directory = {},

View File

@ -1,93 +1,43 @@
import React from 'react'; import React, { useEffect } from 'react';
import { connect } from 'react-redux'; import { useSelector, useDispatch } from 'react-redux';
import { bindActionCreators } from 'redux'; import { useParams, useNavigate } from 'react-router-dom';
import Loader from '../components/Loader'; import Loader from '../components/Loader';
import * as coreActions from '../services/core/actions'; import { loadUri } from '../services/core/actions';
import * as uiActions from '../services/ui/actions'; import { setWindowTitle } from '../services/ui/actions';
import { makeLoadingSelector, makeItemSelector } from '../util/selectors'; import { makeLoadingSelector, makeItemSelector } from '../util/selectors';
import { decodeUri } from '../util/format'; import { decodeUri } from '../util/format';
import { uriType } from '../util/helpers'; import { uriType } from '../util/helpers';
class UriRedirect extends React.Component { const UriRedirect = () => {
componentDidMount() { const navigate = useNavigate();
const { const dispatch = useDispatch();
uri, const { uri: rawUri } = useParams();
item, const uri = decodeUri(rawUri);
coreActions: { const loading = useSelector(makeLoadingSelector([`(.*)${uri}(.*)`]));
loadUri, const item = useSelector(makeItemSelector(uri));
}, const redirect = () => navigate(`/${item.type || uriType(uri)}/${rawUri}`);
} = this.props;
useEffect(() => {
if (item) { if (item) {
this.redirect(); redirect();
} else { } else {
loadUri(uri); dispatch(loadUri(uri));
} }
this.setWindowTitle(); dispatch(setWindowTitle(uri));
} }, []);
componentDidUpdate = ({
uri: prevUri,
}) => {
const {
uri,
item,
coreActions: {
loadUri,
},
} = this.props;
if (prevUri !== uri) {
loadUri(uri);
this.setWindowTitle();
}
useEffect(() => {
if (item) { if (item) {
this.redirect(); redirect();
} else if (!loading) {
dispatch(loadUri(uri));
dispatch(setWindowTitle(uri));
} }
} }, [rawUri, loading]);
setWindowTitle = () => {
const {
uri,
uiActions: {
setWindowTitle,
},
} = this.props;
setWindowTitle(uri); return <Loader loading={loading} body />;
}
redirect = () => {
const {
uri,
item,
history,
} = this.props;
history.replace(`/${item.type || uriType(uri)}/${uri}`);
}
render = () => <Loader body loading />;
} }
const mapStateToProps = (state, ownProps) => { export default UriRedirect;
const { match: { params: { uri: rawUri } } } = ownProps;
const uri = decodeUri(rawUri);
const loadingSelector = makeLoadingSelector([`(.*)${uri}(.*)`]);
const itemSelector = makeItemSelector(uri);
return {
uri,
loading: loadingSelector(state),
item: itemSelector(state),
};
};
const mapDispatchToProps = (dispatch) => ({
uiActions: bindActionCreators(uiActions, dispatch),
coreActions: bindActionCreators(coreActions, dispatch),
});
export default connect(mapStateToProps, mapDispatchToProps)(UriRedirect);