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

middleware.ts 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { AnyAction } from 'redux';
  2. import { IStore } from '../app/types';
  3. import {
  4. PARTICIPANT_JOINED,
  5. PARTICIPANT_KICKED,
  6. PARTICIPANT_LEFT,
  7. PARTICIPANT_UPDATED
  8. } from '../base/participants/actionTypes';
  9. import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
  10. import {
  11. ADD_TO_OFFSET,
  12. INIT_SEARCH,
  13. INIT_UPDATE_STATS,
  14. RESET_SEARCH_CRITERIA
  15. } from './actionTypes';
  16. import {
  17. clearTimelineBoundary,
  18. initReorderStats,
  19. setTimelineBoundary,
  20. updateSortedSpeakerStatsIds,
  21. updateStats
  22. } from './actions.any';
  23. import { CLEAR_TIME_BOUNDARY_THRESHOLD } from './constants';
  24. import {
  25. filterBySearchCriteria,
  26. getCurrentDuration,
  27. getPendingReorder,
  28. getSortedSpeakerStatsIds,
  29. getTimelineBoundaries,
  30. resetHiddenStats
  31. } from './functions';
  32. MiddlewareRegistry.register(({ dispatch, getState }: IStore) => (next: Function) => (action: AnyAction) => {
  33. switch (action.type) {
  34. case INIT_SEARCH: {
  35. const state = getState();
  36. const stats = filterBySearchCriteria(state);
  37. dispatch(updateStats(stats));
  38. break;
  39. }
  40. case INIT_UPDATE_STATS:
  41. if (action.getSpeakerStats) {
  42. const state = getState();
  43. const speakerStats = { ...action.getSpeakerStats() };
  44. const stats = filterBySearchCriteria(state, speakerStats);
  45. const pendingReorder = getPendingReorder(state);
  46. if (pendingReorder) {
  47. dispatch(updateSortedSpeakerStatsIds(getSortedSpeakerStatsIds(state, stats) ?? []));
  48. }
  49. dispatch(updateStats(stats));
  50. }
  51. break;
  52. case RESET_SEARCH_CRITERIA: {
  53. const state = getState();
  54. const stats = resetHiddenStats(state);
  55. dispatch(updateStats(stats));
  56. break;
  57. }
  58. case PARTICIPANT_JOINED:
  59. case PARTICIPANT_LEFT:
  60. case PARTICIPANT_KICKED:
  61. case PARTICIPANT_UPDATED: {
  62. dispatch(initReorderStats());
  63. break;
  64. }
  65. case ADD_TO_OFFSET: {
  66. const state = getState();
  67. const { timelineBoundary } = state['features/speaker-stats'];
  68. const { right } = getTimelineBoundaries(state);
  69. const currentDuration = getCurrentDuration(state) ?? 0;
  70. if (Math.abs((right + action.value) - currentDuration) < CLEAR_TIME_BOUNDARY_THRESHOLD) {
  71. dispatch(clearTimelineBoundary());
  72. } else if (!timelineBoundary) {
  73. dispatch(setTimelineBoundary(currentDuration ?? 0));
  74. }
  75. break;
  76. }
  77. }
  78. return next(action);
  79. });