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.

VideoTrack.tsx 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import React, { ReactEventHandler } from 'react';
  2. import { connect } from 'react-redux';
  3. import { IReduxState } from '../../../../app/types';
  4. import AbstractVideoTrack, { IProps as AbstractVideoTrackProps } from '../AbstractVideoTrack';
  5. import Video from './Video';
  6. /**
  7. * The type of the React {@code Component} props of {@link VideoTrack}.
  8. */
  9. interface IProps extends AbstractVideoTrackProps {
  10. /**
  11. *
  12. * Used to determine the value of the autoplay attribute of the underlying
  13. * video element.
  14. */
  15. _noAutoPlayVideo: boolean;
  16. /**
  17. * CSS classes to add to the video element.
  18. */
  19. className: string;
  20. /**
  21. * A map of the event handlers for the video HTML element.
  22. */
  23. eventHandlers?: {
  24. /**
  25. * OnAbort event handler.
  26. */
  27. onAbort?: ReactEventHandler<HTMLVideoElement>;
  28. /**
  29. * OnCanPlay event handler.
  30. */
  31. onCanPlay?: ReactEventHandler<HTMLVideoElement>;
  32. /**
  33. * OnCanPlayThrough event handler.
  34. */
  35. onCanPlayThrough?: ReactEventHandler<HTMLVideoElement>;
  36. /**
  37. * OnEmptied event handler.
  38. */
  39. onEmptied?: ReactEventHandler<HTMLVideoElement>;
  40. /**
  41. * OnEnded event handler.
  42. */
  43. onEnded?: ReactEventHandler<HTMLVideoElement>;
  44. /**
  45. * OnError event handler.
  46. */
  47. onError?: ReactEventHandler<HTMLVideoElement>;
  48. /**
  49. * OnLoadStart event handler.
  50. */
  51. onLoadStart?: ReactEventHandler<HTMLVideoElement>;
  52. /**
  53. * OnLoadedData event handler.
  54. */
  55. onLoadedData?: ReactEventHandler<HTMLVideoElement>;
  56. /**
  57. * OnLoadedMetadata event handler.
  58. */
  59. onLoadedMetadata?: ReactEventHandler<HTMLVideoElement>;
  60. /**
  61. * OnPause event handler.
  62. */
  63. onPause?: ReactEventHandler<HTMLVideoElement>;
  64. /**
  65. * OnPlay event handler.
  66. */
  67. onPlay?: ReactEventHandler<HTMLVideoElement>;
  68. /**
  69. * OnPlaying event handler.
  70. */
  71. onPlaying?: ReactEventHandler<HTMLVideoElement>;
  72. /**
  73. * OnRateChange event handler.
  74. */
  75. onRateChange?: ReactEventHandler<HTMLVideoElement>;
  76. /**
  77. * OnStalled event handler.
  78. */
  79. onStalled?: ReactEventHandler<HTMLVideoElement>;
  80. /**
  81. * OnSuspend event handler.
  82. */
  83. onSuspend?: ReactEventHandler<HTMLVideoElement>;
  84. /**
  85. * OnWaiting event handler.
  86. */
  87. onWaiting?: ReactEventHandler<HTMLVideoElement>;
  88. };
  89. /**
  90. * The value of the id attribute of the video. Used by the torture tests
  91. * to locate video elements.
  92. */
  93. id: string;
  94. /**
  95. * The value of the muted attribute for the underlying element.
  96. */
  97. muted?: boolean;
  98. /**
  99. * A styles that will be applied on the video element.
  100. */
  101. style: Object;
  102. }
  103. /**
  104. * Component that renders a video element for a passed in video track and
  105. * notifies the store when the video has started playing.
  106. *
  107. * @augments AbstractVideoTrack
  108. */
  109. class VideoTrack extends AbstractVideoTrack<IProps> {
  110. /**
  111. * Default values for {@code VideoTrack} component's properties.
  112. *
  113. * @static
  114. */
  115. static defaultProps = {
  116. className: '',
  117. id: ''
  118. };
  119. /**
  120. * Renders the video element.
  121. *
  122. * @override
  123. * @returns {ReactElement}
  124. */
  125. render() {
  126. const {
  127. _noAutoPlayVideo,
  128. className,
  129. id,
  130. muted,
  131. videoTrack,
  132. style,
  133. eventHandlers
  134. } = this.props;
  135. return (
  136. <Video
  137. autoPlay = { !_noAutoPlayVideo }
  138. className = { className }
  139. eventHandlers = { eventHandlers }
  140. id = { id }
  141. muted = { muted }
  142. onVideoPlaying = { this._onVideoPlaying }
  143. style = { style }
  144. videoTrack = { videoTrack } />
  145. );
  146. }
  147. }
  148. /**
  149. * Maps (parts of) the Redux state to the associated VideoTracks props.
  150. *
  151. * @param {Object} state - The Redux state.
  152. * @private
  153. * @returns {{
  154. * _noAutoPlayVideo: boolean
  155. * }}
  156. */
  157. function _mapStateToProps(state: IReduxState) {
  158. const testingConfig = state['features/base/config'].testing;
  159. return {
  160. _noAutoPlayVideo: Boolean(testingConfig?.noAutoPlayVideo)
  161. };
  162. }
  163. export default connect(_mapStateToProps)(VideoTrack);