Tracks.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import React, { useEffect, useRef } from "react";
  2. import {
  3. AddButton,
  4. LeftBar,
  5. Player,
  6. OrangeButton,
  7. DropdownTracks,
  8. } from "../../Components";
  9. import "./style.scoped.scss";
  10. import AddTrackIcon from "../../assets/add_track_icon.svg";
  11. import PlayIcon from "../../assets/play_icon_3.png";
  12. import { Link } from "react-router-dom";
  13. import { ROUTES } from "../../utils/constants";
  14. import TrackItem from "../../Components/TrackItem/TrackItem";
  15. import { useDispatch, useSelector } from "react-redux";
  16. import {
  17. actionDeleteTracks,
  18. actionGetTracks,
  19. actionGetTracksCount,
  20. actionTracksFetchingOn,
  21. } from "../../redux/actions/creators/tracks";
  22. import store from "../../redux/store";
  23. import { actionPlay, actionSetQueue } from "../../redux/actions/creators/audio";
  24. const Tracks = () => {
  25. const list = useRef(null);
  26. const dispatch = useDispatch();
  27. const state = useSelector((store) => store.tracks);
  28. useEffect(() => {
  29. dispatch(actionGetTracksCount());
  30. list.current.addEventListener("scroll", scrollHandler);
  31. return function() {
  32. document.removeEventListener("scroll", scrollHandler);
  33. };
  34. }, []);
  35. useEffect(() => {
  36. if (state.isFetching) {
  37. dispatch(actionGetTracks(state.page, state.sortBy));
  38. }
  39. }, [state.isFetching]);
  40. const scrollHandler = (e) => {
  41. const { tracks, count } = store.getState().tracks;
  42. if (
  43. e.target.scrollHeight -
  44. (e.target.scrollTop + e.target.clientHeight) <
  45. 100 &&
  46. tracks.length < count - 1
  47. ) {
  48. dispatch(actionTracksFetchingOn());
  49. }
  50. };
  51. return (
  52. <div className="tracks">
  53. <div className="main">
  54. <LeftBar />
  55. <main className="content">
  56. <div className="wrapper">
  57. <div className="header">
  58. <h1 className="page-name">Tracks</h1>
  59. <div className="buttons">
  60. <AddButton
  61. text={"Delete tracks"}
  62. opacity={state.toDelete.length ? 1 : 0}
  63. clickHandler={() =>
  64. dispatch(
  65. actionDeleteTracks(state.toDelete)
  66. )
  67. }
  68. />
  69. <Link to={ROUTES.UPLOAD}>
  70. <AddButton
  71. icon={AddTrackIcon}
  72. text={"Add tracks"}
  73. />
  74. </Link>
  75. </div>
  76. </div>
  77. <div className="filter-bar">
  78. <OrangeButton
  79. icon={PlayIcon}
  80. text={`Play all (${state.tracks.length})`}
  81. clickHandler={() => {
  82. dispatch(
  83. actionSetQueue({ tracks: state.tracks })
  84. );
  85. dispatch(actionPlay());
  86. }}
  87. />
  88. <DropdownTracks />
  89. </div>
  90. <div className="tracks-list" ref={list}>
  91. {state.tracks.length > 0
  92. ? state.tracks.map((track) => (
  93. <TrackItem key={track._id} data={track} />
  94. ))
  95. : null}
  96. </div>
  97. </div>
  98. </main>
  99. </div>
  100. <Player />
  101. </div>
  102. );
  103. };
  104. export default Tracks;