import './AlbumPage.css'; import { Link } from 'react-router5' import {useRouteNode} from 'react-router5' import {unslugify, formatDuration} from './utils.js'; import {useReducer, useEffect} from 'react'; import {fetchAlbums} from './AlbumList'; import {fetchTracks} from './Album'; function pageReducer(state, action) { switch (action.type) { case 'LOAD_ALBUMS': if (!action.payload.items || !action.payload.items.length) return {error: 'Not found'}; const album = action.payload.items[0]; return {...state, album}; case 'SHOW_ALBUM': const tracks = action.payload.tracks; return {...state, tracks, loading: false}; default: throw new Error(`Unknown action type: ${action.type}`); } } export default function AlbumPage({dispatch, scrollRef}) { const { route } = useRouteNode('album'); const { artist: artistSlug, album: albumSlug } = route.params; const artistName = unslugify(artistSlug); const albumName = unslugify(albumSlug); const [{album, tracks, loading, error}, dispatchPage] = useReducer(pageReducer, {loading: true}); useEffect(()=>{ if (album) fetchTracks(album.id, 'SHOW_ALBUM', dispatchPage) else fetchAlbums({artist: artistName, album: albumName}, 0, dispatchPage); }, [artistName, albumName, album, dispatch]); return (

{artistName}

{albumName}

{tracks && (
)} {album && (<> {album.date &&

Date: {album.year}

} {album.country &&

Country: {album.country}

} {album.track_count &&

Tracks: {album.track_count}

} {album.total_duration &&

Duration: {formatDuration(album.total_duration)}

} {album.publisher &&

Publisher: {album.publisher}

} {album.genre &&

Genre: {album.genre}

} )} Browse {loading &&

Loading...

} {error &&

{ error }

} {tracks && ( {tracks.map((track, i) => ( )) }
{track.no}. {track.title} {track.bit_rate} kbps {formatDuration(track.duration)}
)}
); }