Dropzone.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import React, { useCallback, useState } from "react";
  2. import { useDropzone } from "react-dropzone";
  3. import { connect } from "react-redux";
  4. import { actionSetAvatar, actionUploadTracks } from "../../actions/types";
  5. const MyDropzone = ({ promise, onloadAvatar, onloadMusic }) => {
  6. const [error, setError] = useState(false);
  7. const onDrop = useCallback(
  8. (acceptedFiles) => {
  9. if (acceptedFiles[0].type.includes("audio")) {
  10. if (
  11. acceptedFiles.length +
  12. (promise?.playlistTracks?.payload?.tracks
  13. ? promise?.playlistTracks?.payload?.tracks?.length
  14. : 0) <
  15. 100
  16. ) {
  17. for (let i = 0; i < acceptedFiles.length; i++) {
  18. onloadMusic(acceptedFiles[i]);
  19. }
  20. } else {
  21. setError(true);
  22. }
  23. } else {
  24. onloadAvatar(acceptedFiles[0]);
  25. }
  26. },
  27. [onloadAvatar, onloadMusic]
  28. );
  29. const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop });
  30. return (
  31. <div
  32. className={`${
  33. error ? "text-danger" : null
  34. } mt-2 text-center customBorder mx-auto`}
  35. {...getRootProps()}
  36. >
  37. <input {...getInputProps()} />
  38. {isDragActive ? setError(false) : null}
  39. {isDragActive ? (
  40. <p>Поместите файлы сюда...</p>
  41. ) : (
  42. <p>
  43. {error
  44. ? "Ошибка! Максимально допустимое количество треков в плейлисте - 100 штук."
  45. : "Для загрузки перетащите файлы сюда или нажмите на поле и выберите их локально."}
  46. </p>
  47. )}
  48. </div>
  49. );
  50. };
  51. export const CMyDropzone = connect((state) => ({ promise: state.promise }), {
  52. onloadAvatar: actionSetAvatar,
  53. onloadMusic: actionUploadTracks,
  54. })(MyDropzone);