playing.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. import { audio } from './Tracks';
  8. function msToTime(duration) {
  9. let hours,minutes,seconds;
  10. hours = Math.floor(duration / 3600);
  11. minutes = Math.floor((duration - 3600 * hours) / 60);
  12. seconds = Math.floor((duration - 3600 * hours - 60 * minutes) % 60);
  13. hours = (hours < 10) ? "0" + hours : hours;
  14. minutes = (minutes < 10) ? "0" + minutes : minutes;
  15. seconds = (seconds < 10) ? "0" + seconds : seconds;
  16. return minutes + ":" + seconds;
  17. }
  18. export let NowPlayingPlayer = (props) => {
  19. const [volume, setVolume] = useState(20);
  20. const [newCurrent, setNewCurrent] = useState(0)
  21. audio.ontimeupdate = () => store.dispatch(actionFullSetCurrentTime(audio.currentTime));
  22. useEffect(() => {
  23. if (props.currentTime) audio.currentTime = newCurrent
  24. }, [newCurrent])
  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">{props.currentTime ?
  36. `0${((props.currentTime - props.currentTime % 60) / 60 % 60).toFixed() !== 'NaN' ?
  37. ((props.currentTime - props.currentTime % 60) / 60 % 60).toFixed() : '0'}:${(props.currentTime % 60).toFixed() > 9 ?
  38. '' : '0'}${(props.currentTime % 60).toFixed() !== 'NaN' ? (props.currentTime % 60).toFixed() : '0'}` : '--:--'}
  39. </span>
  40. <input type='range' min={0} max={props.duration} className="seek-slider"
  41. value={props.currentTime || 0} onChange={(e) => setNewCurrent(e.target.value)}
  42. onMouseUp={() => store.dispatch(actionFullPlay())} onMouseDown={() => store.dispatch(actionFullPause())}
  43. />
  44. <span className="total-duration">{props.track?.id3?.time || (msToTime(props.duration) !== 'NaN:NaN'? msToTime(props.duration) : '00:00')}</span>
  45. </div>
  46. <div className="slider-container">
  47. <FontAwesomeIcon icon={faVolumeDown} />
  48. <input type='range' min={1} max='99' value={volume} className="volume-slider"
  49. onChange={(e) => {
  50. setVolume(e.target.value);
  51. if (store.getState()?.player?.track) store.dispatch(actionFullSetVolume(volume)) }}
  52. />
  53. <FontAwesomeIcon icon={faVolumeUp} />
  54. </div>
  55. <div className="buttons">
  56. <div className="random-track"
  57. // onClick={randomTrack()}
  58. >
  59. <FontAwesomeIcon icon={faRandom} className='fa-2x'/>
  60. </div>
  61. <div className="prev-track"
  62. // onClick={prevTrack()}
  63. >
  64. <FontAwesomeIcon icon={faStepBackward} className='fa-2x'/>
  65. </div>
  66. <div className="random-track"
  67. onClick={() => {
  68. if(store.getState()?.player?.isPlaying === true) {
  69. store.dispatch(actionFullPause());
  70. } else{
  71. store.dispatch(actionFullPlay());
  72. }
  73. }}
  74. >
  75. <FontAwesomeIcon icon={(!props.isPlaying) ? faPlayCircle : faStopCircle} className='fa-5x' />
  76. </div>
  77. <div className="next-track"
  78. // onClick={nextTrack()}
  79. >
  80. <FontAwesomeIcon icon={faStepForward} className='fa-2x'/>
  81. </div>
  82. <div className="random-track"
  83. // onClick={repeatTrack()}
  84. >
  85. <FontAwesomeIcon icon={faRepeat} className='fa-2x'/>
  86. </div>
  87. </div>
  88. </div>
  89. </div>)
  90. }
  91. export const СNowPlayingPlayer = connect(state => ({track: state.player?.track || [],
  92. duration: state.player?.duration || '00:00',
  93. isPlaying: state.player?.isPlaying || false,
  94. currentTime: state.player?.currentTime || '00:00' }) )(NowPlayingPlayer);