RecorderScreen.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* eslint-disable react/jsx-props-no-spreading */
  2. import { h, Component, type ComponentChild } from 'preact'
  3. import type { Body, Meta } from '@uppy/utils/lib/UppyFile'
  4. import RecordButton from './RecordButton.tsx'
  5. import SubmitButton from './SubmitButton.tsx'
  6. import StopWatch from './StopWatch.tsx'
  7. import StreamStatus from './StreamStatus.tsx'
  8. import ScreenCapture, { type ScreenCaptureState } from './ScreenCapture.tsx'
  9. type RecorderScreenProps<M extends Meta, B extends Body> = {
  10. onStartRecording: ScreenCapture<M, B>['startRecording']
  11. onStopRecording: ScreenCapture<M, B>['stopRecording']
  12. onStop: ScreenCapture<M, B>['stop']
  13. onSubmit: ScreenCapture<M, B>['submit']
  14. i18n: ScreenCapture<M, B>['i18n']
  15. stream: ScreenCapture<M, B>['videoStream']
  16. } & ScreenCaptureState
  17. class RecorderScreen<M extends Meta, B extends Body> extends Component<
  18. RecorderScreenProps<M, B>
  19. > {
  20. videoElement: HTMLVideoElement | null
  21. componentWillUnmount(): void {
  22. const { onStop } = this.props
  23. onStop()
  24. }
  25. render(): ComponentChild {
  26. const { recording, stream: videoStream, recordedVideo } = this.props
  27. const videoProps: {
  28. muted?: boolean
  29. autoplay?: boolean
  30. playsinline?: boolean
  31. controls?: boolean
  32. src?: string
  33. srcObject?: MediaStream | null
  34. } = {
  35. playsinline: true,
  36. }
  37. // show stream
  38. if (recording || (!recordedVideo && !recording)) {
  39. videoProps.muted = true
  40. videoProps.autoplay = true
  41. videoProps.srcObject = videoStream
  42. }
  43. // show preview
  44. if (recordedVideo && !recording) {
  45. videoProps.muted = false
  46. videoProps.controls = true
  47. videoProps.src = recordedVideo
  48. // reset srcObject in dom. If not resetted, stream sticks in element
  49. if (this.videoElement) {
  50. this.videoElement.srcObject = null
  51. }
  52. }
  53. return (
  54. <div className="uppy uppy-ScreenCapture-container">
  55. <div className="uppy-ScreenCapture-videoContainer">
  56. <StreamStatus {...this.props} />
  57. {/* eslint-disable-next-line jsx-a11y/media-has-caption */}
  58. <video
  59. ref={(videoElement) => {
  60. this.videoElement = videoElement
  61. }}
  62. className="uppy-ScreenCapture-video"
  63. {...videoProps}
  64. />
  65. <StopWatch {...this.props} />
  66. </div>
  67. <div className="uppy-ScreenCapture-buttonContainer">
  68. <RecordButton {...this.props} />
  69. <SubmitButton {...this.props} />
  70. </div>
  71. </div>
  72. )
  73. }
  74. }
  75. export default RecorderScreen