@nethesis/phone-island 0.17.1 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/_virtual/index6.js +1 -1
- package/dist/_virtual/index7.js +1 -1
- package/dist/_virtual/index8.js +1 -1
- package/dist/components/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/OperatorBusyView/index.js +1 -1
- package/dist/components/OperatorBusyView/index.js.map +1 -1
- package/dist/components/RestAPI.js +1 -1
- package/dist/components/RestAPI.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/lib/devices/devices.js +1 -1
- package/dist/node_modules/@fortawesome/react-fontawesome/index.es.js +1 -1
- package/dist/node_modules/mic-check/lib/index.js +1 -1
- package/dist/node_modules/prop-types/index.js +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js +1 -1
- package/dist/package.json.js +1 -1
- package/package.json +1 -1
package/dist/App.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./node_modules/tslib/tslib.es6.js"),t=require("react"),n=require("./components/Events.js"),i=require("./components/Socket.js"),s=require("./components/WebRTC.js"),a=require("./components/Island.js"),r=require("./components/RestAPI.js"),o=require("./utils/customHooks/useEventListener.js"),c=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js"),d=require("./store/index.js"),l=require("./services/user.js");require("./node_modules/react-redux/es/index.js"),require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/i18next/dist/esm/i18next.js"),require("./node_modules/react-tooltip/dist/react-tooltip.min.mjs.js"),require("./components/TranscriptionView/TranscriptionView.js");var p=require("./node_modules/js-base64/base64.mjs.js"),v=require("./workers/wake_up.js"),h=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var f=require("./lib/webrtc/messages.js"),g=require("./lib/darkTheme.js"),m=require("./utils/genericFunctions/isEmpty.js"),w=require("./utils/genericFunctions/checkConnection.js"),I=require("./utils/genericFunctions/isBackCallVisible.js"),b=require("./lib/phone/trunk.js"),E=require("./node_modules/react-redux/es/components/Provider.js");function D(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var _=D(t),y=function(D){var y=D.dataConfig,S=D.showAlways,k=void 0!==S&&S,L=D.uaType,U=D.urlParamWithEvent,j=void 0!==U&&U,q=p.Base64.atob(y||"").split(":"),V=q[0],T=q[1],x=q[2],C=q[3],N=q[4],O=q[5],A=q[6],P=t.useState(!1),R=P[0],J=P[1],F=t.useState(!1),Q=F[0],z=F[1],$=t.useState(!1),M=$[0],W=$[1];t.useEffect((function(){var e=new Worker(v.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&J(!0)},function(){e.terminate()}}),[]),t.useEffect((function(){M&&Q&&(J(!1),z(!1),W(!1))}),[M,Q]),o.useEventListener("phone-island-expand",(function(){d.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),o.useEventListener("phone-island-compress",(function(){d.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),o.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),o.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),o.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),o.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),o.useEventListener("phone-island-detach",(function(e){f.detach(),c.eventDispatch("phone-island-detached",{})})),o.useEventListener("phone-island-audio-input-change",(function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return(n=t.deviceId)&&"default"!==n?[4,Z(n)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Audio input device ".concat(n," not available, falling back to default device")),[4,ee()]);case 2:n=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-audio-input-device",{deviceId:n}),c.eventDispatch("phone-island-audio-input-changed",{}),n!==t.deviceId&&console.info("Audio input device changed from ".concat(t.deviceId," to ").concat(n," (fallback)")),[2]}}))}))})),o.useEventListener("phone-island-video-input-change",(function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return(n=t.deviceId)&&"default"!==n?[4,te(n)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Video input device ".concat(n," not available, falling back to default device")),[4,ne()]);case 2:n=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-video-input-device",{deviceId:n}),c.eventDispatch("phone-island-video-input-changed",{}),n!==t.deviceId&&console.info("Video input device changed from ".concat(t.deviceId," to ").concat(n," (fallback)")),[2]}}))}))}));var B=t.useState(!0),H=B[0],G=B[1],K=t.useState(!0),X=K[0],Y=K[1];t.useEffect((function(){H&&(h.initI18n(),e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,l.getParamUrl()];case 1:return t=e.sent(),n=(null==t?void 0:t.url)||"",i=n&&""!==n.trim(),d.store.dispatch.paramUrl.setParamUrl({url:n,onlyQueues:(null==t?void 0:t.only_queues)||!1,hasValidUrl:i}),[3,3];case 2:return s=e.sent(),console.error("Error fetching URL parameter:",s),d.store.dispatch.paramUrl.setParamUrl({url:"",onlyQueues:!1,hasValidUrl:!1}),[3,3];case 3:return[2]}}))})),G(!1))}),[H]);var Z=function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n,i;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return n=e.sent(),[2,n.filter((function(e){return"audioinput"===e.kind})).some((function(e){return e.deviceId===t}))];case 2:return i=e.sent(),console.warn("Error checking audio input device availability:",i),[2,!1];case 3:return[2]}}))}))},ee=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"audioinput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default audio input device:",s),[2,"default"];case 3:return[2]}}))}))},te=function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n,i;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return n=e.sent(),[2,n.filter((function(e){return"videoinput"===e.kind})).some((function(e){return e.deviceId===t}))];case 2:return i=e.sent(),console.warn("Error checking video input device availability:",i),[2,!1];case 3:return[2]}}))}))},ne=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"videoinput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default video input device:",s),[2,"default"];case 3:return[2]}}))}))};o.useEventListener("phone-island-audio-output-change",(function(t){e.__awaiter(void 0,void 0,void 0,(function(){var n,i,s,a,r,o,l,p,v;return e.__generator(this,(function(h){switch(h.label){case 0:return(null==(n=d.store.getState().player.remoteAudio)?void 0:n.current)?(i=t.deviceId)&&"default"!==i?[4,(f=i,e.__awaiter(void 0,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return[2,e.sent().filter((function(e){return"audiooutput"===e.kind})).some((function(e){return e.deviceId===f}))];case 2:return t=e.sent(),console.warn("Error checking device availability:",t),[2,!1];case 3:return[2]}}))})))]:[3,3]:(console.warn("Remote audio element not available"),[2]);case 1:return h.sent()?[3,3]:(console.warn("Audio output device ".concat(i," not available, falling back to default device")),[4,e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"audiooutput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default device:",s),[2,"default"];case 3:return[2]}}))}))]);case 2:i=h.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),h.label=3;case 3:return h.trys.push([3,5,,15]),[4,n.current.setSinkId(i)];case 4:return h.sent(),console.info("Default audio output device changed successfully!"),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,15];case 5:s=h.sent(),console.log("Direct setSinkId failed, trying with temporary stream:",s),h.label=6;case 6:return h.trys.push([6,7,,14]),a=new(window.AudioContext||window.webkitAudioContext),r=a.createOscillator(),o=a.createGain(),r.frequency.setValueAtTime(440,a.currentTime),o.gain.setValueAtTime(0,a.currentTime),r.connect(o),l=a.createMediaStreamDestination(),o.connect(l),n.current.srcObject=l.stream,r.start(),setTimeout((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,7]),[4,n.current.setSinkId(i)];case 1:return e.sent(),console.info("Default audio output device changed successfully with temporary stream!"),r.stop(),a.close(),n.current.srcObject=null,u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,7];case 2:if(t=e.sent(),console.error("Final setSinkId attempt failed:",t),r.stop(),a.close(),n.current.srcObject=null,"default"===i)return[3,6];console.log("Trying fallback to default device"),e.label=3;case 3:return e.trys.push([3,5,,6]),[4,n.current.setSinkId("default")];case 4:return e.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:"default"}),console.info("Fallback to default audio device successful"),[3,6];case 5:return s=e.sent(),console.error("Even default device failed:",s),[3,6];case 6:return u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,7];case 7:return[2]}}))}))}),100),[3,14];case 7:if(p=h.sent(),console.error("Failed to create temporary audio stream:",p),"default"===i)return[3,12];h.label=8;case 8:return h.trys.push([8,10,,11]),[4,n.current.setSinkId("default")];case 9:return h.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:"default"}),console.info("Emergency fallback to default audio device successful"),[3,11];case 10:return v=h.sent(),console.error("Emergency fallback to default device failed:",v),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),[3,11];case 11:return[3,13];case 12:u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),h.label=13;case 13:return c.eventDispatch("phone-island-audio-output-changed",{}),[3,14];case 14:return[3,15];case 15:return[2]}var f}))}))})),o.useEventListener("phone-island-presence-change",(function(e){l.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),o.useEventListener("phone-island-view-changed",(function(e){var t=null==e?void 0:e.viewType;d.store.dispatch.island.setIslandView(t)}));var ie=d.store.getState().player.remoteAudio;t.useEffect((function(){var e;if(X&&ie){var t=null===(e=u.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;c.eventDispatch("phone-island-audio-output-change",{deviceId:t}),Y(!1)}}),[X,ie]),t.useEffect((function(){g.checkDarkTheme()}),[]),o.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),o.useEventListener("phone-island-default-device-change",(function(e){d.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),c.eventDispatch("phone-island-default-device-changed",{})})),o.useEventListener("phone-island-alert",(function(e){d.store.dispatch.alerts.setAlert(e.toString())})),o.useEventListener("phone-island-check-connection",(function(){w.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))})),t.useEffect((function(){var e=setInterval((function(){w.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))}),5e3);return function(){return clearInterval(e)}}),[]),o.useEventListener("phone-island-main-presence",(function(e){var t,n,i,s,a=null===(t=d.store.getState().currentUser)||void 0===t?void 0:t.username,r=d.store.getState().currentUser,o=null==r?void 0:r.mainPresence;if(void 0!==a&&""!==a&&!m.isEmpty(e[a])&&void 0!==(null===(n=e[a])||void 0===n?void 0:n.mainPresence)){var u=null===(i=e[a])||void 0===i?void 0:i.mainPresence;d.store.dispatch.currentUser.updateMainPresence(null===(s=e[a])||void 0===s?void 0:s.mainPresence),"online"===u&&"online"!==o&&c.eventDispatch("phone-island-call-ended",{})}})),o.useEventListener("phone-island-call-status",(function(){var e=d.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var se=function(e,t,n,i){var s=d.store.getState().paramUrl;if(null==s?void 0:s.hasValidUrl){var a=s.url||"";if(a){var r=d.store.getState().island.urlOpened,o=s.openParamUrlType;if(!r||"button"===o){var u=a;u.includes("$CALLER_NUMBER")&&e&&(u=u.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),u.includes("$CALLER_NAME")&&t&&(u=u.replace(/\$CALLER_NAME/g,encodeURIComponent(t))),u.includes("$UNIQUEID")&&i&&(u=u.replace(/\$UNIQUEID/g,encodeURIComponent(i))),u.includes("$CALLED")&&n&&(u=u.replace(/\$CALLED/g,encodeURIComponent(n))),u.includes("{phone}")&&e&&(u=u.replace(/\{phone\}/g,encodeURIComponent(e)));var l=u.startsWith("http")?u:"https://".concat(u);if("mobile"===L||j)c.eventDispatch("phone-island-url-parameter-opened-external",{formattedUrl:l});else{var p=window.open("about:blank","_blank");p&&(p.location.href=l,d.store.dispatch.island.setUrlOpened(!0))}}}}};return o.useEventListener("phone-island-already-opened-external-page",(function(){d.store.dispatch.island.setUrlOpened(!0)})),o.useEventListener("phone-island-url-parameter-opened",(function(e){var t=d.store.getState().paramUrl;if(t.hasValidUrl&&!d.store.getState().island.urlOpened){var n=t.onlyQueues||!1,i=b.isFromTrunk(null==e?void 0:e.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(i),"in"===(null==e?void 0:e.direction)&&(!0===n&&!0===(null==e?void 0:e.throughQueue)?se(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.uniqueId):!1!==n||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||se(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.uniqueId))}})),o.useEventListener("phone-island-user-status",(function(){var e=d.store.getState().currentUser;console.log("User status debug informations: ",e)})),o.useEventListener("phone-island-all-users-status",(function(){var e=d.store.getState().users;console.log("Users status debug informations: ",e)})),o.useEventListener("phone-island-status",(function(){var e=d.store.getState().island;console.log("Phone island status debug informations: ",e)})),o.useEventListener("phone-island-webrtc-status",(function(){var e=d.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-player-status",(function(){var e=d.store.getState().player;console.log("Player status debug informations: ",e)})),o.useEventListener("phone-island-conference-status",(function(){var e=d.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-streaming-status",(function(){var e=d.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),o.useEventListener("phone-island-paramurl-status",(function(){var e=d.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),o.useEventListener("phone-island-player-force-stop",(function(){d.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),o.useEventListener("phone-island-stores-download",(function(){d.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),o.useEventListener("phone-island-sideview-open",(function(){d.store.dispatch.island.toggleSideViewVisible(!0),d.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),o.useEventListener("phone-island-sideview-close",(function(){d.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),o.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-stop-transcription",{}),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-open",(function(){c.eventDispatch("phone-island-start-transcription",{}),d.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{})})),o.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-toggle",(function(){var e=!d.store.getState().island.transcriptionViewIsVisible;d.store.dispatch.island.toggleTranscriptionViewVisible(e),c.eventDispatch(e?"phone-island-transcription-opened":"phone-island-transcription-closed",{})})),o.useEventListener("phone-island-size-change",(function(t){var n=d.store.getState().island,i=n.sideViewIsVisible,s=n.transcriptionViewIsVisible,a=n.actionsExpanded,r=t.sizeInformation,o=e.__assign(e.__assign({},r),{right:i?"42px":"0px",top:I.isBackCallActive()?"40px":"0px",bottom:s&&a?"335px":s&&!a?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:o})})),o.useEventListener("phone-island-call-ended",(function(){if("online"===d.store.getState().currentUser.mainPresence){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),d.store.dispatch.island.handleResetIslandStore(),d.store.dispatch.paramUrl.setThroughTrunk(!1)}})),o.useEventListener("phone-island-conference-list-open",(function(){d.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),o.useEventListener("phone-island-alert-removed",(function(e){var t=d.store.getState().alerts.status.activeAlertsCount,n=d.store.getState().island,i=n.view,s=n.previousView,a=d.store.getState().conference.isActive,r=d.store.getState().alerts.data,o=d.store.getState().currentCall,u=o.incoming,l=o.outgoing,p=o.accepted,v=null==e?void 0:e.type,h=o.incoming||o.outgoing||o.accepted||""!==o.conversationId;if(!(u||l||p||t>0||"player"===i||"recorder"===i||"physicalPhoneRecorder"===i||"waitingConference"===i&&a||"transfer"===i&&a||"settings"===i&&a||"settings"===i&&("recorder"===s||"player"===s)||"operatorBusy"===i&&!a)&&0===t&&(!v||r[v]&&!r[v].active)&&!h){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),d.store.dispatch.island.handleResetIslandStore()}})),o.useEventListener("phone-island-conference-list-close",(function(){d.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),o.useEventListener("phone-island-conversations",(function(e){var t,n=Object.keys(e)[0];if(n===(null===(t=d.store.getState().currentUser)||void 0===t?void 0:t.username)){var i=e[n].conversations,s=d.store.getState().paramUrl,a=d.store.getState().island.urlOpened;if(!s.hasValidUrl||a)return;if("answered"===s.openParamUrlType&&i&&Object.keys(i).length>0){var r=i[Object.keys(i)[0]];if((null==r?void 0:r.connected)&&"in"===(null==r?void 0:r.direction)){var o=s.onlyQueues||!1,c=b.isFromTrunk(r.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(c),!0===o&&!0===(null==r?void 0:r.throughQueue)?se(r.counterpartNum,r.counterpartName,r.owner,r.uniqueId):!1!==o||!0!==c&&!0!==(null==r?void 0:r.throughQueue)||se(r.counterpartNum,r.counterpartName,r.owner,r.uniqueId)}}}})),_.default.createElement(_.default.Fragment,null,_.default.createElement(E.default,{store:d.store},_.default.createElement(s.WebRTC,{hostName:V,sipExten:C,sipSecret:N,sipHost:O,sipPort:A,reload:R,reloadedCallback:function(){return z(!0)},uaType:L},_.default.createElement(r.RestAPI,{hostName:V,username:T,authToken:x},_.default.createElement(i.Socket,{hostName:V,username:T,authToken:x,reload:R,reloadedCallback:function(){return W(!0)},uaType:L},_.default.createElement(n.Events,{sipHost:O},_.default.createElement(a.Island,{showAlways:k,uaType:L})))))))};y.displayName="PhoneIsland",exports.PhoneIsland=y;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./node_modules/tslib/tslib.es6.js"),t=require("react"),n=require("./components/Events.js"),i=require("./components/Socket.js"),s=require("./components/WebRTC.js"),a=require("./components/Island.js"),r=require("./components/RestAPI.js"),o=require("./utils/customHooks/useEventListener.js"),c=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js"),d=require("./store/index.js"),l=require("./services/user.js");require("./node_modules/react-redux/es/index.js"),require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/i18next/dist/esm/i18next.js"),require("./node_modules/react-tooltip/dist/react-tooltip.min.mjs.js"),require("./components/TranscriptionView/TranscriptionView.js");var p=require("./node_modules/js-base64/base64.mjs.js"),v=require("./workers/wake_up.js"),h=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var f=require("./lib/webrtc/messages.js"),g=require("./lib/darkTheme.js"),m=require("./utils/genericFunctions/isEmpty.js"),w=require("./utils/genericFunctions/checkConnection.js"),I=require("./utils/genericFunctions/isBackCallVisible.js"),b=require("./lib/phone/trunk.js"),E=require("./node_modules/react-redux/es/components/Provider.js");function D(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var _=D(t),y=function(D){var y=D.dataConfig,S=D.showAlways,k=void 0!==S&&S,L=D.uaType,U=D.urlParamWithEvent,j=void 0!==U&&U,q=p.Base64.atob(y||"").split(":"),T=q[0],V=q[1],x=q[2],C=q[3],N=q[4],O=q[5],A=q[6],P=t.useState(!1),R=P[0],J=P[1],F=t.useState(!1),Q=F[0],z=F[1],$=t.useState(!1),M=$[0],W=$[1];t.useEffect((function(){var e=new Worker(v.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&J(!0)},function(){e.terminate()}}),[]),t.useEffect((function(){M&&Q&&(J(!1),z(!1),W(!1))}),[M,Q]),o.useEventListener("phone-island-expand",(function(){d.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),o.useEventListener("phone-island-compress",(function(){d.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),o.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),o.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),o.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),o.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),o.useEventListener("phone-island-detach",(function(e){f.detach(),c.eventDispatch("phone-island-detached",{})})),o.useEventListener("phone-island-audio-input-change",(function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return(n=t.deviceId)&&"default"!==n?[4,Z(n)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Audio input device ".concat(n," not available, falling back to default device")),[4,ee()]);case 2:n=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-audio-input-device",{deviceId:n}),c.eventDispatch("phone-island-audio-input-changed",{}),n!==t.deviceId&&console.info("Audio input device changed from ".concat(t.deviceId," to ").concat(n," (fallback)")),[2]}}))}))})),o.useEventListener("phone-island-video-input-change",(function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return(n=t.deviceId)&&"default"!==n?[4,te(n)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Video input device ".concat(n," not available, falling back to default device")),[4,ne()]);case 2:n=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-video-input-device",{deviceId:n}),c.eventDispatch("phone-island-video-input-changed",{}),n!==t.deviceId&&console.info("Video input device changed from ".concat(t.deviceId," to ").concat(n," (fallback)")),[2]}}))}))}));var B=t.useState(!0),H=B[0],G=B[1],K=t.useState(!0),X=K[0],Y=K[1];t.useEffect((function(){H&&(h.initI18n(),e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,l.getParamUrl()];case 1:return t=e.sent(),n=(null==t?void 0:t.url)||"",i=n&&""!==n.trim(),d.store.dispatch.paramUrl.setParamUrl({url:n,onlyQueues:(null==t?void 0:t.only_queues)||!1,hasValidUrl:i}),[3,3];case 2:return s=e.sent(),console.error("Error fetching URL parameter:",s),d.store.dispatch.paramUrl.setParamUrl({url:"",onlyQueues:!1,hasValidUrl:!1}),[3,3];case 3:return[2]}}))})),G(!1))}),[H]);var Z=function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n,i;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return n=e.sent(),[2,n.filter((function(e){return"audioinput"===e.kind})).some((function(e){return e.deviceId===t}))];case 2:return i=e.sent(),console.warn("Error checking audio input device availability:",i),[2,!1];case 3:return[2]}}))}))},ee=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"audioinput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default audio input device:",s),[2,"default"];case 3:return[2]}}))}))},te=function(t){return e.__awaiter(void 0,void 0,void 0,(function(){var n,i;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return n=e.sent(),[2,n.filter((function(e){return"videoinput"===e.kind})).some((function(e){return e.deviceId===t}))];case 2:return i=e.sent(),console.warn("Error checking video input device availability:",i),[2,!1];case 3:return[2]}}))}))},ne=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"videoinput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default video input device:",s),[2,"default"];case 3:return[2]}}))}))};o.useEventListener("phone-island-audio-output-change",(function(t){e.__awaiter(void 0,void 0,void 0,(function(){var n,i,s,a,r,o,l,p,v;return e.__generator(this,(function(h){switch(h.label){case 0:return(null==(n=d.store.getState().player.remoteAudio)?void 0:n.current)?(i=t.deviceId)&&"default"!==i?[4,(f=i,e.__awaiter(void 0,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,!1];case 1:return[2,e.sent().filter((function(e){return"audiooutput"===e.kind})).some((function(e){return e.deviceId===f}))];case 2:return t=e.sent(),console.warn("Error checking device availability:",t),[2,!1];case 3:return[2]}}))})))]:[3,3]:(console.warn("Remote audio element not available"),[2]);case 1:return h.sent()?[3,3]:(console.warn("Audio output device ".concat(i," not available, falling back to default device")),[4,e.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices?[4,navigator.mediaDevices.enumerateDevices()]:[2,"default"];case 1:return t=e.sent(),n=t.filter((function(e){return"audiooutput"===e.kind})),[2,(i=n.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||n[0])?i.deviceId:"default"];case 2:return s=e.sent(),console.warn("Error getting default device:",s),[2,"default"];case 3:return[2]}}))}))]);case 2:i=h.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),h.label=3;case 3:return h.trys.push([3,5,,15]),[4,n.current.setSinkId(i)];case 4:return h.sent(),console.info("Default audio output device changed successfully!"),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,15];case 5:s=h.sent(),console.log("Direct setSinkId failed, trying with temporary stream:",s),h.label=6;case 6:return h.trys.push([6,7,,14]),a=new(window.AudioContext||window.webkitAudioContext),r=a.createOscillator(),o=a.createGain(),r.frequency.setValueAtTime(440,a.currentTime),o.gain.setValueAtTime(0,a.currentTime),r.connect(o),l=a.createMediaStreamDestination(),o.connect(l),n.current.srcObject=l.stream,r.start(),setTimeout((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,7]),[4,n.current.setSinkId(i)];case 1:return e.sent(),console.info("Default audio output device changed successfully with temporary stream!"),r.stop(),a.close(),n.current.srcObject=null,u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,7];case 2:if(t=e.sent(),console.error("Final setSinkId attempt failed:",t),r.stop(),a.close(),n.current.srcObject=null,"default"===i)return[3,6];console.log("Trying fallback to default device"),e.label=3;case 3:return e.trys.push([3,5,,6]),[4,n.current.setSinkId("default")];case 4:return e.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:"default"}),console.info("Fallback to default audio device successful"),[3,6];case 5:return s=e.sent(),console.error("Even default device failed:",s),[3,6];case 6:return u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,7];case 7:return[2]}}))}))}),100),[3,14];case 7:if(p=h.sent(),console.error("Failed to create temporary audio stream:",p),"default"===i)return[3,12];h.label=8;case 8:return h.trys.push([8,10,,11]),[4,n.current.setSinkId("default")];case 9:return h.sent(),u.setJSONItem("phone-island-audio-output-device",{deviceId:"default"}),console.info("Emergency fallback to default audio device successful"),[3,11];case 10:return v=h.sent(),console.error("Emergency fallback to default device failed:",v),u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),[3,11];case 11:return[3,13];case 12:u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),h.label=13;case 13:return c.eventDispatch("phone-island-audio-output-changed",{}),[3,14];case 14:return[3,15];case 15:return[2]}var f}))}))})),o.useEventListener("phone-island-presence-change",(function(e){l.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),o.useEventListener("phone-island-view-changed",(function(e){var t=null==e?void 0:e.viewType;d.store.dispatch.island.setIslandView(t)}));var ie=d.store.getState().player.remoteAudio;t.useEffect((function(){var e;if(X&&ie){var t=null===(e=u.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;c.eventDispatch("phone-island-audio-output-change",{deviceId:t}),Y(!1)}}),[X,ie]),t.useEffect((function(){g.checkDarkTheme()}),[]),o.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),o.useEventListener("phone-island-default-device-change",(function(e){d.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),c.eventDispatch("phone-island-default-device-changed",{})})),o.useEventListener("phone-island-alert",(function(e){d.store.dispatch.alerts.setAlert(e.toString())})),o.useEventListener("phone-island-check-connection",(function(){w.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))})),t.useEffect((function(){var e=setInterval((function(){w.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))}),5e3);return function(){return clearInterval(e)}}),[]),o.useEventListener("phone-island-main-presence",(function(e){var t,n,i,s,a=null===(t=d.store.getState().currentUser)||void 0===t?void 0:t.username,r=d.store.getState().currentUser,o=null==r?void 0:r.mainPresence;if(void 0!==a&&""!==a&&!m.isEmpty(e[a])&&void 0!==(null===(n=e[a])||void 0===n?void 0:n.mainPresence)){var u=null===(i=e[a])||void 0===i?void 0:i.mainPresence;d.store.dispatch.currentUser.updateMainPresence(null===(s=e[a])||void 0===s?void 0:s.mainPresence),"online"===u&&"online"!==o&&c.eventDispatch("phone-island-call-ended",{})}})),o.useEventListener("phone-island-call-status",(function(){var e=d.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var se=function(e,t,n,i){var s=d.store.getState().paramUrl;if(null==s?void 0:s.hasValidUrl){var a=s.url||"";if(a){var r=d.store.getState().island.urlOpened,o=s.openParamUrlType;if(!r||"button"===o){var u=a;u.includes("$CALLER_NUMBER")&&e&&(u=u.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),u.includes("$CALLER_NAME")&&t&&(u=u.replace(/\$CALLER_NAME/g,encodeURIComponent(t))),u.includes("$UNIQUEID")&&i&&(u=u.replace(/\$UNIQUEID/g,encodeURIComponent(i))),u.includes("$CALLED")&&n&&(u=u.replace(/\$CALLED/g,encodeURIComponent(n))),u.includes("{phone}")&&e&&(u=u.replace(/\{phone\}/g,encodeURIComponent(e)));var l=u.startsWith("http")?u:"https://".concat(u);if("mobile"===L||j)c.eventDispatch("phone-island-url-parameter-opened-external",{formattedUrl:l});else{var p=window.open("about:blank","_blank");p&&(p.location.href=l,d.store.dispatch.island.setUrlOpened(!0))}}}}};return o.useEventListener("phone-island-already-opened-external-page",(function(){d.store.dispatch.island.setUrlOpened(!0)})),o.useEventListener("phone-island-url-parameter-opened",(function(e){var t=d.store.getState().paramUrl;if(t.hasValidUrl&&!d.store.getState().island.urlOpened){var n=t.onlyQueues||!1,i=b.isFromTrunk(null==e?void 0:e.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(i),"in"===(null==e?void 0:e.direction)&&(!0===n&&!0===(null==e?void 0:e.throughQueue)?se(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.uniqueId):!1!==n||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||se(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.uniqueId))}})),o.useEventListener("phone-island-user-status",(function(){var e=d.store.getState().currentUser;console.log("User status debug informations: ",e)})),o.useEventListener("phone-island-all-users-status",(function(){var e=d.store.getState().users;console.log("Users status debug informations: ",e)})),o.useEventListener("phone-island-status",(function(){var e=d.store.getState().island;console.log("Phone island status debug informations: ",e)})),o.useEventListener("phone-island-webrtc-status",(function(){var e=d.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-player-status",(function(){var e=d.store.getState().player;console.log("Player status debug informations: ",e)})),o.useEventListener("phone-island-conference-status",(function(){var e=d.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-streaming-status",(function(){var e=d.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),o.useEventListener("phone-island-paramurl-status",(function(){var e=d.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),o.useEventListener("phone-island-player-force-stop",(function(){d.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),o.useEventListener("phone-island-stores-download",(function(){d.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),o.useEventListener("phone-island-sideview-open",(function(){d.store.dispatch.island.toggleSideViewVisible(!0),d.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),o.useEventListener("phone-island-sideview-close",(function(){d.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),o.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-stop-transcription",{}),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-open",(function(){c.eventDispatch("phone-island-start-transcription",{}),d.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{})})),o.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-toggle",(function(){var e=!d.store.getState().island.transcriptionViewIsVisible;d.store.dispatch.island.toggleTranscriptionViewVisible(e),c.eventDispatch(e?"phone-island-transcription-opened":"phone-island-transcription-closed",{})})),o.useEventListener("phone-island-size-change",(function(t){var n=d.store.getState().island,i=n.sideViewIsVisible,s=n.transcriptionViewIsVisible,a=n.actionsExpanded,r=t.sizeInformation,o=e.__assign(e.__assign({},r),{right:i?"42px":"0px",top:I.isBackCallActive()?"40px":"0px",bottomTranscription:s&&a?"335px":s&&!a?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:o})})),o.useEventListener("phone-island-call-ended",(function(){if("online"===d.store.getState().currentUser.mainPresence){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),d.store.dispatch.island.handleResetIslandStore(),d.store.dispatch.paramUrl.setThroughTrunk(!1)}})),o.useEventListener("phone-island-conference-list-open",(function(){d.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),o.useEventListener("phone-island-alert-removed",(function(e){var t=d.store.getState().alerts.status.activeAlertsCount,n=d.store.getState().island,i=n.view,s=n.previousView,a=d.store.getState().conference.isActive,r=d.store.getState().alerts.data,o=d.store.getState().currentCall,u=o.incoming,l=o.outgoing,p=o.accepted,v=null==e?void 0:e.type,h=o.incoming||o.outgoing||o.accepted||""!==o.conversationId;if(!(u||l||p||t>0||"player"===i||"recorder"===i||"physicalPhoneRecorder"===i||"waitingConference"===i&&a||"transfer"===i&&a||"settings"===i&&a||"settings"===i&&("recorder"===s||"player"===s)||"operatorBusy"===i&&!a)&&0===t&&(!v||r[v]&&!r[v].active)&&!h){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),d.store.dispatch.island.handleResetIslandStore()}})),o.useEventListener("phone-island-conference-list-close",(function(){d.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),o.useEventListener("phone-island-conversations",(function(e){var t,n=Object.keys(e)[0];if(n===(null===(t=d.store.getState().currentUser)||void 0===t?void 0:t.username)){var i=e[n].conversations,s=d.store.getState().paramUrl,a=d.store.getState().island.urlOpened;if(!s.hasValidUrl||a)return;if("answered"===s.openParamUrlType&&i&&Object.keys(i).length>0){var r=i[Object.keys(i)[0]];if((null==r?void 0:r.connected)&&"in"===(null==r?void 0:r.direction)){var o=s.onlyQueues||!1,c=b.isFromTrunk(r.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(c),!0===o&&!0===(null==r?void 0:r.throughQueue)?se(r.counterpartNum,r.counterpartName,r.owner,r.uniqueId):!1!==o||!0!==c&&!0!==(null==r?void 0:r.throughQueue)||se(r.counterpartNum,r.counterpartName,r.owner,r.uniqueId)}}}})),_.default.createElement(_.default.Fragment,null,_.default.createElement(E.default,{store:d.store},_.default.createElement(s.WebRTC,{hostName:T,sipExten:C,sipSecret:N,sipHost:O,sipPort:A,reload:R,reloadedCallback:function(){return z(!0)},uaType:L},_.default.createElement(r.RestAPI,{hostName:T,username:V,authToken:x},_.default.createElement(i.Socket,{hostName:T,username:V,authToken:x,reload:R,reloadedCallback:function(){return W(!0)},uaType:L},_.default.createElement(n.Events,{sipHost:O},_.default.createElement(a.Island,{showAlways:k,uaType:L})))))))};y.displayName="PhoneIsland",exports.PhoneIsland=y;
|
|
2
2
|
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store, downloadStoresAsJSON } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport { initI18n } from './lib/i18n'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener, eventDispatch, setJSONItem, getJSONItem } from './utils'\nimport { detach } from './lib/webrtc/messages'\nimport { checkDarkTheme, setTheme } from './lib/darkTheme'\nimport { changeOperatorStatus } from './services/user'\nimport { getParamUrl } from './services/user'\nimport { isEmpty } from './utils/genericFunctions/isEmpty'\nimport { checkInternetConnection } from './utils/genericFunctions/checkConnection'\nimport { isBackCallActive } from './utils/genericFunctions/isBackCallVisible'\nimport { isFromTrunk } from './lib/user/extensions'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n uaType: string\n urlParamWithEvent?: boolean\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({\n dataConfig,\n showAlways = false,\n uaType,\n urlParamWithEvent = false\n}: PhoneIslandProps) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-expand', () => {\n store.dispatch.island.toggleIsOpen(true)\n eventDispatch('phone-island-expanded', {})\n })\n useEventListener('phone-island-compress', () => {\n store.dispatch.island.toggleIsOpen(false)\n eventDispatch('phone-island-compressed', {})\n })\n\n useEventListener('phone-island-call-keypad-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-keypad-closed', {})\n })\n useEventListener('phone-island-call-transfer-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-transfer-closed', {})\n })\n useEventListener('phone-island-recording-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-recording-closed', {})\n })\n useEventListener('phone-island-audio-player-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-audio-player-closed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-audio-input-change', async (data: DeviceInputOutputTypes) => {\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isAudioInputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(`Audio input device ${targetDeviceId} not available, falling back to default device`)\n targetDeviceId = await getDefaultAudioInputDevice()\n }\n }\n\n // Save the final device choice\n setJSONItem('phone-island-audio-input-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-input-changed', {})\n\n if (targetDeviceId !== data.deviceId) {\n console.info(`Audio input device changed from ${data.deviceId} to ${targetDeviceId} (fallback)`)\n }\n })\n\n useEventListener('phone-island-video-input-change', async (data: DeviceInputOutputTypes) => {\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isVideoInputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(`Video input device ${targetDeviceId} not available, falling back to default device`)\n targetDeviceId = await getDefaultVideoInputDevice()\n }\n }\n\n // Save the final device choice\n setJSONItem('phone-island-video-input-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-video-input-changed', {})\n\n if (targetDeviceId !== data.deviceId) {\n console.info(`Video input device changed from ${data.deviceId} to ${targetDeviceId} (fallback)`)\n }\n })\n\n const [firstRender, setFirstRender] = useState(true)\n const [firstAudioOutputInit, setFirstAudioOutputInit] = useState(true)\n\n // Initialize application on first render\n useEffect(() => {\n const initParamUrl = async () => {\n try {\n const paramUrlResponse: any = await getParamUrl()\n const url = paramUrlResponse?.url || ''\n const isValid = url && url.trim() !== ''\n\n // Save data inside the store\n store.dispatch.paramUrl.setParamUrl({\n url: url,\n onlyQueues: paramUrlResponse?.only_queues || false,\n hasValidUrl: isValid,\n })\n } catch (error) {\n console.error('Error fetching URL parameter:', error)\n store.dispatch.paramUrl.setParamUrl({\n url: '',\n onlyQueues: false,\n hasValidUrl: false,\n })\n }\n }\n\n if (firstRender) {\n // Initialize i18n\n initI18n()\n // Initialize param URL\n initParamUrl()\n setFirstRender(false)\n }\n }, [firstRender])\n\n // Helper function to check if an audio output device is available\n const isAudioOutputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioOutputDevices = devices.filter(device => device.kind === 'audiooutput')\n\n return audioOutputDevices.some(device => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking device availability:', err)\n return false\n }\n }\n\n // Helper function to get default audio output device\n const getDefaultAudioOutputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioOutputDevices = devices.filter(device => device.kind === 'audiooutput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice = audioOutputDevices.find(device =>\n device.deviceId === 'default' || device.deviceId === ''\n ) || audioOutputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default device:', err)\n return 'default'\n }\n }\n\n // Helper function to check if an audio input device is available\n const isAudioInputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioInputDevices = devices.filter(device => device.kind === 'audioinput')\n\n return audioInputDevices.some(device => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking audio input device availability:', err)\n return false\n }\n }\n\n // Helper function to get default audio input device\n const getDefaultAudioInputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioInputDevices = devices.filter(device => device.kind === 'audioinput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice = audioInputDevices.find(device =>\n device.deviceId === 'default' || device.deviceId === ''\n ) || audioInputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default audio input device:', err)\n return 'default'\n }\n }\n\n // Helper function to check if a video input device is available\n const isVideoInputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const videoInputDevices = devices.filter(device => device.kind === 'videoinput')\n\n return videoInputDevices.some(device => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking video input device availability:', err)\n return false\n }\n }\n\n // Helper function to get default video input device\n const getDefaultVideoInputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const videoInputDevices = devices.filter(device => device.kind === 'videoinput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice = videoInputDevices.find(device =>\n device.deviceId === 'default' || device.deviceId === ''\n ) || videoInputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default video input device:', err)\n return 'default'\n }\n }\n\n useEventListener('phone-island-audio-output-change', (data: DeviceInputOutputTypes) => {\n const trySetSinkId = async () => {\n const remoteAudioElement: any = store.getState().player.remoteAudio\n\n if (!remoteAudioElement?.current) {\n console.warn('Remote audio element not available')\n return\n }\n\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isAudioOutputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(`Audio output device ${targetDeviceId} not available, falling back to default device`)\n targetDeviceId = await getDefaultAudioOutputDevice()\n\n // Update localStorage with the fallback device\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n }\n\n try {\n // Try to set sink ID directly first (works if audio element is already active)\n await remoteAudioElement.current.setSinkId(targetDeviceId)\n console.info('Default audio output device changed successfully!')\n\n // Save device to localStorage\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n\n } catch (err) {\n console.log('Direct setSinkId failed, trying with temporary stream:', err)\n\n try {\n // Create a temporary silent audio stream to activate the audio element\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()\n const oscillator = audioContext.createOscillator()\n const gainNode = audioContext.createGain()\n\n // Create silent audio\n oscillator.frequency.setValueAtTime(440, audioContext.currentTime)\n gainNode.gain.setValueAtTime(0, audioContext.currentTime) // Silent\n\n oscillator.connect(gainNode)\n\n // Get MediaStream from audio context\n const destination = audioContext.createMediaStreamDestination()\n gainNode.connect(destination)\n\n // Set the stream to the audio element\n remoteAudioElement.current.srcObject = destination.stream\n\n // Start the oscillator\n oscillator.start()\n\n // Try setSinkId again after a short delay\n setTimeout(async () => {\n try {\n await remoteAudioElement.current.setSinkId(targetDeviceId)\n console.info('Default audio output device changed successfully with temporary stream!')\n\n // Clean up temporary stream\n oscillator.stop()\n audioContext.close()\n remoteAudioElement.current.srcObject = null\n\n // Save device to localStorage\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n\n } catch (finalErr) {\n console.error('Final setSinkId attempt failed:', finalErr)\n\n // Clean up on failure\n oscillator.stop()\n audioContext.close()\n remoteAudioElement.current.srcObject = null\n\n // If original device failed and we're not already using default, try default\n if (targetDeviceId !== 'default') {\n console.log('Trying fallback to default device')\n try {\n await remoteAudioElement.current.setSinkId('default')\n setJSONItem('phone-island-audio-output-device', { deviceId: 'default' })\n console.info('Fallback to default audio device successful')\n } catch (defaultErr) {\n console.error('Even default device failed:', defaultErr)\n }\n }\n\n // Save device preference anyway for future calls\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n }\n }, 100)\n\n } catch (streamErr) {\n console.error('Failed to create temporary audio stream:', streamErr)\n\n // Final fallback: try default device\n if (targetDeviceId !== 'default') {\n try {\n await remoteAudioElement.current.setSinkId('default')\n setJSONItem('phone-island-audio-output-device', { deviceId: 'default' })\n console.info('Emergency fallback to default audio device successful')\n } catch (defaultErr) {\n console.error('Emergency fallback to default device failed:', defaultErr)\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n } else {\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n\n eventDispatch('phone-island-audio-output-changed', {})\n }\n }\n }\n\n trySetSinkId()\n })\n\n // Listen for the operator status change\n useEventListener('phone-island-presence-change', (data: any) => {\n changeOperatorStatus(data)\n eventDispatch('phone-island-presence-changed', {})\n })\n\n useEventListener('phone-island-view-changed', (data) => {\n const viewType = data?.viewType\n store.dispatch.island.setIslandView(viewType)\n })\n\n const remoteAudioElement: any = store.getState().player.remoteAudio\n\n //get output device from localstorage\n useEffect(() => {\n if (firstAudioOutputInit && remoteAudioElement) {\n const defaultAudioOutputDevice: any = getJSONItem(\n `phone-island-audio-output-device`,\n )?.deviceId\n eventDispatch('phone-island-audio-output-change', {\n deviceId: defaultAudioOutputDevice,\n })\n setFirstAudioOutputInit(false)\n }\n }, [firstAudioOutputInit, remoteAudioElement])\n\n useEffect(() => {\n checkDarkTheme()\n }, [])\n\n useEventListener('phone-island-theme-change', (theme: any) => {\n setTheme(theme?.selectedTheme)\n })\n\n useEventListener('phone-island-default-device-change', (data) => {\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-default-device-changed', {})\n })\n\n useEventListener('phone-island-alert', (alertType: any) => {\n store.dispatch.alerts.setAlert(alertType.toString())\n })\n\n // Manually check if internet connection is enabled or not\n useEventListener('phone-island-check-connection', () => {\n checkInternetConnection().then((internetIsActive) => {\n if (internetIsActive) {\n eventDispatch('phone-island-internet-connected', {})\n } else {\n eventDispatch('phone-island-internet-disconnected', {})\n }\n })\n })\n\n // Check internet connection every 5 seconds\n useEffect(() => {\n const intervalId = setInterval(() => {\n checkInternetConnection().then((internetIsActive) => {\n if (internetIsActive) {\n eventDispatch('phone-island-internet-connected', {})\n } else {\n eventDispatch('phone-island-internet-disconnected', {})\n }\n })\n }, 5000)\n\n return () => clearInterval(intervalId)\n }, [])\n\n useEventListener('phone-island-main-presence', (data: any) => {\n const currentUsernameInformation: any = store.getState().currentUser?.username\n const currentUserObject: any = store.getState().currentUser\n let mainPresenceValueBeforeUpdate = currentUserObject?.mainPresence\n if (\n currentUsernameInformation !== undefined &&\n currentUsernameInformation !== '' &&\n !isEmpty(data[currentUsernameInformation]) &&\n data[currentUsernameInformation]?.mainPresence !== undefined\n ) {\n let newMainPresenceValue = data[currentUsernameInformation]?.mainPresence\n store.dispatch.currentUser.updateMainPresence(data[currentUsernameInformation]?.mainPresence)\n let mainPresenceValueAfterUpdate = newMainPresenceValue\n if (mainPresenceValueAfterUpdate === 'online' && mainPresenceValueBeforeUpdate !== 'online') {\n eventDispatch('phone-island-call-ended', {})\n }\n }\n })\n\n useEventListener('phone-island-call-status', () => {\n const callInformation = store.getState().currentCall\n console.log('Call status debug informations: ', callInformation)\n })\n\n const openParameterizedUrl = (callerNum: any, callerName: any, called: any, uniqueId: any) => {\n const paramUrlInfo = store.getState().paramUrl\n\n if (!paramUrlInfo?.hasValidUrl) {\n return\n }\n\n const paramUrl = paramUrlInfo.url || ''\n\n if (!paramUrl) {\n return\n }\n\n const { urlOpened } = store.getState().island\n const openParamUrlType = paramUrlInfo.openParamUrlType\n\n if (urlOpened && openParamUrlType !== 'button') {\n return\n }\n\n let processedUrl = paramUrl\n\n if (processedUrl.includes('$CALLER_NUMBER') && callerNum) {\n processedUrl = processedUrl.replace(/\\$CALLER_NUMBER/g, encodeURIComponent(callerNum))\n }\n if (processedUrl.includes('$CALLER_NAME') && callerName) {\n processedUrl = processedUrl.replace(/\\$CALLER_NAME/g, encodeURIComponent(callerName))\n }\n if (processedUrl.includes('$UNIQUEID') && uniqueId) {\n processedUrl = processedUrl.replace(/\\$UNIQUEID/g, encodeURIComponent(uniqueId))\n }\n if (processedUrl.includes('$CALLED') && called) {\n processedUrl = processedUrl.replace(/\\$CALLED/g, encodeURIComponent(called))\n }\n if (processedUrl.includes('{phone}') && callerNum) {\n processedUrl = processedUrl.replace(/\\{phone\\}/g, encodeURIComponent(callerNum))\n }\n\n const formattedUrl = processedUrl.startsWith('http') ? processedUrl : `https://${processedUrl}`\n\n if (uaType !== 'mobile' && !urlParamWithEvent) {\n const newWindow = window.open('about:blank', '_blank')\n if (newWindow) {\n newWindow.location.href = formattedUrl\n store.dispatch.island.setUrlOpened(true)\n }\n } else {\n eventDispatch('phone-island-url-parameter-opened-external', { formattedUrl })\n }\n }\n\n useEventListener('phone-island-already-opened-external-page', () => {\n store.dispatch.island.setUrlOpened(true)\n })\n\n useEventListener('phone-island-url-parameter-opened', (data) => {\n const paramUrlInfo = store.getState().paramUrl\n\n if (!paramUrlInfo.hasValidUrl) {\n return\n }\n\n const { urlOpened } = store.getState().island\n if (urlOpened) {\n return\n }\n\n const onlyQueues = paramUrlInfo.onlyQueues || false\n const throughTrunk = isFromTrunk(data?.counterpartNum)\n store.dispatch.paramUrl.setThroughTrunk(throughTrunk)\n\n if (data?.direction === 'in') {\n if (onlyQueues === true && data?.throughQueue === true) {\n openParameterizedUrl(\n data?.counterpartNum,\n data?.counterpartName,\n data?.owner,\n data?.uniqueId,\n )\n } else if (onlyQueues === false && (throughTrunk === true || data?.throughQueue === true)) {\n openParameterizedUrl(\n data?.counterpartNum,\n data?.counterpartName,\n data?.owner,\n data?.uniqueId,\n )\n }\n }\n })\n\n useEventListener('phone-island-user-status', () => {\n const userInformation = store.getState().currentUser\n console.log('User status debug informations: ', userInformation)\n })\n\n useEventListener('phone-island-all-users-status', () => {\n const allUsersInformation = store.getState().users\n console.log('Users status debug informations: ', allUsersInformation)\n })\n\n useEventListener('phone-island-status', () => {\n const phoneIslandInformation = store.getState().island\n console.log('Phone island status debug informations: ', phoneIslandInformation)\n })\n\n useEventListener('phone-island-webrtc-status', () => {\n const webrtcInformation = store.getState().webrtc\n console.log('Webrtc status debug informations: ', webrtcInformation)\n })\n\n useEventListener('phone-island-player-status', () => {\n const playerInformation = store.getState().player\n console.log('Player status debug informations: ', playerInformation)\n })\n\n useEventListener('phone-island-conference-status', () => {\n const conferenceInformation = store.getState().conference\n console.log('Webrtc status debug informations: ', conferenceInformation)\n })\n\n useEventListener('phone-island-streaming-status', () => {\n const streamingInformation = store.getState().streaming\n console.log('Streaming status debug informations: ', streamingInformation)\n })\n\n useEventListener('phone-island-paramurl-status', () => {\n const paramurl = store.getState().paramUrl\n console.log('Paramurl status debug informations: ', paramurl)\n })\n\n useEventListener('phone-island-player-force-stop', () => {\n store.dispatch.player.reset()\n console.log('Audio player is interrupted')\n })\n\n // Download all stores as JSON file - for debugging and backup\n useEventListener('phone-island-stores-download', () => {\n downloadStoresAsJSON()\n eventDispatch('phone-island-stores-downloaded', {})\n })\n\n useEventListener('phone-island-sideview-open', () => {\n store.dispatch.island.toggleSideViewVisible(true)\n store.dispatch.island.setUrlOpened(false)\n eventDispatch('phone-island-sideview-opened', {})\n })\n\n useEventListener('phone-island-sideview-close', () => {\n store.dispatch.island.toggleSideViewVisible(false)\n eventDispatch('phone-island-sideview-closed', {})\n })\n\n useEventListener('phone-island-transcription-close', () => {\n store.dispatch.island.toggleTranscriptionViewVisible(false)\n eventDispatch('phone-island-stop-transcription', {})\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-open', () => {\n eventDispatch('phone-island-start-transcription', {})\n store.dispatch.island.toggleTranscriptionViewVisible(true)\n eventDispatch('phone-island-transcription-opened', {})\n })\n\n useEventListener('phone-island-transcription-close', () => {\n store.dispatch.island.toggleTranscriptionViewVisible(false)\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-toggle', () => {\n const { transcriptionViewIsVisible } = store.getState().island\n const newState = !transcriptionViewIsVisible\n store.dispatch.island.toggleTranscriptionViewVisible(newState)\n eventDispatch(newState ? 'phone-island-transcription-opened' : 'phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-size-change', (args: any) => {\n const { sideViewIsVisible, transcriptionViewIsVisible, actionsExpanded } = store.getState().island\n\n // Get current dimensions from args\n const { sizeInformation } = args\n\n // // Calculate extra row dimension ( side view and back call )\n const updatedSizeInformation = {\n ...sizeInformation,\n right: sideViewIsVisible ? '42px' : '0px',\n top: isBackCallActive() ? '40px' : '0px',\n bottom: transcriptionViewIsVisible && actionsExpanded ? '335px' : transcriptionViewIsVisible && !actionsExpanded ? '330px' : '0px',\n }\n eventDispatch('phone-island-size-changed', { sizes: updatedSizeInformation })\n })\n\n // Listen for the call end event and set the island size to 0\n useEventListener('phone-island-call-ended', () => {\n const { mainPresence } = store.getState().currentUser\n if (mainPresence === 'online') {\n const sizeInformation: any = {\n width: '0px',\n height: '0px',\n }\n eventDispatch('phone-island-size-change', { sizeInformation })\n eventDispatch('phone-island-sideview-close', {})\n store.dispatch.island.handleResetIslandStore()\n store.dispatch.paramUrl.setThroughTrunk(false)\n }\n })\n\n useEventListener('phone-island-conference-list-open', () => {\n store.dispatch.island.toggleConferenceList(true)\n eventDispatch('phone-island-conference-list-opened', {})\n })\n\n useEventListener('phone-island-alert-removed', (alertRemovedType) => {\n // Get current alerts status\n const { activeAlertsCount } = store.getState().alerts.status\n const { view, previousView } = store.getState().island\n const { isActive } = store.getState().conference\n const alertsData = store.getState().alerts.data\n const currentCall = store.getState().currentCall\n const { incoming, outgoing, accepted } = currentCall\n\n // Check if alert type was provided\n const alertType = alertRemovedType?.type\n\n // Check if user is in a call\n const isInCall =\n currentCall.incoming ||\n currentCall.outgoing ||\n currentCall.accepted ||\n currentCall.conversationId !== ''\n\n // Determine if the island should remain visible\n const shouldKeepVisible =\n incoming ||\n outgoing ||\n accepted ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder' ||\n view === 'physicalPhoneRecorder' ||\n (view === 'waitingConference' && isActive) ||\n (view === 'transfer' && isActive) ||\n (view === 'settings' && isActive) ||\n (view === 'settings' && (previousView === 'recorder' || previousView === 'player')) ||\n (view === 'operatorBusy' && !isActive)\n\n // Reset the island store only if:\n // 1. The island should not remain visible\n // 2. No more active alerts\n // 3. The specific alert is not active anymore\n // 4. User is not currently in a call\n if (\n !shouldKeepVisible &&\n activeAlertsCount === 0 &&\n (!alertType || (alertsData[alertType] && !alertsData[alertType].active)) &&\n !isInCall\n ) {\n const sizeInformation: any = {\n width: '0px',\n height: '0px',\n }\n eventDispatch('phone-island-size-change', { sizeInformation })\n eventDispatch('phone-island-sideview-close', {})\n store.dispatch.island.handleResetIslandStore()\n }\n })\n\n useEventListener('phone-island-conference-list-close', () => {\n store.dispatch.island.toggleConferenceList(false)\n eventDispatch('phone-island-conference-list-closed', {})\n })\n\n // Listen for conversations updates to handle 'answered' preference for parameterized URL\n useEventListener('phone-island-conversations', (data: any) => {\n // Get the current username (first key in the data object)\n const username = Object.keys(data)[0]\n const currentUsernameInformation: any = store.getState().currentUser?.username\n\n if (username === currentUsernameInformation) {\n const conversations = data[username].conversations\n const paramUrlInfo = store.getState().paramUrl\n const { urlOpened } = store.getState().island\n\n // Only proceed if URL is valid and not already opened\n if (!paramUrlInfo.hasValidUrl || urlOpened) {\n return\n }\n\n // Check if the openParamUrlType is set to 'answered'\n if (paramUrlInfo.openParamUrlType === 'answered') {\n // Check if there are any conversations\n if (conversations && Object.keys(conversations).length > 0) {\n // Get the first conversation (usually there's only one active call)\n const convId = Object.keys(conversations)[0]\n const conv = conversations[convId]\n\n // Check conditions: must be connected and incoming\n if (conv?.connected && conv?.direction === 'in') {\n const onlyQueues = paramUrlInfo.onlyQueues || false\n const calculatedThroughTrunk = isFromTrunk(conv.counterpartNum)\n // Update throughTrunk in paramUrl store\n store.dispatch.paramUrl.setThroughTrunk(calculatedThroughTrunk)\n\n // Check queue conditions based on preferences\n if (onlyQueues === true && conv?.throughQueue === true) {\n // Open URL only for queue calls when onlyQueues is true\n openParameterizedUrl(\n conv.counterpartNum,\n conv.counterpartName,\n conv.owner,\n conv.uniqueId,\n )\n } else if (\n onlyQueues === false &&\n (calculatedThroughTrunk === true || conv?.throughQueue === true)\n ) {\n // Open URL for both trunk and queue calls when onlyQueues is false\n openParameterizedUrl(\n conv.counterpartNum,\n conv.counterpartName,\n conv.owner,\n conv.uniqueId,\n )\n }\n }\n }\n }\n }\n })\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n uaType={uaType}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} uaType={uaType} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","showAlways","uaType","_c","urlParamWithEvent","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","_d","useState","reload","setReload","_e","reloadedWebRTC","setReloadedWebRTC","_f","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","island","toggleIsOpen","eventDispatch","setIslandView","detach","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","console","warn","getDefaultAudioInputDevice","setJSONItem","info","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","error","error_1","navigator","mediaDevices","enumerateDevices","devices","filter","device","kind","some","err_3","audioInputDevices","defaultDevice","find","err_4","err_5","videoInputDevices","err_6","remoteAudioElement","getState","player","remoteAudio","current","err_1","audioOutputDevices","err_2","setSinkId","log","err_7","audioContext_1","window","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","setTimeout","stop","close","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","alertType","alerts","setAlert","toString","checkInternetConnection","then","internetIsActive","intervalId","setInterval","clearInterval","currentUsernameInformation","username","currentUserObject","mainPresenceValueBeforeUpdate","mainPresence","undefined","isEmpty","newMainPresenceValue","updateMainPresence","callInformation","currentCall","openParameterizedUrl","callerNum","callerName","called","uniqueId","paramUrlInfo","urlOpened","openParamUrlType","processedUrl","includes","replace","encodeURIComponent","formattedUrl","startsWith","newWindow","open","location","href","setUrlOpened","throughTrunk","isFromTrunk","counterpartNum","setThroughTrunk","direction","throughQueue","counterpartName","owner","userInformation","allUsersInformation","users","phoneIslandInformation","webrtcInformation","webrtc","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","reset","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","newState","transcriptionViewIsVisible","args","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","__assign","right","top","isBackCallActive","bottom","sizes","width","height","handleResetIslandStore","toggleConferenceList","alertRemovedType","activeAlertsCount","status","view","previousView","isActive","alertsData","incoming","outgoing","accepted","isInCall","conversationId","active","Object","keys","conversations","length","conv","connected","calculatedThroughTrunk","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","authToken","Socket","Events","Island","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store, downloadStoresAsJSON } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport { initI18n } from './lib/i18n'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener, eventDispatch, setJSONItem, getJSONItem } from './utils'\nimport { detach } from './lib/webrtc/messages'\nimport { checkDarkTheme, setTheme } from './lib/darkTheme'\nimport { changeOperatorStatus } from './services/user'\nimport { getParamUrl } from './services/user'\nimport { isEmpty } from './utils/genericFunctions/isEmpty'\nimport { checkInternetConnection } from './utils/genericFunctions/checkConnection'\nimport { isBackCallActive } from './utils/genericFunctions/isBackCallVisible'\nimport { isFromTrunk } from './lib/user/extensions'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n uaType: string\n urlParamWithEvent?: boolean\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({\n dataConfig,\n showAlways = false,\n uaType,\n urlParamWithEvent = false,\n}: PhoneIslandProps) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-expand', () => {\n store.dispatch.island.toggleIsOpen(true)\n eventDispatch('phone-island-expanded', {})\n })\n useEventListener('phone-island-compress', () => {\n store.dispatch.island.toggleIsOpen(false)\n eventDispatch('phone-island-compressed', {})\n })\n\n useEventListener('phone-island-call-keypad-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-keypad-closed', {})\n })\n useEventListener('phone-island-call-transfer-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-transfer-closed', {})\n })\n useEventListener('phone-island-recording-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-recording-closed', {})\n })\n useEventListener('phone-island-audio-player-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-audio-player-closed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-audio-input-change', async (data: DeviceInputOutputTypes) => {\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isAudioInputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(\n `Audio input device ${targetDeviceId} not available, falling back to default device`,\n )\n targetDeviceId = await getDefaultAudioInputDevice()\n }\n }\n\n // Save the final device choice\n setJSONItem('phone-island-audio-input-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-input-changed', {})\n\n if (targetDeviceId !== data.deviceId) {\n console.info(\n `Audio input device changed from ${data.deviceId} to ${targetDeviceId} (fallback)`,\n )\n }\n })\n\n useEventListener('phone-island-video-input-change', async (data: DeviceInputOutputTypes) => {\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isVideoInputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(\n `Video input device ${targetDeviceId} not available, falling back to default device`,\n )\n targetDeviceId = await getDefaultVideoInputDevice()\n }\n }\n\n // Save the final device choice\n setJSONItem('phone-island-video-input-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-video-input-changed', {})\n\n if (targetDeviceId !== data.deviceId) {\n console.info(\n `Video input device changed from ${data.deviceId} to ${targetDeviceId} (fallback)`,\n )\n }\n })\n\n const [firstRender, setFirstRender] = useState(true)\n const [firstAudioOutputInit, setFirstAudioOutputInit] = useState(true)\n\n // Initialize application on first render\n useEffect(() => {\n const initParamUrl = async () => {\n try {\n const paramUrlResponse: any = await getParamUrl()\n const url = paramUrlResponse?.url || ''\n const isValid = url && url.trim() !== ''\n\n // Save data inside the store\n store.dispatch.paramUrl.setParamUrl({\n url: url,\n onlyQueues: paramUrlResponse?.only_queues || false,\n hasValidUrl: isValid,\n })\n } catch (error) {\n console.error('Error fetching URL parameter:', error)\n store.dispatch.paramUrl.setParamUrl({\n url: '',\n onlyQueues: false,\n hasValidUrl: false,\n })\n }\n }\n\n if (firstRender) {\n // Initialize i18n\n initI18n()\n // Initialize param URL\n initParamUrl()\n setFirstRender(false)\n }\n }, [firstRender])\n\n // Helper function to check if an audio output device is available\n const isAudioOutputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioOutputDevices = devices.filter((device) => device.kind === 'audiooutput')\n\n return audioOutputDevices.some((device) => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking device availability:', err)\n return false\n }\n }\n\n // Helper function to get default audio output device\n const getDefaultAudioOutputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioOutputDevices = devices.filter((device) => device.kind === 'audiooutput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice =\n audioOutputDevices.find(\n (device) => device.deviceId === 'default' || device.deviceId === '',\n ) || audioOutputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default device:', err)\n return 'default'\n }\n }\n\n // Helper function to check if an audio input device is available\n const isAudioInputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioInputDevices = devices.filter((device) => device.kind === 'audioinput')\n\n return audioInputDevices.some((device) => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking audio input device availability:', err)\n return false\n }\n }\n\n // Helper function to get default audio input device\n const getDefaultAudioInputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const audioInputDevices = devices.filter((device) => device.kind === 'audioinput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice =\n audioInputDevices.find(\n (device) => device.deviceId === 'default' || device.deviceId === '',\n ) || audioInputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default audio input device:', err)\n return 'default'\n }\n }\n\n // Helper function to check if a video input device is available\n const isVideoInputDeviceAvailable = async (deviceId: string): Promise<boolean> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return false\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const videoInputDevices = devices.filter((device) => device.kind === 'videoinput')\n\n return videoInputDevices.some((device) => device.deviceId === deviceId)\n } catch (err) {\n console.warn('Error checking video input device availability:', err)\n return false\n }\n }\n\n // Helper function to get default video input device\n const getDefaultVideoInputDevice = async (): Promise<string> => {\n try {\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\n return 'default'\n }\n\n const devices = await navigator.mediaDevices.enumerateDevices()\n const videoInputDevices = devices.filter((device) => device.kind === 'videoinput')\n\n // Find the default device (usually has deviceId 'default' or is the first one)\n const defaultDevice =\n videoInputDevices.find(\n (device) => device.deviceId === 'default' || device.deviceId === '',\n ) || videoInputDevices[0]\n\n return defaultDevice ? defaultDevice.deviceId : 'default'\n } catch (err) {\n console.warn('Error getting default video input device:', err)\n return 'default'\n }\n }\n\n useEventListener('phone-island-audio-output-change', (data: DeviceInputOutputTypes) => {\n const trySetSinkId = async () => {\n const remoteAudioElement: any = store.getState().player.remoteAudio\n\n if (!remoteAudioElement?.current) {\n console.warn('Remote audio element not available')\n return\n }\n\n let targetDeviceId = data.deviceId\n\n // Check if the requested device is available\n if (targetDeviceId && targetDeviceId !== 'default') {\n const isAvailable = await isAudioOutputDeviceAvailable(targetDeviceId)\n\n if (!isAvailable) {\n console.warn(\n `Audio output device ${targetDeviceId} not available, falling back to default device`,\n )\n targetDeviceId = await getDefaultAudioOutputDevice()\n\n // Update localStorage with the fallback device\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n }\n\n try {\n // Try to set sink ID directly first (works if audio element is already active)\n await remoteAudioElement.current.setSinkId(targetDeviceId)\n console.info('Default audio output device changed successfully!')\n\n // Save device to localStorage\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n } catch (err) {\n console.log('Direct setSinkId failed, trying with temporary stream:', err)\n\n try {\n // Create a temporary silent audio stream to activate the audio element\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)()\n const oscillator = audioContext.createOscillator()\n const gainNode = audioContext.createGain()\n\n // Create silent audio\n oscillator.frequency.setValueAtTime(440, audioContext.currentTime)\n gainNode.gain.setValueAtTime(0, audioContext.currentTime) // Silent\n\n oscillator.connect(gainNode)\n\n // Get MediaStream from audio context\n const destination = audioContext.createMediaStreamDestination()\n gainNode.connect(destination)\n\n // Set the stream to the audio element\n remoteAudioElement.current.srcObject = destination.stream\n\n // Start the oscillator\n oscillator.start()\n\n // Try setSinkId again after a short delay\n setTimeout(async () => {\n try {\n await remoteAudioElement.current.setSinkId(targetDeviceId)\n console.info(\n 'Default audio output device changed successfully with temporary stream!',\n )\n\n // Clean up temporary stream\n oscillator.stop()\n audioContext.close()\n remoteAudioElement.current.srcObject = null\n\n // Save device to localStorage\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n } catch (finalErr) {\n console.error('Final setSinkId attempt failed:', finalErr)\n\n // Clean up on failure\n oscillator.stop()\n audioContext.close()\n remoteAudioElement.current.srcObject = null\n\n // If original device failed and we're not already using default, try default\n if (targetDeviceId !== 'default') {\n console.log('Trying fallback to default device')\n try {\n await remoteAudioElement.current.setSinkId('default')\n setJSONItem('phone-island-audio-output-device', { deviceId: 'default' })\n console.info('Fallback to default audio device successful')\n } catch (defaultErr) {\n console.error('Even default device failed:', defaultErr)\n }\n }\n\n // Save device preference anyway for future calls\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n eventDispatch('phone-island-audio-output-changed', {})\n }\n }, 100)\n } catch (streamErr) {\n console.error('Failed to create temporary audio stream:', streamErr)\n\n // Final fallback: try default device\n if (targetDeviceId !== 'default') {\n try {\n await remoteAudioElement.current.setSinkId('default')\n setJSONItem('phone-island-audio-output-device', { deviceId: 'default' })\n console.info('Emergency fallback to default audio device successful')\n } catch (defaultErr) {\n console.error('Emergency fallback to default device failed:', defaultErr)\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n } else {\n setJSONItem('phone-island-audio-output-device', { deviceId: targetDeviceId })\n }\n\n eventDispatch('phone-island-audio-output-changed', {})\n }\n }\n }\n\n trySetSinkId()\n })\n\n // Listen for the operator status change\n useEventListener('phone-island-presence-change', (data: any) => {\n changeOperatorStatus(data)\n eventDispatch('phone-island-presence-changed', {})\n })\n\n useEventListener('phone-island-view-changed', (data) => {\n const viewType = data?.viewType\n store.dispatch.island.setIslandView(viewType)\n })\n\n const remoteAudioElement: any = store.getState().player.remoteAudio\n\n //get output device from localstorage\n useEffect(() => {\n if (firstAudioOutputInit && remoteAudioElement) {\n const defaultAudioOutputDevice: any = getJSONItem(\n `phone-island-audio-output-device`,\n )?.deviceId\n eventDispatch('phone-island-audio-output-change', {\n deviceId: defaultAudioOutputDevice,\n })\n setFirstAudioOutputInit(false)\n }\n }, [firstAudioOutputInit, remoteAudioElement])\n\n useEffect(() => {\n checkDarkTheme()\n }, [])\n\n useEventListener('phone-island-theme-change', (theme: any) => {\n setTheme(theme?.selectedTheme)\n })\n\n useEventListener('phone-island-default-device-change', (data) => {\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-default-device-changed', {})\n })\n\n useEventListener('phone-island-alert', (alertType: any) => {\n store.dispatch.alerts.setAlert(alertType.toString())\n })\n\n // Manually check if internet connection is enabled or not\n useEventListener('phone-island-check-connection', () => {\n checkInternetConnection().then((internetIsActive) => {\n if (internetIsActive) {\n eventDispatch('phone-island-internet-connected', {})\n } else {\n eventDispatch('phone-island-internet-disconnected', {})\n }\n })\n })\n\n // Check internet connection every 5 seconds\n useEffect(() => {\n const intervalId = setInterval(() => {\n checkInternetConnection().then((internetIsActive) => {\n if (internetIsActive) {\n eventDispatch('phone-island-internet-connected', {})\n } else {\n eventDispatch('phone-island-internet-disconnected', {})\n }\n })\n }, 5000)\n\n return () => clearInterval(intervalId)\n }, [])\n\n useEventListener('phone-island-main-presence', (data: any) => {\n const currentUsernameInformation: any = store.getState().currentUser?.username\n const currentUserObject: any = store.getState().currentUser\n let mainPresenceValueBeforeUpdate = currentUserObject?.mainPresence\n if (\n currentUsernameInformation !== undefined &&\n currentUsernameInformation !== '' &&\n !isEmpty(data[currentUsernameInformation]) &&\n data[currentUsernameInformation]?.mainPresence !== undefined\n ) {\n let newMainPresenceValue = data[currentUsernameInformation]?.mainPresence\n store.dispatch.currentUser.updateMainPresence(data[currentUsernameInformation]?.mainPresence)\n let mainPresenceValueAfterUpdate = newMainPresenceValue\n if (mainPresenceValueAfterUpdate === 'online' && mainPresenceValueBeforeUpdate !== 'online') {\n eventDispatch('phone-island-call-ended', {})\n }\n }\n })\n\n useEventListener('phone-island-call-status', () => {\n const callInformation = store.getState().currentCall\n console.log('Call status debug informations: ', callInformation)\n })\n\n const openParameterizedUrl = (callerNum: any, callerName: any, called: any, uniqueId: any) => {\n const paramUrlInfo = store.getState().paramUrl\n\n if (!paramUrlInfo?.hasValidUrl) {\n return\n }\n\n const paramUrl = paramUrlInfo.url || ''\n\n if (!paramUrl) {\n return\n }\n\n const { urlOpened } = store.getState().island\n const openParamUrlType = paramUrlInfo.openParamUrlType\n\n if (urlOpened && openParamUrlType !== 'button') {\n return\n }\n\n let processedUrl = paramUrl\n\n if (processedUrl.includes('$CALLER_NUMBER') && callerNum) {\n processedUrl = processedUrl.replace(/\\$CALLER_NUMBER/g, encodeURIComponent(callerNum))\n }\n if (processedUrl.includes('$CALLER_NAME') && callerName) {\n processedUrl = processedUrl.replace(/\\$CALLER_NAME/g, encodeURIComponent(callerName))\n }\n if (processedUrl.includes('$UNIQUEID') && uniqueId) {\n processedUrl = processedUrl.replace(/\\$UNIQUEID/g, encodeURIComponent(uniqueId))\n }\n if (processedUrl.includes('$CALLED') && called) {\n processedUrl = processedUrl.replace(/\\$CALLED/g, encodeURIComponent(called))\n }\n if (processedUrl.includes('{phone}') && callerNum) {\n processedUrl = processedUrl.replace(/\\{phone\\}/g, encodeURIComponent(callerNum))\n }\n\n const formattedUrl = processedUrl.startsWith('http') ? processedUrl : `https://${processedUrl}`\n\n if (uaType !== 'mobile' && !urlParamWithEvent) {\n const newWindow = window.open('about:blank', '_blank')\n if (newWindow) {\n newWindow.location.href = formattedUrl\n store.dispatch.island.setUrlOpened(true)\n }\n } else {\n eventDispatch('phone-island-url-parameter-opened-external', { formattedUrl })\n }\n }\n\n useEventListener('phone-island-already-opened-external-page', () => {\n store.dispatch.island.setUrlOpened(true)\n })\n\n useEventListener('phone-island-url-parameter-opened', (data) => {\n const paramUrlInfo = store.getState().paramUrl\n\n if (!paramUrlInfo.hasValidUrl) {\n return\n }\n\n const { urlOpened } = store.getState().island\n if (urlOpened) {\n return\n }\n\n const onlyQueues = paramUrlInfo.onlyQueues || false\n const throughTrunk = isFromTrunk(data?.counterpartNum)\n store.dispatch.paramUrl.setThroughTrunk(throughTrunk)\n\n if (data?.direction === 'in') {\n if (onlyQueues === true && data?.throughQueue === true) {\n openParameterizedUrl(\n data?.counterpartNum,\n data?.counterpartName,\n data?.owner,\n data?.uniqueId,\n )\n } else if (onlyQueues === false && (throughTrunk === true || data?.throughQueue === true)) {\n openParameterizedUrl(\n data?.counterpartNum,\n data?.counterpartName,\n data?.owner,\n data?.uniqueId,\n )\n }\n }\n })\n\n useEventListener('phone-island-user-status', () => {\n const userInformation = store.getState().currentUser\n console.log('User status debug informations: ', userInformation)\n })\n\n useEventListener('phone-island-all-users-status', () => {\n const allUsersInformation = store.getState().users\n console.log('Users status debug informations: ', allUsersInformation)\n })\n\n useEventListener('phone-island-status', () => {\n const phoneIslandInformation = store.getState().island\n console.log('Phone island status debug informations: ', phoneIslandInformation)\n })\n\n useEventListener('phone-island-webrtc-status', () => {\n const webrtcInformation = store.getState().webrtc\n console.log('Webrtc status debug informations: ', webrtcInformation)\n })\n\n useEventListener('phone-island-player-status', () => {\n const playerInformation = store.getState().player\n console.log('Player status debug informations: ', playerInformation)\n })\n\n useEventListener('phone-island-conference-status', () => {\n const conferenceInformation = store.getState().conference\n console.log('Webrtc status debug informations: ', conferenceInformation)\n })\n\n useEventListener('phone-island-streaming-status', () => {\n const streamingInformation = store.getState().streaming\n console.log('Streaming status debug informations: ', streamingInformation)\n })\n\n useEventListener('phone-island-paramurl-status', () => {\n const paramurl = store.getState().paramUrl\n console.log('Paramurl status debug informations: ', paramurl)\n })\n\n useEventListener('phone-island-player-force-stop', () => {\n store.dispatch.player.reset()\n console.log('Audio player is interrupted')\n })\n\n // Download all stores as JSON file - for debugging and backup\n useEventListener('phone-island-stores-download', () => {\n downloadStoresAsJSON()\n eventDispatch('phone-island-stores-downloaded', {})\n })\n\n useEventListener('phone-island-sideview-open', () => {\n store.dispatch.island.toggleSideViewVisible(true)\n store.dispatch.island.setUrlOpened(false)\n eventDispatch('phone-island-sideview-opened', {})\n })\n\n useEventListener('phone-island-sideview-close', () => {\n store.dispatch.island.toggleSideViewVisible(false)\n eventDispatch('phone-island-sideview-closed', {})\n })\n\n useEventListener('phone-island-transcription-close', () => {\n store.dispatch.island.toggleTranscriptionViewVisible(false)\n eventDispatch('phone-island-stop-transcription', {})\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-open', () => {\n eventDispatch('phone-island-start-transcription', {})\n store.dispatch.island.toggleTranscriptionViewVisible(true)\n eventDispatch('phone-island-transcription-opened', {})\n })\n\n useEventListener('phone-island-transcription-close', () => {\n store.dispatch.island.toggleTranscriptionViewVisible(false)\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-toggle', () => {\n const { transcriptionViewIsVisible } = store.getState().island\n const newState = !transcriptionViewIsVisible\n store.dispatch.island.toggleTranscriptionViewVisible(newState)\n eventDispatch(\n newState ? 'phone-island-transcription-opened' : 'phone-island-transcription-closed',\n {},\n )\n })\n\n useEventListener('phone-island-size-change', (args: any) => {\n const { sideViewIsVisible, transcriptionViewIsVisible, actionsExpanded } =\n store.getState().island\n\n // Get current dimensions from args\n const { sizeInformation } = args\n\n // // Calculate extra row dimension ( side view and back call )\n const updatedSizeInformation = {\n ...sizeInformation,\n right: sideViewIsVisible ? '42px' : '0px',\n top: isBackCallActive() ? '40px' : '0px',\n bottomTranscription:\n transcriptionViewIsVisible && actionsExpanded\n ? '335px'\n : transcriptionViewIsVisible && !actionsExpanded\n ? '330px'\n : '0px',\n }\n eventDispatch('phone-island-size-changed', { sizes: updatedSizeInformation })\n })\n\n // Listen for the call end event and set the island size to 0\n useEventListener('phone-island-call-ended', () => {\n const { mainPresence } = store.getState().currentUser\n if (mainPresence === 'online') {\n const sizeInformation: any = {\n width: '0px',\n height: '0px',\n }\n eventDispatch('phone-island-size-change', { sizeInformation })\n eventDispatch('phone-island-sideview-close', {})\n store.dispatch.island.handleResetIslandStore()\n store.dispatch.paramUrl.setThroughTrunk(false)\n }\n })\n\n useEventListener('phone-island-conference-list-open', () => {\n store.dispatch.island.toggleConferenceList(true)\n eventDispatch('phone-island-conference-list-opened', {})\n })\n\n useEventListener('phone-island-alert-removed', (alertRemovedType) => {\n // Get current alerts status\n const { activeAlertsCount } = store.getState().alerts.status\n const { view, previousView } = store.getState().island\n const { isActive } = store.getState().conference\n const alertsData = store.getState().alerts.data\n const currentCall = store.getState().currentCall\n const { incoming, outgoing, accepted } = currentCall\n\n // Check if alert type was provided\n const alertType = alertRemovedType?.type\n\n // Check if user is in a call\n const isInCall =\n currentCall.incoming ||\n currentCall.outgoing ||\n currentCall.accepted ||\n currentCall.conversationId !== ''\n\n // Determine if the island should remain visible\n const shouldKeepVisible =\n incoming ||\n outgoing ||\n accepted ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder' ||\n view === 'physicalPhoneRecorder' ||\n (view === 'waitingConference' && isActive) ||\n (view === 'transfer' && isActive) ||\n (view === 'settings' && isActive) ||\n (view === 'settings' && (previousView === 'recorder' || previousView === 'player')) ||\n (view === 'operatorBusy' && !isActive)\n\n // Reset the island store only if:\n // 1. The island should not remain visible\n // 2. No more active alerts\n // 3. The specific alert is not active anymore\n // 4. User is not currently in a call\n if (\n !shouldKeepVisible &&\n activeAlertsCount === 0 &&\n (!alertType || (alertsData[alertType] && !alertsData[alertType].active)) &&\n !isInCall\n ) {\n const sizeInformation: any = {\n width: '0px',\n height: '0px',\n }\n eventDispatch('phone-island-size-change', { sizeInformation })\n eventDispatch('phone-island-sideview-close', {})\n store.dispatch.island.handleResetIslandStore()\n }\n })\n\n useEventListener('phone-island-conference-list-close', () => {\n store.dispatch.island.toggleConferenceList(false)\n eventDispatch('phone-island-conference-list-closed', {})\n })\n\n // Listen for conversations updates to handle 'answered' preference for parameterized URL\n useEventListener('phone-island-conversations', (data: any) => {\n // Get the current username (first key in the data object)\n const username = Object.keys(data)[0]\n const currentUsernameInformation: any = store.getState().currentUser?.username\n\n if (username === currentUsernameInformation) {\n const conversations = data[username].conversations\n const paramUrlInfo = store.getState().paramUrl\n const { urlOpened } = store.getState().island\n\n // Only proceed if URL is valid and not already opened\n if (!paramUrlInfo.hasValidUrl || urlOpened) {\n return\n }\n\n // Check if the openParamUrlType is set to 'answered'\n if (paramUrlInfo.openParamUrlType === 'answered') {\n // Check if there are any conversations\n if (conversations && Object.keys(conversations).length > 0) {\n // Get the first conversation (usually there's only one active call)\n const convId = Object.keys(conversations)[0]\n const conv = conversations[convId]\n\n // Check conditions: must be connected and incoming\n if (conv?.connected && conv?.direction === 'in') {\n const onlyQueues = paramUrlInfo.onlyQueues || false\n const calculatedThroughTrunk = isFromTrunk(conv.counterpartNum)\n // Update throughTrunk in paramUrl store\n store.dispatch.paramUrl.setThroughTrunk(calculatedThroughTrunk)\n\n // Check queue conditions based on preferences\n if (onlyQueues === true && conv?.throughQueue === true) {\n // Open URL only for queue calls when onlyQueues is true\n openParameterizedUrl(\n conv.counterpartNum,\n conv.counterpartName,\n conv.owner,\n conv.uniqueId,\n )\n } else if (\n onlyQueues === false &&\n (calculatedThroughTrunk === true || conv?.throughQueue === true)\n ) {\n // Open URL for both trunk and queue calls when onlyQueues is false\n openParameterizedUrl(\n conv.counterpartNum,\n conv.counterpartName,\n conv.owner,\n conv.uniqueId,\n )\n }\n }\n }\n }\n }\n })\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n uaType={uaType}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} uaType={uaType} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","showAlways","uaType","_c","urlParamWithEvent","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","_d","useState","reload","setReload","_e","reloadedWebRTC","setReloadedWebRTC","_f","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","island","toggleIsOpen","eventDispatch","setIslandView","detach","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","console","warn","getDefaultAudioInputDevice","setJSONItem","info","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","error","error_1","navigator","mediaDevices","enumerateDevices","devices","filter","device","kind","some","err_3","audioInputDevices","defaultDevice","find","err_4","err_5","videoInputDevices","err_6","remoteAudioElement","getState","player","remoteAudio","current","err_1","audioOutputDevices","err_2","setSinkId","log","err_7","audioContext_1","window","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","setTimeout","stop","close","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","alertType","alerts","setAlert","toString","checkInternetConnection","then","internetIsActive","intervalId","setInterval","clearInterval","currentUsernameInformation","username","currentUserObject","mainPresenceValueBeforeUpdate","mainPresence","undefined","isEmpty","newMainPresenceValue","updateMainPresence","callInformation","currentCall","openParameterizedUrl","callerNum","callerName","called","uniqueId","paramUrlInfo","urlOpened","openParamUrlType","processedUrl","includes","replace","encodeURIComponent","formattedUrl","startsWith","newWindow","open","location","href","setUrlOpened","throughTrunk","isFromTrunk","counterpartNum","setThroughTrunk","direction","throughQueue","counterpartName","owner","userInformation","allUsersInformation","users","phoneIslandInformation","webrtcInformation","webrtc","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","reset","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","newState","transcriptionViewIsVisible","args","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","__assign","right","top","isBackCallActive","bottomTranscription","sizes","width","height","handleResetIslandStore","toggleConferenceList","alertRemovedType","activeAlertsCount","status","view","previousView","isActive","alertsData","incoming","outgoing","accepted","isInCall","conversationId","active","Object","keys","conversations","length","conv","connected","calculatedThroughTrunk","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","authToken","Socket","Events","Island","displayName"],"mappings":"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"}
|
package/dist/_virtual/index6.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.propTypes={exports:{}};
|
|
2
2
|
//# sourceMappingURL=index6.js.map
|
package/dist/_virtual/index7.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.reactIs={exports:{}};
|
|
2
2
|
//# sourceMappingURL=index7.js.map
|
package/dist/_virtual/index8.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.__exports={};
|
|
2
2
|
//# sourceMappingURL=index8.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../utils/customHooks/useIsomorphicLayoutEffect.js");require("../node_modules/tslib/tslib.es6.js");var r=require("../store/index.js"),i=require("./CallView/index.js"),n=require("./KeypadView/index.js"),l=require("./AudioPlayerView/index.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../utils/customHooks/useIsomorphicLayoutEffect.js");require("../node_modules/tslib/tslib.es6.js");var r=require("../store/index.js"),i=require("./CallView/index.js"),n=require("./KeypadView/index.js"),l=require("./AudioPlayerView/index.js"),u=require("./AlertGuard.js"),a=require("./CallView/BackCall.js"),s=require("./SideView/SideView.js"),o=require("./ViewsTransition.js"),c=require("./RecorderView/index.js"),d=require("./IslandMotion.js"),f=require("./IslandDrag.js"),w=require("./PhysicalRecorderView/index.js"),p=require("./SettingsView/index.js"),m=require("./SwitchDeviceView/index.js"),V=require("../utils/genericFunctions/isBackCallVisible.js"),v=require("./VideoView/index.js"),y=require("./ConferenceView/index.js"),E=require("./ContactView/ContactListView.js"),j=require("./StreamingAnswerView/index.js"),h=require("./OperatorBusyView/index.js"),g=require("./TranscriptionView/TranscriptionView.js"),q=require("../node_modules/react-redux/es/hooks/useSelector.js"),S=require("../node_modules/react-redux/es/hooks/useDispatch.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var C=x(e),R=function(x){var R=x.showAlways,b=x.uaType;x.urlParamWithEvent;var A=q.useSelector((function(e){return e.currentCall})),I=A.incoming,P=A.accepted,k=A.outgoing,B=q.useSelector((function(e){return e.island})),D=B.view,T=B.sideViewIsVisible,_=B.transcriptionViewIsVisible,L=B.avoidToShow,O=B.previousView,F=q.useSelector((function(e){return{recording:e.physicalRecorder.recording}})).recording,K=q.useSelector((function(e){return e.alerts.status})).activeAlertsCount,M=q.useSelector((function(e){return e.player})).audioPlayerLoop,N=q.useSelector((function(e){return e.conference})).isActive,W=q.useSelector((function(e){return e.currentUser})),G=W.default_device,U=W.endpoints,z=W.username,H=q.useSelector((function(e){return e.users})).extensions,J=e.useRef(null),Q=S.useDispatch(),X=e.useRef(null),Y=e.useRef(null),Z=e.useRef(null);t.useIsomorphicLayoutEffect((function(){Q.player.updatePlayer({audioPlayer:X,localAudio:Y,remoteAudio:Z})}),[]),e.useEffect((function(){var e=r.store.getState().conference,t=e.isActive,i=e.conferenceStartedFrom,n=e.isOwnerInside,l=r.store.getState().currentUser.username;(I||k)&&t&&i===l&&n?Q.island.setIslandView("waitingConference"):!I&&!k||L||Q.island.setIslandView("call")}),[I,k]),e.useEffect((function(){F&&Q.island.setIslandView("physicalPhoneRecorder")}),[D]);var $=e.useState(""),ee=$[0],te=$[1];e.useEffect((function(){setTimeout((function(){te(D)}),200)}),[D]);var re,ie=function(){if(!H||!z)return!1;var e=Object.values(H).filter((function(e){return(null==e?void 0:e.username)===z}));return null==e?void 0:e.some((function(e){var t=null==U?void 0:U.extension.find((function(t){return t.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==t?void 0:t.type)&&"offline"!==(null==e?void 0:e.status)}))};return C.default.createElement("div",{ref:J,className:"pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000"},(I||k||P||R||K>0||"player"===D||"recorder"===D||"physicalPhoneRecorder"===D||"waitingConference"===D&&N||"transfer"===D&&N||"settings"===D&&N||"operatorBusy"===D&&("mobile"===b&&ie()||"desktop"===b&&("webrtc"===(null==G?void 0:G.type)||void 0===(null==G?void 0:G.type)&&!ie()||!ie()&&"physical"===(null==G?void 0:G.type)))||"settings"===D&&("recorder"===O||"player"===O))&&!L&&C.default.createElement(C.default.Fragment,null,C.default.createElement(f.IslandDrag,{islandContainerRef:J},C.default.createElement(a.default,{isVisible:V.isBackCallActive()}),C.default.createElement(s.default,{isVisible:T,uaType:b}),C.default.createElement(g.default,{isVisible:_}),C.default.createElement(d.IslandMotion,null,C.default.createElement(u.AlertGuard,{uaType:b},(re={call:i.default?C.default.createElement(i.default,null):null,keypad:n.default?C.default.createElement(n.default,null):null,transfer:E.ContactListView?C.default.createElement(E.ContactListView,null):null,player:l.KeypadView?C.default.createElement(l.KeypadView,null):null,recorder:c.RecorderView?C.default.createElement(c.RecorderView,null):null,physicalPhoneRecorder:w.PhysicalRecorderView?C.default.createElement(w.PhysicalRecorderView,null):null,settings:p.SettingsView?C.default.createElement(p.SettingsView,null):null,video:v.VideoView?C.default.createElement(v.VideoView,null):null,switchDevice:m.SwitchDeviceView?C.default.createElement(m.SwitchDeviceView,null):null,waitingConference:y.WaitingConferenceView?C.default.createElement(y.WaitingConferenceView,null):null,streamingAnswer:j.StreamingAnswerView?C.default.createElement(j.StreamingAnswerView,null):null,operatorBusy:h.OperatorBusyView?C.default.createElement(h.OperatorBusyView,null):null},ee in re&&re[ee]?C.default.createElement(o.default,{forView:ee},re[ee]):C.default.createElement(C.default.Fragment,null)))))),C.default.createElement("div",{className:"pi-hidden"},C.default.createElement("audio",{loop:M,ref:X}),C.default.createElement("audio",{muted:!0,ref:Y}),C.default.createElement("audio",{autoPlay:!0,ref:Z})))};R.displayName="Island",exports.Island=R;
|
|
2
2
|
//# sourceMappingURL=Island.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport { useIsomorphicLayoutEffect } from '../utils'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport AudioPlayerView from './AudioPlayerView'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport SideView from './SideView/SideView'\nimport ViewsTransition from './ViewsTransition'\nimport { RecorderView } from './RecorderView'\nimport IslandMotions from './IslandMotion'\nimport IslandDrag from './IslandDrag'\nimport { PhysicalRecorderView } from './PhysicalRecorderView'\nimport { SettingsView } from './SettingsView'\nimport { SwitchDeviceView } from './SwitchDeviceView'\nimport { isBackCallActive } from '../utils/genericFunctions/isBackCallVisible'\nimport VideoView from './VideoView'\nimport { WaitingConferenceView } from './ConferenceView'\nimport { store } from '../store'\nimport { ContactListView } from './ContactView/ContactListView'\nimport StreamingAnswerView from './StreamingAnswerView'\nimport { OperatorBusyView } from './OperatorBusyView'\nimport { TranscriptionView } from './TranscriptionView'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n */\nexport const Island: FC<IslandProps> = ({ showAlways, uaType, urlParamWithEvent }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const { view, sideViewIsVisible, transcriptionViewIsVisible, avoidToShow, previousView } = useSelector(\n (state: RootState) => state.island,\n )\n const { recording } = useSelector((state: RootState) => ({\n recording: state.physicalRecorder.recording,\n }))\n\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer,\n localAudio: localAudio,\n remoteAudio: remoteAudio,\n })\n }, [])\n\n // Handle and apply view switch logic\n // ...set callview as the current view\n useEffect(() => {\n const { isActive, conferenceStartedFrom, isOwnerInside } = store.getState().conference\n const { username } = store.getState().currentUser\n // Check and switch the view\n if ((incoming || outgoing) && isActive && conferenceStartedFrom === username && isOwnerInside) {\n dispatch.island.setIslandView('waitingConference')\n } else if ((incoming || outgoing) && !avoidToShow) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n useEffect(() => {\n if (recording) {\n dispatch.island.setIslandView('physicalPhoneRecorder')\n }\n }, [view])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n // Handle island view change\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n return (\n <div\n ref={islandContainerRef}\n className='pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000'\n >\n {(incoming ||\n outgoing ||\n accepted ||\n showAlways ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder' ||\n view === 'physicalPhoneRecorder' ||\n (view === 'waitingConference' && isActive) ||\n (view === 'transfer' && isActive) ||\n (view === 'settings' && isActive) ||\n (view === 'operatorBusy' ) ||\n (view === 'settings' && (previousView === 'recorder' || previousView === 'player'))) &&\n !avoidToShow && (\n <>\n <IslandDrag islandContainerRef={islandContainerRef}>\n {/* Add background call visibility logic */}\n <BackCall isVisible={isBackCallActive()} />\n <SideView isVisible={sideViewIsVisible} uaType={uaType} />\n <TranscriptionView isVisible={transcriptionViewIsVisible} />\n <IslandMotions>\n {/* The views logic */}\n <AlertGuard uaType={uaType}>\n {(() => {\n const views = {\n call: CallView ? <CallView /> : null,\n keypad: KeyboardView ? <KeyboardView /> : null,\n transfer: ContactListView ? <ContactListView /> : null,\n player: AudioPlayerView ? <AudioPlayerView /> : null,\n recorder: RecorderView ? <RecorderView /> : null,\n physicalPhoneRecorder: PhysicalRecorderView ? <PhysicalRecorderView /> : null,\n settings: SettingsView ? <SettingsView /> : null,\n video: VideoView ? <VideoView /> : null,\n switchDevice: SwitchDeviceView ? <SwitchDeviceView /> : null,\n waitingConference: WaitingConferenceView ? <WaitingConferenceView /> : null,\n streamingAnswer: StreamingAnswerView ? <StreamingAnswerView /> : null,\n operatorBusy: OperatorBusyView ? <OperatorBusyView /> : null,\n }\n\n return currentView in views && views[currentView as keyof typeof views] ? (\n <ViewsTransition forView={currentView}>\n {views[currentView as keyof typeof views]}\n </ViewsTransition>\n ) : (\n <></>\n )\n })()}\n </AlertGuard>\n </IslandMotions>\n </IslandDrag>\n </>\n )}\n <div className='pi-hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n uaType?: string\n urlParamWithEvent?: boolean\n}\n"],"names":["Island","_a","showAlways","uaType","urlParamWithEvent","_b","useSelector","state","currentCall","incoming","accepted","outgoing","_c","island","view","sideViewIsVisible","transcriptionViewIsVisible","avoidToShow","previousView","recording","physicalRecorder","activeAlertsCount","alerts","status","audioPlayerLoop","player","isActive","conference","islandContainerRef","useRef","dispatch","useDispatch","audioPlayer","localAudio","remoteAudio","useIsomorphicLayoutEffect","updatePlayer","useEffect","store","getState","conferenceStartedFrom","isOwnerInside","username","currentUser","setIslandView","views","_d","useState","currentView","setCurrentView","setTimeout","React","ref","className","createElement","Fragment","IslandDrag","BackCall","isVisible","isBackCallActive","SideView","TranscriptionView","IslandMotions","AlertGuard","call","CallView","keypad","KeyboardView","transfer","ContactListView","AudioPlayerView","KeypadView","recorder","RecorderView","physicalPhoneRecorder","PhysicalRecorderView","settings","SettingsView","video","VideoView","switchDevice","SwitchDeviceView","waitingConference","WaitingConferenceView","streamingAnswer","StreamingAnswerView","operatorBusy","OperatorBusyView","ViewsTransition","forView","loop","muted","autoPlay","displayName"],"mappings":"owCAkCaA,EAA0B,SAACC,GAAE,IAAAC,eAAYC,EAAMF,EAAAE,OAAmBF,EAAAG,kBAEvE,IAAAC,EAAmCC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAAzEC,EAAQJ,EAAAI,SAAEC,EAAQL,EAAAK,SAAEC,EAAQN,EAAAM,SAE9BC,EAAqFN,EAAAA,aACzF,SAACC,GAAqB,OAAAA,EAAMM,MAAM,IAD5BC,EAAIF,EAAAE,KAAEC,EAAiBH,EAAAG,kBAAEC,EAA0BJ,EAAAI,2BAAEC,EAAWL,EAAAK,YAAEC,EAAYN,EAAAM,aAG9EC,EAAcb,EAAAA,aAAY,SAACC,GAAqB,MAAC,CACvDY,UAAWZ,EAAMa,iBAAiBD,UADoB,IAErDA,UAGKE,EAAsBf,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMe,OAAOC,4BAGrEC,EAAoBlB,eAAY,SAACC,GAAqB,OAAAA,EAAMkB,0BAC5DC,EAAapB,eAAY,SAACC,GAAqB,OAAAA,EAAMoB,uBAGvDC,EAAqBC,SAAY,MAGjCC,EAAWC,EAAAA,cAEXC,EAAcH,SAAyB,MACvCI,EAAaJ,SAAyB,MACtCK,EAAcL,SAAyB,MAE7CM,EAAAA,2BAA0B,WACxBL,EAASL,OAAOW,aAAa,CAC3BJ,YAAaA,EACbC,WAAYA,EACZC,YAAaA,GAEhB,GAAE,IAIHG,EAAAA,WAAU,WACF,IAAApC,EAAqDqC,EAAKA,MAACC,WAAWZ,WAApED,EAAQzB,EAAAyB,SAAEc,EAAqBvC,EAAAuC,sBAAEC,kBACjCC,EAAaJ,EAAKA,MAACC,WAAWI,YAAWD,UAE5CjC,GAAYE,IAAae,GAAYc,IAA0BE,GAAYD,EAC9EX,EAASjB,OAAO+B,cAAc,sBACpBnC,IAAYE,GAAcM,GACpCa,EAASjB,OAAO+B,cAAc,OAElC,GAAG,CAACnC,EAAUE,IAEd0B,EAAAA,WAAU,WACJlB,GACFW,EAASjB,OAAO+B,cAAc,wBAElC,GAAG,CAAC9B,IAEE,IAsCkB+B,EAtClBC,EAAgCC,EAAAA,SAAc,IAA7CC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GASlC,OANAT,EAAAA,WAAU,WACRa,YAAW,WACTD,EAAenC,EAChB,GAAE,IACL,GAAG,CAACA,IAGFqC,EAAAA,6BACEC,IAAKxB,EACLyB,UAAU,yMAER5C,GACAE,GACAD,GACAR,GACAmB,EAAoB,GACX,WAATP,GACS,aAATA,GACS,0BAATA,GACU,sBAATA,GAAgCY,GACvB,aAATZ,GAAuBY,GACd,aAATZ,GAAuBY,GACd,iBAATZ,GACS,aAATA,IAAyC,aAAjBI,GAAgD,WAAjBA,MACvDD,GACCkC,EAAA,QAAAG,cAAAH,EAAA,QAAAI,SAAA,KACEJ,EAAAA,QAAAG,cAACE,EAAAA,WAAU,CAAC5B,mBAAoBA,GAE9BuB,EAAA,QAAAG,cAACG,EAAQ,QAAC,CAAAC,UAAWC,EAAAA,qBACrBR,EAAC,QAAAG,cAAAM,WAASF,UAAW3C,EAAmBZ,OAAQA,IAChDgD,EAAAA,QAAAG,cAACO,EAAAA,QAAiB,CAACH,UAAW1C,IAC9BmC,UAAAG,cAACQ,EAAAA,aAAa,KAEZX,EAAA,QAAAG,cAACS,EAAUA,WAAC,CAAA5D,OAAQA,IAEV0C,EAAQ,CACZmB,KAAMC,EAAQ,QAAGd,EAAC,QAAAG,cAAAW,EAAQ,QAAG,MAAG,KAChCC,OAAQC,EAAY,QAAGhB,EAAC,QAAAG,cAAAa,EAAY,QAAG,MAAG,KAC1CC,SAAUC,EAAeA,gBAAGlB,EAAC,QAAAG,cAAAe,EAAeA,gBAAG,MAAG,KAClD5C,OAAQ6C,EAAeC,WAAGpB,EAAC,QAAAG,cAAAgB,EAAeC,WAAG,MAAG,KAChDC,SAAUC,EAAYA,aAAGtB,EAAC,QAAAG,cAAAmB,EAAYA,aAAG,MAAG,KAC5CC,sBAAuBC,EAAoBA,qBAAGxB,EAAC,QAAAG,cAAAqB,EAAoBA,qBAAG,MAAG,KACzEC,SAAUC,EAAYA,aAAG1B,EAAC,QAAAG,cAAAuB,EAAYA,aAAG,MAAG,KAC5CC,MAAOC,EAASA,UAAG5B,EAAC,QAAAG,cAAAyB,EAASA,UAAG,MAAG,KACnCC,aAAcC,EAAgBA,iBAAG9B,EAAC,QAAAG,cAAA2B,EAAgBA,iBAAG,MAAG,KACxDC,kBAAmBC,EAAqBA,sBAAGhC,EAAC,QAAAG,cAAA6B,EAAqBA,sBAAG,MAAG,KACvEC,gBAAiBC,EAAmBA,oBAAGlC,EAAC,QAAAG,cAAA+B,EAAmBA,oBAAG,MAAG,KACjEC,aAAcC,EAAgBA,iBAAGpC,EAAC,QAAAG,cAAAiC,EAAgBA,iBAAG,MAAG,MAGnDvC,KAAeH,GAASA,EAAMG,GACnCG,wBAACqC,EAAe,QAAA,CAACC,QAASzC,GACvBH,EAAMG,IAGTG,EAAA,QAAAG,cAAAH,UAAAI,SAAA,WAQhBJ,EAAAA,QAAKG,cAAA,MAAA,CAAAD,UAAU,aACbF,EAAA,QAAAG,cAAA,QAAA,CAAOoC,KAAMlE,EAAiB4B,IAAKpB,IACnCmB,EAAA,QAAAG,cAAA,QAAA,CAAOqC,OAAO,EAAMvC,IAAKnB,IACzBkB,UAAOG,cAAA,QAAA,CAAAsC,YAASxC,IAAKlB,KAI7B,EAEAlC,EAAO6F,YAAc"}
|
|
1
|
+
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport { useIsomorphicLayoutEffect } from '../utils'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport AudioPlayerView from './AudioPlayerView'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport SideView from './SideView/SideView'\nimport ViewsTransition from './ViewsTransition'\nimport { RecorderView } from './RecorderView'\nimport IslandMotions from './IslandMotion'\nimport IslandDrag from './IslandDrag'\nimport { PhysicalRecorderView } from './PhysicalRecorderView'\nimport { SettingsView } from './SettingsView'\nimport { SwitchDeviceView } from './SwitchDeviceView'\nimport { isBackCallActive } from '../utils/genericFunctions/isBackCallVisible'\nimport VideoView from './VideoView'\nimport { WaitingConferenceView } from './ConferenceView'\nimport { store } from '../store'\nimport { ContactListView } from './ContactView/ContactListView'\nimport StreamingAnswerView from './StreamingAnswerView'\nimport { OperatorBusyView } from './OperatorBusyView'\nimport { TranscriptionView } from './TranscriptionView'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n */\nexport const Island: FC<IslandProps> = ({ showAlways, uaType, urlParamWithEvent }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const { view, sideViewIsVisible, transcriptionViewIsVisible, avoidToShow, previousView } = useSelector(\n (state: RootState) => state.island,\n )\n const { recording } = useSelector((state: RootState) => ({\n recording: state.physicalRecorder.recording,\n }))\n\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n // Get user information for device logic\n const { default_device, endpoints, username } = useSelector((state: RootState) => state.currentUser)\n const { extensions } = useSelector((state: RootState) => state.users)\n\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer,\n localAudio: localAudio,\n remoteAudio: remoteAudio,\n })\n }, [])\n\n // Handle and apply view switch logic\n // ...set callview as the current view\n useEffect(() => {\n const { isActive, conferenceStartedFrom, isOwnerInside } = store.getState().conference\n const { username } = store.getState().currentUser\n // Check and switch the view\n if ((incoming || outgoing) && isActive && conferenceStartedFrom === username && isOwnerInside) {\n dispatch.island.setIslandView('waitingConference')\n } else if ((incoming || outgoing) && !avoidToShow) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n useEffect(() => {\n if (recording) {\n dispatch.island.setIslandView('physicalPhoneRecorder')\n }\n }, [view])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n // Handle island view change\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n // Check if there's an online NethLink device\n const hasOnlineNethlink = () => {\n if (!extensions || !username) return false\n\n // Get all extensions for current user\n const userExtensions: any = Object.values(extensions).filter(\n (ext) => ext?.username === username,\n )\n\n // Check if any extension is nethlink type and online\n return userExtensions?.some((ext) => {\n const endpointExtension = endpoints?.extension.find(\n (endpoint) => endpoint.id === ext?.exten,\n )\n return endpointExtension?.type === 'nethlink' && ext?.status !== 'offline'\n })\n }\n\n return (\n <div\n ref={islandContainerRef}\n className='pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000'\n >\n {(incoming ||\n outgoing ||\n accepted ||\n showAlways ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder' ||\n view === 'physicalPhoneRecorder' ||\n (view === 'waitingConference' && isActive) ||\n (view === 'transfer' && isActive) ||\n (view === 'settings' && isActive) ||\n (view === 'operatorBusy' &&\n ((uaType === 'mobile' && hasOnlineNethlink()) ||\n (uaType === 'desktop' &&\n (default_device?.type === 'webrtc' ||\n (default_device?.type === undefined && !hasOnlineNethlink()) ||\n (!hasOnlineNethlink() && default_device?.type === 'physical'))))) ||\n (view === 'settings' && (previousView === 'recorder' || previousView === 'player'))) &&\n !avoidToShow && (\n <>\n <IslandDrag islandContainerRef={islandContainerRef}>\n {/* Add background call visibility logic */}\n <BackCall isVisible={isBackCallActive()} />\n <SideView isVisible={sideViewIsVisible} uaType={uaType} />\n <TranscriptionView isVisible={transcriptionViewIsVisible} />\n <IslandMotions>\n {/* The views logic */}\n <AlertGuard uaType={uaType}>\n {(() => {\n const views = {\n call: CallView ? <CallView /> : null,\n keypad: KeyboardView ? <KeyboardView /> : null,\n transfer: ContactListView ? <ContactListView /> : null,\n player: AudioPlayerView ? <AudioPlayerView /> : null,\n recorder: RecorderView ? <RecorderView /> : null,\n physicalPhoneRecorder: PhysicalRecorderView ? <PhysicalRecorderView /> : null,\n settings: SettingsView ? <SettingsView /> : null,\n video: VideoView ? <VideoView /> : null,\n switchDevice: SwitchDeviceView ? <SwitchDeviceView /> : null,\n waitingConference: WaitingConferenceView ? <WaitingConferenceView /> : null,\n streamingAnswer: StreamingAnswerView ? <StreamingAnswerView /> : null,\n operatorBusy: OperatorBusyView ? <OperatorBusyView /> : null,\n }\n\n return currentView in views && views[currentView as keyof typeof views] ? (\n <ViewsTransition forView={currentView}>\n {views[currentView as keyof typeof views]}\n </ViewsTransition>\n ) : (\n <></>\n )\n })()}\n </AlertGuard>\n </IslandMotions>\n </IslandDrag>\n </>\n )}\n <div className='pi-hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n uaType?: string\n urlParamWithEvent?: boolean\n}\n"],"names":["Island","_a","showAlways","uaType","urlParamWithEvent","_b","useSelector","state","currentCall","incoming","accepted","outgoing","_c","island","view","sideViewIsVisible","transcriptionViewIsVisible","avoidToShow","previousView","recording","physicalRecorder","activeAlertsCount","alerts","status","audioPlayerLoop","player","isActive","conference","_d","currentUser","default_device","endpoints","username","extensions","users","islandContainerRef","useRef","dispatch","useDispatch","audioPlayer","localAudio","remoteAudio","useIsomorphicLayoutEffect","updatePlayer","useEffect","store","getState","conferenceStartedFrom","isOwnerInside","setIslandView","_e","useState","currentView","setCurrentView","setTimeout","views","hasOnlineNethlink","userExtensions","Object","values","filter","ext","some","endpointExtension","extension","find","endpoint","id","exten","type","React","ref","className","undefined","createElement","Fragment","IslandDrag","BackCall","isVisible","isBackCallActive","SideView","TranscriptionView","IslandMotions","AlertGuard","call","CallView","keypad","KeyboardView","transfer","ContactListView","AudioPlayerView","KeypadView","recorder","RecorderView","physicalPhoneRecorder","PhysicalRecorderView","settings","SettingsView","video","VideoView","switchDevice","SwitchDeviceView","waitingConference","WaitingConferenceView","streamingAnswer","StreamingAnswerView","operatorBusy","OperatorBusyView","ViewsTransition","forView","loop","muted","autoPlay","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),a=require("../GenericAvatar.js"),n=require("../CustomThemedTooltip.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js"),i=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=o(e);exports.OperatorBusyView=function(){var o=s.useSelector((function(e){return e.island})).operatorBusy,c=s.useSelector((function(e){return e.avatars})).avatars,m=s.useSelector((function(e){return e.users})).extensions,p=t.useTranslation().t,f=i.useDispatch(),v=e.useCallback((function(){f.player.stopAudioPlayer(),f.island.resetOperatorBusyCompletely(),f.island.setIslandView(null)}),[f]),b=e.useMemo((function(){if((null==o?void 0:o.calledNumber)&&m){var e=Object.values(m).find((function(e){return e.exten===(null==o?void 0:o.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[m,null==o?void 0:o.calledNumber]),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),a=require("../GenericAvatar.js"),n=require("../CustomThemedTooltip.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js"),i=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=o(e);exports.OperatorBusyView=function(){var o=s.useSelector((function(e){return e.island})).operatorBusy,c=s.useSelector((function(e){return e.avatars})).avatars,m=s.useSelector((function(e){return e.users})).extensions,p=t.useTranslation().t,f=i.useDispatch(),v=e.useCallback((function(){f.player.stopAudioPlayer(),f.island.resetOperatorBusyCompletely(),f.island.setIslandView(null)}),[f]),b=e.useMemo((function(){if((null==o?void 0:o.calledNumber)&&m){var e=Object.values(m).find((function(e){return e.exten===(null==o?void 0:o.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[m,null==o?void 0:o.calledNumber]),x=e.useMemo((function(){return b&&c&&c[b]?c[b]:null}),[c,b]),y=e.useMemo((function(){return null!==b}),[b]),j=e.useMemo((function(){if(m&&(null==o?void 0:o.calledNumber)&&""!==(null==o?void 0:o.calledNumber)){var e=Object.values(m).find((function(e){return(null==e?void 0:e.exten)===(null==o?void 0:o.calledNumber)}));return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==o?void 0:o.calledNumber}return"-"}),[null==o?void 0:o.calledNumber,m]),N=e.useMemo((function(){return p(y?"Call.User busy":"Call.Number busy")}),[p,y]);return e.useEffect((function(){return function(){f.player.stopAudioPlayer()}}),[f]),d.default.createElement(d.default.Fragment,null,d.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},d.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},d.default.createElement(a.GenericAvatar,{avatarUrl:x,size:"open",showPulseEffect:!1}),d.default.createElement("div",{className:"pi-flex pi-flex-col"},d.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},j),d.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},N))),d.default.createElement(r.Button,{variant:"default",onClick:v,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":p("Tooltip.Close")||"Close"},d.default.createElement(l.FontAwesomeIcon,{icon:u.faXmark,className:"pi-w-5 pi-h-5"}))),d.default.createElement(n.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n // Reset island view\n dispatch.island.setIslandView(null)\n }, [dispatch])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n // Reset island view\n dispatch.island.setIslandView(null)\n }, [dispatch])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["operatorBusy","useSelector","state","island","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","handleClose","useCallback","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","username","avatarUrl","isOperator","displayText","name","statusText","useEffect","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"4nCAa2D,WACjD,IAAAA,EAAiBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,uBACzDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBACpDC,EAAeJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,oBACvDC,EAAMC,qBACRC,EAAWC,EAAAA,cAEXC,EAAcC,EAAAA,aAAY,WAE9BH,EAASI,OAAOC,kBAEhBL,EAASN,OAAOY,8BAEhBN,EAASN,OAAOa,cAAc,KAChC,GAAG,CAACP,IAGEQ,EAAmBC,EAAAA,SAAQ,WAE/B,IAAIlB,aAAY,EAAZA,EAAcmB,eAAgBd,EAAY,CAE5C,IAAMe,EAAYC,OAAOC,OAAOjB,GAAYkB,MAC1C,SAACC,GAAQ,OAAAA,EAAIC,SAAUzB,aAAY,EAAZA,EAAcmB,aAA5B,IAGX,OAAOC,EAAYA,aAAA,EAAAA,EAAWM,SAAW,IAC1C,CACD,OAAO,IACR,GAAE,CAACrB,EAAYL,aAAY,EAAZA,EAAcmB,eAGxBQ,EAAYT,EAAAA,SAAQ,WAExB,OAAID,GAAoBb,GAAWA,EAAQa,GAClCb,EAAQa,GAEV,IACT,GAAG,CAACb,EAASa,IAGPW,EAAaV,EAAAA,SAAQ,WACzB,OAA4B,OAArBD,CACT,GAAG,CAACA,IAGEY,EAAcX,EAAAA,SAAQ,WAC1B,GAAIb,IAAcL,aAAA,EAAAA,EAAcmB,eAA+C,MAA/BnB,aAAY,EAAZA,EAAcmB,cAAqB,CAEjF,IAAMC,EAAYC,OAAOC,OAAOjB,GAAYkB,MAC1C,SAACC,GAAQ,OAAAA,eAAAA,EAAKC,UAAUzB,aAAA,EAAAA,EAAcmB,aAAY,IAIpD,OAAIC,IAAaA,aAAA,EAAAA,EAAWU,OAA4B,MAApBV,aAAS,EAATA,EAAWU,MACtCV,eAAAA,EAAWU,KAIb9B,eAAAA,EAAcmB,YACtB,CAED,MAAO,GACR,GAAE,CAACnB,aAAY,EAAZA,EAAcmB,aAAcd,IAE1B0B,EAAab,EAAAA,SAAQ,WAEzB,OACSX,EADLqB,EACO,iBAEF,mBACX,GAAG,CAACrB,EAAGqB,IASP,OANAI,EAAAA,WAAU,WACR,OAAO,WACLvB,EAASI,OAAOC,iBAClB,CACF,GAAG,CAACL,IAGFwB,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wDAEbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wCAEbH,UAAAC,cAACG,EAAaA,cAAA,CAACV,UAAWA,EAAWW,KAAK,OAAOC,iBAAiB,IAGlEN,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,uBACbH,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,oFACZP,GAEHI,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,qFACZL,KAMPE,EAAC,QAAAC,cAAAM,EAAMA,QACLC,QAAQ,UACRC,QAAS/B,EACTyB,UAAU,2BACM,0BAAyB,uBACnB7B,EAAE,kBAAoB,SAE5C0B,UAACC,cAAAS,EAAAA,gBAAgB,CAAAC,KAAMC,EAAAA,QAAST,UAAU,oBAG9CH,EAAAA,QAAAC,cAACY,sBAAoB,CAAAV,UAAU,UAAUW,GAAG,0BAA0BC,MAAM,SAGlF"}
|