TrackItem.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import React from "react";
  2. import "./style.scoped.scss";
  3. import PlayIcon from "../../assets/play_icon_2.svg";
  4. import { styled } from "@mui/material/styles";
  5. import Checkbox from "@mui/material/Checkbox";
  6. import { useDispatch } from "react-redux";
  7. import {
  8. actionClearQueue,
  9. actionSetTrack,
  10. } from "../../redux/actions/creators/audio";
  11. import { removeAudioExtension } from "../../utils/regex";
  12. import { actionTrackToDelete } from "../../redux/actions/creators/tracks";
  13. const BpIcon = styled("span")(({ theme = "dark" }) => ({
  14. borderRadius: 3,
  15. width: 16,
  16. height: 16,
  17. backgroundColor: "gray",
  18. ".Mui-focusVisible &": {
  19. outline: "2px auto rgba(19,124,189,.6)",
  20. outlineOffset: 2,
  21. },
  22. "input:hover ~ &": {
  23. backgroundColor: "gray",
  24. },
  25. }));
  26. const BpCheckedIcon = styled(BpIcon)({
  27. backgroundColor: "gray",
  28. "&:before": {
  29. display: "block",
  30. width: 16,
  31. height: 16,
  32. borderRadius: 3,
  33. backgroundColor: "#106ba3",
  34. backgroundImage:
  35. "url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath" +
  36. " fill-rule='evenodd' clip-rule='evenodd' d='M12 5c-.28 0-.53.11-.71.29L7 9.59l-2.29-2.3a1.003 " +
  37. "1.003 0 00-1.42 1.42l3 3c.18.18.43.29.71.29s.53-.11.71-.29l5-5A1.003 1.003 0 0012 5z' fill='%23fff'/%3E%3C/svg%3E\")",
  38. content: '""',
  39. },
  40. "input:hover ~ &": {
  41. backgroundColor: "#106ba3",
  42. },
  43. });
  44. function BpCheckbox(props) {
  45. return (
  46. <Checkbox
  47. sx={{
  48. "&:hover": { bgcolor: "transparent" },
  49. }}
  50. disableRipple
  51. color="default"
  52. checkedIcon={<BpCheckedIcon />}
  53. icon={<BpIcon />}
  54. {...props}
  55. />
  56. );
  57. }
  58. const TrackItem = (props) => {
  59. const dispatch = useDispatch();
  60. const track = props.data;
  61. const title =
  62. track.id3.title || removeAudioExtension(track.originalFileName);
  63. return (
  64. <div className="track">
  65. <div className="buttons">
  66. <div
  67. className="button-delete"
  68. onClick={() => dispatch(actionTrackToDelete(track._id))}
  69. >
  70. <BpCheckbox />
  71. </div>
  72. <div
  73. className="button-play"
  74. onClick={() => {
  75. dispatch(actionSetTrack(track));
  76. dispatch(actionClearQueue());
  77. }}
  78. >
  79. <img src={PlayIcon} alt="play_icon" />
  80. </div>
  81. </div>
  82. <div className="info">
  83. <p className="title">{title ?? "Title"}</p>
  84. <p className="artist">{track.id3.artist ?? "artist"}</p>
  85. <p className="album">{track.id3.album ?? "album"}</p>
  86. <p className="year">{track.id3.year ?? "year"}</p>
  87. <p className="genre">{track.id3.genre ?? "genre"}</p>
  88. </div>
  89. </div>
  90. );
  91. };
  92. export default TrackItem;