Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

VisitorsList.tsx 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import React, { useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { useDispatch, useSelector } from 'react-redux';
  4. import { makeStyles } from 'tss-react/mui';
  5. import { withPixelLineHeight } from '../../../base/styles/functions.web';
  6. import { admitMultiple, goLive } from '../../../visitors/actions';
  7. import {
  8. getPromotionRequests,
  9. getVisitorsCount,
  10. getVisitorsInQueueCount,
  11. isVisitorsLive
  12. } from '../../../visitors/functions';
  13. import { VisitorsItem } from './VisitorsItem';
  14. const useStyles = makeStyles()(theme => {
  15. return {
  16. container: {
  17. margin: `${theme.spacing(3)} 0`
  18. },
  19. headingW: {
  20. color: theme.palette.warning02
  21. },
  22. drawerActions: {
  23. listStyleType: 'none',
  24. margin: 0,
  25. padding: 0
  26. },
  27. drawerItem: {
  28. alignItems: 'center',
  29. color: theme.palette.text01,
  30. display: 'flex',
  31. padding: '12px 16px',
  32. ...withPixelLineHeight(theme.typography.bodyShortRegularLarge),
  33. '&:first-child': {
  34. marginTop: '15px'
  35. },
  36. '&:hover': {
  37. cursor: 'pointer',
  38. background: theme.palette.action02
  39. }
  40. },
  41. icon: {
  42. marginRight: 16
  43. },
  44. headingContainer: {
  45. alignItems: 'center',
  46. display: 'flex',
  47. justifyContent: 'space-between'
  48. },
  49. heading: {
  50. ...withPixelLineHeight(theme.typography.bodyShortBold),
  51. color: theme.palette.text02
  52. },
  53. link: {
  54. ...withPixelLineHeight(theme.typography.labelBold),
  55. color: theme.palette.link01,
  56. cursor: 'pointer'
  57. }
  58. };
  59. });
  60. /**
  61. * Component used to display a list of visitors waiting for approval to join the main meeting.
  62. *
  63. * @returns {ReactNode}
  64. */
  65. export default function VisitorsList() {
  66. const requests = useSelector(getPromotionRequests);
  67. const visitorsCount = useSelector(getVisitorsCount);
  68. const visitorsInQueueCount = useSelector(getVisitorsInQueueCount);
  69. const isLive = useSelector(isVisitorsLive);
  70. const showVisitorsInQueue = visitorsInQueueCount > 0 && isLive === false;
  71. const { t } = useTranslation();
  72. const { classes, cx } = useStyles();
  73. const dispatch = useDispatch();
  74. const admitAll = useCallback(() => {
  75. dispatch(admitMultiple(requests));
  76. }, [ dispatch, requests ]);
  77. const goLiveCb = useCallback(() => {
  78. dispatch(goLive());
  79. }, [ dispatch ]);
  80. if (visitorsCount <= 0 && !showVisitorsInQueue) {
  81. return null;
  82. }
  83. return (
  84. <>
  85. <div className = { classes.headingContainer }>
  86. <div className = { cx(classes.heading, classes.headingW) }>
  87. { t('participantsPane.headings.visitors', { count: visitorsCount })}
  88. { requests.length > 0
  89. && t('participantsPane.headings.visitorRequests', { count: requests.length }) }
  90. { showVisitorsInQueue
  91. && t('participantsPane.headings.visitorInQueue', { count: visitorsInQueueCount }) }
  92. </div>
  93. {
  94. requests.length > 1 && !showVisitorsInQueue // Go live button is with higher priority
  95. && <div
  96. className = { classes.link }
  97. onClick = { admitAll }>{ t('participantsPane.actions.admitAll') }</div>
  98. }
  99. {
  100. showVisitorsInQueue
  101. && <div
  102. className = { classes.link }
  103. onClick = { goLiveCb }>{ t('participantsPane.actions.goLive') }</div>
  104. }
  105. </div>
  106. <div
  107. className = { classes.container }
  108. id = 'visitor-list'>
  109. {
  110. requests.map(r => (
  111. <VisitorsItem
  112. key = { r.from }
  113. request = { r } />)
  114. )
  115. }
  116. </div>
  117. </>
  118. );
  119. }