Player.jsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import React, { useState } from "react";
  2. import { useSelector, useDispatch } from "react-redux";
  3. import {
  4. actionTogglePlay,
  5. actionToggleRepeat,
  6. actionSetVolume,
  7. actionSetCurrentTime,
  8. actionPrevTrack,
  9. actionNextTrack,
  10. } from "../../redux/actions/creators/audio";
  11. import "./style.scoped.scss";
  12. import { removeAudioExtension } from "../../utils/regex";
  13. import CollapseIcon from "../../assets/collapse_icon.svg";
  14. import ShuffleIcon from "../../assets/shuffle_icon.svg";
  15. import PreviousIcon from "../../assets/previous_icon.svg";
  16. import NextIcon from "../../assets/next_icon.svg";
  17. import PlayIcon from "../../assets/play_icon.svg";
  18. import StopIcon from "../../assets/stop_icon.svg";
  19. import RepeatIcon from "../../assets/repeat_icon.svg";
  20. import VolumeUpIcon from "../../assets/volume_up_icon.svg";
  21. import VolumeStopIcon from "../../assets/volume_stop_icon.svg";
  22. import { secondsToHMS } from "../../utils";
  23. const whiteFilter = `invert(100%) sepia(0%) saturate(7500%) hue-rotate(116deg)
  24. brightness(109%) contrast(109%)`;
  25. const darkFilter = `invert(48%) sepia(3%) saturate(4%) hue-rotate(326deg) brightness(110%) contrast(78%)`;
  26. const Player = () => {
  27. const dispatch = useDispatch();
  28. const state = useSelector((store) => store.audio);
  29. const title = state.track
  30. ? state.track.id3.title ||
  31. removeAudioExtension(state.track.originalFileName)
  32. : null;
  33. const [isCollapsed, setIsCollapsed] = useState(false);
  34. return (
  35. <div
  36. className="player"
  37. style={{
  38. height: isCollapsed ? "30px" : "80px",
  39. }}
  40. >
  41. <div className="header">
  42. <p className="duration">{secondsToHMS(state.currentTime)}</p>
  43. <input
  44. className="audio"
  45. type={"range"}
  46. min={0}
  47. max={state.duration}
  48. value={state.currentTime}
  49. onChange={(e) => {
  50. dispatch(actionSetCurrentTime(+e.target.value));
  51. }}
  52. />
  53. <img
  54. className="button-collapse"
  55. src={CollapseIcon}
  56. style={{
  57. filter: isCollapsed ? darkFilter : whiteFilter,
  58. }}
  59. onClick={() => setIsCollapsed(!isCollapsed)}
  60. />
  61. </div>
  62. {!isCollapsed ? (
  63. <div className="footer">
  64. <div className="info">
  65. <p className="track-name">{title ?? "Here is track"}</p>
  66. <p className="playlist-name">Here is playlist</p>
  67. </div>
  68. <div className="main-buttons">
  69. <img className="shuffle-button" src={ShuffleIcon} />
  70. <img
  71. className="previous-button"
  72. src={PreviousIcon}
  73. onClick={() => dispatch(actionPrevTrack())}
  74. />
  75. <img
  76. className="status-button"
  77. src={state.isPlaying ? StopIcon : PlayIcon}
  78. onClick={() =>
  79. dispatch(
  80. actionTogglePlay(
  81. state.isPlaying ? false : true
  82. )
  83. )
  84. }
  85. />
  86. <img
  87. className="next-button"
  88. src={NextIcon}
  89. onClick={() => dispatch(actionNextTrack())}
  90. />
  91. <img
  92. className="repeat-button"
  93. src={RepeatIcon}
  94. style={{
  95. filter: state.isRepeated
  96. ? whiteFilter
  97. : darkFilter,
  98. }}
  99. onClick={() =>
  100. dispatch(actionToggleRepeat(!state.isRepeated))
  101. }
  102. />
  103. </div>
  104. <div className="volume-settings">
  105. <img
  106. className="button-volume"
  107. src={state.volume ? VolumeUpIcon : VolumeStopIcon}
  108. onClick={() =>
  109. dispatch(actionSetVolume(state.volume ? 0 : 1))
  110. }
  111. />
  112. <input
  113. className="volume"
  114. type={"range"}
  115. min={0}
  116. max={1}
  117. step={0.01}
  118. value={state.volume}
  119. onChange={(e) => {
  120. dispatch(actionSetVolume(+e.target.value));
  121. }}
  122. />
  123. </div>
  124. </div>
  125. ) : null}
  126. </div>
  127. );
  128. };
  129. export default Player;