playing.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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, actionPrevTrack, actionNextTrack, actionSetRepeat} from '../store/playerReducer';
  6. import {Provider, connect} from 'react-redux';
  7. import { audio } from './Tracks';
  8. import img_album from '../images/default_album.gif'
  9. function msToTime(duration) {
  10. let hours,minutes,seconds;
  11. hours = Math.floor(duration / 3600);
  12. minutes = Math.floor((duration - 3600 * hours) / 60);
  13. seconds = Math.floor((duration - 3600 * hours - 60 * minutes) % 60);
  14. hours = (hours < 10) ? "0" + hours : hours;
  15. minutes = (minutes < 10) ? "0" + minutes : minutes;
  16. seconds = (seconds < 10) ? "0" + seconds : seconds;
  17. return minutes + ":" + seconds;
  18. }
  19. export let NowPlayingPlayer = (props) => {
  20. const [volume, setVolume] = useState(20);
  21. const [newCurrent, setNewCurrent] = useState(0)
  22. useEffect(() => {
  23. if (props.currentTime) audio.currentTime = newCurrent
  24. }, [newCurrent]);
  25. let album_photo = (props.track?.album?.photo) ? `http://player-api/storage/albums/${props.track?.album?.photo}` : img_album
  26. return(
  27. <div className="player">
  28. <div className="wrapper">
  29. <div className="details">
  30. <div className="now-playing"></div>
  31. <div className="track-art" style={{backgroundImage:`url(${album_photo})`}} ></div>
  32. <div className="track-name">{props.track?.name|| 'Track Name' }</div>
  33. <div className="now-playing">{props.track?.id3?.artist || 'Artist' }</div>
  34. </div>
  35. <div className="slider-container duration">
  36. <span className="current-time">{props.currentTime ?
  37. `0${((props.currentTime - props.currentTime % 60) / 60 % 60).toFixed() !== 'NaN' ?
  38. ((props.currentTime - props.currentTime % 60) / 60 % 60).toFixed() : '0'}:${(props.currentTime % 60).toFixed() > 9 ?
  39. '' : '0'}${(props.currentTime % 60).toFixed() !== 'NaN' ? (props.currentTime % 60).toFixed() : '0'}` : '--:--'}
  40. </span>
  41. <input type='range' min={0} max={props.duration} className="seek-slider"
  42. value={props.currentTime || 0} onChange={(e) => setNewCurrent(e.target.value)}
  43. onMouseUp={() => store.dispatch(actionFullPlay())} onMouseDown={() => store.dispatch(actionFullPause())}
  44. />
  45. <span className="total-duration">{props.track?.id3?.time || (msToTime(props.duration) !== 'NaN:NaN'? msToTime(props.duration) : '00:00')}</span>
  46. </div>
  47. <div className="slider-container">
  48. <FontAwesomeIcon icon={faVolumeDown} />
  49. <input type='range' min={1} max='99' value={volume} className="volume-slider"
  50. onChange={(e) => {
  51. setVolume(e.target.value);
  52. if (store.getState()?.player?.track) store.dispatch(actionFullSetVolume(volume)) }}
  53. />
  54. <FontAwesomeIcon icon={faVolumeUp} />
  55. </div>
  56. <div className="buttons">
  57. <div className="random-track"
  58. // onClick={randomTrack()}
  59. >
  60. <FontAwesomeIcon icon={faRandom} className='fa-2x'/>
  61. </div>
  62. <div className="prev-track"
  63. onClick={ () => store.dispatch(actionPrevTrack(props.track))}
  64. >
  65. <FontAwesomeIcon icon={faStepBackward} className='fa-2x'/>
  66. </div>
  67. <div className="play-track"
  68. onClick={() => {
  69. if(store.getState()?.player?.isPlaying === true) {
  70. store.dispatch(actionFullPause());
  71. } else{
  72. store.dispatch(actionFullPlay());
  73. }
  74. }}
  75. >
  76. <FontAwesomeIcon icon={(!props.isPlaying) ? faPlayCircle : faStopCircle} className='fa-5x' />
  77. </div>
  78. <div className="next-track"
  79. onClick={() => {
  80. store.dispatch(actionNextTrack({track: props.track, end:'false'}));
  81. }
  82. }
  83. >
  84. <FontAwesomeIcon icon={faStepForward} className='fa-2x'/>
  85. </div>
  86. <div className="random-track"
  87. onClick={() => (props.repeat === 1 ? store.dispatch(actionSetRepeat(2)) : store.dispatch(actionSetRepeat(1)))}
  88. >
  89. <FontAwesomeIcon icon={faRepeat} className={props.repeat === 1 ? 'fa-2x' : 'fa-3x'}/>
  90. </div>
  91. </div>
  92. </div>
  93. </div>)
  94. }
  95. export const СNowPlayingPlayer = connect(state => ({track: state.player?.track || [],
  96. duration: state.player?.duration || '00:00',
  97. isPlaying: state.player?.isPlaying || false,
  98. currentTime: state.player?.currentTime || '00:00',
  99. repeat: state.player?.repeat || 1}) )(NowPlayingPlayer);