playing.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
  2. import React, {useState, useEffect} from 'react';
  3. import {faVolumeDown, faVolumeUp, faRandom, faStepBackward, faStopCircle, faStepForward, faPlayCircle, faRepeat} from '@fortawesome/free-solid-svg-icons'
  4. import { store } from '../store/store';
  5. import {actionFullGetDuration, actionFullSetTrack, actionFullPlay, actionFullPause, actionFullSetVolume, actionFullSetCurrentTime } from '../store/playerReducer';
  6. import {Provider, connect} from 'react-redux';
  7. function msToTime(duration) {
  8. let hours,minutes,seconds;
  9. hours = Math.floor(duration / 3600);
  10. minutes = Math.floor((duration - 3600 * hours) / 60);
  11. seconds = Math.floor((duration - 3600 * hours - 60 * minutes) % 60);
  12. hours = (hours < 10) ? "0" + hours : hours;
  13. minutes = (minutes < 10) ? "0" + minutes : minutes;
  14. seconds = (seconds < 10) ? "0" + seconds : seconds;
  15. return minutes + ":" + seconds;
  16. }
  17. export let NowPlayingPlayer = (props) => {
  18. const [volume, setVolume] = useState(10);
  19. // let duration;
  20. // useEffect(() => {
  21. // if (!store.getState().player?.duration) {
  22. // duration = msToTime(store.getState()?.player?.track?.src?.duration)
  23. // }
  24. // }, []);
  25. return(
  26. <div className="player">
  27. <div className="wrapper">
  28. <div className="details">
  29. <div className="now-playing"></div>
  30. <div className="track-art"></div>
  31. <div className="track-name">{props.track?.name|| 'Track Name' }</div>
  32. <div className="now-playing">{props.track?.id3?.artist || 'Artist' }</div>
  33. </div>
  34. <div className="slider-container duration">
  35. <span className="current-time">00:00</span>
  36. <input type='range' min={1} max='100' value='0' className="seek-slider"
  37. // onChange={(e) => setDuration(e.target.value)}
  38. />
  39. <span className="total-duration">{msToTime(props.duration) !== 'NaN'? msToTime(props.duration) : '00:00'}</span>
  40. </div>
  41. <div className="slider-container">
  42. <FontAwesomeIcon icon={faVolumeDown} />
  43. <input type='range' min={1} max='99' value={volume} className="volume-slider"
  44. onChange={(e) => {
  45. setVolume(e.target.value);
  46. if (store.getState()?.player?.track) store.dispatch(actionFullSetVolume(volume)) }}
  47. />
  48. <FontAwesomeIcon icon={faVolumeUp} />
  49. </div>
  50. <div className="buttons">
  51. <div className="random-track"
  52. // onClick={randomTrack()}
  53. >
  54. <FontAwesomeIcon icon={faRandom} className='fa-2x'/>
  55. </div>
  56. <div className="random-track"
  57. // onClick={prevTrack()}
  58. >
  59. <FontAwesomeIcon icon={faStepBackward} className='fa-2x'/>
  60. </div>
  61. <div className="random-track"
  62. onClick={() => {
  63. if(store.getState()?.player?.isPlaying === true) {
  64. store.dispatch(actionFullPause());
  65. //setPlay(true)
  66. } else{
  67. store.dispatch(actionFullPlay());
  68. //setPlay(false)
  69. }
  70. }}
  71. >
  72. <FontAwesomeIcon icon={(!props.isPlaying) ? faPlayCircle : faStopCircle} className='fa-5x' />
  73. </div>
  74. <div className="next-track"
  75. // onClick={nextTrack()}
  76. >
  77. <FontAwesomeIcon icon={faStepForward} className='fa-2x'/>
  78. </div>
  79. <div className="random-track"
  80. // onClick={repeatTrack()}
  81. >
  82. <FontAwesomeIcon icon={faRepeat} className='fa-2x'/>
  83. </div>
  84. </div>
  85. </div>
  86. </div>)
  87. }
  88. function mapStateToProps (state) {
  89. return {
  90. track: state.player?.track,
  91. duration: state.player?.duration,
  92. }
  93. }
  94. //export const СNowPlayingPlayer = connect(mapStateToProps)(NowPlayingPlayer)
  95. export const СNowPlayingPlayer = connect(state => ({track: state.player?.track || [], duration: state.player?.duration || [], isPlaying: state.player?.isPlaying || false}) )(NowPlayingPlayer);