StreamList.jsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import React from "react";
  2. import useOpenVidu from "./useOpenVidu";
  3. import LocalStream from "./LocalStream";
  4. import RemoteStream from "./RemoteStream";
  5. const StreamList = ({
  6. currentUser,
  7. users,
  8. audioOnly = true,
  9. enableLocalVideo = false,
  10. enableLocalAudio = true,
  11. setLocalVideo = () => {},
  12. setLocalAudio = () => {},
  13. }) => {
  14. const { remoteStreams = [], localStream } = useOpenVidu();
  15. const streamMap = React.useMemo(
  16. () =>
  17. remoteStreams.reduce((acc, stream) => {
  18. acc[stream.data.uid] = stream;
  19. return acc;
  20. }, {}),
  21. [remoteStreams]
  22. );
  23. return (
  24. <div className="stream-list">
  25. {localStream && (
  26. <div className="local-stream">
  27. <LocalStream
  28. stream={localStream}
  29. video={enableLocalVideo && !audioOnly}
  30. audio={enableLocalAudio}
  31. user={currentUser}
  32. />
  33. <div className="actions">
  34. {!audioOnly && (
  35. <button
  36. onClick={() => setLocalVideo(!enableLocalVideo)}
  37. className={enableLocalVideo ? "active" : ""}
  38. >
  39. <img
  40. src={
  41. enableLocalVideo
  42. ? "https://icongr.am/feather/camera.svg?size=16&color=f9fbfa"
  43. : "https://icongr.am/feather/camera-off.svg?size=16&color=f9fbfa"
  44. }
  45. />
  46. </button>
  47. )}
  48. <button
  49. onClick={() => setLocalAudio(!enableLocalAudio)}
  50. className={enableLocalAudio ? "active" : ""}
  51. >
  52. <img
  53. src={
  54. enableLocalAudio
  55. ? "https://icongr.am/feather/mic.svg?size=16&color=f9fbfa"
  56. : "https://icongr.am/feather/mic-off.svg?size=16&color=f9fbfa"
  57. }
  58. />
  59. </button>
  60. </div>
  61. </div>
  62. )}
  63. {users.map(
  64. (user) =>
  65. streamMap[user.uid] && (
  66. <div key={user.uid} className="remote-stream">
  67. <RemoteStream stream={streamMap[user.uid]} user={user} />
  68. </div>
  69. )
  70. )}
  71. </div>
  72. );
  73. };
  74. export default StreamList;