AlbumList.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import React from 'react';
  2. import InfiniteScroll from 'react-infinite-scroller';
  3. import {formatDuration} from './utils.js';
  4. import logo from './logo.svg';
  5. import './AlbumList.css';
  6. function _albumProps(albums, index) {
  7. if (index === 0) {
  8. return {showArtist: true, showType: true}
  9. }
  10. if (albums[index-1].artist !== albums[index].artist) {
  11. return {showArtist: true, showType: true}
  12. }
  13. let showType = (albums[index-1].type !== albums[index].type);
  14. return {showType};
  15. }
  16. function Album({album, showArtist, showType, onPlayAlbum}) {
  17. function onClick(album) {
  18. return (e) => {
  19. e.preventDefault()
  20. onPlayAlbum(album)
  21. }
  22. }
  23. return (
  24. <div>
  25. {showArtist && (<h3>{album.artist}</h3>)}
  26. {showType && (<h4>{album.type}</h4>)}
  27. <div className="album">
  28. <div><img src={album.cover || logo} alt={album.album} /></div>
  29. <div>
  30. <span>{album.year}</span>
  31. <span>{album.country}</span>
  32. <span>{album.track_count}&nbsp;@&nbsp;{formatDuration(album.total_duration)}</span>
  33. </div>
  34. <div>
  35. <span><a href={`/album/${album.id}`} onClick={onClick(album)}>{album.album}</a></span>
  36. <span>{album.publisher}</span>
  37. <span>{album.genre}</span>
  38. </div>
  39. </div>
  40. </div>
  41. )
  42. }
  43. export default function AlbumList({loadMore, hasMore, albums, title, error, ...props}) {
  44. return (
  45. <div className="AlbumList">
  46. <h2>{title}</h2>
  47. { error ? (
  48. <div className="error">{error}></div>
  49. ) : (
  50. <InfiniteScroll
  51. loadMore={loadMore}
  52. hasMore={hasMore}
  53. loader={<div className="loader" key={0}>Loading ...</div>}
  54. initialLoad={false}
  55. useWindow={false}
  56. >
  57. {albums.map((album, idx) => (
  58. <Album key={idx} album={album} {..._albumProps(albums, idx)} {...props} />
  59. ))}
  60. </InfiniteScroll>
  61. )
  62. }
  63. </div>
  64. )
  65. }