Player.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { Fragment, useEffect, useState } from "react";
  2. import YoutubePlayer from "./YoutubePlayer";
  3. import PlayerToolbar from "./PlayerToolbar";
  4. import { makeMessage } from "../util/Resolver";
  5. import { MessageTypes } from "../util/enums";
  6. import { Chueue } from "../util/room";
  7. export default function Player({ room, setRoom, socket }) {
  8. const { playback, controller, chueue } = room;
  9. const { isMe } = controller;
  10. const { repeatEnabled } = chueue;
  11. const [playerEnabled, setPlayerEnabled] = useState(false);
  12. const [previousPlayerEnabled, setPreviousPlayerEnabled] = useState(playerEnabled);
  13. const [placeholderHidden, setPlaceholderHidden] = useState(false);
  14. useEffect(() => {
  15. setPreviousPlayerEnabled(playerEnabled);
  16. }, [playerEnabled]);
  17. useEffect(() => {
  18. console.log(socket);
  19. if (socket.ws.readyState === WebSocket.OPEN && playerEnabled !== previousPlayerEnabled) {
  20. socket.ws.send(makeMessage(MessageTypes.PLAYER_ENABLED, { enabled: playerEnabled }))
  21. }
  22. }, [playerEnabled, previousPlayerEnabled, socket])
  23. function onSongEnd() {
  24. console.debug("Song end triggered with state", room)
  25. if (isMe && playback.song !== null) {
  26. socket.ws.send(makeMessage(MessageTypes.SONG_END, { id: playback.song.id }))
  27. const { song: newSong, chueue: newChueue } = Chueue.pop(chueue)
  28. setRoom({
  29. ...room,
  30. chueue: { ...chueue, ...newChueue },
  31. playback: { ...playback, song: newSong },
  32. })
  33. }
  34. }
  35. let player;
  36. if (playerEnabled) {
  37. player = <YoutubePlayer playback={playback} onSongEnd={onSongEnd}/>
  38. } else if (placeholderHidden) {
  39. player =
  40. <button className="btn btn-link btn-sm text-secondary pl-2" onClick={() => setPlaceholderHidden(false)}>
  41. Show
  42. </button>
  43. } else {
  44. player = <div className="col-12">
  45. <div className="playerContainer">
  46. <div className="d-flex justify-content-center playerPlaceholder">
  47. <div>
  48. <button className="btn btn-outline-secondary"
  49. onClick={() => setPlayerEnabled(true)}>
  50. Start Player
  51. </button>
  52. <br/>
  53. <button className="btn btn-link btn-sm small text-secondary"
  54. style={{ width: "100%" }}
  55. onClick={() => setPlaceholderHidden(true)}>
  56. Hide
  57. </button>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. }
  63. return <Fragment>
  64. <div className="row">
  65. <PlayerToolbar playback={playback} repeatEnabled={repeatEnabled}
  66. playerEnabled={playerEnabled} setPlayerEnabled={setPlayerEnabled}
  67. socket={socket} isController={isMe}/>
  68. </div>
  69. <div className="row">
  70. {player}
  71. </div>
  72. </Fragment>
  73. }