Record.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import recordSVG from "../../assets/icons/record.svg";
  2. import {MenuItemClass} from "./MenuItemClass";
  3. import {uploadFiles} from "../upload/index";
  4. import {i18n} from "../i18n/index";
  5. export class Record extends MenuItemClass {
  6. constructor(vditor: Vditor, menuItem: MenuItem) {
  7. super(vditor, menuItem)
  8. this.element.children[0].innerHTML = menuItem.icon || recordSVG
  9. this._bindEvent(vditor)
  10. }
  11. _bindEvent(vditor: Vditor) {
  12. let mediaRecorder: any
  13. this.element.children[0].addEventListener('click', () => {
  14. if (!mediaRecorder) {
  15. import(/* webpackChunkName: "recordrtc" */ 'recordrtc/RecordRTC.js').then(RecordRTC => {
  16. navigator.mediaDevices.getUserMedia({audio: true}).then((mediaStream: MediaStream) => {
  17. mediaRecorder = new RecordRTC.default(mediaStream, {
  18. type: 'audio',
  19. mimeType: 'audio/wav',
  20. });
  21. vditor.upload.element.children[0].innerHTML = i18n[vditor.options.lang].recoding
  22. vditor.upload.element.style.opacity = 1
  23. vditor.upload.element.className = 'vditor-upload vditor-upload--tip'
  24. vditor.editor.element.setAttribute('disabled', 'disabled')
  25. mediaRecorder.startRecording()
  26. }).catch((err: ErrorEvent) => {
  27. console.log('init media error:', err);
  28. });
  29. }).catch(err => {
  30. console.log('Failed to load marked', err);
  31. });
  32. return
  33. }
  34. if ('recording' === mediaRecorder.getState()) {
  35. mediaRecorder.stopRecording(function () {
  36. const blob = mediaRecorder.getBlob();
  37. vditor.upload.element.className = 'vditor-upload'
  38. uploadFiles(vditor, [blob])
  39. });
  40. } else {
  41. vditor.upload.element.children[0].innerHTML = i18n[vditor.options.lang].recoding
  42. vditor.upload.element.style.opacity = 1
  43. vditor.upload.element.className = 'vditor-upload vditor-upload--tip'
  44. vditor.editor.element.setAttribute('disabled', 'disabled')
  45. mediaRecorder.startRecording()
  46. }
  47. })
  48. }
  49. }