图标部分:logo.svg/logo96.png/logo192.png/logo32x32.png/logo32x32a.png原来画的是开源Tinode 项目自己的蓝绿橙"t"speech-bubble标志。用登录页AppMark组件的真实CSS参数(白色圆角方卡 + 旋转 -18deg的蓝色squircle + 加粗白色首字母,色值#1677ff,圆角50% 50% 50% 18%)原样重新画成独立 的SVG/PNG资源,不是另起一套新设计——文字/图标/圆角比例/旋转角度均按登录页实测的computed style 数值1:1还原。favicon(32x32)的"未读"变体(右下角绿点)沿用原有的visual language。 og-logo.jpeg(社交分享预览图,og:image meta标签用)问题比图标本身更明显:原图整个背景是金门大桥 照片,前景写着"Tinode / Open Source Instant Messenger",这两行文字是本次engagement里最直接的 一处Tinode品牌泄漏(没有隐藏在代码里,链接分享出去别人就直接看到)。改成深色渐变背景+同一套 logo mark+"MeetingIM"+"即时通讯",不再引用任何第三方项目的名字或素材。 意外发现:umd/index.prod.js(生产构建产物,index.html的<script>直接引用)从很早之前就没有 重新构建过,仍然包含"TinodeWeb"/"web.tinode.co"/tinode.co的隐私政策与服务条款链接/ support@tinode.co邮箱等一整套本轮及更早各轮已经在源码里修掉的Tinode字样——如果这份产物被 原样部署,之前所有品牌清理都不会真正体现在生产环境。已用`npm run build:prod`重新构建(干净 通过,只有两条跟本次改动无关的资源体积警告),确认重建后的产物里"MeetingIM"正确替换了旧品牌名、 真实域名替换了tinode.co。这次只重新生成了产物文件,没有执行任何部署动作。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2 lines
20 KiB
JavaScript
2 lines
20 KiB
JavaScript
"use strict";(self.webpackChunktinode_webapp=self.webpackChunktinode_webapp||[]).push([[821],{7821:function(e,t,a){a.r(t);var i=a(1594),s=a.n(i),n=a(8181),r=a(5247),o=(a(3272),a(7256)),h=a(4848);const l=new Audio("audio/call-out.m4a");l.loop=!0;const d=new Audio("audio/call-end.m4a");d.loop=!0;const c=new Audio("audio/dialing.m4a"),p="video:muted",m="video:unmuted",u=Symbol("unmounted-during-offer");function g(e){const t=Math.floor(e/3600),a=Math.floor(e%3600/60),i=e%60,s=e=>String(e).padStart(2,"0");return t>0?`${t}:${s(a)}:${s(i)}`:`${s(a)}:${s(i)}`}const C=(0,n.defineMessages)({already_in_call:{id:"already_in_call",defaultMessage:"You already in an ongoing call!",description:"Error message when the user tried to accept a new call without finishing pervious one"}});class f extends s().PureComponent{constructor(e){super(e),this.state={localStream:void 0,remoteStream:void 0,pc:void 0,dataChannel:void 0,previousOnInfo:void 0,waitingForPeer:!1,callInitialSetupComplete:!1,audioOnly:e.callAudioOnly,videoToggleInProgress:!1,remoteVideoLive:!1,elapsedSeconds:0,speakerOn:!0},this.callStartedAt=null,this.elapsedTimerId=null,this.localStreamConstraints={audio:!0,video:!e.callAudioOnly},this.isOutgoingCall=1==e.callState,this.containerRef=s().createRef(),this.localRef=s().createRef(),this.remoteRef=s().createRef(),this.remoteIceCandidatesCache=[],this.onInfo=this.onInfo.bind(this),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this.createPeerConnection=this.createPeerConnection.bind(this),this.canSendOffer=this.canSendOffer.bind(this),this.drainRemoteIceCandidatesCache=this.drainRemoteIceCandidatesCache.bind(this),this.handleNegotiationNeededEvent=this.handleNegotiationNeededEvent.bind(this),this.handleICECandidateEvent=this.handleICECandidateEvent.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.handleICEConnectionStateChangeEvent=this.handleICEConnectionStateChangeEvent.bind(this),this.handleSignalingStateChangeEvent=this.handleSignalingStateChangeEvent.bind(this),this.handleICEGatheringStateChangeEvent=this.handleICEGatheringStateChangeEvent.bind(this),this.handleIceCandidateErrorEvent=this.handleIceCandidateErrorEvent.bind(this),this.handleTrackEvent=this.handleTrackEvent.bind(this),this.handleVideoOfferMsg=this.handleVideoOfferMsg.bind(this),this.handleVideoAnswerMsg=this.handleVideoAnswerMsg.bind(this),this.handleNewICECandidateMsg=this.handleNewICECandidateMsg.bind(this),this.reportError=this.reportError.bind(this),this.handleGetUserMediaError=this.handleGetUserMediaError.bind(this),this.stopTracks=this.stopTracks.bind(this),this.disconnectMedia=this.disconnectMedia.bind(this),this.handleCloseClick=this.handleCloseClick.bind(this),this.handleToggleCameraClick=this.handleToggleCameraClick.bind(this),this.handleToggleMicClick=this.handleToggleMicClick.bind(this),this.handleToggleSpeakerClick=this.handleToggleSpeakerClick.bind(this),this.handleSwitchCameraClick=this.handleSwitchCameraClick.bind(this),this.startElapsedTimer=this.startElapsedTimer.bind(this),this.stopElapsedTimer=this.stopElapsedTimer.bind(this),this.handleRemoteHangup=this.handleRemoteHangup.bind(this),this.handleVideoCallAccepted=this.handleVideoCallAccepted.bind(this),this.muteVideo=this.muteVideo.bind(this),this.unmuteVideo=this.unmuteVideo.bind(this),this.emptyVideoTrack=this.emptyVideoTrack.bind(this),this.handleDataChannelEvent=this.handleDataChannelEvent.bind(this),this.handleDataChannelError=this.handleDataChannelError.bind(this),this.handleDataChannelMessage=this.handleDataChannelMessage.bind(this),this.handleDataChannelOpen=this.handleDataChannelOpen.bind(this),this.handleDataChannelClose=this.handleDataChannelClose.bind(this),this.bounds={},this.dragStart=e=>{if(e.target.closest(".draggable")&&!window.matchMedia("(width<=640px)").matches&&this.props.minimized&&this.containerRef){e.stopPropagation();const t=this.containerRef.current;t.setPointerCapture(e.pointerId),t.style.cursor="grabbing",this.bounds.left=t.offsetLeft,this.bounds.top=t.offsetTop,this.bounds.width=t.offsetWidth,this.bounds.height=t.offsetHeight,t.style.right="auto",t.style.left=`${this.bounds.left}px`,t.style.top=`${this.bounds.top}px`;const a=t.offsetParent;this.bounds.maxX=a.offsetWidth,this.bounds.maxY=a.offsetHeight}},this.drag=e=>{e.stopPropagation();const t=this.containerRef.current;this.props.minimized&&this.containerRef&&t.hasPointerCapture(e.pointerId)&&(this.bounds.left=Math.min(Math.max(this.bounds.left+e.movementX,0),this.bounds.maxX-this.bounds.width),this.bounds.top=Math.min(Math.max(this.bounds.top+e.movementY,0),this.bounds.maxY-this.bounds.height),t.style.left=`${this.bounds.left}px`,t.style.top=`${this.bounds.top}px`)},this.dragEnd=e=>{e.stopPropagation(),this.props.minimized&&this.containerRef&&(this.containerRef.current.releasePointerCapture(e.pointerId),this.containerRef.current.style.cursor="grab")}}componentDidMount(){const e=this.props.tinode.getTopic(this.props.topic);this.previousOnInfo=e.onInfo,e.onInfo=this.onInfo,1!=this.props.callState&&3!=this.props.callState||!this.localRef.current||this.start(),this.containerRef&&(this.containerRef.current.addEventListener("pointerdown",this.dragStart),this.containerRef.current.addEventListener("pointermove",this.drag),this.containerRef.current.addEventListener("pointerup",this.dragEnd))}componentWillUnmount(){this._unmounted=!0,this.props.tinode.getTopic(this.props.topic).onInfo=this.previousOnInfo,this.stop(),this.containerRef&&(this.containerRef.current.removeEventListener("pointerdown",this.dragStart),this.containerRef.current.removeEventListener("pointermove",this.drag),this.containerRef.current.removeEventListener("pointerup",this.dragEnd))}handleVideoCallAccepted(e){l.pause();const t=this.createPeerConnection(!0),a=this.state.localStream;a.getTracks().forEach(e=>{t.addTrack(e,a),"video"==e.kind&&this.state.audioOnly&&(e.enabled=!1,e.stop(),a.removeTrack(e))})}onInfo(e){if("call"==e.what)switch(e.event){case"accept":this.handleVideoCallAccepted(e);break;case"answer":this.handleVideoAnswerMsg(e);break;case"ice-candidate":this.handleNewICECandidateMsg(e);break;case"hang-up":this.handleRemoteHangup(e);break;case"offer":this.handleVideoOfferMsg(e);break;case"ringing":l.play().catch(e=>{});break;default:console.warn("Unknown call event",e.event)}else this.previousOnInfo&&this.previousOnInfo(e)}emptyVideoTrack(){const e=Object.assign(document.createElement("canvas"),{width:640,height:480});e.getContext("2d").fillRect(0,0,640,480);const t=e.captureStream(0);return Object.assign(t.getVideoTracks()[0],{enabled:!1})}start(){this.state.localStream?this.props.onError(this.props.intl.formatMessage(C.already_in_call),"info"):3!=this.props.callState?navigator.mediaDevices.getUserMedia(this.localStreamConstraints).then(e=>{this._unmounted?e.getTracks().forEach(e=>e.stop()):(this.localStreamConstraints.video||e.addTrack(this.emptyVideoTrack()),this.setState({localStream:e,waitingForPeer:!0}),this.localRef.current.srcObject=e,c.play(),this.props.onInvite(this.props.topic,this.props.seq,this.props.callState,this.props.callAudioOnly))}).catch(this.handleGetUserMediaError):this.props.onInvite(this.props.topic,this.props.seq,3,this.props.callAudioOnly)}stop(){d.pause(),d.currentTime=0,l.pause(),l.currentTime=0,this.stopElapsedTimer(),this.stopTracks(this.state.localStream),this.stopTracks(this.state.remoteStream),this.disconnectMedia(this.localRef.current),this.disconnectMedia(this.remoteRef.current),this.state.pc&&(this.state.pc.ontrack=null,this.state.pc.onremovetrack=null,this.state.pc.onremovestream=null,this.state.pc.onicecandidate=null,this.state.pc.oniceconnectionstatechange=null,this.state.pc.onsignalingstatechange=null,this.state.pc.onicegatheringstatechange=null,this.state.pc.onnegotiationneeded=null,this.state.pc.onicecandidateerror=null,this.state.pc.ondatachannel=null,!this.state.dataChannel||"open"!=this.state.dataChannel.readyState&&"connecting"!=this.state.dataChannel.readyState||this.state.dataChannel.close(),this.state.pc.close()),this.setState({pc:null,waitingForPeer:!1})}disconnectMedia(e){e&&(e.srcObject=null,e.src="")}stopTracks(e){if(!e)return;let t=e.getTracks();t&&t.forEach(e=>{e.stop(),e.enabled=!1})}handleDataChannelError(e){console.error("data channel error",e)}handleDataChannelMessage(e){switch(e.data){case p:this.setState({remoteVideoLive:!1},e=>{this.remoteRef.current.srcObject=this.state.remoteStream});break;case m:this.setState({remoteVideoLive:!0},e=>{this.remoteRef.current.srcObject=this.state.remoteStream})}}handleDataChannelOpen(e){this.state.audioOnly||e.target.send(m)}handleDataChannelClose(e){console.info("close data channel:",e)}handleDataChannelEvent(e){console.info("data channel event:",e);const t=e.channel;t.onerror=this.handleDataChannelError,t.onmessage=this.handleDataChannelMessage,t.onopen=this.handleDataChannelOpen,t.onclose=this.handleDataChannelClose,this.setState({dataChannel:t})}createPeerConnection(e){const t=this.props.tinode.getServerParam("iceServers",null),a=t?new RTCPeerConnection({iceServers:t}):new RTCPeerConnection;a.onicecandidate=this.handleICECandidateEvent,a.oniceconnectionstatechange=this.handleICEConnectionStateChangeEvent,a.onicegatheringstatechange=this.handleICEGatheringStateChangeEvent,a.onsignalingstatechange=this.handleSignalingStateChangeEvent,a.onnegotiationneeded=this.handleNegotiationNeededEvent,a.onicecandidateerror=this.handleIceCandidateErrorEvent,a.ontrack=this.handleTrackEvent,a.ondatachannel=this.handleDataChannelEvent;let i={pc:a,waitingForPeer:!1};if(e){const e=a.createDataChannel("events",{ordered:!0});e.onerror=this.handleDataChannelError,e.onmessage=this.handleDataChannelMessage,e.onopen=this.handleDataChannelOpen,e.onclose=this.handleDataChannelClose,i.dataChannel=e}return this.setState(i),a}handleVideoAnswerMsg(e){const t=new RTCSessionDescription(e.payload);this.state.pc.setRemoteDescription(t).then(e=>{this.setState({callInitialSetupComplete:!0},e=>this.drainRemoteIceCandidatesCache())}).catch(e=>this.reportError(e))}reportError(e){this.props.onError(e.message,"err")}canSendOffer(){return this.isOutgoingCall||this.state.callInitialSetupComplete}handleNegotiationNeededEvent(e){const t=e.target;this.canSendOffer()&&t.createOffer().then(e=>t.setLocalDescription(e)).then(e=>{this.props.onSendOffer(this.props.topic,this.props.seq,t.localDescription.toJSON())}).catch(e=>this.reportError(e))}handleIceCandidateErrorEvent(e){console.warn("ICE candidate error:",e)}handleICECandidateEvent(e){e.candidate&&this.props.onIceCandidate(this.props.topic,this.props.seq,e.candidate.toJSON())}handleNewICECandidateMsg(e){const t=new RTCIceCandidate(e.payload);this.state.callInitialSetupComplete?this.state.pc.addIceCandidate(t).catch(e=>{t.candidate&&this.reportError(e),console.warn("Error adding new ice candidate",t,e)}):this.remoteIceCandidatesCache.push(t)}drainRemoteIceCandidatesCache(){this.remoteIceCandidatesCache.forEach(e=>{this.state.pc.addIceCandidate(e).catch(t=>{e.candidate&&this.reportError(t),console.warn("Error adding cached ice candidate",e,t)})}),this.remoteIceCandidatesCache=[]}handleICEConnectionStateChangeEvent(e){switch(e.target.iceConnectionState){case"closed":case"failed":this.handleCloseClick()}}handleSignalingStateChangeEvent(e){"closed"==e.target.signalingState&&this.handleCloseClick()}handleICEGatheringStateChangeEvent(e){}handleTrackEvent(e){this.remoteRef.current.srcObject=e.streams[0],this.setState({remoteStream:e.streams[0]}),this.startElapsedTimer()}startElapsedTimer(){this.elapsedTimerId||(this.callStartedAt=Date.now(),this.elapsedTimerId=setInterval(e=>{this.setState({elapsedSeconds:Math.floor((Date.now()-this.callStartedAt)/1e3)})},1e3))}stopElapsedTimer(){this.elapsedTimerId&&(clearInterval(this.elapsedTimerId),this.elapsedTimerId=null),this.callStartedAt=null}handleGetUserMediaError(e){switch(console.error("Error opening camera and/or microphone",e),e.name){case"NotFoundError":default:this.reportError(e);case"SecurityError":case"PermissionDeniedError":}this.handleCloseClick()}handleVideoOfferMsg(e){let t=null;const a=this.state.pc?this.state.pc:this.createPeerConnection(!1),i=new RTCSessionDescription(e.payload);a.setRemoteDescription(i).then(e=>navigator.mediaDevices.getUserMedia(this.localStreamConstraints)).then(e=>{if(this._unmounted)return e.getTracks().forEach(e=>e.stop()),Promise.reject(u);let i;this.localStreamConstraints.video||(i=this.emptyVideoTrack(),e.addTrack(i)),t=e,this.localRef.current.srcObject=e,this.setState({localStream:e}),t.getTracks().forEach(e=>{a.addTrack(e,t)}),i&&(i.enabled=!1,i.stop(),e.removeTrack(i))}).then(e=>a.createAnswer()).then(e=>a.setLocalDescription(e)).then(e=>{this.props.onSendAnswer(this.props.topic,this.props.seq,a.localDescription.toJSON()),this.setState({callInitialSetupComplete:!0},e=>this.drainRemoteIceCandidatesCache())}).catch(e=>{e!==u&&this.handleGetUserMediaError(e)})}handleRemoteHangup(){this.state.waitingForPeer?(this.setState({waitingForPeer:!1}),l.pause(),l.currentTime=0,d.loop=!0,d.play().catch(e=>{}),setTimeout(e=>{this.handleCloseClick()},2e3)):this.handleCloseClick()}handleCloseClick(){this.stop(),this.props.onHangup(this.props.topic,this.props.seq)}muteVideo(){const e=this.state.localStream,t=e.getVideoTracks()[0];t?(t.enabled=!1,t.stop(),e.removeTrack(t),this.sendOnDataChannel(p),this.setState({videoToggleInProgress:!1})):this.setState({videoToggleInProgress:!1})}replaceLocalVideoTrack(e){this.localRef.current.srcObject=null,this.state.localStream.getVideoTracks().forEach(e=>this.state.localStream.removeTrack(e)),this.state.localStream.addTrack(e);let t=Promise.resolve();if(this.state.pc){const a=this.state.pc.getSenders().find(e=>e.track&&"video"==e.track.kind);a?t=a.replaceTrack(e):this.state.pc.addTrack(e,this.state.localStream)}return t.then(e=>{this.localRef.current.srcObject=this.state.localStream})}unmuteVideo(){navigator.mediaDevices.getUserMedia({video:!0}).then(e=>{const t=e.getVideoTracks()[0];if(e.removeTrack(t),!this._unmounted)return this.replaceLocalVideoTrack(t);t.stop()}).then(e=>{this.sendOnDataChannel(m)}).catch(e=>this.handleGetUserMediaError(e)).finally(e=>{this._unmounted||this.setState({videoToggleInProgress:!1})})}sendOnDataChannel(e){this.state.dataChannel&&"open"==this.state.dataChannel.readyState&&this.state.dataChannel.send(e)}handleSwitchCameraClick(){if(this.state.videoToggleInProgress||this.state.audioOnly)return;const e=this.state.localStream.getVideoTracks()[0],t=e&&e.getSettings&&e.getSettings().deviceId;this.setState({videoToggleInProgress:!0},e=>{navigator.mediaDevices.enumerateDevices().then(e=>{const a=e.filter(e=>"videoinput"==e.kind);if(a.length<2)return null;const i=a.findIndex(e=>e.deviceId==t),s=a[(i+1)%a.length];return navigator.mediaDevices.getUserMedia({video:{deviceId:{exact:s.deviceId}}})}).then(e=>{if(!e)return null;const t=e.getVideoTracks()[0];return e.removeTrack(t),this._unmounted?(t.stop(),null):this.replaceLocalVideoTrack(t)}).catch(e=>this.handleGetUserMediaError(e)).finally(e=>{this._unmounted||this.setState({videoToggleInProgress:!1})})})}handleToggleCameraClick(){if(this.state.videoToggleInProgress)return;const e=this.state.localStream.getVideoTracks();this.setState({videoToggleInProgress:!0},t=>{e&&e.length>0&&e[0].enabled&&"live"==e[0].readyState?this.muteVideo():this.unmuteVideo(),this.setState({audioOnly:!this.state.audioOnly})})}handleToggleMicClick(){const e=this.state.localStream.getAudioTracks()[0];e.enabled=!e.enabled,this.forceUpdate()}static speakerSwitchingSupported(){return"undefined"!=typeof HTMLMediaElement&&"setSinkId"in HTMLMediaElement.prototype}handleToggleSpeakerClick(){if(!f.speakerSwitchingSupported()||!this.remoteRef.current)return;const e=!this.state.speakerOn;navigator.mediaDevices.enumerateDevices().then(t=>{const a=t.filter(e=>"audiooutput"==e.kind),i=e?a.find(e=>/speaker/i.test(e.label)):a.find(e=>/earpiece|receiver/i.test(e.label));return this._unmounted||!this.remoteRef.current?null:this.remoteRef.current.setSinkId(i?i.deviceId:"")}).then(t=>{this._unmounted||this.setState({speakerOn:e})}).catch(e=>console.error("Failed to switch audio output device",e))}render(){const e=this.state.localStream&&this.state.localStream.getAudioTracks(),t=!this.state.audioOnly&&this.state.localStream&&this.state.localStream.getVideoTracks(),a=!(e&&e[0]),i=!!(e&&e[0]&&e[0].enabled),s=i?"mic":"mic_off",l=!!(t&&t[0]&&t[0].enabled&&"live"==t[0].readyState),d=l?"videocam":"videocam_off",c=f.speakerSwitchingSupported(),p=this.state.speakerOn?"volume_up":"volume_off",m=(0,o.W5)(this.props.title,24),u=this.state.waitingForPeer?" pulse":"",C=!!this.state.remoteStream;let v=!1;if(this.remoteRef.current&&this.remoteRef.current.srcObject&&this.state.remoteVideoLive){const e=this.remoteRef.current.srcObject;if(e.getVideoTracks().length>0){const t=e.getVideoTracks()[0];v=t.enabled&&"live"==t.readyState}}const S=this.props.minimized?"minimized":null,b=this.props.minimized?"fullscreen":"fullscreen_exit";return this.props.minimized&&this.state.audioOnly?(0,h.jsx)("div",{id:"video-container",className:"minimized audio-minimized",ref:this.containerRef,children:(0,h.jsxs)("div",{className:"call-pill-row",children:[(0,h.jsxs)("div",{className:"call-pill draggable",children:[(0,h.jsx)("i",{className:"material-icons",children:"call"}),(0,h.jsx)("span",{className:"call-pill-duration",children:g(this.state.elapsedSeconds)})]}),(0,h.jsx)("button",{className:"full-screen",onClick:this.props.onToggleMinimize,children:(0,h.jsx)("i",{className:"material-icons",children:b})})]})}):(0,h.jsxs)("div",{id:"video-container",className:S,ref:this.containerRef,children:[C&&(0,h.jsx)("div",{className:"call-duration",children:g(this.state.elapsedSeconds)}),(0,h.jsxs)("div",{id:"video-container-panel",className:"draggable",children:[(0,h.jsxs)("div",{className:"call-party self",disabled:this.state.audioOnly||this.props.minimized,children:[(0,h.jsx)("video",{ref:this.localRef,autoPlay:!0,muted:!0,playsInline:!0}),(0,h.jsx)("div",{className:"caller-name inactive",children:(0,h.jsx)(n.FormattedMessage,{id:"calls_you_label",defaultMessage:"You",description:"Shown over the local video screen"})})]}),(0,h.jsx)("div",{className:"call-party peer",disabled:!v,children:v?(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("video",{ref:this.remoteRef,autoPlay:!0,playsInline:!0}),(0,h.jsx)("div",{className:"caller-name inactive",children:m})]}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("audio",{ref:this.remoteRef,autoPlay:!0}),(0,h.jsxs)("div",{className:`caller-card${u} draggable`,children:[(0,h.jsx)("div",{className:"avatar-box",children:(0,h.jsx)(r.A,{authorizeURL:this.props.tinode.authorizeURL,avatar:this.props.avatar,topic:this.props.topic,title:this.props.title})}),(0,h.jsx)("div",{className:"caller-name",children:m}),C?null:(0,h.jsx)("p",{className:"caller-status",children:"正在等待对方接受邀请…"})]})]})})]}),(0,h.jsx)("button",{className:"full-screen",onClick:this.props.onToggleMinimize,children:(0,h.jsx)("i",{className:"material-icons",children:b})}),(0,h.jsxs)("div",{id:"controls",className:S,children:[(0,h.jsx)("button",{className:"danger",onClick:this.handleCloseClick,children:(0,h.jsx)("i",{className:"material-icons",children:"call_end"})}),(0,h.jsx)("button",{className:"secondary"+(l?"":" off"),onClick:this.handleToggleCameraClick,disabled:a,children:(0,h.jsx)("i",{className:"material-icons",children:d})}),(0,h.jsx)("button",{className:"secondary"+(i?"":" off"),onClick:this.handleToggleMicClick,disabled:a,children:(0,h.jsx)("i",{className:"material-icons",children:s})}),c&&(0,h.jsx)("button",{className:"secondary"+(this.state.speakerOn?"":" off"),onClick:this.handleToggleSpeakerClick,disabled:a,children:(0,h.jsx)("i",{className:"material-icons",children:p})}),!this.state.audioOnly&&(0,h.jsx)("button",{className:"secondary",onClick:this.handleSwitchCameraClick,disabled:a||!l,children:(0,h.jsx)("i",{className:"material-icons",children:"flip_camera_android"})})]})]})}}t.default=(0,n.injectIntl)(f)}}]);
|
|
//# sourceMappingURL=821.prod.js.map
|