@bothub-chat/ui
Version:
Bothub UI Components
2 lines (1 loc) • 2.21 kB
JavaScript
import{__awaiter as e}from"tslib";import{useRef as r,useState as t,useCallback as n,useEffect as o}from"react";import"unified";import"remark-parse";import"remark-gfm";import"mdast-util-to-markdown";import{getSupportedAudioMimeType as i}from"../../utils/getSupportedAudioMimeType.js";import"../../utils/colors/calculateGrayScale.js";import"../../utils/colors/calculateAccentColors.js";import{getWaveData as c}from"../../utils/audio/getWaveData.js";const a=({onVoiceFilesChange:a})=>{const u=r(null),l=r(null),s=r([]),d=r(null),m=r(!1),[v,p]=t([]),[f,w]=t(!1),[g,V]=t(!1),[R,b]=t(null),h=n(r=>e(void 0,void 0,void 0,function*(){if(f)return;m.current=!0,r.stopPropagation();const e=yield navigator.mediaDevices.getUserMedia({audio:!0}),t=new MediaRecorder(e,{mimeType:i()});m.current&&(t.start(1e3),u.current=t,l.current=e,d.current=window.setInterval(()=>{b(e=>(null!=e?e:0)+.1)},100),w(!0),b(0),V(!1))}),[m.current,s.current,f]),y=n(()=>{const e=u.current,r=l.current,t=d.current;if(f&&e&&r&&t){e.stop();for(const e of r.getTracks())e.stop();window.clearInterval(t)}},[f,u.current,l.current,d.current]),L=n(()=>e(void 0,void 0,void 0,function*(){m.current=!1,f&&y()}),[f,y]),j=n(()=>{const e=u.current,r=d.current;f&&e&&r&&(e.pause(),window.clearInterval(r),V(!0))},[f]),D=n(()=>{const e=u.current;f&&e&&(e.resume(),d.current=window.setInterval(()=>{b(e=>(null!=e?e:0)+.1)},100),V(!1))},[f,b]),E=n(e=>{p(v.filter(r=>r.src!==e.src))},[v,p]);return o(()=>{const r=u.current,t=e=>{e.data.size>0&&s.current.push(e.data)},n=()=>e(void 0,void 0,void 0,function*(){const e=new Blob(s.current,{type:i()}),{waveData:r,duration:t}=yield c(e),n={src:URL.createObjectURL(e),duration:t,blob:e,waveData:r};p([...v,n]),u.current=null,l.current=null,s.current=[],d.current=null,w(!1),b(null)});return r&&(r.addEventListener("dataavailable",t),r.addEventListener("stop",n)),()=>{r&&(r.removeEventListener("dataavailable",t),r.removeEventListener("stop",n)),y()}},[u.current]),o(()=>{null==a||a(v)},[v]),{voiceFiles:v,setVoiceFiles:p,isVoiceRecording:f,isVoicePaused:g,voiceRecordingTime:R,handleVoiceRecordStart:h,handleVoiceRecordEnd:L,handleVoicePause:j,handleVoiceResume:D,handleVoiceFileDelete:E}};export{a as useVoice};