您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

AbstractSpeakerStatsList.js 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // @flow
  2. import { useCallback, useEffect, useRef } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import { useDispatch, useSelector } from 'react-redux';
  5. import { getLocalParticipant } from '../../base/participants';
  6. import { initUpdateStats } from '../actions.any';
  7. import {
  8. SPEAKER_STATS_RELOAD_INTERVAL
  9. } from '../constants';
  10. /**
  11. * Component that renders the list of speaker stats.
  12. *
  13. * @param {Function} speakerStatsItem - React element tu use when rendering.
  14. * @param {Object} itemStyles - Styles for the speaker stats item.
  15. * @returns {Function}
  16. */
  17. const abstractSpeakerStatsList = (speakerStatsItem: Function, itemStyles?: Object): Function[] => {
  18. const dispatch = useDispatch();
  19. const { t } = useTranslation();
  20. const conference = useSelector(state => state['features/base/conference'].conference);
  21. const { stats: speakerStats, showFaceExpressions } = useSelector(state => state['features/speaker-stats']);
  22. const localParticipant = useSelector(getLocalParticipant);
  23. const { defaultRemoteDisplayName } = useSelector(
  24. state => state['features/base/config']) || {};
  25. const { faceLandmarks } = useSelector(state => state['features/base/config']) || {};
  26. const { faceExpressions } = useSelector(state => state['features/face-landmarks']) || {};
  27. const reloadInterval = useRef(null);
  28. /**
  29. * Update the internal state with the latest speaker stats.
  30. *
  31. * @returns {Object}
  32. * @private
  33. */
  34. const getSpeakerStats = useCallback(() => {
  35. const stats = conference.getSpeakerStats();
  36. for (const userId in stats) {
  37. if (stats[userId]) {
  38. if (stats[userId].isLocalStats()) {
  39. const meString = t('me');
  40. stats[userId].setDisplayName(
  41. localParticipant.name
  42. ? `${localParticipant.name} (${meString})`
  43. : meString
  44. );
  45. if (faceLandmarks?.enableDisplayFaceExpressions) {
  46. stats[userId].setFaceExpressions(faceExpressions);
  47. }
  48. }
  49. if (!stats[userId].getDisplayName()) {
  50. stats[userId].setDisplayName(
  51. conference.getParticipantById(userId)?.name
  52. );
  53. }
  54. }
  55. }
  56. return stats;
  57. }, [ faceExpressions ]);
  58. const updateStats = useCallback(
  59. () => dispatch(initUpdateStats(getSpeakerStats)),
  60. [ dispatch, initUpdateStats, getSpeakerStats ]);
  61. useEffect(() => {
  62. if (reloadInterval.current) {
  63. clearInterval(reloadInterval.current);
  64. }
  65. reloadInterval.current = setInterval(() => {
  66. updateStats();
  67. }, SPEAKER_STATS_RELOAD_INTERVAL);
  68. return () => clearInterval(reloadInterval.current);
  69. }, [ faceExpressions ]);
  70. const localSpeakerStats = Object.keys(speakerStats).length === 0 ? getSpeakerStats() : speakerStats;
  71. const userIds = Object.keys(localSpeakerStats).filter(id => localSpeakerStats[id] && !localSpeakerStats[id].hidden);
  72. return userIds.map(userId => {
  73. const statsModel = localSpeakerStats[userId];
  74. const props = {};
  75. props.isDominantSpeaker = statsModel.isDominantSpeaker();
  76. props.dominantSpeakerTime = statsModel.getTotalDominantSpeakerTime();
  77. props.participantId = userId;
  78. props.hasLeft = statsModel.hasLeft();
  79. if (showFaceExpressions) {
  80. props.faceExpressions = statsModel.getFaceExpressions();
  81. }
  82. props.hidden = statsModel.hidden;
  83. props.showFaceExpressions = showFaceExpressions;
  84. props.displayName = statsModel.getDisplayName() || defaultRemoteDisplayName;
  85. if (itemStyles) {
  86. props.styles = itemStyles;
  87. }
  88. props.t = t;
  89. return speakerStatsItem(props);
  90. });
  91. };
  92. export default abstractSpeakerStatsList;