AlbumList.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import './AlbumList.css';
  2. import InfiniteScroll from 'react-infinite-scroller';
  3. import {useEffect} from 'react';
  4. import {getAlbums, request} from './Api';
  5. import Album from './Album';
  6. import {CATEGORIES} from './Filters';
  7. function _albumProps(albums, index, props) {
  8. if (index === 0) {
  9. return {showArtist: !props.noArtist, showType: true}
  10. }
  11. if (albums[index-1].artist !== albums[index].artist) {
  12. return {showArtist: !props.noArtist, showType: true}
  13. }
  14. let showType = (albums[index-1].type !== albums[index].type);
  15. return {showType};
  16. }
  17. export function fetchAlbums(filters, page, dispatch) {
  18. const {filter, alpha} = filters;
  19. const limit = 15;
  20. const offset = (page || 0) * limit;
  21. const params = {offset, limit:(limit+1)};
  22. if (filter) params.filter = filter;
  23. for (const {cat} of CATEGORIES) {
  24. if (filters[cat])
  25. params[cat] = filters[cat];
  26. }
  27. if (!alpha) params['latest'] = 1;
  28. const {url, options} = getAlbums(params);
  29. request(url, options)
  30. .then(data => {
  31. const more = data.length > limit;
  32. dispatch({type: 'LOAD_ALBUMS', payload:{items: data.slice(0, limit), more}});
  33. })
  34. .catch((e) => {
  35. console.log(e);
  36. })
  37. }
  38. export default function AlbumList(props) {
  39. const {albums, error, filters, dispatch, playerDispatch, scrollRef} = props;
  40. const title = (!props.noTitle && (filters.alpha ? 'Alphabetical' : 'Latest'));
  41. useEffect(()=>{
  42. fetchAlbums(filters, albums.page, dispatch);
  43. }, [filters, albums.page, dispatch]);
  44. return (
  45. <div className="AlbumList">
  46. {title && <h2>{title}</h2>}
  47. { error ? (
  48. <div className="error">{error}></div>
  49. ) : (
  50. <InfiniteScroll
  51. loadMore={(p) => {dispatch({type: 'SET_PAGE', payload: p})}}
  52. hasMore={albums.more}
  53. loader={<div className="loader" key={0}>Loading ...</div>}
  54. initialLoad={false}
  55. getScrollParent={() => scrollRef.current}
  56. useWindow={false}
  57. >
  58. {albums.items.map((album, idx) => (
  59. <Album key={idx} album={album} dispatch={playerDispatch} {..._albumProps(albums.items, idx, props)}/>
  60. ))}
  61. </InfiniteScroll>
  62. )
  63. }
  64. </div>
  65. );
  66. }