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

reducer.ts 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { PARTICIPANT_ID_CHANGED } from '../participants/actionTypes';
  2. import ReducerRegistry from '../redux/ReducerRegistry';
  3. import { set } from '../redux/functions';
  4. import {
  5. SET_NO_SRC_DATA_NOTIFICATION_UID,
  6. TRACK_ADDED,
  7. TRACK_CREATE_CANCELED,
  8. TRACK_CREATE_ERROR,
  9. TRACK_NO_DATA_FROM_SOURCE,
  10. TRACK_OWNER_CHANGED,
  11. TRACK_REMOVED,
  12. TRACK_UPDATED,
  13. TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT,
  14. TRACK_WILL_CREATE
  15. } from './actionTypes';
  16. import { ITrack } from './types';
  17. /**
  18. * Reducer function for a single track.
  19. *
  20. * @param {Track|undefined} state - Track to be modified.
  21. * @param {Object} action - Action object.
  22. * @param {string} action.type - Type of action.
  23. * @param {string} action.name - Name of last media event.
  24. * @param {string} action.newValue - New participant ID value (in this
  25. * particular case).
  26. * @param {string} action.oldValue - Old participant ID value (in this
  27. * particular case).
  28. * @param {Track} action.track - Information about track to be changed.
  29. * @param {Participant} action.participant - Information about participant.
  30. * @returns {Track|undefined}
  31. */
  32. function track(state: ITrack, action: any) {
  33. switch (action.type) {
  34. case PARTICIPANT_ID_CHANGED:
  35. if (state.participantId === action.oldValue) {
  36. return {
  37. ...state,
  38. participantId: action.newValue
  39. };
  40. }
  41. break;
  42. case TRACK_OWNER_CHANGED: {
  43. const t = action.track;
  44. if (state.jitsiTrack === t.jitsiTrack) {
  45. return {
  46. ...state,
  47. participantId: t.participantId
  48. };
  49. }
  50. break;
  51. }
  52. case TRACK_UPDATED: {
  53. const t = action.track;
  54. if (state.jitsiTrack === t.jitsiTrack) {
  55. // Make sure that there's an actual update in order to reduce the
  56. // risk of unnecessary React Component renders.
  57. for (const p in t) {
  58. // @ts-ignore
  59. if (state[p] !== t[p]) {
  60. // There's an actual update.
  61. return {
  62. ...state,
  63. ...t
  64. };
  65. }
  66. }
  67. }
  68. break;
  69. }
  70. case TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT: {
  71. const t = action.track;
  72. if (state.jitsiTrack === t) {
  73. if (state.lastMediaEvent !== action.name) {
  74. return {
  75. ...state,
  76. lastMediaEvent: action.name
  77. };
  78. }
  79. }
  80. break;
  81. }
  82. case TRACK_NO_DATA_FROM_SOURCE: {
  83. const t = action.track;
  84. if (state.jitsiTrack === t.jitsiTrack) {
  85. const isReceivingData = t.jitsiTrack.isReceivingData();
  86. if (state.isReceivingData !== isReceivingData) {
  87. return {
  88. ...state,
  89. isReceivingData
  90. };
  91. }
  92. }
  93. break;
  94. }
  95. }
  96. return state;
  97. }
  98. export type ITracksState = ITrack[];
  99. /**
  100. * Listen for actions that mutate (e.g. Add, remove) local and remote tracks.
  101. */
  102. ReducerRegistry.register<ITracksState>('features/base/tracks', (state = [], action): ITracksState => {
  103. switch (action.type) {
  104. case PARTICIPANT_ID_CHANGED:
  105. case TRACK_NO_DATA_FROM_SOURCE:
  106. case TRACK_OWNER_CHANGED:
  107. case TRACK_UPDATE_LAST_VIDEO_MEDIA_EVENT:
  108. case TRACK_UPDATED:
  109. return state.map((t: ITrack) => track(t, action));
  110. case TRACK_ADDED: {
  111. let withoutTrackStub = state;
  112. if (action.track.local) {
  113. withoutTrackStub
  114. = state.filter(
  115. (t: ITrack) => !t.local || t.mediaType !== action.track.mediaType);
  116. }
  117. return [ ...withoutTrackStub, action.track ];
  118. }
  119. case TRACK_CREATE_CANCELED:
  120. case TRACK_CREATE_ERROR: {
  121. return state.filter((t: ITrack) => !t.local || t.mediaType !== action.trackType);
  122. }
  123. case TRACK_REMOVED:
  124. return state.filter((t: ITrack) => t.jitsiTrack !== action.track.jitsiTrack);
  125. case TRACK_WILL_CREATE:
  126. return [ ...state, action.track ];
  127. default:
  128. return state;
  129. }
  130. });
  131. export interface INoSrcDataState {
  132. noSrcDataNotificationUid?: string | number;
  133. }
  134. /**
  135. * Listen for actions that mutate the no-src-data state, like the current notification id.
  136. */
  137. ReducerRegistry.register<INoSrcDataState>('features/base/no-src-data', (state = {}, action): INoSrcDataState => {
  138. switch (action.type) {
  139. case SET_NO_SRC_DATA_NOTIFICATION_UID:
  140. return set(state, 'noSrcDataNotificationUid', action.uid);
  141. default:
  142. return state;
  143. }
  144. });