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.

reducer.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /* @flow */
  2. import { MEDIA_TYPE } from '../base/media/constants';
  3. import { ReducerRegistry } from '../base/redux';
  4. import {
  5. DISABLE_MODERATION,
  6. DISMISS_PENDING_PARTICIPANT,
  7. ENABLE_MODERATION,
  8. LOCAL_PARTICIPANT_APPROVED,
  9. PARTICIPANT_APPROVED,
  10. PARTICIPANT_PENDING_AUDIO
  11. } from './actionTypes';
  12. const initialState = {
  13. audioModerationEnabled: false,
  14. videoModerationEnabled: false,
  15. audioWhitelist: {},
  16. videoWhitelist: {},
  17. pendingAudio: [],
  18. pendingVideo: []
  19. };
  20. ReducerRegistry.register('features/av-moderation', (state = initialState, action) => {
  21. switch (action.type) {
  22. case DISABLE_MODERATION: {
  23. const newState = action.mediaType === MEDIA_TYPE.AUDIO
  24. ? {
  25. audioModerationEnabled: false,
  26. audioUnmuteApproved: undefined
  27. } : {
  28. videoModerationEnabled: false,
  29. videoUnmuteApproved: undefined
  30. };
  31. return {
  32. ...state,
  33. ...newState,
  34. audioWhitelist: {},
  35. videoWhitelist: {},
  36. pendingAudio: [],
  37. pendingVideo: []
  38. };
  39. }
  40. case ENABLE_MODERATION: {
  41. const newState = action.mediaType === MEDIA_TYPE.AUDIO
  42. ? { audioModerationEnabled: true } : { videoModerationEnabled: true };
  43. return {
  44. ...state,
  45. ...newState
  46. };
  47. }
  48. case LOCAL_PARTICIPANT_APPROVED: {
  49. const newState = action.mediaType === MEDIA_TYPE.AUDIO
  50. ? { audioUnmuteApproved: true } : { videoUnmuteApproved: true };
  51. return {
  52. ...state,
  53. ...newState
  54. };
  55. }
  56. case PARTICIPANT_PENDING_AUDIO: {
  57. const { id } = action;
  58. // Add participant to pendigAudio array only if it's not already added
  59. if (!state.pendingAudio.find(pending => pending === id)) {
  60. const updated = [ ...state.pendingAudio ];
  61. updated.push(id);
  62. return {
  63. ...state,
  64. pendingAudio: updated
  65. };
  66. }
  67. return state;
  68. }
  69. case DISMISS_PENDING_PARTICIPANT: {
  70. const { id, mediaType } = action;
  71. if (mediaType === MEDIA_TYPE.AUDIO) {
  72. return {
  73. ...state,
  74. pendingAudio: state.pendingAudio.filter(pending => pending !== id)
  75. };
  76. }
  77. if (mediaType === MEDIA_TYPE.VIDEO) {
  78. return {
  79. ...state,
  80. pendingAudio: state.pendingVideo.filter(pending => pending !== id)
  81. };
  82. }
  83. return state;
  84. }
  85. case PARTICIPANT_APPROVED: {
  86. const { mediaType, id } = action;
  87. if (mediaType === MEDIA_TYPE.AUDIO) {
  88. return {
  89. ...state,
  90. audioWhitelist: {
  91. ...state.audioWhitelist,
  92. [id]: true
  93. }
  94. };
  95. }
  96. if (mediaType === MEDIA_TYPE.VIDEO) {
  97. return {
  98. ...state,
  99. videoWhitelist: {
  100. ...state.videoWhitelist,
  101. [id]: true
  102. }
  103. };
  104. }
  105. return state;
  106. }
  107. }
  108. return state;
  109. });