diff --git a/src/js/views/Album.js b/src/js/views/Album.js index b42171c3..1676172b 100755 --- a/src/js/views/Album.js +++ b/src/js/views/Album.js @@ -1,9 +1,7 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; - import sanitizeHtml from 'sanitize-html'; - import ErrorMessage from '../components/ErrorMessage'; import TrackList from '../components/TrackList'; import Thumbnail from '../components/Thumbnail'; @@ -30,82 +28,80 @@ import { decodeUri } from '../util/format'; const SORT_KEY = 'album_tracks'; -class Album extends React.Component { - constructor(props) { - super(props); +const Album = ({ + uri, + album: albumProp, + sortField, + sortReverse, + loading, + slim_mode, + coreActions: { + loadAlbum, + }, + lastfmActions: { + getAlbum, + }, + uiActions: { + setSort, + setWindowTitle, + showContextMenu, + hideContextMenu, + }, + mopidyActions: { + playURIs, + }, +}) => { + const [filter, setFilter] = useState(''); + const [album, setAlbum] = useState({}); - this.state = { - filter: '', + let tracks = album ?.tracks || []; + if (sortField && tracks) tracks = sortItems(tracks, sortField, sortReverse); + if (filter && filter !== '') tracks = applyFilter('name', filter, tracks); + + useEffect( + () => { + if (uri) { + loadAlbum(uri, { full: true }); + } + }, + [uri], + ); + + useEffect(() => { + if (albumProp && !album) { + if (albumProp.artists && albumProp.wiki === undefined) { + getAlbum(albumProp.uri, albumProp.artists[0].name, albumProp.name); + } }; - } - - componentDidMount = () => { - const { - uri, - album, - coreActions: { - loadAlbum, - }, - lastfmActions: { - getAlbum, - }, - } = this.props; - - this.setWindowTitle(); - loadAlbum(uri, { full: true }); - - if (album) { - if (album.artists && album.wiki === undefined) { - getAlbum(album.uri, album.artists[0].name, album.name); - } - } - } - - componentDidUpdate = ({ - uri: prevUri, - album: prevAlbum, - }) => { - const { - uri, - album, - coreActions: { - loadAlbum, - }, - lastfmActions: { - getAlbum, - }, - } = this.props; - - if (uri !== prevUri) { - loadAlbum(uri, { full: true }); - } - - // We have just received our full album or our album artists - if ((!prevAlbum && album)) { - if (album.artists && album.wiki === undefined) { - getAlbum(album.uri, album.artists[0].name, album.name); - } - } - - if (!prevAlbum && album) this.setWindowTitle(album); - } - - setWindowTitle = (album = this.props.album) => { - const { uiActions: { setWindowTitle } } = this.props; + setAlbum(albumProp); + }, [albumProp]) + useEffect(() => { if (album) { setWindowTitle(i18n('album.title_window', { name: album.name, - artist: album.artists?.map((artist) => artist.name).join(), + artist: album.artists ? album.artists.map((artist) => artist.name).join(', ') : '', })); } else { setWindowTitle(i18n('album.title')); } + }, [album]); + + if (loading) { + return ; } - handleContextMenu = (e) => { - const { album, uri, uiActions: { showContextMenu } } = this.props; + if (!album) { + return ( + +

+ {i18n('errors.uri_not_found', { uri })} +

+
+ ); + } + const handleContextMenu = (e) => { showContextMenu({ e, context: 'album', @@ -114,49 +110,9 @@ class Album extends React.Component { }); } - loadMore = () => { - const { - spotifyActions: { - getMore, - }, - album: { - uri, - name, - tracks_more, - } = {}, - } = this.props; - - getMore( - tracks_more, { - parent_type: 'album', - parent_key: uri, - records_type: 'track', - }, - null, - { - album: { - uri, - name, - }, - }, - ); - } - - play = () => { - const { uri, mopidyActions: { playURIs } } = this.props; - playURIs([uri], uri); - } - - onChangeSort = (field) => { - const { - sortField, - sortReverse, - uiActions: { - setSort, - hideContextMenu, - }, - } = this.props; + const play = () => playURIs([uri], uri); + const onChangeSort = (field) => { let reverse = false; if (field !== null && sortField === field) { reverse = !sortReverse; @@ -166,179 +122,133 @@ class Album extends React.Component { hideContextMenu(); } - inLibrary = () => { - const { uri } = this.props; - const library = `${uriSource(uri)}_library_albums`; - return (this.props[library] && this.props[library].indexOf(this.props.uri) > -1); - } + const sort_options = [ + { + value: 'disc_track', + label: i18n('album.tracks.sort.disc_track'), + }, + { + value: 'name', + label: i18n('album.tracks.sort.name'), + }, + ]; - render = () => { - const { - uri, - album, - loading, - slim_mode, - sortField, - sortReverse, - } = this.props; - let { - album: { - tracks, - } = {}, - } = this.props; - const { - filter, - } = this.state; - - if (loading) { - return ; - } - if (!album) { - return ( - -

- {i18n('errors.uri_not_found', { uri })} -

-
- ); - } - - if (sortField && tracks) { - tracks = sortItems(tracks, sortField, sortReverse); - } - - if (filter && filter !== '') { - tracks = applyFilter('name', filter, tracks); - } - - const sort_options = [ - { - value: 'disc_track', - label: i18n('album.tracks.sort.disc_track'), - }, - { - value: 'name', - label: i18n('album.tracks.sort.name'), - }, - ]; - - return ( -
-
- -
- -
-

{album.name}

- -
    - {!slim_mode ? ( -
  • - -
  • - ) : null} - {album.artists && album.artists.length > 0 ? ( -
  • - -
  • - ) : null} - {album.release_date ? ( -
  • - -
  • - ) : null} - {album.tracks ? ( -
  • - {i18n( - 'specs.tracks', - { count: album.tracks.length }, - )} -
  • - ) : null} - {!slim_mode && album.tracks ? ( -
  • - -
  • - ) : null} - {!slim_mode && album.play_count ? ( -
  • - {i18n( - 'specs.plays', - { count: nice_number(album.play_count) }, - )} -
  • - ) : null} - {!slim_mode && album.listeners ? ( -
  • - {i18n( - 'specs.listeners', - { count: nice_number(album.listeners) }, - )} -
  • - ) : null} -
-
- -
- - {uriSource(uri) === 'spotify' && ( - - )} - -
- -
-

- -
- this.setState({ filter: value })} - onSubmit={() => uiActions.hideContextMenu()} - /> - -
-

- -
- - {album.wiki ? ( -
-

{i18n('album.wiki.title')}

-
-

-
-

- -
-
-
- ) : null} + return ( +
+
+
- ); - } + +
+

{album.name}

+ +
    + {!slim_mode ? ( +
  • + +
  • + ) : null} + {album.artists && album.artists.length > 0 ? ( +
  • + +
  • + ) : null} + {album.release_date ? ( +
  • + +
  • + ) : null} + {album.tracks ? ( +
  • + {i18n( + 'specs.tracks', + { count: album.tracks.length }, + )} +
  • + ) : null} + {!slim_mode && album.tracks ? ( +
  • + +
  • + ) : null} + {!slim_mode && album.play_count ? ( +
  • + {i18n( + 'specs.plays', + { count: nice_number(album.play_count) }, + )} +
  • + ) : null} + {!slim_mode && album.listeners ? ( +
  • + {i18n( + 'specs.listeners', + { count: nice_number(album.listeners) }, + )} +
  • + ) : null} +
+
+ +
+ + {uriSource(uri) === 'spotify' && ( + + )} + +
+ +
+

+ +
+ + +
+

+ +
+ + {album.wiki ? ( +
+

{i18n('album.wiki.title')}

+
+

+
+

+ +
+
+
+ ) : null} +
+ ); } const mapStateToProps = (state, ownProps) => {