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
+ {i18n('errors.uri_not_found', { uri })}
+
- {i18n('errors.uri_not_found', { uri })}
-