You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ParticipantsPane.js 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // @flow
  2. import React, { useState } from 'react';
  3. import { useSelector } from 'react-redux';
  4. import JitsiScreen from '../../../base/modal/components/JitsiScreen';
  5. import { isLocalParticipantModerator } from '../../../base/participants';
  6. import { equals } from '../../../base/redux';
  7. import {
  8. getBreakoutRooms,
  9. getCurrentRoomId,
  10. isAddBreakoutRoomButtonVisible,
  11. isAutoAssignParticipantsVisible,
  12. isInBreakoutRoom
  13. } from '../../../breakout-rooms/functions';
  14. import { getKnockingParticipants } from '../../../lobby/functions';
  15. import {
  16. AddBreakoutRoomButton,
  17. AutoAssignButton,
  18. LeaveBreakoutRoomButton
  19. } from '../breakout-rooms/components/native';
  20. import { CollapsibleRoom } from '../breakout-rooms/components/native/CollapsibleRoom';
  21. import LobbyParticipantList from './LobbyParticipantList';
  22. import MeetingParticipantList from './MeetingParticipantList';
  23. import ParticipantsPaneFooter from './ParticipantsPaneFooter';
  24. import styles from './styles';
  25. /**
  26. * Participants pane.
  27. *
  28. * @returns {React$Element<any>}
  29. */
  30. const ParticipantsPane = () => {
  31. const [ searchString, setSearchString ] = useState('');
  32. const isLocalModerator = useSelector(isLocalParticipantModerator);
  33. const { conference } = useSelector(state => state['features/base/conference']);
  34. const _isBreakoutRoomsSupported = conference?.getBreakoutRooms()?.isSupported();
  35. const currentRoomId = useSelector(getCurrentRoomId);
  36. const rooms: Array<Object> = Object.values(useSelector(getBreakoutRooms, equals))
  37. .filter((room: Object) => room.id !== currentRoomId)
  38. .sort((p1: Object, p2: Object) => (p1?.name || '').localeCompare(p2?.name || ''));
  39. const inBreakoutRoom = useSelector(isInBreakoutRoom);
  40. const showAddBreakoutRoom = useSelector(isAddBreakoutRoomButtonVisible);
  41. const showAutoAssign = useSelector(isAutoAssignParticipantsVisible);
  42. const lobbyParticipants = useSelector(getKnockingParticipants);
  43. return (
  44. <JitsiScreen
  45. footerComponent = { isLocalModerator && ParticipantsPaneFooter }
  46. style = { styles.participantsPaneContainer }>
  47. <LobbyParticipantList />
  48. <MeetingParticipantList
  49. breakoutRooms = { rooms }
  50. isLocalModerator = { isLocalModerator }
  51. lobbyParticipants = { lobbyParticipants }
  52. searchString = { searchString }
  53. setSearchString = { setSearchString } />
  54. {
  55. showAutoAssign && <AutoAssignButton />
  56. }
  57. {
  58. inBreakoutRoom && <LeaveBreakoutRoomButton />
  59. }
  60. {
  61. _isBreakoutRoomsSupported
  62. && rooms.map(room => (<CollapsibleRoom
  63. key = { room.id }
  64. room = { room }
  65. searchString = { searchString } />))
  66. }
  67. {
  68. showAddBreakoutRoom && <AddBreakoutRoomButton />
  69. }
  70. </JitsiScreen>
  71. );
  72. };
  73. export default ParticipantsPane;