Playerbar.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { useEffect, useState } from "react"
  2. import { connect } from "react-redux"
  3. import { 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 className="timestamp highlightYellow">
  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. <footer className="playerbar">
  18. {_player?.track ?
  19. <div style={{ display: `${_player?.track ? 'block' : 'none'}` }}>
  20. <div>
  21. <input
  22. className="playerbar__range plumline yellowThumb"
  23. style={{ width: '95%' }}
  24. type="range" min="0" max={_player?.duration || 0} step="any"
  25. value={_player?.currentTime}
  26. onChange={(e) => setCurrentTime(e.target.value)}
  27. />
  28. </div>
  29. <div className="playerbar__info">
  30. <Timestamp className="playerbar" time={_player?.currentTime} />
  31. <strong className="highlightYellow">
  32. <small className="lightText highlightGreen">{(_player.playlist.name || 'Uploads') + ' : '}</small>
  33. {(_player.track?.id3?.artist && _player.track?.id3?.title ?
  34. _player.track?.id3?.artist + ' - ' + _player.track?.id3?.title :
  35. _player.track?.originalFileName)}
  36. </strong>
  37. <Timestamp time={_player?.duration} />
  38. </div>
  39. <div style={{ marginTop: '0.5%' }}>
  40. <button onClick={() => switchTrack(false, _player?.playlistIndex, _player?.playlist)}>
  41. {_player?.playlistIndex === 0 ? <FontAwesomeIcon icon={faFastBackward} /> :
  42. <FontAwesomeIcon icon={faBackward} />}
  43. </button>
  44. {_player?.isPlaying ?
  45. <button onClick={() => pauseTrack()}><FontAwesomeIcon icon={faPause} /></button> :
  46. <button onClick={() => playTrack()}><FontAwesomeIcon icon={faPlay} /></button>
  47. }
  48. <button onClick={() => switchTrack(true, _player?.playlistIndex, _player?.playlist)}>
  49. {_player?.playlistIndex === (_player?.playlist?.constructor.name === 'Array' ?
  50. _player?.playlist?.length - 1 : _player?.playlist?.tracks.length - 1) ?
  51. <FontAwesomeIcon icon={faFastForward} /> :
  52. <FontAwesomeIcon icon={faForward} />}
  53. </button>
  54. <label style={{ marginLeft: '1%' }}>
  55. <FontAwesomeIcon icon={faVolumeUp} />
  56. <input
  57. className="playerbar__range blueline blueThumb"
  58. type="range" min="0" max="1" step="any"
  59. onChange={(e) => setTrackVolume(e.target.value)}
  60. />
  61. </label>
  62. </div>
  63. </div> : <></>}
  64. </footer>
  65. )
  66. }
  67. export const PlayerbarConnect = connect(
  68. state => ({ player: state.player || {} }),
  69. {
  70. playTrack: action.playTrack,
  71. pauseTrack: action.pauseTrack,
  72. switchTrack: action.switchTrack,
  73. setTrackVolume: action.setTrackVolume,
  74. setCurrentTime: action.setNewTrackCurrentTime
  75. }
  76. )(Playerbar)