diff --git a/src/js/components/AddedFrom.js b/src/js/components/AddedFrom.js
new file mode 100644
index 00000000..9077a972
--- /dev/null
+++ b/src/js/components/AddedFrom.js
@@ -0,0 +1,90 @@
+import React, { useEffect } from 'react';
+import { useSelector, useDispatch } from 'react-redux';
+import URILink from './URILink';
+import { I18n, i18n } from '../locale';
+import {
+ getFromUri,
+ titleCase,
+ uriType,
+} from '../util/helpers';
+import {
+ makeItemSelector,
+ makeLoadingSelector,
+} from '../util/selectors';
+import { loadUri } from '../services/core/actions';
+
+export default ({
+ by,
+ uri,
+ className = '',
+ inline,
+}) => {
+ if (!uri) return null;
+
+ const dispatch = useDispatch();
+ const from = useSelector(makeItemSelector(uri));
+ const loading = useSelector(makeLoadingSelector([`(.*)${uri}(.*)`]));
+
+ useEffect(() => {
+ if (uri && !from && !loading) {
+ dispatch(loadUri(uri));
+ }
+ }, []);
+
+ const type = from?.type || uriType(uri);
+ let link = null;
+ switch (type) {
+ case 'discover':
+ link = (
+
+
+
+ );
+ break;
+
+ case 'browse':
+ link = (
+
+
+
+ );
+ break;
+
+ case 'search':
+ link = (
+
+
+
+ );
+ break;
+
+ case 'radio':
+ link = ;
+ break;
+
+ case 'queue-history':
+ link = ;
+ break;
+
+ default:
+ link = {from?.name || titleCase(type)};
+ }
+
+ if (inline) {
+ return (
+
+ {i18n('specs.added_from')}
+ {link}
+
+ );
+ }
+
+ return (
+
+ {link}
+
+ {i18n('specs.added_from_by', { by, name: type })}
+
+
+ );
+};
diff --git a/src/js/components/ContextMenu.js b/src/js/components/ContextMenu.js
index dad6dbde..cd7d4477 100755
--- a/src/js/components/ContextMenu.js
+++ b/src/js/components/ContextMenu.js
@@ -34,6 +34,7 @@ import {
makeProvidersSelector,
makeLibrarySelector,
} from '../util/selectors';
+import AddedFrom from './AddedFrom';
const processKeys = [
'MOPIDY_GET_LIBRARY_PLAYLISTS',
@@ -696,49 +697,20 @@ class ContextMenu extends React.Component {
if (context.items_count === 1 && context.name === 'queue-track' && context.item !== undefined) {
if (queue_metadata[`tlid_${context.item.tlid}`] !== undefined) {
- const metadata = queue_metadata[`tlid_${context.item.tlid}`];
-
- if (metadata.added_from && metadata.added_by) {
- const type = (metadata.added_from ? uriType(metadata.added_from) : null);
-
- switch (type) {
- case 'discover':
- var link = (
-
-
-
- );
- break;
-
- case 'browse':
- var link = (
-
-
-
- );
- break;
-
- case 'search':
- var link = (
-
-
-
- );
- break;
-
- default:
- var link = {type};
- }
-
- return (
-
-
- {`${metadata.added_by} added from `}
- {link}
-
-
- );
- }
+ const {
+ added_from,
+ added_by,
+ } = queue_metadata[`tlid_${context.item.tlid}`] || {};
+ return (
+
+ );
}
}
diff --git a/src/js/components/Track.js b/src/js/components/Track.js
index ceeea19d..dbc3964d 100755
--- a/src/js/components/Track.js
+++ b/src/js/components/Track.js
@@ -5,13 +5,9 @@ import { Dater, dater } from './Dater';
import URILink from './URILink';
import ContextMenuTrigger from './ContextMenuTrigger';
import ErrorBoundary from './ErrorBoundary';
-import {
- getFromUri,
- titleCase,
- isTouchDevice,
- uriType,
-} from '../util/helpers';
+import { isTouchDevice } from '../util/helpers';
import { I18n, i18n } from '../locale';
+import AddedFrom from './AddedFrom';
const MiddleColumn = ({
track_context,
@@ -36,71 +32,16 @@ const MiddleColumn = ({
);
break;
}
-
case 'queue': {
- if (added_from) {
- const type = (added_from ? uriType(added_from) : null);
- let link = null;
-
- switch (type) {
- case 'discover':
- link = (
-
-
-
- );
- break;
-
- case 'browse':
- link = (
-
-
-
- );
- break;
-
- case 'search':
- link = (
-
-
-
- );
- break;
-
- case 'radio':
- link = ;
- break;
-
- case 'queue-history':
- link = ;
- break;
-
- default:
- link = {titleCase(type)};
- }
-
- content = (
-
-
- {link}
-
- {added_by && (
-
- {`${added_by}`}
-
- )}
-
- );
- } else if (added_by) {
- content = (
-
- {added_by}
-
- );
- }
+ content = (
+
+ );
break;
}
-
default:
return null;
}
diff --git a/src/js/locale/en.yaml b/src/js/locale/en.yaml
index b89d14c4..7e5bb3b1 100755
--- a/src/js/locale/en.yaml
+++ b/src/js/locale/en.yaml
@@ -117,7 +117,8 @@ specs:
playlists: '%{count} playlists'
plays: '%{count} plays'
popularity: '%{percent}% popularity'
- added: 'Added '
+ added_from: 'Added from '
+ added_from_by: 'Added from %{name} by %{by}'
added_ago: 'Added %{time} ago'
edited: 'Edited '
edited_ago: 'Edited %{time} ago'