PeerGrid.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import {
  2. GridLayout,
  3. Peer,
  4. PeerList,
  5. RemoteMediaList
  6. } from '@andyet/simplewebrtc';
  7. import React, { useContext } from 'react';
  8. import styled from 'styled-components';
  9. import HiddenPeers from '../contexts/HiddenPeers';
  10. import Placeholders from '../contexts/Placeholders';
  11. import isMobile from '../utils/isMobile';
  12. import PeerGridItem from './PeerGridItem';
  13. const StyledGridLayout = styled(GridLayout)({
  14. flex: 1,
  15. backgroundColor: '#eaecec',
  16. maxHeight: '100vh',
  17. '& video': {
  18. width: '100%'
  19. },
  20. '& > div': {
  21. position: 'relative'
  22. }
  23. }) as any; // TODO: Fix this!
  24. interface Props {
  25. roomAddress: string;
  26. activeSpeakerView: boolean;
  27. }
  28. // const speakingPeers = peers.filter(p => p.speaking);
  29. // let peersToRender = [];
  30. // if (speakingPeers) {
  31. // peersToRender = [...speakingPeers, peers.filter(p => p.hasSpokenInLast(5))];
  32. // } else {
  33. // peersToRender = peers.filter(p => p.hasSpokenInLast(15));
  34. // }
  35. // if (peersToRender.length === 0) {
  36. // peersToRender = peers;
  37. // }
  38. // PeerGrid is the main video display for Talky. It matches remoteMedia to
  39. // peers and then renders a PeerGridItem for each peer in the room.
  40. const PeerGrid: React.SFC<Props> = ({ roomAddress, activeSpeakerView }) => {
  41. const { hiddenPeers } = useContext(HiddenPeers);
  42. return (
  43. <PeerList
  44. speaking={activeSpeakerView ? activeSpeakerView : undefined}
  45. room={roomAddress}
  46. render={({ peers }) => {
  47. const visiblePeers = peers.filter(p => !hiddenPeers.includes(p.id));
  48. return visiblePeers.length > 0 || activeSpeakerView ? (
  49. <StyledGridLayout
  50. items={visiblePeers}
  51. renderCell={(peer: Peer) => (
  52. <RemoteMediaList
  53. peer={peer.address}
  54. render={({ media }) => (
  55. <PeerGridItem media={media} peer={peer} />
  56. )}
  57. />
  58. )}
  59. />
  60. ) : (
  61. <Placeholders.Consumer>
  62. {({ gridPlaceholder }) => (
  63. <div
  64. style={{
  65. flex: 1,
  66. display: 'flex',
  67. alignItems: 'center',
  68. justifyContent: 'center',
  69. position: 'relative'
  70. }}
  71. ref={node => {
  72. if (node && gridPlaceholder && node.childElementCount === 0) {
  73. const el = gridPlaceholder();
  74. if (el) {
  75. node.appendChild(el);
  76. }
  77. }
  78. }}
  79. />
  80. )}
  81. </Placeholders.Consumer>
  82. );
  83. }}
  84. />
  85. );
  86. };
  87. export default PeerGrid;