Playerbar.js 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useEffect, useState } from "react"
  2. import { connect } from "react-redux"
  3. import { faHome, faPlay, faPause, faForward, faBackward, faFastForward, faFastBackward, faVolumeUp} from "@fortawesome/free-solid-svg-icons";
  4. import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
  5. import * as action from "../actions"
  6. const Timestamp = ({time}) =>
  7. <small style={{margin: '0 10px'}}>
  8. {Math.floor((time / 60) % 60) < 10? `0` + Math.floor((time / 60) % 60) : Math.floor((time / 60) % 60)} :
  9. {Math.floor(time % 60) < 10? `0`+ Math.floor(time % 60) : Math.floor(time % 60)}
  10. </small>
  11. const Playerbar = ({ player, playTrack, pauseTrack, switchTrack, setTrackVolume, setCurrentTime }) => {
  12. let [_player, setPlayer] = useState()
  13. useEffect(() => {
  14. setPlayer(player)
  15. }, [player, _player])
  16. return (
  17. <>
  18. {_player?.track ?
  19. <footer style={{display: `${_player?.track ? 'block' : 'none'}`, width: '95%', margin:'0 auto'}}>
  20. <input
  21. style={{width:'100%'}}
  22. type="range" min="0" max={_player?.duration} step="any"
  23. value={_player?.currentTime}
  24. onChange={(e) => setCurrentTime(e.target.value)}
  25. />
  26. <div style={{display:"flex", justifyContent:"space-between", width:'95%', margin:'0 auto'}}>
  27. <Timestamp time={_player?.currentTime} />
  28. {_player ? (_player.track?.id3?.artist && _player.track?.id3?.title ?
  29. <strong>{_player.track?.id3?.artist} - {_player.track?.id3?.title}</strong> :
  30. <strong>{_player.track?.originalFileName}</strong>) : ''}
  31. <Timestamp time={_player?.duration} />
  32. </div>
  33. <div style={{marginTop:'0.5%'}}>
  34. <button
  35. style={{ fontSize: '2vh', padding: '5px' }}
  36. onClick={() => switchTrack(false, _player?.playlistIndex, _player?.playlist)}
  37. >
  38. {_player?.playlistIndex === 0 ? <FontAwesomeIcon icon={faFastBackward} />:
  39. <FontAwesomeIcon icon={faBackward} />}
  40. </button>
  41. {_player?.isPlaying ?
  42. <button style={{ fontSize: '2vh', padding: '5px' }} onClick={() => pauseTrack()}><FontAwesomeIcon icon={faPause} /></button> :
  43. <button style={{ fontSize: '2vh', padding: '5px' }} onClick={() => playTrack()}><FontAwesomeIcon icon={faPlay} /></button>
  44. }
  45. <button
  46. style={{ fontSize: '2vh', padding: '5px' }}
  47. onClick={() => switchTrack(true, _player?.playlistIndex, _player?.playlist)}
  48. >
  49. {_player?.playlistIndex === (_player?.playlist?.constructor.name === 'Array'? _player?.playlist?.length - 1 : _player?.playlist?.tracks.length - 1) ?
  50. <FontAwesomeIcon icon={faFastForward} /> : <FontAwesomeIcon icon={faForward} />}
  51. </button>
  52. <label style={{marginLeft: '1%'}}>
  53. <FontAwesomeIcon icon={faVolumeUp} />
  54. <input type="range" min="0" max="1" step="any" onChange={(e) => setTrackVolume(e.target.value)} />
  55. </label>
  56. </div>
  57. {/* <small>{_player?.playlistIndex}</small> */}
  58. </footer> : <div style={{width:'inherit', height:'inherit', padding:'2em'}}>C'mon, Push the play button on some track :)</div>}
  59. </>
  60. )
  61. }
  62. export const PlayerbarConnect = connect(
  63. state => ({ player: state.player || {} }),
  64. {
  65. playTrack: action.playTrack,
  66. pauseTrack: action.pauseTrack,
  67. switchTrack: action.switchTrack,
  68. setTrackVolume: action.setTrackVolume,
  69. setCurrentTime: action.setNewTrackCurrentTime
  70. }
  71. )(Playerbar)