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'