@nethesis/phone-island 0.18.6 → 0.18.8

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 CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./node_modules/tslib/tslib.es6.js"),n=require("react"),t=require("./components/Events.js"),i=require("./components/Socket.js"),s=require("./components/WebRTC.js"),a=require("./components/Island.js"),o=require("./components/RestAPI.js"),r=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("./lib/phone/call.js"),D=require("./node_modules/react-redux/es/components/Provider.js");function S(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 y=S(n),_=n.forwardRef((function(S,_){var k=S.dataConfig,L=S.showAlways,U=void 0!==L&&L,T=S.uaType,j=S.urlParamWithEvent,C=void 0!==j&&j,N=p.Base64.atob(k||"").split(":"),O=N[0],A=N[1],q=N[2],R=N[3],V=N[4],P=N[5],x=N[6],J=n.useState(!1),W=J[0],F=J[1],M=n.useState(!1),Q=M[0],z=M[1],H=n.useState(!1),$=H[0],B=H[1],G=n.useRef(0);n.useImperativeHandle(_,(function(){return{reset:function(){console.info("PhoneIsland: Performing full component reset"),F(!0)}}}),[]),n.useEffect((function(){var e=Date.now(),n=function(){if(!document.hidden){var n=Date.now(),t=n-e;setTimeout((function(){c.eventDispatch("phone-island-emergency-stop-ringtone",{})}),2e3),t>3e5&&(console.info("Tab inactive for long period, performing soft reconnection"),F(!0)),e=n}},t=new Worker(v.default,{type:"module"});return t.onmessage=function(n){"ping"===n.data&&(e=Date.now())},document.addEventListener("visibilitychange",n),function(){t.terminate(),document.removeEventListener("visibilitychange",n)}}),[]),n.useEffect((function(){$&&Q&&(F(!1),z(!1),B(!1))}),[$,Q]),n.useEffect((function(){var e=setInterval((function(){var e,n,t,i,s=d.store.getState().alerts.data,a=(null===(e=s.webrtc_down)||void 0===e?void 0:e.active)||!1,o=(null===(n=s.socket_down)||void 0===n?void 0:n.active)||!1,r=Date.now(),c=r-G.current,u=d.store.getState().webrtc.sipcall,l=d.store.getState().currentCall,p=l.accepted,v=l.outgoing,h=null===(i=null===(t=null==u?void 0:u.webrtcStuff)||void 0===t?void 0:t.pc)||void 0===i?void 0:i.iceConnectionState,f=p||v||"connected"===h||"completed"===h,g=navigator.onLine;if((a||o)&&!W&&c>1e4&&g){if(f)return void console.info("Alert detected but active call in progress - skipping automatic reload to let ICE recover",{timeSinceLastReload:Math.round(c/1e3)+"s",isWebRTCDown:a,isSocketDown:o,iceState:h,accepted:p,outgoing:v});console.info("Alert detected (webrtc_down or socket_down), triggering automatic reload",{timeSinceLastReload:Math.round(c/1e3)+"s",isWebRTCDown:a,isSocketDown:o}),G.current=r,F(!0)}}),1e3);return function(){return clearInterval(e)}}),[W]),r.useEventListener("phone-island-expand",(function(){d.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),r.useEventListener("phone-island-compress",(function(){d.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),r.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),r.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),r.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),r.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),r.useEventListener("phone-island-emergency-stop-ringtone",(function(){null===d.store.getState().island.view?(console.warn("Emergency stop ringtone triggered - phone island inactive"),d.store.dispatch.player.emergencyStopAudioPlayer(),c.eventDispatch("phone-island-emergency-stop-ringtone-completed",{})):console.log("Phone island is active, ringtone stop ignored")})),r.useEventListener("phone-island-detach",(function(e){f.detach(),c.eventDispatch("phone-island-detached",{})})),r.useEventListener("phone-island-reload-component",(function(e){(null==e?void 0:e.force)&&d.store.dispatch.island.setForceReload(!0),F(!0)})),r.useEventListener("phone-island-audio-input-change",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return(t=n.deviceId)&&"default"!==t?[4,te(t)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Audio input device ".concat(t," not available, falling back to default device")),[4,ie()]);case 2:t=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-audio-input-device",{deviceId:t}),c.eventDispatch("phone-island-audio-input-changed",{}),t!==n.deviceId&&console.info("Audio input device changed from ".concat(n.deviceId," to ").concat(t," (fallback)")),[2]}}))}))})),r.useEventListener("phone-island-video-input-change",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return(t=n.deviceId)&&"default"!==t?[4,se(t)]:[3,3];case 1:return e.sent()?[3,3]:(console.warn("Video input device ".concat(t," not available, falling back to default device")),[4,ae()]);case 2:t=e.sent(),e.label=3;case 3:return u.setJSONItem("phone-island-video-input-device",{deviceId:t}),c.eventDispatch("phone-island-video-input-changed",{}),t!==n.deviceId&&console.info("Video input device changed from ".concat(n.deviceId," to ").concat(t," (fallback)")),[2]}}))}))}));var K=n.useState(!0),X=K[0],Y=K[1],Z=n.useState(!0),ee=Z[0],ne=Z[1];n.useEffect((function(){X&&(h.initI18n(),e.__awaiter(void 0,void 0,void 0,(function(){var n,t,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 n=e.sent(),t=(null==n?void 0:n.url)||"",i=t&&""!==t.trim(),d.store.dispatch.paramUrl.setParamUrl({url:t,onlyQueues:(null==n?void 0:n.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]}}))})),Y(!1))}),[X]);var te=function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,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 t=e.sent(),[2,t.filter((function(e){return"audioinput"===e.kind})).some((function(e){return e.deviceId===n}))];case 2:return i=e.sent(),console.warn("Error checking audio input device availability:",i),[2,!1];case 3:return[2]}}))}))},ie=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,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 n=e.sent(),t=n.filter((function(e){return"audioinput"===e.kind})),[2,(i=t.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||t[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]}}))}))},se=function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,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 t=e.sent(),[2,t.filter((function(e){return"videoinput"===e.kind})).some((function(e){return e.deviceId===n}))];case 2:return i=e.sent(),console.warn("Error checking video input device availability:",i),[2,!1];case 3:return[2]}}))}))},ae=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,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 n=e.sent(),t=n.filter((function(e){return"videoinput"===e.kind})),[2,(i=t.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||t[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]}}))}))};r.useEventListener("phone-island-audio-output-change",(function(n){e.__awaiter(void 0,void 0,void 0,(function(){var t,i,s,a,o,r,l,p,v;return e.__generator(this,(function(h){switch(h.label){case 0:return(null==(t=d.store.getState().player.remoteAudio)?void 0:t.current)?(i=n.deviceId)&&"default"!==i?[4,(f=i,e.__awaiter(void 0,void 0,void 0,(function(){var n;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 n=e.sent(),console.warn("Error checking device availability:",n),[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 n,t,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 n=e.sent(),t=n.filter((function(e){return"audiooutput"===e.kind})),[2,(i=t.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||t[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,t.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),o=a.createOscillator(),r=a.createGain(),o.frequency.setValueAtTime(440,a.currentTime),r.gain.setValueAtTime(0,a.currentTime),o.connect(r),l=a.createMediaStreamDestination(),r.connect(l),t.current.srcObject=l.stream,o.start(),setTimeout((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,s;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,7]),[4,t.current.setSinkId(i)];case 1:return e.sent(),console.info("Default audio output device changed successfully with temporary stream!"),o.stop(),a.close(),t.current.srcObject=null,u.setJSONItem("phone-island-audio-output-device",{deviceId:i}),c.eventDispatch("phone-island-audio-output-changed",{}),[3,7];case 2:if(n=e.sent(),console.error("Final setSinkId attempt failed:",n),o.stop(),a.close(),t.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,t.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,t.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}))}))})),r.useEventListener("phone-island-presence-change",(function(e){l.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),r.useEventListener("phone-island-view-changed",(function(e){var n=null==e?void 0:e.viewType;d.store.dispatch.island.setIslandView(n)}));var oe=d.store.getState().player.remoteAudio;n.useEffect((function(){var e;if(ee&&oe){var n=null===(e=u.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;c.eventDispatch("phone-island-audio-output-change",{deviceId:n}),ne(!1)}}),[ee,oe]),n.useEffect((function(){g.checkDarkTheme()}),[]),r.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),r.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",{})})),r.useEventListener("phone-island-alert",(function(e){d.store.dispatch.alerts.setAlert(e.toString())})),r.useEventListener("phone-island-ringing-tone-list",(function(){var e=d.store.getState().ringtones.availableRingtones.map((function(e){return{name:e.name,displayName:e.displayName,base64Audio:e.base64Audio}}));c.eventDispatch("phone-island-ringing-tone-list-response",{ringtones:e})})),r.useEventListener("phone-island-ringing-tone-select",(function(e){(null==e?void 0:e.name)&&(u.setJSONItem("phone-island-selected-ringtone",{value:e.name}),d.store.dispatch.ringtones.setSelectedRingtone(e.name),c.eventDispatch("phone-island-ringing-tone-selected",{name:e.name}))})),r.useEventListener("phone-island-ringing-tone-output",(function(e){(null==e?void 0:e.deviceId)&&(u.setJSONItem("phone-island-ringtone-output-device",{value:e.deviceId}),d.store.dispatch.ringtones.setOutputDeviceId(e.deviceId),c.eventDispatch("phone-island-ringing-tone-output-changed",{deviceId:e.deviceId}))})),n.useEffect((function(){var e=u.getJSONItem("phone-island-selected-ringtone"),n=u.getJSONItem("phone-island-ringtone-output-device");(null==e?void 0:e.value)&&d.store.dispatch.ringtones.setSelectedRingtone(e.value),(null==n?void 0:n.value)&&d.store.dispatch.ringtones.setOutputDeviceId(n.value)}),[]),r.useEventListener("phone-island-check-connection",(function(){w.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))})),n.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)}}),[]),r.useEventListener("phone-island-main-presence",(function(e){var n,t,i,s,a=null===(n=d.store.getState().currentUser)||void 0===n?void 0:n.username,o=d.store.getState().currentUser,r=null==o?void 0:o.mainPresence;if(void 0!==a&&""!==a&&!m.isEmpty(e[a])&&void 0!==(null===(t=e[a])||void 0===t?void 0:t.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"!==r&&c.eventDispatch("phone-island-call-ended",{})}})),r.useEventListener("phone-island-call-status",(function(){var e=d.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var re=function(e,n,t,i){var s=d.store.getState().paramUrl;if(null==s?void 0:s.hasValidUrl){var a=s.url||"";if(a){var o=d.store.getState().island.urlOpened,r=s.openParamUrlType;if(!o||"button"===r){var u=a;u.includes("$CALLER_NUMBER")&&e&&(u=u.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),u.includes("$CALLER_NAME")&&n&&(u=u.replace(/\$CALLER_NAME/g,encodeURIComponent(n))),u.includes("$UNIQUEID")&&i&&(u=u.replace(/\$UNIQUEID/g,encodeURIComponent(i))),u.includes("$CALLED")&&t&&(u=u.replace(/\$CALLED/g,encodeURIComponent(t))),u.includes("{phone}")&&e&&(u=u.replace(/\{phone\}/g,encodeURIComponent(e)));var l=u.startsWith("http")?u:"https://".concat(u);if("mobile"===T||C)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 r.useEventListener("phone-island-already-opened-external-page",(function(){d.store.dispatch.island.setUrlOpened(!0)})),r.useEventListener("phone-island-url-parameter-opened",(function(e){var n=d.store.getState().paramUrl;if(n.hasValidUrl&&!d.store.getState().island.urlOpened){var t=n.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===t&&!0===(null==e?void 0:e.throughQueue)?re(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!==t||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||re(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.uniqueId))}})),r.useEventListener("phone-island-user-status",(function(){var e=d.store.getState().currentUser;console.log("User status debug informations: ",e)})),r.useEventListener("phone-island-all-users-status",(function(){var e=d.store.getState().users;console.log("Users status debug informations: ",e)})),r.useEventListener("phone-island-status",(function(){var e=d.store.getState().island;console.log("Phone island status debug informations: ",e)})),r.useEventListener("phone-island-webrtc-status",(function(){var e=d.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),r.useEventListener("phone-island-player-status",(function(){var e=d.store.getState().player;console.log("Player status debug informations: ",e)})),r.useEventListener("phone-island-conference-status",(function(){var e=d.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),r.useEventListener("phone-island-streaming-status",(function(){var e=d.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),r.useEventListener("phone-island-paramurl-status",(function(){var e=d.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),r.useEventListener("phone-island-player-force-stop",(function(){d.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),r.useEventListener("phone-island-stores-download",(function(){d.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),r.useEventListener("phone-island-sideview-open",(function(){d.store.dispatch.island.toggleSideViewVisible(!0),d.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),r.useEventListener("phone-island-sideview-close",(function(){d.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),r.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-stop-transcription",{}),c.eventDispatch("phone-island-transcription-closed",{})})),r.useEventListener("phone-island-transcription-open",(function(){c.eventDispatch("phone-island-start-transcription",{}),d.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{})})),r.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-transcription-closed",{})})),r.useEventListener("phone-island-init-audio",(function(){var e=d.store.getState().currentCall,n=e.accepted,t=e.incoming,i=e.outgoing,s=e.incomingWebRTC,a=e.incomingSocket;if(n||t||i||s||a)console.log("[AUDIO-WARMUP] Skipping audio warm-up: active call in progress");else if(P&&"string"==typeof P&&0!==P.length){var o=d.store.getState().currentUser.featureCodes,r=null==o?void 0:o.audio_test,c=r&&"string"==typeof r&&r.length>0?r:"*41";console.log("[AUDIO-WARMUP] Starting audio warm-up test call",{codeToCall:c,SIP_HOST:P}),E.callNumber(c,P)}else console.warn("[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available",{SIP_HOST:P})})),r.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",{})})),r.useEventListener("phone-island-size-change",(function(n){var t=d.store.getState().island,i=t.sideViewIsVisible,s=t.transcriptionViewIsVisible,a=t.actionsExpanded,o=n.sizeInformation,r=e.__assign(e.__assign({},o),{right:i?"42px":"0px",top:I.isBackCallActive()?"40px":"0px",bottomTranscription:s&&a?"335px":s&&!a?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:r})})),r.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)}})),r.useEventListener("phone-island-conference-list-open",(function(){d.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),r.useEventListener("phone-island-alert-removed",(function(e){var n=d.store.getState().alerts.status.activeAlertsCount,t=d.store.getState().island,i=t.view,s=t.previousView,a=d.store.getState().conference.isActive,o=d.store.getState().alerts.data,r=d.store.getState().currentCall,u=r.incoming,l=r.outgoing,p=r.accepted,v=null==e?void 0:e.type,h=r.incoming||r.outgoing||r.accepted||""!==r.conversationId;if(!(u||l||p||n>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===n&&(!v||o[v]&&!o[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()}})),r.useEventListener("phone-island-conference-list-close",(function(){d.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),r.useEventListener("phone-island-conversations",(function(e){var n,t=Object.keys(e)[0];if(t===(null===(n=d.store.getState().currentUser)||void 0===n?void 0:n.username)){var i=e[t].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 o=i[Object.keys(i)[0]];if((null==o?void 0:o.connected)&&"in"===(null==o?void 0:o.direction)){var r=s.onlyQueues||!1,c=b.isFromTrunk(o.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(c),!0===r&&!0===(null==o?void 0:o.throughQueue)?re(o.counterpartNum,o.counterpartName,o.owner,o.uniqueId):!1!==r||!0!==c&&!0!==(null==o?void 0:o.throughQueue)||re(o.counterpartNum,o.counterpartName,o.owner,o.uniqueId)}}}})),y.default.createElement(y.default.Fragment,null,y.default.createElement(D.default,{store:d.store},R&&""!==R.trim()?y.default.createElement(s.WebRTC,{hostName:O,sipExten:R,sipSecret:V,sipHost:P,sipPort:x,reload:W,reloadedCallback:function(){return z(!0)},uaType:T},y.default.createElement(o.RestAPI,{hostName:O,username:A,authToken:q},y.default.createElement(i.Socket,{hostName:O,username:A,authToken:q,reload:W,reloadedCallback:function(){return B(!0)},uaType:T},y.default.createElement(t.Events,{sipHost:P},y.default.createElement(a.Island,{showAlways:U,uaType:T}))))):y.default.createElement(o.RestAPI,{hostName:O,username:A,authToken:q},y.default.createElement(i.Socket,{hostName:O,username:A,authToken:q,reload:W,reloadedCallback:function(){B(!0),z(!0)},uaType:T},y.default.createElement(t.Events,{sipHost:P},y.default.createElement(a.Island,{showAlways:U,uaType:T}))))))}));_.displayName="PhoneIslandComponent";var k=n.forwardRef((function(n,t){return y.default.createElement(_,e.__assign({},n,{ref:t}))}));k.displayName="PhoneIsland",exports.PhoneIsland=k;
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"),o=require("./components/RestAPI.js"),r=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("./lib/phone/call.js"),D=require("./node_modules/react-redux/es/components/Provider.js");function S(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 y=S(t),_=t.forwardRef((function(S,_){var k=S.dataConfig,L=S.showAlways,U=void 0!==L&&L,T=S.uaType,j=S.urlParamWithEvent,C=void 0!==j&&j,N=p.Base64.atob(k||"").split(":"),O=N[0],A=N[1],q=N[2],R=N[3],V=N[4],P=N[5],x=N[6],J=t.useState(!1),W=J[0],F=J[1],M=t.useState(!1),Q=M[0],z=M[1],H=t.useState(!1),$=H[0],B=H[1],G=t.useRef(0);t.useImperativeHandle(_,(function(){return{reset:function(){console.info("PhoneIsland: Performing full component reset"),F(!0)}}}),[]),t.useEffect((function(){var e=Date.now(),t=function(){if(!document.hidden){var t=Date.now(),n=t-e;setTimeout((function(){c.eventDispatch("phone-island-emergency-stop-ringtone",{})}),2e3),n>3e5&&(console.info("Tab inactive for long period, performing soft reconnection"),F(!0)),e=t}},n=new Worker(v.default,{type:"module"});return n.onmessage=function(t){"ping"===t.data&&(e=Date.now())},document.addEventListener("visibilitychange",t),function(){n.terminate(),document.removeEventListener("visibilitychange",t)}}),[]),t.useEffect((function(){$&&Q&&(F(!1),z(!1),B(!1))}),[$,Q]),t.useEffect((function(){var e=setInterval((function(){var e,t,n,i,s=d.store.getState().alerts.data,a=(null===(e=s.webrtc_down)||void 0===e?void 0:e.active)||!1,o=(null===(t=s.socket_down)||void 0===t?void 0:t.active)||!1,r=Date.now(),c=r-G.current,u=d.store.getState().webrtc.sipcall,l=d.store.getState().currentCall,p=l.accepted,v=l.outgoing,h=null===(i=null===(n=null==u?void 0:u.webrtcStuff)||void 0===n?void 0:n.pc)||void 0===i?void 0:i.iceConnectionState,f=p||v||"connected"===h||"completed"===h,g=navigator.onLine;if((a||o)&&!W&&c>1e4&&g){if(f)return void console.info("Alert detected but active call in progress - skipping automatic reload to let ICE recover",{timeSinceLastReload:Math.round(c/1e3)+"s",isWebRTCDown:a,isSocketDown:o,iceState:h,accepted:p,outgoing:v});console.info("Alert detected (webrtc_down or socket_down), triggering automatic reload",{timeSinceLastReload:Math.round(c/1e3)+"s",isWebRTCDown:a,isSocketDown:o}),G.current=r,F(!0)}}),1e3);return function(){return clearInterval(e)}}),[W]),r.useEventListener("phone-island-expand",(function(){d.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),r.useEventListener("phone-island-compress",(function(){d.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),r.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),r.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),r.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),r.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),r.useEventListener("phone-island-emergency-stop-ringtone",(function(){null===d.store.getState().island.view?(console.warn("Emergency stop ringtone triggered - phone island inactive"),d.store.dispatch.player.emergencyStopAudioPlayer(),c.eventDispatch("phone-island-emergency-stop-ringtone-completed",{})):console.log("Phone island is active, ringtone stop ignored")})),r.useEventListener("phone-island-detach",(function(e){f.detach(),c.eventDispatch("phone-island-detached",{})})),r.useEventListener("phone-island-reload-component",(function(e){(null==e?void 0:e.force)&&d.store.dispatch.island.setForceReload(!0),F(!0)})),r.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,ne(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,ie()]);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]}}))}))})),r.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,se(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,ae()]);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 K=t.useState(!0),X=K[0],Y=K[1],Z=t.useState(!0),ee=Z[0],te=Z[1];t.useEffect((function(){X&&(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]}}))})),Y(!1))}),[X]);var ne=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]}}))}))},ie=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]}}))}))},se=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]}}))}))},ae=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]}}))}))};r.useEventListener("phone-island-audio-output-change",(function(t){e.__awaiter(void 0,void 0,void 0,(function(){var n,i,s,a,o,r,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),o=a.createOscillator(),r=a.createGain(),o.frequency.setValueAtTime(440,a.currentTime),r.gain.setValueAtTime(0,a.currentTime),o.connect(r),l=a.createMediaStreamDestination(),r.connect(l),n.current.srcObject=l.stream,o.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!"),o.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),o.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}))}))})),r.useEventListener("phone-island-presence-change",(function(e){l.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),r.useEventListener("phone-island-view-changed",(function(e){var t=null==e?void 0:e.viewType;d.store.dispatch.island.setIslandView(t)}));var oe=d.store.getState().player.remoteAudio;t.useEffect((function(){var e;if(ee&&oe){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}),te(!1)}}),[ee,oe]),t.useEffect((function(){g.checkDarkTheme()}),[]),r.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),r.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",{})})),r.useEventListener("phone-island-alert",(function(e){d.store.dispatch.alerts.setAlert(e.toString())})),r.useEventListener("phone-island-ringing-tone-list",(function(){var e=d.store.getState().ringtones.availableRingtones.map((function(e){return{name:e.name,displayName:e.displayName,base64Audio:e.base64Audio}}));c.eventDispatch("phone-island-ringing-tone-list-response",{ringtones:e})})),r.useEventListener("phone-island-ringing-tone-select",(function(e){(null==e?void 0:e.name)&&(u.setJSONItem("phone-island-selected-ringtone",{value:e.name}),d.store.dispatch.ringtones.setSelectedRingtone(e.name),c.eventDispatch("phone-island-ringing-tone-selected",{name:e.name}))})),r.useEventListener("phone-island-ringing-tone-output",(function(e){(null==e?void 0:e.deviceId)&&(u.setJSONItem("phone-island-ringtone-output-device",{value:e.deviceId}),d.store.dispatch.ringtones.setOutputDeviceId(e.deviceId),c.eventDispatch("phone-island-ringing-tone-output-changed",{deviceId:e.deviceId}))})),t.useEffect((function(){var e=u.getJSONItem("phone-island-selected-ringtone"),t=u.getJSONItem("phone-island-ringtone-output-device");(null==e?void 0:e.value)&&d.store.dispatch.ringtones.setSelectedRingtone(e.value),(null==t?void 0:t.value)&&d.store.dispatch.ringtones.setOutputDeviceId(t.value)}),[]),r.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)}}),[]),r.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,o=d.store.getState().currentUser,r=null==o?void 0:o.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"!==r&&c.eventDispatch("phone-island-call-ended",{})}})),r.useEventListener("phone-island-call-status",(function(){var e=d.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var re=function(e,t,n,i,s){var a=d.store.getState().paramUrl;if(null==a?void 0:a.hasValidUrl){var o=a.url||"";if(o){var r=d.store.getState().island.urlOpened,u=a.openParamUrlType;if(!r||"button"===u){var l=o;l.includes("$CALLER_NUMBER")&&e&&(l=l.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),l.includes("$CALLER_NAME")&&t&&(l=l.replace(/\$CALLER_NAME/g,encodeURIComponent(t))),l.includes("$UNIQUEID")&&i&&(l=l.replace(/\$UNIQUEID/g,encodeURIComponent(i))),l.includes("$CALLED")&&n&&(l=l.replace(/\$CALLED/g,encodeURIComponent(n))),l.includes("{phone}")&&e&&(l=l.replace(/\{phone\}/g,encodeURIComponent(e)));var p=l.startsWith("http")?l:"https://".concat(l);if("mobile"!==T&&!C&&s){var v=window.open("about:blank","_blank");v&&(v.location.href=p,d.store.dispatch.island.setUrlOpened(!0))}else c.eventDispatch("phone-island-url-parameter-opened-external",{formattedUrl:p})}}}};return r.useEventListener("phone-island-already-opened-external-page",(function(){d.store.dispatch.island.setUrlOpened(!0)})),r.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);var s=d.store.getState().currentUser.default_device,a=!("desktop"===T&&"nethlink"===(null==s?void 0:s.type));"in"===(null==e?void 0:e.direction)&&(!0===n&&!0===(null==e?void 0:e.throughQueue)?re(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,a):!1!==n||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||re(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,a))}})),r.useEventListener("phone-island-user-status",(function(){var e=d.store.getState().currentUser;console.log("User status debug informations: ",e)})),r.useEventListener("phone-island-all-users-status",(function(){var e=d.store.getState().users;console.log("Users status debug informations: ",e)})),r.useEventListener("phone-island-status",(function(){var e=d.store.getState().island;console.log("Phone island status debug informations: ",e)})),r.useEventListener("phone-island-webrtc-status",(function(){var e=d.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),r.useEventListener("phone-island-player-status",(function(){var e=d.store.getState().player;console.log("Player status debug informations: ",e)})),r.useEventListener("phone-island-conference-status",(function(){var e=d.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),r.useEventListener("phone-island-streaming-status",(function(){var e=d.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),r.useEventListener("phone-island-paramurl-status",(function(){var e=d.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),r.useEventListener("phone-island-player-force-stop",(function(){d.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),r.useEventListener("phone-island-stores-download",(function(){d.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),r.useEventListener("phone-island-sideview-open",(function(){d.store.dispatch.island.toggleSideViewVisible(!0),d.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),r.useEventListener("phone-island-sideview-close",(function(){d.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),r.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-stop-transcription",{}),c.eventDispatch("phone-island-transcription-closed",{})})),r.useEventListener("phone-island-transcription-open",(function(){c.eventDispatch("phone-island-start-transcription",{}),d.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{})})),r.useEventListener("phone-island-transcription-close",(function(){d.store.dispatch.island.toggleTranscriptionViewVisible(!1),c.eventDispatch("phone-island-transcription-closed",{})})),r.useEventListener("phone-island-init-audio",(function(){var e=d.store.getState().currentCall,t=e.accepted,n=e.incoming,i=e.outgoing,s=e.incomingWebRTC,a=e.incomingSocket;if(t||n||i||s||a)console.log("[AUDIO-WARMUP] Skipping audio warm-up: active call in progress");else if(P&&"string"==typeof P&&0!==P.length){var o=d.store.getState().currentUser.featureCodes,r=null==o?void 0:o.audio_test,c=r&&"string"==typeof r&&r.length>0?r:"*41";console.log("[AUDIO-WARMUP] Starting audio warm-up test call",{codeToCall:c,SIP_HOST:P}),E.callNumber(c,P)}else console.warn("[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available",{SIP_HOST:P})})),r.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",{})})),r.useEventListener("phone-island-size-change",(function(t){var n=d.store.getState().island,i=n.sideViewIsVisible,s=n.transcriptionViewIsVisible,a=n.actionsExpanded,o=t.sizeInformation,r=e.__assign(e.__assign({},o),{right:i?"42px":"0px",top:I.isBackCallActive()?"40px":"0px",bottomTranscription:s&&a?"335px":s&&!a?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:r})})),r.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)}})),r.useEventListener("phone-island-conference-list-open",(function(){d.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),r.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,o=d.store.getState().alerts.data,r=d.store.getState().currentCall,u=r.incoming,l=r.outgoing,p=r.accepted,v=null==e?void 0:e.type,h=r.incoming||r.outgoing||r.accepted||""!==r.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||o[v]&&!o[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()}})),r.useEventListener("phone-island-conference-list-close",(function(){d.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),r.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 o=i[Object.keys(i)[0]];if((null==o?void 0:o.connected)&&"in"===(null==o?void 0:o.direction)){var r=s.onlyQueues||!1,c=b.isFromTrunk(o.counterpartNum);d.store.dispatch.paramUrl.setThroughTrunk(c),!0===r&&!0===(null==o?void 0:o.throughQueue)?re(o.counterpartNum,o.counterpartName,o.owner,o.uniqueId):!1!==r||!0!==c&&!0!==(null==o?void 0:o.throughQueue)||re(o.counterpartNum,o.counterpartName,o.owner,o.uniqueId)}}}})),y.default.createElement(y.default.Fragment,null,y.default.createElement(D.default,{store:d.store},R&&""!==R.trim()?y.default.createElement(s.WebRTC,{hostName:O,sipExten:R,sipSecret:V,sipHost:P,sipPort:x,reload:W,reloadedCallback:function(){return z(!0)},uaType:T},y.default.createElement(o.RestAPI,{hostName:O,username:A,authToken:q},y.default.createElement(i.Socket,{hostName:O,username:A,authToken:q,reload:W,reloadedCallback:function(){return B(!0)},uaType:T},y.default.createElement(n.Events,{sipHost:P},y.default.createElement(a.Island,{showAlways:U,uaType:T}))))):y.default.createElement(o.RestAPI,{hostName:O,username:A,authToken:q},y.default.createElement(i.Socket,{hostName:O,username:A,authToken:q,reload:W,reloadedCallback:function(){B(!0),z(!0)},uaType:T},y.default.createElement(n.Events,{sipHost:P},y.default.createElement(a.Island,{showAlways:U,uaType:T}))))))}));_.displayName="PhoneIslandComponent";var k=t.forwardRef((function(t,n){return y.default.createElement(_,e.__assign({},t,{ref:n}))}));k.displayName="PhoneIsland",exports.PhoneIsland=k;
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, forwardRef, useImperativeHandle, useRef } 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'\nimport { callNumber } from './lib/phone/call'\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 interface PhoneIslandRef {\n reset: () => void\n}\n\nconst PhoneIslandComponent = forwardRef<PhoneIslandRef, PhoneIslandProps>(\n (\n {\n dataConfig,\n showAlways = false,\n uaType,\n urlParamWithEvent = false,\n }: PhoneIslandProps,\n ref,\n ) => {\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 // Cooldown to prevent reload loop when network is down\n const lastReloadTime = useRef<number>(0)\n const RELOAD_COOLDOWN = 10 * 1000 // 10 seconds between reload attempts\n\n // Expose reset method via imperativeHandle\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n console.info('PhoneIsland: Performing full component reset')\n setReload(true)\n },\n }),\n [],\n )\n\n // Keepalive system to maintain tab active without heavy reload\n useEffect(() => {\n let lastActiveTime = Date.now()\n const INACTIVITY_THRESHOLD = 5 * 60 * 1000 // 5 minutes\n\n // Handle visibility change (tab becomes visible/hidden)\n const handleVisibilityChange = () => {\n if (!document.hidden) {\n const now = Date.now()\n const timeSinceLastActive = now - lastActiveTime\n // Trigger emergency stop ringtone after 2 seconds when tab becomes active again\n setTimeout(() => {\n eventDispatch('phone-island-emergency-stop-ringtone', {})\n }, 2000)\n\n // Only reload if tab was hidden for more than threshold\n if (timeSinceLastActive > INACTIVITY_THRESHOLD) {\n console.info('Tab inactive for long period, performing soft reconnection')\n setReload(true)\n }\n lastActiveTime = now\n }\n }\n\n // Lightweight worker for keepalive ping\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n if (event.data === 'ping') {\n // Simple ping to keep tab active - no action needed\n lastActiveTime = Date.now()\n }\n }\n\n // Listen for visibility changes\n document.addEventListener('visibilitychange', handleVisibilityChange)\n\n return () => {\n worker.terminate()\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n // Monitor alerts and trigger automatic reload when webrtc_down or socket_down become active\n useEffect(() => {\n const checkInterval = setInterval(() => {\n const { data } = store.getState().alerts\n const isWebRTCDown = data.webrtc_down?.active || false\n const isSocketDown = data.socket_down?.active || false\n const now = Date.now()\n const timeSinceLastReload = now - lastReloadTime.current\n\n // Check if there's an active call - if so, don't reload automatically\n // WebRTC/ICE is designed to recover from brief network interruptions\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { accepted, outgoing } = store.getState().currentCall\n const iceState = sipcall?.webrtcStuff?.pc?.iceConnectionState\n const hasActiveCall = accepted || outgoing || iceState === 'connected' || iceState === 'completed'\n\n // If either alert is active and we're not already reloading and cooldown has passed\n // Don't trigger reload if we're completely offline - wait for network to come back\n // Don't trigger reload if there's an active call - let ICE try to recover\n const isOnline = navigator.onLine\n if ((isWebRTCDown || isSocketDown) && !reload && timeSinceLastReload > RELOAD_COOLDOWN && isOnline) {\n if (hasActiveCall) {\n console.info('Alert detected but active call in progress - skipping automatic reload to let ICE recover', {\n timeSinceLastReload: Math.round(timeSinceLastReload / 1000) + 's',\n isWebRTCDown,\n isSocketDown,\n iceState,\n accepted,\n outgoing\n })\n // Don't reload - let ICE try to recover the call\n return\n }\n console.info('Alert detected (webrtc_down or socket_down), triggering automatic reload', {\n timeSinceLastReload: Math.round(timeSinceLastReload / 1000) + 's',\n isWebRTCDown,\n isSocketDown\n })\n lastReloadTime.current = now\n setReload(true)\n }\n }, 1000) // Check every second\n\n return () => clearInterval(checkInterval)\n }, [reload])\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-emergency-stop-ringtone', () => {\n const { view } = store.getState().island\n\n // If phone-island is active (view is not null), don't stop the ringtone\n if (view !== null) {\n console.log('Phone island is active, ringtone stop ignored')\n return\n }\n\n // Phone-island is not active (view is null), force stop ringtone\n console.warn('Emergency stop ringtone triggered - phone island inactive')\n store.dispatch.player.emergencyStopAudioPlayer()\n eventDispatch('phone-island-emergency-stop-ringtone-completed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-reload-component', (data: any) => {\n if (data?.force) {\n store.dispatch.island.setForceReload(true)\n }\n setReload(true)\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 // Ringtone management events\n useEventListener('phone-island-ringing-tone-list', () => {\n const ringtones = store.getState().ringtones.availableRingtones\n const ringtoneList = ringtones.map((r) => ({\n name: r.name,\n displayName: r.displayName,\n base64Audio: r.base64Audio,\n }))\n eventDispatch('phone-island-ringing-tone-list-response', { ringtones: ringtoneList })\n })\n\n useEventListener('phone-island-ringing-tone-select', (data: { name: string }) => {\n if (data?.name) {\n // Save to localStorage\n setJSONItem('phone-island-selected-ringtone', { value: data.name })\n // Update store\n store.dispatch.ringtones.setSelectedRingtone(data.name)\n eventDispatch('phone-island-ringing-tone-selected', { name: data.name })\n }\n })\n\n useEventListener('phone-island-ringing-tone-output', (data: { deviceId: string }) => {\n if (data?.deviceId) {\n // Save to localStorage\n setJSONItem('phone-island-ringtone-output-device', { value: data.deviceId })\n // Update store\n store.dispatch.ringtones.setOutputDeviceId(data.deviceId)\n eventDispatch('phone-island-ringing-tone-output-changed', { deviceId: data.deviceId })\n }\n })\n\n // Load ringtone preferences from localStorage on mount\n useEffect(() => {\n const savedRingtone = getJSONItem('phone-island-selected-ringtone')\n const savedOutputDevice = getJSONItem('phone-island-ringtone-output-device')\n\n if (savedRingtone?.value) {\n store.dispatch.ringtones.setSelectedRingtone(savedRingtone.value)\n }\n if (savedOutputDevice?.value) {\n store.dispatch.ringtones.setOutputDeviceId(savedOutputDevice.value)\n }\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-init-audio', () => {\n // Check if there's an active call - don't interrupt it with audio warm-up\n const { accepted, incoming, outgoing, incomingWebRTC, incomingSocket } = store.getState().currentCall\n const hasActiveCall = accepted || incoming || outgoing || incomingWebRTC || incomingSocket\n\n if (hasActiveCall) {\n console.log('[AUDIO-WARMUP] Skipping audio warm-up: active call in progress')\n return\n }\n\n // Validate SIP_HOST before attempting call\n if (!SIP_HOST || typeof SIP_HOST !== 'string' || SIP_HOST.length === 0) {\n console.warn('[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available', { SIP_HOST })\n return\n }\n\n const { featureCodes } = store.getState().currentUser\n const audioTestCode = featureCodes?.audio_test\n // Always fallback to *41 if audio_test is not available\n const codeToCall = (audioTestCode && typeof audioTestCode === 'string' && audioTestCode.length > 0)\n ? audioTestCode\n : '*41'\n\n console.log('[AUDIO-WARMUP] Starting audio warm-up test call', { codeToCall, SIP_HOST })\n callNumber(codeToCall, SIP_HOST)\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 {SIP_EXTEN && SIP_EXTEN.trim() !== '' ? (\n // Full stack with WebRTC when SIP extension is provided\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 ) : (\n // Minimal stack without WebRTC when no SIP extension\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={() => {\n setReloadedSocket(true)\n setReloadedWebRTC(true)\n }}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} uaType={uaType} />\n </Events>\n </Socket>\n </RestAPI>\n )}\n </Provider>\n </>\n )\n})\n\nPhoneIslandComponent.displayName = 'PhoneIslandComponent'\n\nexport const PhoneIsland = forwardRef<PhoneIslandRef, PhoneIslandProps>(\n (props, ref) => <PhoneIslandComponent {...props} ref={ref} />,\n)\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIslandComponent","forwardRef","_a","ref","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","lastReloadTime","useRef","useImperativeHandle","reset","console","info","useEffect","lastActiveTime","Date","now","handleVisibilityChange","document","hidden","timeSinceLastActive","setTimeout","eventDispatch","worker","Worker","wakeUpWorker","type","onmessage","event","data","addEventListener","terminate","removeEventListener","checkInterval","setInterval","store","getState","alerts","isWebRTCDown","webrtc_down","active","isSocketDown","socket_down","timeSinceLastReload","current","sipcall","webrtc","currentCall","accepted","outgoing","iceState","webrtcStuff","pc","iceConnectionState","hasActiveCall","isOnline","navigator","onLine","Math","round","clearInterval","useEventListener","dispatch","island","toggleIsOpen","setIslandView","view","warn","player","emergencyStopAudioPlayer","log","detach","force","setForceReload","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","getDefaultAudioInputDevice","setJSONItem","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","error","error_1","mediaDevices","enumerateDevices","devices","filter","device","kind","some","err_3","audioInputDevices","defaultDevice","find","err_4","err_5","videoInputDevices","err_6","remoteAudioElement","remoteAudio","err_1","audioOutputDevices","err_2","setSinkId","err_7","audioContext_1","window","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","stop","close","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","alertType","setAlert","toString","ringtoneList","ringtones","availableRingtones","map","r","name","displayName","base64Audio","value","setSelectedRingtone","setOutputDeviceId","savedRingtone","savedOutputDevice","checkInternetConnection","then","internetIsActive","intervalId","currentUsernameInformation","username","currentUserObject","mainPresenceValueBeforeUpdate","mainPresence","undefined","isEmpty","newMainPresenceValue","updateMainPresence","callInformation","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","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","incoming","incomingWebRTC","incomingSocket","length","featureCodes","audioTestCode","audio_test","codeToCall","callNumber","newState","transcriptionViewIsVisible","args","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","__assign","right","top","isBackCallActive","bottomTranscription","sizes","width","height","handleResetIslandStore","toggleConferenceList","alertRemovedType","activeAlertsCount","status","previousView","isActive","alertsData","isInCall","conversationId","Object","keys","conversations","conv","connected","calculatedThroughTrunk","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","authToken","Socket","Events","Island","PhoneIsland","props"],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect, forwardRef, useImperativeHandle, useRef } 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'\nimport { callNumber } from './lib/phone/call'\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 interface PhoneIslandRef {\n reset: () => void\n}\n\nconst PhoneIslandComponent = forwardRef<PhoneIslandRef, PhoneIslandProps>(\n (\n {\n dataConfig,\n showAlways = false,\n uaType,\n urlParamWithEvent = false,\n }: PhoneIslandProps,\n ref,\n ) => {\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 // Cooldown to prevent reload loop when network is down\n const lastReloadTime = useRef<number>(0)\n const RELOAD_COOLDOWN = 10 * 1000 // 10 seconds between reload attempts\n\n // Expose reset method via imperativeHandle\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n console.info('PhoneIsland: Performing full component reset')\n setReload(true)\n },\n }),\n [],\n )\n\n // Keepalive system to maintain tab active without heavy reload\n useEffect(() => {\n let lastActiveTime = Date.now()\n const INACTIVITY_THRESHOLD = 5 * 60 * 1000 // 5 minutes\n\n // Handle visibility change (tab becomes visible/hidden)\n const handleVisibilityChange = () => {\n if (!document.hidden) {\n const now = Date.now()\n const timeSinceLastActive = now - lastActiveTime\n // Trigger emergency stop ringtone after 2 seconds when tab becomes active again\n setTimeout(() => {\n eventDispatch('phone-island-emergency-stop-ringtone', {})\n }, 2000)\n\n // Only reload if tab was hidden for more than threshold\n if (timeSinceLastActive > INACTIVITY_THRESHOLD) {\n console.info('Tab inactive for long period, performing soft reconnection')\n setReload(true)\n }\n lastActiveTime = now\n }\n }\n\n // Lightweight worker for keepalive ping\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n if (event.data === 'ping') {\n // Simple ping to keep tab active - no action needed\n lastActiveTime = Date.now()\n }\n }\n\n // Listen for visibility changes\n document.addEventListener('visibilitychange', handleVisibilityChange)\n\n return () => {\n worker.terminate()\n document.removeEventListener('visibilitychange', handleVisibilityChange)\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n // Monitor alerts and trigger automatic reload when webrtc_down or socket_down become active\n useEffect(() => {\n const checkInterval = setInterval(() => {\n const { data } = store.getState().alerts\n const isWebRTCDown = data.webrtc_down?.active || false\n const isSocketDown = data.socket_down?.active || false\n const now = Date.now()\n const timeSinceLastReload = now - lastReloadTime.current\n\n // Check if there's an active call - if so, don't reload automatically\n // WebRTC/ICE is designed to recover from brief network interruptions\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { accepted, outgoing } = store.getState().currentCall\n const iceState = sipcall?.webrtcStuff?.pc?.iceConnectionState\n const hasActiveCall = accepted || outgoing || iceState === 'connected' || iceState === 'completed'\n\n // If either alert is active and we're not already reloading and cooldown has passed\n // Don't trigger reload if we're completely offline - wait for network to come back\n // Don't trigger reload if there's an active call - let ICE try to recover\n const isOnline = navigator.onLine\n if ((isWebRTCDown || isSocketDown) && !reload && timeSinceLastReload > RELOAD_COOLDOWN && isOnline) {\n if (hasActiveCall) {\n console.info('Alert detected but active call in progress - skipping automatic reload to let ICE recover', {\n timeSinceLastReload: Math.round(timeSinceLastReload / 1000) + 's',\n isWebRTCDown,\n isSocketDown,\n iceState,\n accepted,\n outgoing\n })\n // Don't reload - let ICE try to recover the call\n return\n }\n console.info('Alert detected (webrtc_down or socket_down), triggering automatic reload', {\n timeSinceLastReload: Math.round(timeSinceLastReload / 1000) + 's',\n isWebRTCDown,\n isSocketDown\n })\n lastReloadTime.current = now\n setReload(true)\n }\n }, 1000) // Check every second\n\n return () => clearInterval(checkInterval)\n }, [reload])\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-emergency-stop-ringtone', () => {\n const { view } = store.getState().island\n\n // If phone-island is active (view is not null), don't stop the ringtone\n if (view !== null) {\n console.log('Phone island is active, ringtone stop ignored')\n return\n }\n\n // Phone-island is not active (view is null), force stop ringtone\n console.warn('Emergency stop ringtone triggered - phone island inactive')\n store.dispatch.player.emergencyStopAudioPlayer()\n eventDispatch('phone-island-emergency-stop-ringtone-completed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-reload-component', (data: any) => {\n if (data?.force) {\n store.dispatch.island.setForceReload(true)\n }\n setReload(true)\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 // Ringtone management events\n useEventListener('phone-island-ringing-tone-list', () => {\n const ringtones = store.getState().ringtones.availableRingtones\n const ringtoneList = ringtones.map((r) => ({\n name: r.name,\n displayName: r.displayName,\n base64Audio: r.base64Audio,\n }))\n eventDispatch('phone-island-ringing-tone-list-response', { ringtones: ringtoneList })\n })\n\n useEventListener('phone-island-ringing-tone-select', (data: { name: string }) => {\n if (data?.name) {\n // Save to localStorage\n setJSONItem('phone-island-selected-ringtone', { value: data.name })\n // Update store\n store.dispatch.ringtones.setSelectedRingtone(data.name)\n eventDispatch('phone-island-ringing-tone-selected', { name: data.name })\n }\n })\n\n useEventListener('phone-island-ringing-tone-output', (data: { deviceId: string }) => {\n if (data?.deviceId) {\n // Save to localStorage\n setJSONItem('phone-island-ringtone-output-device', { value: data.deviceId })\n // Update store\n store.dispatch.ringtones.setOutputDeviceId(data.deviceId)\n eventDispatch('phone-island-ringing-tone-output-changed', { deviceId: data.deviceId })\n }\n })\n\n // Load ringtone preferences from localStorage on mount\n useEffect(() => {\n const savedRingtone = getJSONItem('phone-island-selected-ringtone')\n const savedOutputDevice = getJSONItem('phone-island-ringtone-output-device')\n\n if (savedRingtone?.value) {\n store.dispatch.ringtones.setSelectedRingtone(savedRingtone.value)\n }\n if (savedOutputDevice?.value) {\n store.dispatch.ringtones.setOutputDeviceId(savedOutputDevice.value)\n }\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, automatic?: 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 && automatic) {\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 // Calculate automatic flag: false when desktop with nethlink device, true otherwise\n const { default_device } = store.getState().currentUser\n const automatic = !(uaType === 'desktop' && default_device?.type === 'nethlink')\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?.linkedId,\n automatic,\n )\n } else if (onlyQueues === false && (throughTrunk === true || data?.throughQueue === true)) {\n openParameterizedUrl(\n data?.counterpartNum,\n data?.counterpartName,\n data?.owner,\n data?.linkedId,\n automatic,\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-init-audio', () => {\n // Check if there's an active call - don't interrupt it with audio warm-up\n const { accepted, incoming, outgoing, incomingWebRTC, incomingSocket } = store.getState().currentCall\n const hasActiveCall = accepted || incoming || outgoing || incomingWebRTC || incomingSocket\n\n if (hasActiveCall) {\n console.log('[AUDIO-WARMUP] Skipping audio warm-up: active call in progress')\n return\n }\n\n // Validate SIP_HOST before attempting call\n if (!SIP_HOST || typeof SIP_HOST !== 'string' || SIP_HOST.length === 0) {\n console.warn('[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available', { SIP_HOST })\n return\n }\n\n const { featureCodes } = store.getState().currentUser\n const audioTestCode = featureCodes?.audio_test\n // Always fallback to *41 if audio_test is not available\n const codeToCall = (audioTestCode && typeof audioTestCode === 'string' && audioTestCode.length > 0)\n ? audioTestCode\n : '*41'\n\n console.log('[AUDIO-WARMUP] Starting audio warm-up test call', { codeToCall, SIP_HOST })\n callNumber(codeToCall, SIP_HOST)\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 {SIP_EXTEN && SIP_EXTEN.trim() !== '' ? (\n // Full stack with WebRTC when SIP extension is provided\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 ) : (\n // Minimal stack without WebRTC when no SIP extension\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={() => {\n setReloadedSocket(true)\n setReloadedWebRTC(true)\n }}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} uaType={uaType} />\n </Events>\n </Socket>\n </RestAPI>\n )}\n </Provider>\n </>\n )\n})\n\nPhoneIslandComponent.displayName = 'PhoneIslandComponent'\n\nexport const PhoneIsland = forwardRef<PhoneIslandRef, PhoneIslandProps>(\n (props, ref) => <PhoneIslandComponent {...props} ref={ref} />,\n)\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIslandComponent","forwardRef","_a","ref","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","lastReloadTime","useRef","useImperativeHandle","reset","console","info","useEffect","lastActiveTime","Date","now","handleVisibilityChange","document","hidden","timeSinceLastActive","setTimeout","eventDispatch","worker","Worker","wakeUpWorker","type","onmessage","event","data","addEventListener","terminate","removeEventListener","checkInterval","setInterval","store","getState","alerts","isWebRTCDown","webrtc_down","active","isSocketDown","socket_down","timeSinceLastReload","current","sipcall","webrtc","currentCall","accepted","outgoing","iceState","webrtcStuff","pc","iceConnectionState","hasActiveCall","isOnline","navigator","onLine","Math","round","clearInterval","useEventListener","dispatch","island","toggleIsOpen","setIslandView","view","warn","player","emergencyStopAudioPlayer","log","detach","force","setForceReload","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","getDefaultAudioInputDevice","setJSONItem","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","error","error_1","mediaDevices","enumerateDevices","devices","filter","device","kind","some","err_3","audioInputDevices","defaultDevice","find","err_4","err_5","videoInputDevices","err_6","remoteAudioElement","remoteAudio","err_1","audioOutputDevices","err_2","setSinkId","err_7","audioContext_1","window","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","stop","close","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","alertType","setAlert","toString","ringtoneList","ringtones","availableRingtones","map","r","name","displayName","base64Audio","value","setSelectedRingtone","setOutputDeviceId","savedRingtone","savedOutputDevice","checkInternetConnection","then","internetIsActive","intervalId","currentUsernameInformation","username","currentUserObject","mainPresenceValueBeforeUpdate","mainPresence","undefined","isEmpty","newMainPresenceValue","updateMainPresence","callInformation","openParameterizedUrl","callerNum","callerName","called","uniqueId","automatic","paramUrlInfo","urlOpened","openParamUrlType","processedUrl","includes","replace","encodeURIComponent","formattedUrl","startsWith","newWindow","open","location","href","setUrlOpened","throughTrunk","isFromTrunk","counterpartNum","setThroughTrunk","default_device","direction","throughQueue","counterpartName","owner","linkedId","userInformation","allUsersInformation","users","phoneIslandInformation","webrtcInformation","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","incoming","incomingWebRTC","incomingSocket","length","featureCodes","audioTestCode","audio_test","codeToCall","callNumber","newState","transcriptionViewIsVisible","args","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","__assign","right","top","isBackCallActive","bottomTranscription","sizes","width","height","handleResetIslandStore","toggleConferenceList","alertRemovedType","activeAlertsCount","status","previousView","isActive","alertsData","isInCall","conversationId","Object","keys","conversations","conv","connected","calculatedThroughTrunk","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","authToken","Socket","Events","Island","PhoneIsland","props"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/tslib/tslib.es6.js"),n=require("react");require("../../../node_modules/react-redux/es/index.js");var i=require("../../../store/index.js"),r=require("../../../utils/deviceUtils.js"),o=require("../../../lib/webrtc/janus.js"),t=require("../../../lib/phone/trunk.js"),u=require("../../../lib/devices/devices.js"),l=require("../../../utils/genericFunctions/eventDispatch.js"),s=require("../../../node_modules/react-redux/es/hooks/useDispatch.js"),a=require("../../../node_modules/react-redux/es/hooks/useSelector.js");exports.useSideViewLogic=function(c){var d,v,p,h,f,b,g,m,_=s.useDispatch(),S=a.useSelector((function(e){return e.currentUser})),j=a.useSelector((function(e){return e.users})),w=a.useSelector((function(e){return e.paramUrl})),V=i.store.select.mediaDevices.videoInputDevices(i.store.getState()),k=n.useRef(o.default),q=a.useSelector((function(e){return e.currentUser.conversations})),C=n.useState([]),D=C[0],T=C[1],U=n.useState(!0),y=U[0],x=U[1],O=n.useCallback((function(e){if(_.island.toggleSideViewVisible(!1),"openUrl"===e){var n=Object.values(q).find((function(e){return Object.keys(e).length>0})),i=n?Object.values(n)[0]:null;if((null==i?void 0:i.connected)&&"in"===(null==i?void 0:i.direction)){var r={counterpartNum:i.counterpartNum,counterpartName:i.counterpartName,owner:i.owner,uniqueId:i.uniqueId,throughQueue:i.throughQueue,throughTrunk:i.throughTrunk,direction:i.direction,connected:i.connected};l.eventDispatch("phone-island-url-parameter-opened",r)}}else null!==e&&_.island.setIslandView(e)}),[_.island,q]),Q=n.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return V.length>0?[4,u.checkWebCamPermission()]:[3,2];case 1:return n=e.sent(),x(n),[2,n];case 2:return x(!1),[2,!1]}}))}))}),[V.length]),I=n.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,Q()];case 1:return e.sent()&&(O("video"),i.store.dispatch.currentCall.updateCurrentCall({isLocalVideoEnabled:!0,isStartingVideoCall:!0})),[2]}}))}))}),[Q,O]),E=n.useCallback((function(){O("video"),i.store.dispatch.screenShare.update({isStartingScreenShare:!0})}),[O]),M=n.useMemo((function(){var e;return(null===(e=null==S?void 0:S.profile)||void 0===e?void 0:e.macro_permissions)||{}}),[null===(d=null==S?void 0:S.profile)||void 0===d?void 0:d.macro_permissions]),N=n.useMemo((function(){var e,n,i,r,o,t;return{canRecord:(null===(i=null===(n=null===(e=null==M?void 0:M.settings)||void 0===e?void 0:e.permissions)||void 0===n?void 0:n.recording)||void 0===i?void 0:i.value)||!1,canShareScreen:"safari"!==k.current.webRTCAdapter.browserDetails.browser&&((null===(t=null===(o=null===(r=null==M?void 0:M.nethvoice_cti)||void 0===r?void 0:r.permissions)||void 0===o?void 0:o.screen_sharing)||void 0===t?void 0:t.value)||!1),canSwitchDevice:(null==D?void 0:D.length)>0}}),[null===(h=null===(p=null===(v=null==M?void 0:M.settings)||void 0===v?void 0:v.permissions)||void 0===p?void 0:p.recording)||void 0===h?void 0:h.value,null===(g=null===(b=null===(f=null==M?void 0:M.nethvoice_cti)||void 0===f?void 0:f.permissions)||void 0===b?void 0:b.screen_sharing)||void 0===g?void 0:g.value,null==D?void 0:D.length,null===(m=null==S?void 0:S.default_device)||void 0===m?void 0:m.type,c]),P=n.useMemo((function(){var e=Object.values(q).find((function(e){return Object.keys(e).length>0})),n=e?Object.values(e)[0]:null;if("never"===w.openParamUrlType)return!1;if(!(null==n?void 0:n.connected)||"in"!==(null==n?void 0:n.direction))return!1;if("button"===w.openParamUrlType){if(w.onlyQueues&&(null==n?void 0:n.throughQueue))return!0;if(!w.onlyQueues&&(t.isFromTrunk(n.counterpartNum)||(null==n?void 0:n.throughQueue)))return!0}return!1}),[q,w.onlyQueues,w.openParamUrlType]);n.useEffect((function(){if(S&&j){var e=r.getAvailableDevices(S,j);T(e)}}),[S,j]);var A=n.useCallback((function(){_.island.toggleSideViewVisible(!1),setTimeout((function(){l.eventDispatch("phone-island-transcription-open",{})}),100)}),[_.island]),L=n.useMemo((function(){return(null==S?void 0:S.call_transcription_enabled)||!1}),[null==S?void 0:S.call_transcription_enabled]);return e.__assign(e.__assign({userInformation:S,availableDevices:D,videoInputDevices:V,isVideoCallButtonVisible:y,isUrlButtonEnabled:P,hasValidUrl:w.hasValidUrl,isTranscriptionEnabled:L},N),{goToVideoCall:I,goToScreenSharing:E,closeSideViewAndLaunchEvent:O,openTranscriptionView:A})};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/tslib/tslib.es6.js"),i=require("react");require("../../../node_modules/react-redux/es/index.js");var n=require("../../../store/index.js"),r=require("../../../utils/deviceUtils.js"),o=require("../../../lib/webrtc/janus.js"),u=require("../../../lib/phone/trunk.js"),t=require("../../../lib/devices/devices.js"),l=require("../../../utils/genericFunctions/eventDispatch.js"),s=require("../../../node_modules/react-redux/es/hooks/useDispatch.js"),a=require("../../../node_modules/react-redux/es/hooks/useSelector.js");exports.useSideViewLogic=function(d){var c,v,p,h,f,b,g,m,_=s.useDispatch(),S=a.useSelector((function(e){return e.currentUser})),j=a.useSelector((function(e){return e.users})),w=a.useSelector((function(e){return e.paramUrl})),k=n.store.select.mediaDevices.videoInputDevices(n.store.getState()),V=i.useRef(o.default),q=a.useSelector((function(e){return e.currentUser.conversations})),C=i.useState([]),D=C[0],T=C[1],U=i.useState(!0),y=U[0],I=U[1],x=i.useCallback((function(e){if(_.island.toggleSideViewVisible(!1),"openUrl"===e){var i=Object.values(q).find((function(e){return Object.keys(e).length>0})),n=i?Object.values(i)[0]:null;if((null==n?void 0:n.connected)&&"in"===(null==n?void 0:n.direction)){var r={counterpartNum:n.counterpartNum,counterpartName:n.counterpartName,owner:n.owner,uniqueId:n.uniqueId,linkedId:n.linkedId,throughQueue:n.throughQueue,throughTrunk:n.throughTrunk,direction:n.direction,connected:n.connected};l.eventDispatch("phone-island-url-parameter-opened",r)}}else null!==e&&_.island.setIslandView(e)}),[_.island,q]),O=i.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var i;return e.__generator(this,(function(e){switch(e.label){case 0:return k.length>0?[4,t.checkWebCamPermission()]:[3,2];case 1:return i=e.sent(),I(i),[2,i];case 2:return I(!1),[2,!1]}}))}))}),[k.length]),Q=i.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,O()];case 1:return e.sent()&&(x("video"),n.store.dispatch.currentCall.updateCurrentCall({isLocalVideoEnabled:!0,isStartingVideoCall:!0})),[2]}}))}))}),[O,x]),E=i.useCallback((function(){x("video"),n.store.dispatch.screenShare.update({isStartingScreenShare:!0})}),[x]),M=i.useMemo((function(){var e;return(null===(e=null==S?void 0:S.profile)||void 0===e?void 0:e.macro_permissions)||{}}),[null===(c=null==S?void 0:S.profile)||void 0===c?void 0:c.macro_permissions]),N=i.useMemo((function(){var e,i,n,r,o,u,t,l,s;return{canRecord:(null===(n=null===(i=null===(e=null==M?void 0:M.settings)||void 0===e?void 0:e.permissions)||void 0===i?void 0:i.recording)||void 0===n?void 0:n.value)||!1,canShareScreen:"safari"!==(null===(u=null===(o=null===(r=null==V?void 0:V.current)||void 0===r?void 0:r.webRTCAdapter)||void 0===o?void 0:o.browserDetails)||void 0===u?void 0:u.browser)&&((null===(s=null===(l=null===(t=null==M?void 0:M.nethvoice_cti)||void 0===t?void 0:t.permissions)||void 0===l?void 0:l.screen_sharing)||void 0===s?void 0:s.value)||!1),canSwitchDevice:(null==D?void 0:D.length)>0}}),[null===(h=null===(p=null===(v=null==M?void 0:M.settings)||void 0===v?void 0:v.permissions)||void 0===p?void 0:p.recording)||void 0===h?void 0:h.value,null===(g=null===(b=null===(f=null==M?void 0:M.nethvoice_cti)||void 0===f?void 0:f.permissions)||void 0===b?void 0:b.screen_sharing)||void 0===g?void 0:g.value,null==D?void 0:D.length,null===(m=null==S?void 0:S.default_device)||void 0===m?void 0:m.type,d]),P=i.useMemo((function(){var e=Object.values(q).find((function(e){return Object.keys(e).length>0})),i=e?Object.values(e)[0]:null;if("never"===w.openParamUrlType)return!1;if(!(null==i?void 0:i.connected)||"in"!==(null==i?void 0:i.direction))return!1;if("button"===w.openParamUrlType){if(w.onlyQueues&&(null==i?void 0:i.throughQueue))return!0;if(!w.onlyQueues&&(u.isFromTrunk(i.counterpartNum)||(null==i?void 0:i.throughQueue)))return!0}return!1}),[q,w.onlyQueues,w.openParamUrlType]);i.useEffect((function(){if(S&&j){var e=r.getAvailableDevices(S,j);T(e)}}),[S,j]);var A=i.useCallback((function(){_.island.toggleSideViewVisible(!1),setTimeout((function(){l.eventDispatch("phone-island-transcription-open",{})}),100)}),[_.island]),L=i.useMemo((function(){return(null==S?void 0:S.call_transcription_enabled)||!1}),[null==S?void 0:S.call_transcription_enabled]);return e.__assign(e.__assign({userInformation:S,availableDevices:D,videoInputDevices:k,isVideoCallButtonVisible:y,isUrlButtonEnabled:P,hasValidUrl:w.hasValidUrl,isTranscriptionEnabled:L},N),{goToVideoCall:Q,goToScreenSharing:E,closeSideViewAndLaunchEvent:x,openTranscriptionView:A})};
2
2
  //# sourceMappingURL=useSideViewLogic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSideViewLogic.js","sources":["../../../../src/components/SideView/hooks/useSideViewLogic.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../../store'\nimport { getAvailableDevices } from '../../../utils/deviceUtils'\nimport JanusLib from '../../../lib/webrtc/janus.js'\nimport { isFromTrunk } from '../../../lib/user/extensions'\nimport { checkWebCamPermission } from '../../../lib/devices/devices'\nimport { eventDispatch } from '../../../utils'\n\nexport const useSideViewLogic = (uaType?: string) => {\n const dispatch = useDispatch<Dispatch>()\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const paramUrlData = useSelector((state: RootState) => state.paramUrl)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n const janus = useRef<any>(JanusLib)\n const conversations = useSelector((state: RootState) => state.currentUser.conversations)\n\n const [availableDevices, setAvailableDevices] = useState([])\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const closeSideViewAndLaunchEvent = useCallback(\n (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType === 'openUrl') {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (conversationData?.connected && conversationData?.direction === 'in') {\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n }\n } else if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n },\n [dispatch.island, conversations],\n )\n\n const checkCameraPermission = useCallback(async () => {\n if (videoInputDevices.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n setIsVideoCallButtonVisible(isWebCamAccepted)\n return isWebCamAccepted\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }, [videoInputDevices.length])\n\n const goToVideoCall = useCallback(async () => {\n const cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n isStartingVideoCall: true,\n })\n }\n }, [checkCameraPermission, closeSideViewAndLaunchEvent])\n\n const goToScreenSharing = useCallback(() => {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.screenShare.update({\n isStartingScreenShare: true,\n })\n }, [closeSideViewAndLaunchEvent])\n\n const permissions = useMemo(\n () => userInformation?.profile?.macro_permissions || {},\n [userInformation?.profile?.macro_permissions],\n )\n\n const userCapabilities = useMemo(\n () => ({\n canRecord: permissions?.settings?.permissions?.recording?.value || false,\n canShareScreen:\n janus.current.webRTCAdapter.browserDetails.browser !== 'safari' &&\n (permissions?.nethvoice_cti?.permissions?.screen_sharing?.value || false),\n canSwitchDevice: availableDevices?.length > 0,\n }),\n [\n permissions?.settings?.permissions?.recording?.value,\n permissions?.nethvoice_cti?.permissions?.screen_sharing?.value,\n availableDevices?.length,\n userInformation?.default_device?.type,\n uaType,\n ],\n )\n\n const isUrlButtonEnabled = useMemo(() => {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n // If param url type is 'never', return false\n if (paramUrlData.openParamUrlType === 'never') {\n return false\n }\n\n if (!conversationData?.connected || conversationData?.direction !== 'in') {\n return false\n }\n\n // open param url type is set to 'button'\n if (paramUrlData.openParamUrlType === 'button') {\n if (paramUrlData.onlyQueues && conversationData?.throughQueue) {\n return true\n } else if (\n !paramUrlData.onlyQueues &&\n (isFromTrunk(conversationData.counterpartNum) || conversationData?.throughQueue)\n ) {\n return true\n }\n }\n\n return false\n }, [conversations, paramUrlData.onlyQueues, paramUrlData.openParamUrlType])\n\n useEffect(() => {\n if (userInformation && allUsersInformation) {\n const devices = getAvailableDevices(userInformation, allUsersInformation)\n setAvailableDevices(devices)\n }\n }, [userInformation, allUsersInformation])\n\n const openTranscriptionView = useCallback(() => {\n // Close SideView, collapse actions, and open TranscriptionView\n dispatch.island.toggleSideViewVisible(false)\n setTimeout(() => {\n eventDispatch('phone-island-transcription-open', {})\n }, 100)\n }, [dispatch.island])\n\n const isTranscriptionEnabled = useMemo(\n () => userInformation?.call_transcription_enabled || false,\n [userInformation?.call_transcription_enabled],\n )\n\n return {\n userInformation,\n availableDevices,\n videoInputDevices,\n isVideoCallButtonVisible,\n isUrlButtonEnabled,\n hasValidUrl: paramUrlData.hasValidUrl,\n isTranscriptionEnabled,\n ...userCapabilities,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n openTranscriptionView,\n }\n}\n"],"names":["uaType","dispatch","useDispatch","userInformation","useSelector","state","currentUser","allUsersInformation","users","paramUrlData","paramUrl","videoInputDevices","store","select","mediaDevices","getState","janus","useRef","JanusLib","conversations","_j","useState","availableDevices","setAvailableDevices","_k","isVideoCallButtonVisible","setIsVideoCallButtonVisible","closeSideViewAndLaunchEvent","useCallback","viewType","island","toggleSideViewVisible","activeConversation","Object","values","find","conv","keys","length","conversationData","connected","direction","eventData","counterpartNum","counterpartName","owner","uniqueId","throughQueue","throughTrunk","eventDispatch","setIslandView","checkCameraPermission","__awaiter","checkWebCamPermission","isWebCamAccepted","_a","sent","goToVideoCall","currentCall","updateCurrentCall","isLocalVideoEnabled","isStartingVideoCall","goToScreenSharing","screenShare","update","isStartingScreenShare","permissions","useMemo","profile","macro_permissions","userCapabilities","canRecord","_c","settings","_b","recording","value","canShareScreen","current","webRTCAdapter","browserDetails","browser","_f","_e","nethvoice_cti","_d","screen_sharing","canSwitchDevice","_g","_h","default_device","type","isUrlButtonEnabled","openParamUrlType","onlyQueues","isFromTrunk","useEffect","devices","getAvailableDevices","openTranscriptionView","setTimeout","isTranscriptionEnabled","call_transcription_enabled","__assign","hasValidUrl"],"mappings":"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"}
1
+ {"version":3,"file":"useSideViewLogic.js","sources":["../../../../src/components/SideView/hooks/useSideViewLogic.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../../store'\nimport { getAvailableDevices } from '../../../utils/deviceUtils'\nimport JanusLib from '../../../lib/webrtc/janus.js'\nimport { isFromTrunk } from '../../../lib/user/extensions'\nimport { checkWebCamPermission } from '../../../lib/devices/devices'\nimport { eventDispatch } from '../../../utils'\n\nexport const useSideViewLogic = (uaType?: string) => {\n const dispatch = useDispatch<Dispatch>()\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const paramUrlData = useSelector((state: RootState) => state.paramUrl)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n const janus = useRef<any>(JanusLib)\n const conversations = useSelector((state: RootState) => state.currentUser.conversations)\n\n const [availableDevices, setAvailableDevices] = useState([])\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const closeSideViewAndLaunchEvent = useCallback(\n (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType === 'openUrl') {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (conversationData?.connected && conversationData?.direction === 'in') {\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n linkedId: conversationData.linkedId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n }\n } else if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n },\n [dispatch.island, conversations],\n )\n\n const checkCameraPermission = useCallback(async () => {\n if (videoInputDevices.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n setIsVideoCallButtonVisible(isWebCamAccepted)\n return isWebCamAccepted\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }, [videoInputDevices.length])\n\n const goToVideoCall = useCallback(async () => {\n const cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n isStartingVideoCall: true,\n })\n }\n }, [checkCameraPermission, closeSideViewAndLaunchEvent])\n\n const goToScreenSharing = useCallback(() => {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.screenShare.update({\n isStartingScreenShare: true,\n })\n }, [closeSideViewAndLaunchEvent])\n\n const permissions = useMemo(\n () => userInformation?.profile?.macro_permissions || {},\n [userInformation?.profile?.macro_permissions],\n )\n\n const userCapabilities = useMemo(\n () => ({\n canRecord: permissions?.settings?.permissions?.recording?.value || false,\n canShareScreen:\n janus?.current?.webRTCAdapter?.browserDetails?.browser !== 'safari' &&\n (permissions?.nethvoice_cti?.permissions?.screen_sharing?.value || false),\n canSwitchDevice: availableDevices?.length > 0,\n }),\n [\n permissions?.settings?.permissions?.recording?.value,\n permissions?.nethvoice_cti?.permissions?.screen_sharing?.value,\n availableDevices?.length,\n userInformation?.default_device?.type,\n uaType,\n ],\n )\n\n const isUrlButtonEnabled = useMemo(() => {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n // If param url type is 'never', return false\n if (paramUrlData.openParamUrlType === 'never') {\n return false\n }\n\n if (!conversationData?.connected || conversationData?.direction !== 'in') {\n return false\n }\n\n // open param url type is set to 'button'\n if (paramUrlData.openParamUrlType === 'button') {\n if (paramUrlData.onlyQueues && conversationData?.throughQueue) {\n return true\n } else if (\n !paramUrlData.onlyQueues &&\n (isFromTrunk(conversationData.counterpartNum) || conversationData?.throughQueue)\n ) {\n return true\n }\n }\n\n return false\n }, [conversations, paramUrlData.onlyQueues, paramUrlData.openParamUrlType])\n\n useEffect(() => {\n if (userInformation && allUsersInformation) {\n const devices = getAvailableDevices(userInformation, allUsersInformation)\n setAvailableDevices(devices)\n }\n }, [userInformation, allUsersInformation])\n\n const openTranscriptionView = useCallback(() => {\n // Close SideView, collapse actions, and open TranscriptionView\n dispatch.island.toggleSideViewVisible(false)\n setTimeout(() => {\n eventDispatch('phone-island-transcription-open', {})\n }, 100)\n }, [dispatch.island])\n\n const isTranscriptionEnabled = useMemo(\n () => userInformation?.call_transcription_enabled || false,\n [userInformation?.call_transcription_enabled],\n )\n\n return {\n userInformation,\n availableDevices,\n videoInputDevices,\n isVideoCallButtonVisible,\n isUrlButtonEnabled,\n hasValidUrl: paramUrlData.hasValidUrl,\n isTranscriptionEnabled,\n ...userCapabilities,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n openTranscriptionView,\n }\n}\n"],"names":["uaType","dispatch","useDispatch","userInformation","useSelector","state","currentUser","allUsersInformation","users","paramUrlData","paramUrl","videoInputDevices","store","select","mediaDevices","getState","janus","useRef","JanusLib","conversations","_j","useState","availableDevices","setAvailableDevices","_k","isVideoCallButtonVisible","setIsVideoCallButtonVisible","closeSideViewAndLaunchEvent","useCallback","viewType","island","toggleSideViewVisible","activeConversation","Object","values","find","conv","keys","length","conversationData","connected","direction","eventData","counterpartNum","counterpartName","owner","uniqueId","linkedId","throughQueue","throughTrunk","eventDispatch","setIslandView","checkCameraPermission","__awaiter","checkWebCamPermission","isWebCamAccepted","_a","sent","goToVideoCall","currentCall","updateCurrentCall","isLocalVideoEnabled","isStartingVideoCall","goToScreenSharing","screenShare","update","isStartingScreenShare","permissions","useMemo","profile","macro_permissions","userCapabilities","canRecord","_c","settings","_b","recording","value","canShareScreen","_f","_d","current","webRTCAdapter","_e","browserDetails","browser","_h","nethvoice_cti","_g","screen_sharing","canSwitchDevice","default_device","type","isUrlButtonEnabled","openParamUrlType","onlyQueues","isFromTrunk","useEffect","devices","getAvailableDevices","openTranscriptionView","setTimeout","isTranscriptionEnabled","call_transcription_enabled","__assign","hasValidUrl"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),o=require("../lib/phone/conversation.js"),i=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),m=require("../utils/genericFunctions/isEmpty.js"),v=require("../utils/streaming/getStreamingSourceId.js"),g=require("../events/SocketEvents.js"),f=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),S=require("../utils/streaming/isFromStreaming.js"),b=require("../lib/phone/trunk.js"),y=require("../node_modules/react-redux/es/hooks/useDispatch.js"),k=require("../node_modules/react-redux/es/hooks/useSelector.js");function w(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var C=w(n);exports.Socket=function(w){var _=w.hostName,N=w.username,T=w.authToken,D=w.reload,U=w.reloadedCallback,j=w.children,I=w.uaType,q=y.useDispatch(),x=n.useRef(),E=n.useRef(),F=n.useRef(!1),O=n.useRef(0);k.useSelector((function(e){return e.currentUser})),s.useEventListener("phone-island-start-transcription",(function(){E.current&&E.current.emit("start_transcription",{})})),s.useEventListener("phone-island-stop-transcription",(function(){E.current&&E.current.emit("stop_transcription",{})}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&S.isFromStreaming(e.counterpartNum)){q.island.setIsFromStreaming(!0),q.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=v.getStreamingSourceId(e.counterpartNum);n&&i.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},y=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,m=l.store.getState().island.view;if(Object.keys(t).length>0){if(n.status){var v=l.store.getState().users.extensions,g=l.store.getState().currentUser.default_device,S=l.store.getState().currentUser,y=S.endpoints,k=S.username,w=l.store.getState().currentCall;w.incoming,w.outgoing;var C=function(){if(!v||!k)return!1;var e=Object.values(v).filter((function(e){return(null==e?void 0:e.username)===k}));return null==e?void 0:e.some((function(e){var n=null==y?void 0:y.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":if(s(t),"mobile"===I&&C()||"desktop"===I&&("webrtc"===(null==g?void 0:g.type)||void 0===(null==g?void 0:g.type)&&!C()||!C()&&"physical"===(null==g?void 0:g.type))){F.current||(F.current=!0,i.getCurrentUserInfo().then((function(n){n&&(q.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?q.paramUrl.setOpenParamUrlType(n.settings.open_param_url):q.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){F.current=!1}),100)}))),q.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:"".concat(v&&v[t.counterpartNum]&&v[t.counterpartNum].username)||"",ownerExtension:t.owner}),t.id,o.getDisplayName(t),"".concat(t.counterpartNum),t.owner,"".concat(v&&v[t.counterpartNum]&&v[t.counterpartNum].username),null==t||t.chDest,null==t||t.chSource,t.direction,t.inConference,t.linkedId,t.uniqueId,t.throughQueue,t.throughTrunk,t.recording,l.store.dispatch.island.setIslandView("call"),a.eventDispatch("phone-island-call-ringing",{});var _=l.store.getState().paramUrl.openParamUrlType,N=l.store.getState().island.urlOpened;if("ringing"===_&&!N){var T=b.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(T),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:o.getDisplayName(t),owner:t.owner,uniqueId:t.uniqueId,throughQueue:t.throughQueue,throughTrunk:T,direction:t.direction,connected:t.connected})}}break;case"busy":if(s(t),"mobile"===I&&C()||"desktop"===I&&("webrtc"===(null==g?void 0:g.type)||void 0===(null==g?void 0:g.type)&&!C()||!C()&&"physical"===(null==g?void 0:g.type))){if(t&&t.connected)q.currentCall.updateCurrentCall({conversationId:t.id,displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:"".concat(v&&v[t.counterpartNum]&&v[t.counterpartNum].username)||"",chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),q.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),q.currentCall.addTransferCalls({type:"transferred",displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),startTime:"".concat(f.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){q.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){q.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===m&&c&&q.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)q.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var D=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&D&&(q.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),q.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&q.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&q.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:o.getDisplayName(t),number:"".concat(null==t?void 0:t.counterpartNum),username:"".concat(v&&v[null==t?void 0:t.counterpartNum]&&v[null==t?void 0:t.counterpartNum].username)||""})}break;case"onhold":var U=t.counterpartName,j=t.counterpartNum,x=t.startTime;c&&j&&U&&"<unknown>"!==U&&(q.currentCall.addTransferCalls({type:"destination",displayName:o.getDisplayName(t),number:j,startTime:"".concat(f.getTimestampInSeconds())}),q.currentCall.updateCurrentCall({displayName:o.getDisplayName(t),number:j,startTime:"".concat(x/1e3),conversationId:t.id}),q.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(q.player.stopAudioPlayer(),q.currentCall.reset(),q.physicalRecorder.setRecordingTempVariable(!1),q.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(N)&&(n.path="/api/ws"),E.current=t.io("https://"+_,n),q.websocket.update({socket:E.current}),E.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(E.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),E.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),x.current&&(clearInterval(x.current),x.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),E.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),E.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),E.current.io.on("reconnect",(function(e){O.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(E.current.id,")"))})),E.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),E.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),E.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),E.current.on("connect",(function(){console.debug("Socket on: "+_+" is connected!"),E.current.emit("login",{accessKeyId:"".concat(N),token:T,uaType:I})})),E.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),x.current&&clearInterval(x.current),x.current=setInterval((function(){E.current.volatile.emit("ping",u.withTimeout((function(){O.current=0,setTimeout((function(){q.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){O.current++,console.debug("Socket ping timeout (".concat(O.current,"/").concat(3,"), connected: ").concat(E.current.connected)),setTimeout((function(){var e,n,t=E.current.connected&&O.current>=3;if(!E.current.connected||t){var r=l.store.getState().webrtc.sipcall,o=l.store.getState().currentCall,i=o.accepted,c=o.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((i||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:i,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),E.current.disconnect()),q.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),E.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),g.dispatchMainPresence(n)})),E.current.on("extenHangup",(function(e){var n=l.store.getState().currentUser,t=n.endpoints,r=n.username,o=l.store.getState().conference,i=o.isActive,s=o.conferenceStartedFrom,u=l.store.getState().island,d=u.view,p=u.previewCallFromMobileOrNethlink,m=((null==t?void 0:t.extension)||[]).find((function(n){return n.id===e.callerNum})),v=null==m?void 0:m.type;if("normal_clearing"===e.cause&&("physical"===v||"mobile"===v)||"normal_clearing"===e.cause&&("webrtc"===v||"nethlink"===v)&&p||"user_busy"===(null==e?void 0:e.cause)||"not_defined"===(null==e?void 0:e.cause)||"call_rejected"===(null==e?void 0:e.cause)||"interworking"===(null==e?void 0:e.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),i&&s!==r&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==e?void 0:e.cause)&&i&&s===r?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==e.cause&&"user_busy"!==(null==e?void 0:e.cause)&&"not_defined"!==(null==e?void 0:e.cause)&&"call_rejected"!==(null==e?void 0:e.cause)||"webrtc"!==v&&"nethlink"!==v||!i||s===r||l.store.dispatch.conference.resetConference(),("normal_clearing"===e.cause&&("webrtc"===v||"nethlink"===v)||"call_rejected"===(null==e?void 0:e.cause))&&i&&s===r){var g=l.store.getState().conference,f=g.usersList,h=g.pendingUsers,S=f&&Object.keys(f).length>0,b=h&&Object.keys(h).length>0;S||b?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()}if("interworking"===(null==e?void 0:e.cause)&&i&&s===r&&"waitingConference"!==d&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==e?void 0:e.cause)){var y=l.store.getState().currentUser,k=y.endpoints,w=y.username,C=((null==k?void 0:k.extension)||[]).map((function(e){return e.id})),_=l.store.getState().currentCall,N=_.incoming;_.outgoing;var T=l.store.getState().conference,D=T.isActive,U=T.conferenceStartedFrom;N&&C.includes(e.callerNum)||(l.store.dispatch.island.setOperatorBusyActive({callerNumber:e.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),D&&U===w&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))}if("subscriber_absent"===(null==e?void 0:e.cause)){var j=l.store.getState().conference,I=j.isActive,q=j.conferenceStartedFrom,x=l.store.getState().currentUser.username;if(I&&q===x){var E=l.store.getState().conference;f=E.usersList,h=E.pendingUsers,S=f&&Object.keys(f).length>0,b=h&&Object.keys(h).length>0,S||b?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),h&&h[e.callerNum]&&l.store.dispatch.conference.removePendingUser(e.callerNum)):l.store.dispatch.conference.resetConference()}}})),E.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,o=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),i=null==o?void 0:o.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&i&&("mobile"===i||"physical"===i)||"physical"===(null==t?void 0:t.type)&&i&&"physical"!==i)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:i}))})),E.current.on("extenUpdate",(function(e){var n,t;q.users.updateExtension(e);var r=l.store.getState().users.extensions,o={},i=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;o[s]||(o[s]=[]),o[s].push(a)}var u=o[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===N&&!m.isEmpty(d)&&(null==d?void 0:d.owner)){var v=null===(t=null===(n=null==i?void 0:i.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));v&&"mobile"===v.type&&(p=!0)}if(g.dispatchExtensions(e),m.isEmpty(d)){var f=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!m.isEmpty(t)}));f||g.dispatchConversations(e)}else p||g.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===N&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===N&&(y(e,d),q.currentUser.updateConversations(e))})),E.current.on("queueUpdate",(function(e){g.dispatchQueueUpdate(e)})),E.current.on("queueMemberUpdate",(function(e){g.dispatchQueueMemberUpdate(e)})),E.current.on("takeOver",(function(){g.dispatchAlreadyLogin()})),E.current.on("serverReloaded",(function(){g.dispatchServerReload()})),E.current.on("parkingUpdate",(function(e){g.dispatchParkingUpdate(e)})),E.current.on("actionNethLink",(function(e,n){g.dispatchUrlCall(e,n)})),E.current.on("message",(function(e){switch(e.message){case"screenSharingStart":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),E.current.on("updateDefaultDevice",(function(n){g.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var o=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==o.length){var i=o[0],c=r.extension.find((function(e){return e.id===i.exten}));c&&(i=e.__assign(e.__assign({},i),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(i),d.checkMediaPermissions()}}})),E.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,o=l.store.getState().conference.usersList,i=e.__assign({},r);o&&Object.keys(i).forEach((function(n){o[n]&&(i[n]=e.__assign(e.__assign({},i[n]),{muted:o[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(i),l.store.dispatch.conference.updateConferenceId(t)}})),E.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),E.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),E.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),E.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var o=l.store.getState().currentCall.streamingSourceNumber;v.getStreamingSourceId(o),q.streaming.updateSourceImage({source:t,image:r})}}})),E.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(x.current),E.current.close()}}),[_,N,T,I,q]),n.useEffect((function(){var e;if(D){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),x.current&&(clearInterval(x.current),x.current=null),setTimeout((function(){E.current.disconnect(),E.current.connect(),U()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),U())}}),[D]),C.default.createElement(C.default.Fragment,null,j)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),o=require("../lib/phone/conversation.js"),i=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),v=require("../utils/genericFunctions/isEmpty.js"),m=require("../utils/streaming/getStreamingSourceId.js"),g=require("../events/SocketEvents.js"),f=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),S=require("../utils/streaming/isFromStreaming.js"),b=require("../lib/phone/trunk.js"),y=require("../node_modules/react-redux/es/hooks/useDispatch.js"),k=require("../node_modules/react-redux/es/hooks/useSelector.js");function w(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var C=w(n);exports.Socket=function(w){var _=w.hostName,N=w.username,T=w.authToken,D=w.reload,U=w.reloadedCallback,j=w.children,I=w.uaType,q=y.useDispatch(),x=n.useRef(),E=n.useRef(),F=n.useRef(!1),O=n.useRef(0);k.useSelector((function(e){return e.currentUser})),s.useEventListener("phone-island-start-transcription",(function(){E.current&&E.current.emit("start_transcription",{})})),s.useEventListener("phone-island-stop-transcription",(function(){E.current&&E.current.emit("stop_transcription",{})}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&S.isFromStreaming(e.counterpartNum)){q.island.setIsFromStreaming(!0),q.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=m.getStreamingSourceId(e.counterpartNum);n&&i.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},y=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,v=l.store.getState().island.view;if(Object.keys(t).length>0){if(n.status){var m=l.store.getState().users.extensions,g=l.store.getState().currentUser.default_device,S=l.store.getState().currentUser,y=S.endpoints,k=S.username,w=l.store.getState().currentCall;w.incoming,w.outgoing;var C=function(){if(!m||!k)return!1;var e=Object.values(m).filter((function(e){return(null==e?void 0:e.username)===k}));return null==e?void 0:e.some((function(e){var n=null==y?void 0:y.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":s(t),("mobile"===I&&C()||"desktop"===I&&("webrtc"===(null==g?void 0:g.type)||void 0===(null==g?void 0:g.type)&&!C()||!C()&&"physical"===(null==g?void 0:g.type)))&&(q.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",ownerExtension:t.owner}),l.store.dispatch.island.setIslandView("call")),F.current||(F.current=!0,i.getCurrentUserInfo().then((function(n){n&&(q.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?q.paramUrl.setOpenParamUrlType(n.settings.open_param_url):q.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){F.current=!1}),100)})));var _=l.store.getState().paramUrl.openParamUrlType,N=l.store.getState().island.urlOpened;if("ringing"===_&&!N){var T=b.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(T),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:o.getDisplayName(t),owner:t.owner,uniqueId:t.uniqueId,linkedId:t.linkedId,throughQueue:t.throughQueue,throughTrunk:T,direction:t.direction,connected:t.connected})}break;case"busy":if(s(t),"mobile"===I&&C()||"desktop"===I&&("webrtc"===(null==g?void 0:g.type)||void 0===(null==g?void 0:g.type)&&!C()||!C()&&"physical"===(null==g?void 0:g.type))){if(t&&t.connected)q.currentCall.updateCurrentCall({conversationId:t.id,displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),q.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),q.currentCall.addTransferCalls({type:"transferred",displayName:o.getDisplayName(t),number:"".concat(t.counterpartNum),startTime:"".concat(f.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){q.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){q.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===v&&c&&q.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)q.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var D=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&D&&(q.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),q.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&q.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&q.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:o.getDisplayName(t),number:"".concat(null==t?void 0:t.counterpartNum),username:"".concat(m&&m[null==t?void 0:t.counterpartNum]&&m[null==t?void 0:t.counterpartNum].username)||""})}break;case"onhold":var U=t.counterpartName,j=t.counterpartNum,x=t.startTime;c&&j&&U&&"<unknown>"!==U&&(q.currentCall.addTransferCalls({type:"destination",displayName:o.getDisplayName(t),number:j,startTime:"".concat(f.getTimestampInSeconds())}),q.currentCall.updateCurrentCall({displayName:o.getDisplayName(t),number:j,startTime:"".concat(x/1e3),conversationId:t.id}),q.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(q.player.stopAudioPlayer(),q.currentCall.reset(),q.physicalRecorder.setRecordingTempVariable(!1),q.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(N)&&(n.path="/api/ws"),E.current=t.io("https://"+_,n),q.websocket.update({socket:E.current}),E.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(E.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),E.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),x.current&&(clearInterval(x.current),x.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),E.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),E.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),E.current.io.on("reconnect",(function(e){O.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(E.current.id,")"))})),E.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),E.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),E.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),E.current.on("connect",(function(){console.debug("Socket on: "+_+" is connected!"),E.current.emit("login",{accessKeyId:"".concat(N),token:T,uaType:I})})),E.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),x.current&&clearInterval(x.current),x.current=setInterval((function(){E.current.volatile.emit("ping",u.withTimeout((function(){O.current=0,setTimeout((function(){q.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){O.current++,console.debug("Socket ping timeout (".concat(O.current,"/").concat(3,"), connected: ").concat(E.current.connected)),setTimeout((function(){var e,n,t=E.current.connected&&O.current>=3;if(!E.current.connected||t){var r=l.store.getState().webrtc.sipcall,o=l.store.getState().currentCall,i=o.accepted,c=o.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((i||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:i,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),E.current.disconnect()),q.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),E.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),g.dispatchMainPresence(n)})),E.current.on("extenHangup",(function(e){var n=l.store.getState().currentUser,t=n.endpoints,r=n.username,o=l.store.getState().conference,i=o.isActive,s=o.conferenceStartedFrom,u=l.store.getState().island,d=u.view,p=u.previewCallFromMobileOrNethlink,v=((null==t?void 0:t.extension)||[]).find((function(n){return n.id===e.callerNum})),m=null==v?void 0:v.type;if("normal_clearing"===e.cause&&("physical"===m||"mobile"===m)||"normal_clearing"===e.cause&&("webrtc"===m||"nethlink"===m)&&p||"user_busy"===(null==e?void 0:e.cause)||"not_defined"===(null==e?void 0:e.cause)||"call_rejected"===(null==e?void 0:e.cause)||"interworking"===(null==e?void 0:e.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),i&&s!==r&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==e?void 0:e.cause)&&i&&s===r?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==e.cause&&"user_busy"!==(null==e?void 0:e.cause)&&"not_defined"!==(null==e?void 0:e.cause)&&"call_rejected"!==(null==e?void 0:e.cause)||"webrtc"!==m&&"nethlink"!==m||!i||s===r||l.store.dispatch.conference.resetConference(),("normal_clearing"===e.cause&&("webrtc"===m||"nethlink"===m)||"call_rejected"===(null==e?void 0:e.cause))&&i&&s===r){var g=l.store.getState().conference,f=g.usersList,h=g.pendingUsers,S=f&&Object.keys(f).length>0,b=h&&Object.keys(h).length>0;S||b?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()}if("interworking"===(null==e?void 0:e.cause)&&i&&s===r&&"waitingConference"!==d&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==e?void 0:e.cause)){var y=l.store.getState().currentUser,k=y.endpoints,w=y.username,C=((null==k?void 0:k.extension)||[]).map((function(e){return e.id})),_=l.store.getState().currentCall,N=_.incoming;_.outgoing;var T=l.store.getState().conference,D=T.isActive,U=T.conferenceStartedFrom;N&&C.includes(e.callerNum)||(l.store.dispatch.island.setOperatorBusyActive({callerNumber:e.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),D&&U===w&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))}if("subscriber_absent"===(null==e?void 0:e.cause)){var j=l.store.getState().conference,I=j.isActive,q=j.conferenceStartedFrom,x=l.store.getState().currentUser.username;if(I&&q===x){var E=l.store.getState().conference;f=E.usersList,h=E.pendingUsers,S=f&&Object.keys(f).length>0,b=h&&Object.keys(h).length>0,S||b?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),h&&h[e.callerNum]&&l.store.dispatch.conference.removePendingUser(e.callerNum)):l.store.dispatch.conference.resetConference()}}})),E.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,o=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),i=null==o?void 0:o.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&i&&("mobile"===i||"physical"===i)||"physical"===(null==t?void 0:t.type)&&i&&"physical"!==i)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:i}))})),E.current.on("extenUpdate",(function(e){var n,t;q.users.updateExtension(e);var r=l.store.getState().users.extensions,o={},i=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;o[s]||(o[s]=[]),o[s].push(a)}var u=o[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===N&&!v.isEmpty(d)&&(null==d?void 0:d.owner)){var m=null===(t=null===(n=null==i?void 0:i.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));m&&"mobile"===m.type&&(p=!0)}if(g.dispatchExtensions(e),v.isEmpty(d)){var f=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!v.isEmpty(t)}));f||g.dispatchConversations(e)}else p||g.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===N&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===N&&(y(e,d),q.currentUser.updateConversations(e))})),E.current.on("queueUpdate",(function(e){g.dispatchQueueUpdate(e)})),E.current.on("queueMemberUpdate",(function(e){g.dispatchQueueMemberUpdate(e)})),E.current.on("takeOver",(function(){g.dispatchAlreadyLogin()})),E.current.on("serverReloaded",(function(){g.dispatchServerReload()})),E.current.on("parkingUpdate",(function(e){g.dispatchParkingUpdate(e)})),E.current.on("actionNethLink",(function(e,n){g.dispatchUrlCall(e,n)})),E.current.on("message",(function(e){switch(e.message){case"screenSharingStart":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),E.current.on("updateDefaultDevice",(function(n){g.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var o=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==o.length){var i=o[0],c=r.extension.find((function(e){return e.id===i.exten}));c&&(i=e.__assign(e.__assign({},i),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(i),d.checkMediaPermissions()}}})),E.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,o=l.store.getState().conference.usersList,i=e.__assign({},r);o&&Object.keys(i).forEach((function(n){o[n]&&(i[n]=e.__assign(e.__assign({},i[n]),{muted:o[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(i),l.store.dispatch.conference.updateConferenceId(t)}})),E.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),E.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),E.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),E.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var o=l.store.getState().currentCall.streamingSourceNumber;m.getStreamingSourceId(o),q.streaming.updateSourceImage({source:t,image:r})}}})),E.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(x.current),E.current.close()}}),[_,N,T,I,q]),n.useEffect((function(){var e;if(D){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),x.current&&(clearInterval(x.current),x.current=null),setTimeout((function(){E.current.disconnect(),E.current.connect(),U()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),U())}}),[D]),C.default.createElement(C.default.Fragment,null,j)};
2
2
  //# sourceMappingURL=Socket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getApiMode } from './RestAPI'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport { getCurrentUserInfo } from '../services/user'\nimport busyRingtone from '../static/busy_ringtone'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n dispatchExtensions,\n dispatchUrlCall,\n dispatchDefaultDeviceUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, useEventListener, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\nimport { isPhysical } from '../lib/user/default_device'\nimport { ScreenSharingMessage } from './VideoView'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { isFromStreaming } from '../utils/streaming/isFromStreaming'\nimport { getStreamingSourceId } from '../utils/streaming/getStreamingSourceId'\nimport { subscribe } from '../services/user'\nimport { isFromTrunk } from '../lib/user/extensions'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n const isUpdatingUserInfo = useRef(false)\n const consecutivePingTimeouts = useRef(0)\n const STALE_CONNECTION_THRESHOLD = 3 // Force reconnect after 3 consecutive ping timeouts\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n // Event listener for starting transcription\n useEventListener('phone-island-start-transcription', () => {\n if (socket.current) {\n socket.current.emit('start_transcription', {})\n }\n })\n\n // Event listener for stopping transcription\n useEventListener('phone-island-stop-transcription', () => {\n if (socket.current) {\n socket.current.emit('stop_transcription', {})\n }\n })\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.player.setAudioPlayerLoop(false)\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Helper function to handle streaming source detection and subscription\n */\n const handleStreamingSource = (conv: ConversationTypes) => {\n // Check if the call is from a streaming source\n if (conv.counterpartNum && isFromStreaming(conv.counterpartNum)) {\n // Set isFromStreaming flag to true\n dispatch.island.setIsFromStreaming(true)\n\n // Store the streaming source number in the currentCall state for future reference\n dispatch.currentCall.updateCurrentCall({\n streamingSourceNumber: conv.counterpartNum,\n })\n\n // Find the source ID and subscribe to streaming updates\n const sourceId = getStreamingSourceId(conv.counterpartNum)\n if (sourceId) {\n // Subscribe to streaming updates\n subscribe({ id: sourceId }).catch((error) =>\n console.error('Error subscribing to streaming source:', error),\n )\n }\n }\n }\n\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n const view = store.getState().island.view\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n const { default_device } = store.getState().currentUser\n const { endpoints, username } = store.getState().currentUser\n const { incoming, outgoing } = store.getState().currentCall\n\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 switch (res.status) {\n case 'ringing':\n // Handle streaming source for incoming calls\n handleStreamingSource(conv)\n\n if (\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 ) {\n // Get updated user info\n if (!isUpdatingUserInfo.current) {\n isUpdatingUserInfo.current = true\n getCurrentUserInfo()\n .then((userInfo) => {\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n eventDispatch('phone-island-user-informations-update', { ...userInfo })\n if (userInfo.settings && userInfo.settings.open_param_url) {\n dispatch.paramUrl.setOpenParamUrlType(userInfo.settings.open_param_url)\n } else {\n dispatch.paramUrl.setOpenParamUrlType('never')\n }\n }\n })\n .catch((error) => {\n console.error('Error getting current user info:', error)\n })\n .finally(() => {\n setTimeout(() => {\n isUpdatingUserInfo.current = false\n }, 100)\n })\n }\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n incoming: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n let callInformations = {\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n counterpartNum: `${conv.counterpartNum}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n chDest: conv?.chDest || {},\n chSource: conv?.chSource || {},\n direction: conv.direction,\n inConference: conv.inConference,\n linkedId: conv.linkedId,\n uniqueId: conv.uniqueId,\n throughQueue: conv.throughQueue,\n throughTrunk: conv.throughTrunk,\n recording: conv.recording,\n }\n store.dispatch.island.setIslandView('call')\n\n eventDispatch('phone-island-call-ringing', {})\n const { openParamUrlType } = store.getState().paramUrl\n const { urlOpened } = store.getState().island\n\n if (openParamUrlType === 'ringing' && !urlOpened) {\n // Calculate throughTrunk based on counterpartNum\n const calculatedThroughTrunk = isFromTrunk(conv.counterpartNum)\n\n // Update throughTrunk in paramUrl store\n store.dispatch.paramUrl.setThroughTrunk(calculatedThroughTrunk)\n\n store.dispatch.island.setUrlOpened(false)\n eventDispatch('phone-island-url-parameter-opened', {\n counterpartNum: conv.counterpartNum,\n counterpartName: getDisplayName(conv),\n owner: conv.owner,\n uniqueId: conv.uniqueId,\n throughQueue: conv.throughQueue,\n throughTrunk: calculatedThroughTrunk,\n direction: conv.direction,\n connected: conv.connected,\n })\n }\n }\n break\n // @ts-ignore\n case 'busy':\n // Handle streaming source for outgoing calls\n handleStreamingSource(conv)\n\n if (\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 ) {\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n chDest: conv?.chDest || {},\n chSource: conv?.chSource || {},\n })\n // Update the current call informations for physical devices\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedSocket: true,\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n // Check if this is a streaming call that was accepted\n const { isFromStreaming } = store.getState().island\n if (isFromStreaming && conv.direction === 'out') {\n // Set view to streamingAnswer for outgoing streaming calls when accepted\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n if (isPhysical()) {\n checkDefaultDeviceConversationActive(conv)\n }\n if (view === 'call' && transferring) {\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n }\n }\n // Delete transfer calls if there are more than one ( in case of call switch after transfer)\n if (transferCalls.length > 1) {\n dispatch.currentCall.deleteTransferCalls()\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n outgoing: conv?.counterpartName === 'REC' ? false : true,\n displayName: getDisplayName(conv),\n number: `${conv?.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv?.counterpartNum] &&\n extensions[conv?.counterpartNum].username\n }` || '',\n })\n }\n }\n break\n\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n // Reset isFromStreaming flag\n dispatch.island.setIsFromStreaming(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n const currentApiMode = getApiMode(username)\n\n const socketOptions: any = {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n }\n\n // Only set path for new API mode\n if (currentApiMode === 'new') {\n socketOptions.path = '/api/ws'\n }\n\n socket.current = io('https://' + hostName, socketOptions)\n\n // save websocket to store\n dispatch.websocket.update({ socket: socket.current })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n // Clear the connection check interval on disconnect to avoid stale pings\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n connectionCheckInterval.current = null\n }\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n // Reset consecutive ping timeout counter on successful reconnection\n consecutivePingTimeouts.current = 0\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Connection check interval is now started in the authe_ok handler\n // to ensure it only runs after successful authentication\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n eventDispatch('phone-island-socket-authorized', {})\n\n // Start connection check interval after successful authentication\n // Clear any existing interval first to avoid duplicates\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n }\n connectionCheckInterval.current = setInterval(() => {\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Ping success - reset consecutive timeout counter\n consecutivePingTimeouts.current = 0\n // Remove socket_down alert (async to avoid React error #300 with framer-motion)\n setTimeout(() => {\n dispatch.alerts.removeAlert('socket_down')\n eventDispatch('phone-island-alert-removed', {\n type: 'socket_down',\n })\n eventDispatch('phone-island-socket-disconnected-popup-close', {})\n }, 0)\n },\n () => {\n // Ping timeout - increment counter\n consecutivePingTimeouts.current++\n console.debug(`Socket ping timeout (${consecutivePingTimeouts.current}/${STALE_CONNECTION_THRESHOLD}), connected: ${socket.current.connected}`)\n\n // Set socket_down alert (async to avoid React error #300 with framer-motion)\n setTimeout(() => {\n // Check for stale connection: socket reports connected but pings keep timing out\n const isStaleConnection = socket.current.connected && consecutivePingTimeouts.current >= STALE_CONNECTION_THRESHOLD\n\n if (!socket.current.connected || isStaleConnection) {\n // Check if there's an active call with ICE still connected\n // If so, skip showing alert - let ICE grace period mechanism handle it\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { accepted, outgoing } = store.getState().currentCall\n const iceState = sipcall?.webrtcStuff?.pc?.iceConnectionState\n const hasActiveCallWithIce = (accepted || outgoing) && (iceState === 'connected' || iceState === 'completed')\n\n if (hasActiveCallWithIce) {\n console.debug('Socket unreachable but active call with ICE connected - skipping socket_down alert', {\n iceState,\n accepted,\n outgoing,\n isStaleConnection,\n timestamp: new Date().toISOString()\n })\n return\n }\n\n if (isStaleConnection) {\n console.warn('Stale socket connection detected - forcing reconnection')\n // Force disconnect to trigger reconnection\n socket.current.disconnect()\n }\n\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-open', {})\n console.error('Socket is unreachable!')\n }\n }, 0)\n },\n 5 * 1000,\n ),\n )\n }, 5 * 1000)\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenHangup', (res: any) => {\n const { endpoints, username } = store.getState().currentUser\n const { isActive, conferenceStartedFrom } = store.getState().conference\n const { view, previewCallFromMobileOrNethlink } = store.getState().island\n\n // Get user extensions\n const userExtensions = endpoints?.extension || []\n\n // Find the extension type based on callerNum\n const connectedExtension = userExtensions.find((ext) => ext.id === res.callerNum)\n const extensionType: any = connectedExtension?.type\n\n // If cause is normal_clearing and extension is physical or mobile\n // Clean phone-island visibility also after user_busy ( useful for physical devices )\n if (\n (res.cause === 'normal_clearing' &&\n (extensionType === 'physical' || extensionType === 'mobile')) ||\n (res.cause === 'normal_clearing' &&\n (extensionType === 'webrtc' || extensionType === 'nethlink') &&\n previewCallFromMobileOrNethlink) ||\n res?.cause === 'user_busy' ||\n res?.cause === 'not_defined' ||\n res?.cause === 'call_rejected' ||\n res?.cause === 'interworking'\n ) {\n // Reset phone island visibility after 2 seconds to avoid glitches\n setTimeout(() => {\n store.dispatch.island.toggleAvoidToShow(false)\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(false)\n }, 500)\n // Only reset conference if there are no more participants or if user is not in a conference\n if (isActive && conferenceStartedFrom !== username) {\n store.dispatch.conference.resetConference()\n }\n } else if (\n res?.cause === 'normal_circuit_congestion' &&\n isActive &&\n conferenceStartedFrom === username\n ) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n } else if (\n (res.cause === 'normal_clearing' ||\n res?.cause === 'user_busy' ||\n res?.cause === 'not_defined' ||\n res?.cause === 'call_rejected') &&\n (extensionType === 'webrtc' || extensionType === 'nethlink') &&\n isActive &&\n conferenceStartedFrom !== username\n ) {\n store.dispatch.conference.resetConference()\n }\n // if conference owner and added participant refuses or hangs up with normal_clearing\n if (\n ((res.cause === 'normal_clearing' &&\n (extensionType === 'webrtc' || extensionType === 'nethlink')) ||\n res?.cause === 'call_rejected') &&\n isActive &&\n conferenceStartedFrom === username\n ) {\n const { usersList, pendingUsers } = store.getState().conference\n // Check if there are still participants in the conference (both confirmed and pending)\n const hasConfirmedParticipants = usersList && Object.keys(usersList).length > 0\n const hasPendingParticipants = pendingUsers && Object.keys(pendingUsers).length > 0\n const hasParticipants = hasConfirmedParticipants || hasPendingParticipants\n\n if (!hasParticipants) {\n store.dispatch.conference.resetConference()\n } else {\n // If there are still participants, keep the waitingConference view\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n }\n }\n // if conference owner call the call with the added user inside conference\n if (\n res?.cause === 'interworking' &&\n isActive &&\n conferenceStartedFrom === username &&\n view !== 'waitingConference'\n ) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n }\n if (res?.cause === 'user_busy') {\n // Get current user's extensions\n const { endpoints, username } = store.getState().currentUser\n const userExtensions = endpoints?.extension || []\n const userExtensionIds = userExtensions.map((ext) => ext.id)\n\n // Get the current call state to understand if we're the caller or receiver\n const { incoming, outgoing } = store.getState().currentCall\n\n // Check if there's an active conference\n const { isActive, conferenceStartedFrom } = store.getState().conference\n\n // When we RECEIVE a call on our extension, callerNum is the busy extension (our own)\n // When we CALL someone, channelExten is one of our extensions (the one we're calling from)\n const isReceivingCall = incoming && userExtensionIds.includes(res.callerNum)\n\n // Only show operator busy view if:\n // 1. We are NOT receiving an incoming call to our own extension\n if (!isReceivingCall) {\n // Set operator busy active with caller information\n store.dispatch.island.setOperatorBusyActive({\n callerNumber: res.callerNum || 'Unknown',\n })\n\n // Stop busy tone after 4 seconds\n setTimeout(() => {\n store.dispatch.player.stopAudioPlayer()\n }, 4000)\n\n setTimeout(() => {\n // Play busy tone\n store.dispatch.player.updateStartAudioPlayer({\n src: busyRingtone,\n loop: true,\n })\n store.dispatch.island.setIslandView('operatorBusy')\n }, 600)\n\n // If conference is active and we're the owner, return to conference after timeout\n if (isActive && conferenceStartedFrom === username) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 4000)\n }\n }\n }\n\n // Handle subscriber_absent - when added participant rejects the call\n if (res?.cause === 'subscriber_absent') {\n const { isActive, conferenceStartedFrom } = store.getState().conference\n const { username } = store.getState().currentUser\n\n // Only handle if conference is active and current user is the owner\n if (isActive && conferenceStartedFrom === username) {\n // Check if there are still participants in the conference (both confirmed and pending)\n const { usersList, pendingUsers } = store.getState().conference\n const hasConfirmedParticipants = usersList && Object.keys(usersList).length > 0\n const hasPendingParticipants = pendingUsers && Object.keys(pendingUsers).length > 0\n const hasParticipants = hasConfirmedParticipants || hasPendingParticipants\n\n if (hasParticipants) {\n // Return to waiting conference view to manage other participants\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n // Remove from pending users if exists\n if (pendingUsers && pendingUsers[res.callerNum]) {\n store.dispatch.conference.removePendingUser(res.callerNum)\n }\n } else {\n // No participants left, reset conference\n store.dispatch.conference.resetConference()\n }\n }\n }\n })\n\n // Avoid to show phone island if call is connected with other extension\n socket.current.on('extenConnected', (res: { extenConnected: string }) => {\n // Get the current user's extensions\n\n const { default_device, endpoints } = store.getState().currentUser\n const userExtensions = endpoints?.extension || []\n\n // Find the extension type\n const connectedExtension = userExtensions.find((ext) => ext.id === res.extenConnected)\n const extensionType: any = connectedExtension?.type\n\n // Reset only if the extension type is not webrtc or nethlink\n // ( avoid to not show phone island if default is physical and extensionType is physical)\n if (\n ((default_device?.type === 'webrtc' || default_device?.type === 'nethlink') &&\n extensionType &&\n (extensionType === 'mobile' || extensionType === 'physical')) ||\n (default_device?.type === 'physical' && extensionType && extensionType !== 'physical')\n ) {\n // Avoid to show phone island in case of answer from physical or mobile device\n store.dispatch.island.toggleAvoidToShow(true)\n // Set the preview call flag\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(true)\n // Launch an event to advert the user that the call it's answered from another device\n eventDispatch('phone-island-call-answered', { extensionType })\n }\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n const userInformation = store.getState().currentUser\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Check if this is a mobile extension call for the current user\n let isMobileExtensionCall = false\n if (res?.username === username && !isEmpty(conv) && conv?.owner) {\n const matchingExtension = userInformation?.endpoints?.extension?.find(\n (ext: any) => ext.id === conv.owner,\n )\n if (matchingExtension && matchingExtension.type === 'mobile') {\n isMobileExtensionCall = true\n }\n }\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else if (!isMobileExtensionCall) {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\n if (isMobileExtensionCall && res?.status === 'busy' && res?.username === username) {\n store.dispatch.island.toggleAvoidToShow(true)\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(true)\n }\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `parkingUpdate` is the socket event when a call is parked or unparked\n socket.current.on('parkingUpdate', (event) => {\n // Dispatch parking update event with the parking information\n dispatchParkingUpdate(event)\n })\n\n // `actionNethLink` is the socket event when user make a call or a action from NethLink and has a physical device\n socket.current.on('actionNethLink', (link, urlType) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchUrlCall(link, urlType)\n })\n\n socket.current.on('message', (data: any) => {\n switch (data.message) {\n case 'screenSharingStart':\n dispatch.island.toggleSideViewVisible(false)\n dispatch.island.toggleTranscriptionViewVisible(false)\n dispatch.island.setIslandView('video')\n\n dispatch.screenShare.update({\n isJoiningScreenShare: true,\n room: (data as ScreenSharingMessage).roomId,\n })\n break\n case 'screenSharingStop':\n dispatch.island.toggleSideViewVisible(false)\n dispatch.island.toggleTranscriptionViewVisible(false)\n dispatch.island.setIslandView('video')\n\n dispatch.screenShare.update({\n isLeavingScreenShare: true,\n })\n break\n default:\n console.warn('Socket: unknown message type ', data.message)\n }\n })\n\n // `updateDefaultDevice` is the socket event when user change the default device\n socket.current.on('updateDefaultDevice', (extension: string) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchDefaultDeviceUpdate(extension)\n // Update the internal store\n const { extensions } = store.getState().users\n const { endpoints } = store.getState().currentUser\n if (!extensions || !endpoints) return\n\n const extensionInformations: any = Object.values(extensions).filter(\n (ext) => ext?.exten === extension,\n )\n if (extensionInformations.length === 0) return\n\n let objectComplete = extensionInformations[0]\n const endpointExtension = endpoints.extension.find(\n (endpoint) => endpoint.id === objectComplete.exten,\n )\n if (endpointExtension) {\n objectComplete = { ...objectComplete, type: endpointExtension.type }\n }\n\n store.dispatch.currentUser.updateCurrentDefaultDevice(objectComplete)\n //make sure to check the media permissions\n checkMediaPermissions()\n })\n\n socket.current.on('confBridgeUpdate', (res: any) => {\n if (res && res?.users) {\n // Get User informations\n const conferenceId = res?.id\n const conferenceUsers = res?.users\n\n // Get current users list to preserve mute status\n const { usersList } = store.getState().conference\n\n // Create a copy of the new conference users while preserving mute status\n const updatedConferenceUsers = { ...conferenceUsers }\n\n // Preserve mute status for existing users\n if (usersList) {\n Object.keys(updatedConferenceUsers).forEach((userId) => {\n if (usersList[userId]) {\n // Keep the existing mute status instead of using the server's value\n updatedConferenceUsers[userId] = {\n ...updatedConferenceUsers[userId],\n muted: usersList[userId].muted,\n }\n }\n })\n }\n\n store.dispatch.conference.updateConferenceUsersList(updatedConferenceUsers)\n store.dispatch.conference.updateConferenceId(conferenceId)\n }\n })\n\n socket.current.on('confBridgeEnd', (res: any) => {\n if (res && res?.id) {\n // Reset the conference store when conference ends\n store.dispatch.conference.resetConference()\n eventDispatch('phone-island-conference-finished', {})\n }\n })\n\n socket.current.on('callWebrtc', (res: any) => {\n // On call event from socket dispatch the call start event\n eventDispatch('phone-island-call-start', { number: res })\n })\n\n socket.current.on('newVoiceMessageCounter', (res: any) => {\n eventDispatch('phone-island-voicemail-received', { voicemailInfo: res })\n })\n\n socket.current.on('streamingSourceUpdate', (res: any) => {\n eventDispatch('phone-island-streaming-information-received', { res })\n const streamingData = res.streaming || (res.res && res.res.streaming)\n\n if (streamingData) {\n const { source, image } = streamingData\n if (source && image) {\n const { isFromStreaming } = store.getState().island\n const { streamingSourceNumber } = store.getState().currentCall\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n\n dispatch.streaming.updateSourceImage({\n source: source,\n image: image,\n })\n }\n }\n })\n\n // Handle satellite/transcription messages\n socket.current.on('satellite/transcription', (transcriptionData: any) => {\n // Dispatch the transcription event to external listeners\n eventDispatch('phone-island-conversation-transcription', transcriptionData)\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [hostName, username, authToken, uaType, dispatch])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('Socket reload requested')\n const { data } = store.getState().alerts\n const { forceReload } = store.getState().island\n\n // Check if socket is actually down using alerts (more reliable than socket.connected)\n const isSocketDown = data.socket_down?.active || false\n\n // Only reconnect if socket_down alert is active OR force reload is requested\n if (isSocketDown || forceReload) {\n console.info(\n forceReload\n ? 'Force reload requested, performing Socket reconnection'\n : 'Socket down detected (alert active), performing reconnection'\n )\n // Reset force reload flag\n if (forceReload) {\n store.dispatch.island.setForceReload(false)\n }\n // Clear the connection check interval to avoid stale ping timeouts during reconnection\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n connectionCheckInterval.current = null\n }\n // Disconnect and reconnect socket\n setTimeout(() => {\n socket.current.disconnect()\n socket.current.connect()\n // Execute the reloaded callback\n reloadedCallback()\n }, 100)\n } else {\n console.info('Socket already connected (no alert active), skipping reconnection')\n // Execute callback without reload\n reloadedCallback()\n }\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","isUpdatingUserInfo","consecutivePingTimeouts","useSelector","state","currentUser","useEventListener","current","emit","useEffect","socketOptions","handleStreamingSource","conv","counterpartNum","isFromStreaming","island","setIsFromStreaming","currentCall","updateCurrentCall","streamingSourceNumber","sourceId","getStreamingSourceId","subscribe","id","catch","error","console","handleCurrentUserEvents","res","store","getState","transferring","transferSwitching","transferCalls","view","Object","keys","length","status","extensions_1","users","extensions","default_device","_b","endpoints_1","endpoints","username_1","_c","incoming","hasOnlineNethlink","userExtensions","values","filter","ext","some","endpointExtension","extension","find","endpoint","exten","type","undefined","getCurrentUserInfo","then","userInfo","updateCurrentUser","eventDispatch","__assign","settings","open_param_url","paramUrl","setOpenParamUrlType","finally","setTimeout","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","concat","incomingSocket","ownerExtension","owner","chDest","chSource","direction","inConference","linkedId","uniqueId","throughQueue","throughTrunk","recording","setIslandView","openParamUrlType","urlOpened","calculatedThroughTrunk","isFromTrunk","setThroughTrunk","setUrlOpened","counterpartName","connected","checkAcceptedUpdate","acceptedSocket","addTransferCalls","startTime","getTimestampInSeconds","isPhysical","accepted","player","stopAudioPlayer","setAudioPlayerLoop","checkDefaultDeviceConversationActive","deleteTransferCalls","inTransferCalls","item","updateTransferSwitching","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","outgoing","userTotallyFree","reset","upgrade","transports","reconnection","reconnectionDelay","getApiMode","path","io","websocket","update","on","debug","reason","clearInterval","includes","err","attempt","accessKeyId","token","setInterval","volatile","withTimeout","alerts","removeAlert","isStaleConnection","sipcall","webrtc","iceState","webrtcStuff","pc","iceConnectionState","timestamp","Date","toISOString","warn","disconnect","setAlert","updateEndpointMainPresence","mainPresence","dispatchMainPresence","conference","isActive","conferenceStartedFrom","previewCallFromMobileOrNethlink","connectedExtension","callerNum","extensionType","cause","toggleAvoidToShow","setPreviewCallFromMobileOrNethlink","resetConference","viewType","_d","usersList","pendingUsers","hasConfirmedParticipants","hasPendingParticipants","_e","endpoints_2","username_2","userExtensionIds","map","_f","_g","isActive_1","conferenceStartedFrom_1","setOperatorBusyActive","callerNumber","updateStartAudioPlayer","src","busyRingtone","loop","_h","isActive_2","conferenceStartedFrom_2","username_3","_j","removePendingUser","extenConnected","updateExtension","deviceMap","userInformation","key","user","push","associatedExtensions","conversations","isMobileExtensionCall","isEmpty","matchingExtension","dispatchExtensions","hasNonEmptyConversation","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","event","dispatchParkingUpdate","link","urlType","dispatchUrlCall","data","message","toggleSideViewVisible","toggleTranscriptionViewVisible","screenShare","isJoiningScreenShare","room","roomId","isLeavingScreenShare","dispatchDefaultDeviceUpdate","extensionInformations","objectComplete","updateCurrentDefaultDevice","checkMediaPermissions","conferenceId","conferenceUsers","usersList_1","updatedConferenceUsers_1","forEach","userId","muted","updateConferenceUsersList","updateConferenceId","voicemailInfo","streamingData","streaming","source","image","updateSourceImage","transcriptionData","close","info","forceReload","socket_down","active","setForceReload","connect","React","createElement","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getApiMode } from './RestAPI'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport { getCurrentUserInfo } from '../services/user'\nimport busyRingtone from '../static/busy_ringtone'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n dispatchExtensions,\n dispatchUrlCall,\n dispatchDefaultDeviceUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, useEventListener, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\nimport { isPhysical } from '../lib/user/default_device'\nimport { ScreenSharingMessage } from './VideoView'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { isFromStreaming } from '../utils/streaming/isFromStreaming'\nimport { getStreamingSourceId } from '../utils/streaming/getStreamingSourceId'\nimport { subscribe } from '../services/user'\nimport { isFromTrunk } from '../lib/user/extensions'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n const isUpdatingUserInfo = useRef(false)\n const consecutivePingTimeouts = useRef(0)\n const STALE_CONNECTION_THRESHOLD = 3 // Force reconnect after 3 consecutive ping timeouts\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n // Event listener for starting transcription\n useEventListener('phone-island-start-transcription', () => {\n if (socket.current) {\n socket.current.emit('start_transcription', {})\n }\n })\n\n // Event listener for stopping transcription\n useEventListener('phone-island-stop-transcription', () => {\n if (socket.current) {\n socket.current.emit('stop_transcription', {})\n }\n })\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.player.setAudioPlayerLoop(false)\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Helper function to handle streaming source detection and subscription\n */\n const handleStreamingSource = (conv: ConversationTypes) => {\n // Check if the call is from a streaming source\n if (conv.counterpartNum && isFromStreaming(conv.counterpartNum)) {\n // Set isFromStreaming flag to true\n dispatch.island.setIsFromStreaming(true)\n\n // Store the streaming source number in the currentCall state for future reference\n dispatch.currentCall.updateCurrentCall({\n streamingSourceNumber: conv.counterpartNum,\n })\n\n // Find the source ID and subscribe to streaming updates\n const sourceId = getStreamingSourceId(conv.counterpartNum)\n if (sourceId) {\n // Subscribe to streaming updates\n subscribe({ id: sourceId }).catch((error) =>\n console.error('Error subscribing to streaming source:', error),\n )\n }\n }\n }\n\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n const view = store.getState().island.view\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n const { default_device } = store.getState().currentUser\n const { endpoints, username } = store.getState().currentUser\n const { incoming, outgoing } = store.getState().currentCall\n\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 switch (res.status) {\n case 'ringing':\n // Handle streaming source for incoming calls\n handleStreamingSource(conv)\n\n if (\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 ) {\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n incoming: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n store.dispatch.island.setIslandView('call')\n }\n // Get updated user info to refresh open url param type\n if (!isUpdatingUserInfo.current) {\n isUpdatingUserInfo.current = true\n getCurrentUserInfo()\n .then((userInfo) => {\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n eventDispatch('phone-island-user-informations-update', { ...userInfo })\n if (userInfo.settings && userInfo.settings.open_param_url) {\n dispatch.paramUrl.setOpenParamUrlType(userInfo.settings.open_param_url)\n } else {\n dispatch.paramUrl.setOpenParamUrlType('never')\n }\n }\n })\n .catch((error) => {\n console.error('Error getting current user info:', error)\n })\n .finally(() => {\n setTimeout(() => {\n isUpdatingUserInfo.current = false\n }, 100)\n })\n }\n const { openParamUrlType } = store.getState().paramUrl\n const { urlOpened } = store.getState().island\n if (openParamUrlType === 'ringing' && !urlOpened) {\n // Calculate throughTrunk based on counterpartNum\n const calculatedThroughTrunk = isFromTrunk(conv.counterpartNum)\n\n // Update throughTrunk in paramUrl store\n store.dispatch.paramUrl.setThroughTrunk(calculatedThroughTrunk)\n\n store.dispatch.island.setUrlOpened(false)\n eventDispatch('phone-island-url-parameter-opened', {\n counterpartNum: conv.counterpartNum,\n counterpartName: getDisplayName(conv),\n owner: conv.owner,\n uniqueId: conv.uniqueId,\n linkedId: conv.linkedId,\n throughQueue: conv.throughQueue,\n throughTrunk: calculatedThroughTrunk,\n direction: conv.direction,\n connected: conv.connected,\n })\n }\n break\n // @ts-ignore\n case 'busy':\n // Handle streaming source for outgoing calls\n handleStreamingSource(conv)\n\n if (\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 ) {\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n chDest: conv?.chDest || {},\n chSource: conv?.chSource || {},\n })\n // Update the current call informations for physical devices\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedSocket: true,\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n // Check if this is a streaming call that was accepted\n const { isFromStreaming } = store.getState().island\n if (isFromStreaming && conv.direction === 'out') {\n // Set view to streamingAnswer for outgoing streaming calls when accepted\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n if (isPhysical()) {\n checkDefaultDeviceConversationActive(conv)\n }\n if (view === 'call' && transferring) {\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n }\n }\n // Delete transfer calls if there are more than one ( in case of call switch after transfer)\n if (transferCalls.length > 1) {\n dispatch.currentCall.deleteTransferCalls()\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n outgoing: conv?.counterpartName === 'REC' ? false : true,\n displayName: getDisplayName(conv),\n number: `${conv?.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv?.counterpartNum] &&\n extensions[conv?.counterpartNum].username\n }` || '',\n })\n }\n }\n break\n\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n // Reset isFromStreaming flag\n dispatch.island.setIsFromStreaming(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n const currentApiMode = getApiMode(username)\n\n const socketOptions: any = {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n }\n\n // Only set path for new API mode\n if (currentApiMode === 'new') {\n socketOptions.path = '/api/ws'\n }\n\n socket.current = io('https://' + hostName, socketOptions)\n\n // save websocket to store\n dispatch.websocket.update({ socket: socket.current })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n // Clear the connection check interval on disconnect to avoid stale pings\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n connectionCheckInterval.current = null\n }\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n // Reset consecutive ping timeout counter on successful reconnection\n consecutivePingTimeouts.current = 0\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Connection check interval is now started in the authe_ok handler\n // to ensure it only runs after successful authentication\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n eventDispatch('phone-island-socket-authorized', {})\n\n // Start connection check interval after successful authentication\n // Clear any existing interval first to avoid duplicates\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n }\n connectionCheckInterval.current = setInterval(() => {\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Ping success - reset consecutive timeout counter\n consecutivePingTimeouts.current = 0\n // Remove socket_down alert (async to avoid React error #300 with framer-motion)\n setTimeout(() => {\n dispatch.alerts.removeAlert('socket_down')\n eventDispatch('phone-island-alert-removed', {\n type: 'socket_down',\n })\n eventDispatch('phone-island-socket-disconnected-popup-close', {})\n }, 0)\n },\n () => {\n // Ping timeout - increment counter\n consecutivePingTimeouts.current++\n console.debug(\n `Socket ping timeout (${consecutivePingTimeouts.current}/${STALE_CONNECTION_THRESHOLD}), connected: ${socket.current.connected}`,\n )\n\n // Set socket_down alert (async to avoid React error #300 with framer-motion)\n setTimeout(() => {\n // Check for stale connection: socket reports connected but pings keep timing out\n const isStaleConnection =\n socket.current.connected &&\n consecutivePingTimeouts.current >= STALE_CONNECTION_THRESHOLD\n\n if (!socket.current.connected || isStaleConnection) {\n // Check if there's an active call with ICE still connected\n // If so, skip showing alert - let ICE grace period mechanism handle it\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { accepted, outgoing } = store.getState().currentCall\n const iceState = sipcall?.webrtcStuff?.pc?.iceConnectionState\n const hasActiveCallWithIce =\n (accepted || outgoing) &&\n (iceState === 'connected' || iceState === 'completed')\n\n if (hasActiveCallWithIce) {\n console.debug(\n 'Socket unreachable but active call with ICE connected - skipping socket_down alert',\n {\n iceState,\n accepted,\n outgoing,\n isStaleConnection,\n timestamp: new Date().toISOString(),\n },\n )\n return\n }\n\n if (isStaleConnection) {\n console.warn('Stale socket connection detected - forcing reconnection')\n // Force disconnect to trigger reconnection\n socket.current.disconnect()\n }\n\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-open', {})\n console.error('Socket is unreachable!')\n }\n }, 0)\n },\n 5 * 1000,\n ),\n )\n }, 5 * 1000)\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenHangup', (res: any) => {\n const { endpoints, username } = store.getState().currentUser\n const { isActive, conferenceStartedFrom } = store.getState().conference\n const { view, previewCallFromMobileOrNethlink } = store.getState().island\n\n // Get user extensions\n const userExtensions = endpoints?.extension || []\n\n // Find the extension type based on callerNum\n const connectedExtension = userExtensions.find((ext) => ext.id === res.callerNum)\n const extensionType: any = connectedExtension?.type\n\n // If cause is normal_clearing and extension is physical or mobile\n // Clean phone-island visibility also after user_busy ( useful for physical devices )\n if (\n (res.cause === 'normal_clearing' &&\n (extensionType === 'physical' || extensionType === 'mobile')) ||\n (res.cause === 'normal_clearing' &&\n (extensionType === 'webrtc' || extensionType === 'nethlink') &&\n previewCallFromMobileOrNethlink) ||\n res?.cause === 'user_busy' ||\n res?.cause === 'not_defined' ||\n res?.cause === 'call_rejected' ||\n res?.cause === 'interworking'\n ) {\n // Reset phone island visibility after 2 seconds to avoid glitches\n setTimeout(() => {\n store.dispatch.island.toggleAvoidToShow(false)\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(false)\n }, 500)\n // Only reset conference if there are no more participants or if user is not in a conference\n if (isActive && conferenceStartedFrom !== username) {\n store.dispatch.conference.resetConference()\n }\n } else if (\n res?.cause === 'normal_circuit_congestion' &&\n isActive &&\n conferenceStartedFrom === username\n ) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n } else if (\n (res.cause === 'normal_clearing' ||\n res?.cause === 'user_busy' ||\n res?.cause === 'not_defined' ||\n res?.cause === 'call_rejected') &&\n (extensionType === 'webrtc' || extensionType === 'nethlink') &&\n isActive &&\n conferenceStartedFrom !== username\n ) {\n store.dispatch.conference.resetConference()\n }\n // if conference owner and added participant refuses or hangs up with normal_clearing\n if (\n ((res.cause === 'normal_clearing' &&\n (extensionType === 'webrtc' || extensionType === 'nethlink')) ||\n res?.cause === 'call_rejected') &&\n isActive &&\n conferenceStartedFrom === username\n ) {\n const { usersList, pendingUsers } = store.getState().conference\n // Check if there are still participants in the conference (both confirmed and pending)\n const hasConfirmedParticipants = usersList && Object.keys(usersList).length > 0\n const hasPendingParticipants = pendingUsers && Object.keys(pendingUsers).length > 0\n const hasParticipants = hasConfirmedParticipants || hasPendingParticipants\n\n if (!hasParticipants) {\n store.dispatch.conference.resetConference()\n } else {\n // If there are still participants, keep the waitingConference view\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n }\n }\n // if conference owner call the call with the added user inside conference\n if (\n res?.cause === 'interworking' &&\n isActive &&\n conferenceStartedFrom === username &&\n view !== 'waitingConference'\n ) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n }\n if (res?.cause === 'user_busy') {\n // Get current user's extensions\n const { endpoints, username } = store.getState().currentUser\n const userExtensions = endpoints?.extension || []\n const userExtensionIds = userExtensions.map((ext) => ext.id)\n\n // Get the current call state to understand if we're the caller or receiver\n const { incoming, outgoing } = store.getState().currentCall\n\n // Check if there's an active conference\n const { isActive, conferenceStartedFrom } = store.getState().conference\n\n // When we RECEIVE a call on our extension, callerNum is the busy extension (our own)\n // When we CALL someone, channelExten is one of our extensions (the one we're calling from)\n const isReceivingCall = incoming && userExtensionIds.includes(res.callerNum)\n\n // Only show operator busy view if:\n // 1. We are NOT receiving an incoming call to our own extension\n if (!isReceivingCall) {\n // Set operator busy active with caller information\n store.dispatch.island.setOperatorBusyActive({\n callerNumber: res.callerNum || 'Unknown',\n })\n\n // Stop busy tone after 4 seconds\n setTimeout(() => {\n store.dispatch.player.stopAudioPlayer()\n }, 4000)\n\n setTimeout(() => {\n // Play busy tone\n store.dispatch.player.updateStartAudioPlayer({\n src: busyRingtone,\n loop: true,\n })\n store.dispatch.island.setIslandView('operatorBusy')\n }, 600)\n\n // If conference is active and we're the owner, return to conference after timeout\n if (isActive && conferenceStartedFrom === username) {\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 4000)\n }\n }\n }\n\n // Handle subscriber_absent - when added participant rejects the call\n if (res?.cause === 'subscriber_absent') {\n const { isActive, conferenceStartedFrom } = store.getState().conference\n const { username } = store.getState().currentUser\n\n // Only handle if conference is active and current user is the owner\n if (isActive && conferenceStartedFrom === username) {\n // Check if there are still participants in the conference (both confirmed and pending)\n const { usersList, pendingUsers } = store.getState().conference\n const hasConfirmedParticipants = usersList && Object.keys(usersList).length > 0\n const hasPendingParticipants = pendingUsers && Object.keys(pendingUsers).length > 0\n const hasParticipants = hasConfirmedParticipants || hasPendingParticipants\n\n if (hasParticipants) {\n // Return to waiting conference view to manage other participants\n setTimeout(() => {\n eventDispatch('phone-island-view-changed', { viewType: 'waitingConference' })\n }, 800)\n // Remove from pending users if exists\n if (pendingUsers && pendingUsers[res.callerNum]) {\n store.dispatch.conference.removePendingUser(res.callerNum)\n }\n } else {\n // No participants left, reset conference\n store.dispatch.conference.resetConference()\n }\n }\n }\n })\n\n // Avoid to show phone island if call is connected with other extension\n socket.current.on('extenConnected', (res: { extenConnected: string }) => {\n // Get the current user's extensions\n\n const { default_device, endpoints } = store.getState().currentUser\n const userExtensions = endpoints?.extension || []\n\n // Find the extension type\n const connectedExtension = userExtensions.find((ext) => ext.id === res.extenConnected)\n const extensionType: any = connectedExtension?.type\n\n // Reset only if the extension type is not webrtc or nethlink\n // ( avoid to not show phone island if default is physical and extensionType is physical)\n if (\n ((default_device?.type === 'webrtc' || default_device?.type === 'nethlink') &&\n extensionType &&\n (extensionType === 'mobile' || extensionType === 'physical')) ||\n (default_device?.type === 'physical' && extensionType && extensionType !== 'physical')\n ) {\n // Avoid to show phone island in case of answer from physical or mobile device\n store.dispatch.island.toggleAvoidToShow(true)\n // Set the preview call flag\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(true)\n // Launch an event to advert the user that the call it's answered from another device\n eventDispatch('phone-island-call-answered', { extensionType })\n }\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n const userInformation = store.getState().currentUser\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Check if this is a mobile extension call for the current user\n let isMobileExtensionCall = false\n if (res?.username === username && !isEmpty(conv) && conv?.owner) {\n const matchingExtension = userInformation?.endpoints?.extension?.find(\n (ext: any) => ext.id === conv.owner,\n )\n if (matchingExtension && matchingExtension.type === 'mobile') {\n isMobileExtensionCall = true\n }\n }\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else if (!isMobileExtensionCall) {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\n if (isMobileExtensionCall && res?.status === 'busy' && res?.username === username) {\n store.dispatch.island.toggleAvoidToShow(true)\n store.dispatch.island.setPreviewCallFromMobileOrNethlink(true)\n }\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `parkingUpdate` is the socket event when a call is parked or unparked\n socket.current.on('parkingUpdate', (event) => {\n // Dispatch parking update event with the parking information\n dispatchParkingUpdate(event)\n })\n\n // `actionNethLink` is the socket event when user make a call or a action from NethLink and has a physical device\n socket.current.on('actionNethLink', (link, urlType) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchUrlCall(link, urlType)\n })\n\n socket.current.on('message', (data: any) => {\n switch (data.message) {\n case 'screenSharingStart':\n dispatch.island.toggleSideViewVisible(false)\n dispatch.island.toggleTranscriptionViewVisible(false)\n dispatch.island.setIslandView('video')\n\n dispatch.screenShare.update({\n isJoiningScreenShare: true,\n room: (data as ScreenSharingMessage).roomId,\n })\n break\n case 'screenSharingStop':\n dispatch.island.toggleSideViewVisible(false)\n dispatch.island.toggleTranscriptionViewVisible(false)\n dispatch.island.setIslandView('video')\n\n dispatch.screenShare.update({\n isLeavingScreenShare: true,\n })\n break\n default:\n console.warn('Socket: unknown message type ', data.message)\n }\n })\n\n // `updateDefaultDevice` is the socket event when user change the default device\n socket.current.on('updateDefaultDevice', (extension: string) => {\n // Dispatch phone island physical call event with the link and the urlType\n dispatchDefaultDeviceUpdate(extension)\n // Update the internal store\n const { extensions } = store.getState().users\n const { endpoints } = store.getState().currentUser\n if (!extensions || !endpoints) return\n\n const extensionInformations: any = Object.values(extensions).filter(\n (ext) => ext?.exten === extension,\n )\n if (extensionInformations.length === 0) return\n\n let objectComplete = extensionInformations[0]\n const endpointExtension = endpoints.extension.find(\n (endpoint) => endpoint.id === objectComplete.exten,\n )\n if (endpointExtension) {\n objectComplete = { ...objectComplete, type: endpointExtension.type }\n }\n\n store.dispatch.currentUser.updateCurrentDefaultDevice(objectComplete)\n //make sure to check the media permissions\n checkMediaPermissions()\n })\n\n socket.current.on('confBridgeUpdate', (res: any) => {\n if (res && res?.users) {\n // Get User informations\n const conferenceId = res?.id\n const conferenceUsers = res?.users\n\n // Get current users list to preserve mute status\n const { usersList } = store.getState().conference\n\n // Create a copy of the new conference users while preserving mute status\n const updatedConferenceUsers = { ...conferenceUsers }\n\n // Preserve mute status for existing users\n if (usersList) {\n Object.keys(updatedConferenceUsers).forEach((userId) => {\n if (usersList[userId]) {\n // Keep the existing mute status instead of using the server's value\n updatedConferenceUsers[userId] = {\n ...updatedConferenceUsers[userId],\n muted: usersList[userId].muted,\n }\n }\n })\n }\n\n store.dispatch.conference.updateConferenceUsersList(updatedConferenceUsers)\n store.dispatch.conference.updateConferenceId(conferenceId)\n }\n })\n\n socket.current.on('confBridgeEnd', (res: any) => {\n if (res && res?.id) {\n // Reset the conference store when conference ends\n store.dispatch.conference.resetConference()\n eventDispatch('phone-island-conference-finished', {})\n }\n })\n\n socket.current.on('callWebrtc', (res: any) => {\n // On call event from socket dispatch the call start event\n eventDispatch('phone-island-call-start', { number: res })\n })\n\n socket.current.on('newVoiceMessageCounter', (res: any) => {\n eventDispatch('phone-island-voicemail-received', { voicemailInfo: res })\n })\n\n socket.current.on('streamingSourceUpdate', (res: any) => {\n eventDispatch('phone-island-streaming-information-received', { res })\n const streamingData = res.streaming || (res.res && res.res.streaming)\n\n if (streamingData) {\n const { source, image } = streamingData\n if (source && image) {\n const { isFromStreaming } = store.getState().island\n const { streamingSourceNumber } = store.getState().currentCall\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n\n dispatch.streaming.updateSourceImage({\n source: source,\n image: image,\n })\n }\n }\n })\n\n // Handle satellite/transcription messages\n socket.current.on('satellite/transcription', (transcriptionData: any) => {\n // Dispatch the transcription event to external listeners\n eventDispatch('phone-island-conversation-transcription', transcriptionData)\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [hostName, username, authToken, uaType, dispatch])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('Socket reload requested')\n const { data } = store.getState().alerts\n const { forceReload } = store.getState().island\n\n // Check if socket is actually down using alerts (more reliable than socket.connected)\n const isSocketDown = data.socket_down?.active || false\n\n // Only reconnect if socket_down alert is active OR force reload is requested\n if (isSocketDown || forceReload) {\n console.info(\n forceReload\n ? 'Force reload requested, performing Socket reconnection'\n : 'Socket down detected (alert active), performing reconnection',\n )\n // Reset force reload flag\n if (forceReload) {\n store.dispatch.island.setForceReload(false)\n }\n // Clear the connection check interval to avoid stale ping timeouts during reconnection\n if (connectionCheckInterval.current) {\n clearInterval(connectionCheckInterval.current)\n connectionCheckInterval.current = null\n }\n // Disconnect and reconnect socket\n setTimeout(() => {\n socket.current.disconnect()\n socket.current.connect()\n // Execute the reloaded callback\n reloadedCallback()\n }, 100)\n } else {\n console.info('Socket already connected (no alert active), skipping reconnection')\n // Execute callback without reload\n reloadedCallback()\n }\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","isUpdatingUserInfo","consecutivePingTimeouts","useSelector","state","currentUser","useEventListener","current","emit","useEffect","socketOptions","handleStreamingSource","conv","counterpartNum","isFromStreaming","island","setIsFromStreaming","currentCall","updateCurrentCall","streamingSourceNumber","sourceId","getStreamingSourceId","subscribe","id","catch","error","console","handleCurrentUserEvents","res","store","getState","transferring","transferSwitching","transferCalls","view","Object","keys","length","status","extensions_1","users","extensions","default_device","_b","endpoints_1","endpoints","username_1","_c","incoming","hasOnlineNethlink","userExtensions","values","filter","ext","some","endpointExtension","extension","find","endpoint","exten","type","undefined","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","concat","incomingSocket","ownerExtension","owner","setIslandView","getCurrentUserInfo","then","userInfo","updateCurrentUser","eventDispatch","__assign","settings","open_param_url","paramUrl","setOpenParamUrlType","finally","setTimeout","openParamUrlType","urlOpened","calculatedThroughTrunk","isFromTrunk","setThroughTrunk","setUrlOpened","counterpartName","uniqueId","linkedId","throughQueue","throughTrunk","direction","connected","chDest","chSource","checkAcceptedUpdate","acceptedSocket","addTransferCalls","startTime","getTimestampInSeconds","isPhysical","accepted","player","stopAudioPlayer","setAudioPlayerLoop","checkDefaultDeviceConversationActive","deleteTransferCalls","inTransferCalls","item","updateTransferSwitching","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","outgoing","userTotallyFree","reset","upgrade","transports","reconnection","reconnectionDelay","getApiMode","path","io","websocket","update","on","debug","reason","clearInterval","includes","err","attempt","accessKeyId","token","setInterval","volatile","withTimeout","alerts","removeAlert","isStaleConnection","sipcall","webrtc","iceState","webrtcStuff","pc","iceConnectionState","timestamp","Date","toISOString","warn","disconnect","setAlert","updateEndpointMainPresence","mainPresence","dispatchMainPresence","conference","isActive","conferenceStartedFrom","previewCallFromMobileOrNethlink","connectedExtension","callerNum","extensionType","cause","toggleAvoidToShow","setPreviewCallFromMobileOrNethlink","resetConference","viewType","_d","usersList","pendingUsers","hasConfirmedParticipants","hasPendingParticipants","_e","endpoints_2","username_2","userExtensionIds","map","_f","_g","isActive_1","conferenceStartedFrom_1","setOperatorBusyActive","callerNumber","updateStartAudioPlayer","src","busyRingtone","loop","_h","isActive_2","conferenceStartedFrom_2","username_3","_j","removePendingUser","extenConnected","updateExtension","deviceMap","userInformation","key","user","push","associatedExtensions","conversations","isMobileExtensionCall","isEmpty","matchingExtension","dispatchExtensions","hasNonEmptyConversation","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","event","dispatchParkingUpdate","link","urlType","dispatchUrlCall","data","message","toggleSideViewVisible","toggleTranscriptionViewVisible","screenShare","isJoiningScreenShare","room","roomId","isLeavingScreenShare","dispatchDefaultDeviceUpdate","extensionInformations","objectComplete","updateCurrentDefaultDevice","checkMediaPermissions","conferenceId","conferenceUsers","usersList_1","updatedConferenceUsers_1","forEach","userId","muted","updateConferenceUsersList","updateConferenceId","voicemailInfo","streamingData","streaming","source","image","updateSourceImage","transcriptionData","close","info","forceReload","socket_down","active","setForceReload","connect","React","createElement","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../node_modules/@rematch/core/dist/core.esm.js"),n=require("../static/incoming_ringtone.js"),i=require("../static/example_tone1.js"),s=require("../static/example_tone2.js"),a=require("../static/example_tone3.js"),o=require("../static/example_tone4.js"),u={availableRingtones:[{name:"default",displayName:"Default",base64Audio:n.default},{name:"classic",displayName:"Classic",base64Audio:i.default},{name:"modern",displayName:"Modern",base64Audio:s.default},{name:"soft",displayName:"Soft",base64Audio:a.default},{name:"gentle",displayName:"Gentle",base64Audio:o.default}],selectedRingtone:"default",outputDeviceId:null},r=t.createModel()({state:u,reducers:{setSelectedRingtone:function(t,n){return t.availableRingtones.some((function(e){return e.name===n}))?e.__assign(e.__assign({},t),{selectedRingtone:n}):(console.warn('Ringtone "'.concat(n,'" not found. Keeping current selection.')),t)},setOutputDeviceId:function(t,n){return e.__assign(e.__assign({},t),{outputDeviceId:n})},reset:function(){return u}},effects:function(e){return{getSelectedRingtoneAudio:function(e,t){var n=t.ringtones,i=n.selectedRingtone,s=n.availableRingtones,a=s.find((function(e){return e.name===i}));return(null==a?void 0:a.base64Audio)||s[0].base64Audio}}}});exports.ringtones=r;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../node_modules/@rematch/core/dist/core.esm.js"),n=require("../static/incoming_ringtone.js"),i=require("../static/example_tone1.js"),s=require("../static/example_tone2.js"),a=require("../static/example_tone3.js"),o=require("../static/example_tone4.js"),u=require("../static/silent_ringtone.js"),r={availableRingtones:[{name:"default",displayName:"Default",base64Audio:n.default},{name:"classic",displayName:"Classic",base64Audio:i.default},{name:"modern",displayName:"Modern",base64Audio:s.default},{name:"soft",displayName:"Soft",base64Audio:a.default},{name:"gentle",displayName:"Gentle",base64Audio:o.default},{name:"silent",displayName:"Silent",base64Audio:u.default}],selectedRingtone:"default",outputDeviceId:null},l=t.createModel()({state:r,reducers:{setSelectedRingtone:function(t,n){return t.availableRingtones.some((function(e){return e.name===n}))?e.__assign(e.__assign({},t),{selectedRingtone:n}):(console.warn('Ringtone "'.concat(n,'" not found. Keeping current selection.')),t)},setOutputDeviceId:function(t,n){return e.__assign(e.__assign({},t),{outputDeviceId:n})},reset:function(){return r}},effects:function(e){return{getSelectedRingtoneAudio:function(e,t){var n=t.ringtones,i=n.selectedRingtone,s=n.availableRingtones,a=s.find((function(e){return e.name===i}));return(null==a?void 0:a.base64Audio)||s[0].base64Audio}}}});exports.ringtones=l;
2
2
  //# sourceMappingURL=ringtones.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ringtones.js","sources":["../../src/models/ringtones.ts"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport exampleTone1 from '../static/example_tone1'\nimport exampleTone2 from '../static/example_tone2'\nimport exampleTone3 from '../static/example_tone3'\nimport exampleTone4 from '../static/example_tone4'\n\nexport interface RingtoneOption {\n name: string\n displayName: string\n base64Audio: string\n}\n\nexport interface RingtonesTypes {\n availableRingtones: RingtoneOption[]\n selectedRingtone: string\n outputDeviceId: string | null\n}\n\nconst AVAILABLE_RINGTONES: RingtoneOption[] = [\n {\n name: 'default',\n displayName: 'Default',\n base64Audio: incomingRingtone,\n },\n {\n name: 'classic',\n displayName: 'Classic',\n base64Audio: exampleTone1,\n },\n {\n name: 'modern',\n displayName: 'Modern',\n base64Audio: exampleTone2,\n },\n {\n name: 'soft',\n displayName: 'Soft',\n base64Audio: exampleTone3,\n },\n {\n name: 'gentle',\n displayName: 'Gentle',\n base64Audio: exampleTone4,\n },\n]\n\nconst defaultState: RingtonesTypes = {\n availableRingtones: AVAILABLE_RINGTONES,\n selectedRingtone: 'default',\n outputDeviceId: null,\n}\n\nexport const ringtones = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n setSelectedRingtone: (state, payload: string) => {\n // Validate that the ringtone exists\n const ringtoneExists = state.availableRingtones.some((r) => r.name === payload)\n if (!ringtoneExists) {\n console.warn(`Ringtone \"${payload}\" not found. Keeping current selection.`)\n return state\n }\n return {\n ...state,\n selectedRingtone: payload,\n }\n },\n setOutputDeviceId: (state, payload: string | null) => {\n return {\n ...state,\n outputDeviceId: payload,\n }\n },\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n /**\n * Gets the currently selected ringtone's base64 audio data\n */\n getSelectedRingtoneAudio: (_: void, rootState): string => {\n const { selectedRingtone, availableRingtones } = rootState.ringtones\n const ringtone = (availableRingtones as RingtoneOption[]).find(\n (r) => r.name === selectedRingtone,\n )\n return ringtone?.base64Audio || (availableRingtones as RingtoneOption[])[0].base64Audio\n },\n }),\n})\n"],"names":["defaultState","availableRingtones","name","displayName","base64Audio","incomingRingtone","exampleTone1","exampleTone2","exampleTone3","exampleTone4","selectedRingtone","outputDeviceId","ringtones","createModel","state","reducers","setSelectedRingtone","payload","some","r","__assign","console","warn","setOutputDeviceId","reset","effects","dispatch","getSelectedRingtoneAudio","_","rootState","_a","ringtone","find"],"mappings":"gYAmDMA,EAA+B,CACnCC,mBA7B4C,CAC5C,CACEC,KAAM,UACNC,YAAa,UACbC,YAAaC,EAAgB,SAE/B,CACEH,KAAM,UACNC,YAAa,UACbC,YAAaE,EAAY,SAE3B,CACEJ,KAAM,SACNC,YAAa,SACbC,YAAaG,EAAY,SAE3B,CACEL,KAAM,OACNC,YAAa,OACbC,YAAaI,EAAY,SAE3B,CACEN,KAAM,SACNC,YAAa,SACbC,YAAaK,EAAY,UAM3BC,iBAAkB,UAClBC,eAAgB,MAGLC,EAAYC,EAAWA,aAAXA,CAAyB,CAChDC,MAAOd,EACPe,SAAU,CACRC,oBAAqB,SAACF,EAAOG,GAG3B,OADuBH,EAAMb,mBAAmBiB,MAAK,SAACC,GAAM,OAAAA,EAAEjB,OAASe,CAAO,IAK9EG,EAAAA,SAAAA,EAAAA,SAAA,GACKN,GAAK,CACRJ,iBAAkBO,KALlBI,QAAQC,KAAK,oBAAaL,EAAO,4CAC1BH,EAMV,EACDS,kBAAmB,SAACT,EAAOG,GACzB,OAAAG,EAAAA,SAAAA,EAAAA,SAAA,GACKN,GAAK,CACRH,eAAgBM,GAEnB,EACDO,MAAO,WACL,OAAOxB,CACR,GAEHyB,QAAS,SAACC,GAAa,MAAC,CAItBC,yBAA0B,SAACC,EAASC,GAC5B,IAAAC,EAA2CD,EAAUjB,UAAnDF,EAAgBoB,EAAApB,iBAAET,EAAkB6B,EAAA7B,mBACtC8B,EAAY9B,EAAwC+B,MACxD,SAACb,GAAM,OAAAA,EAAEjB,OAASQ,CAAX,IAET,OAAOqB,eAAAA,EAAU3B,cAAgBH,EAAwC,GAAGG,WAC7E,EACD"}
1
+ {"version":3,"file":"ringtones.js","sources":["../../src/models/ringtones.ts"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport exampleTone1 from '../static/example_tone1'\nimport exampleTone2 from '../static/example_tone2'\nimport exampleTone3 from '../static/example_tone3'\nimport exampleTone4 from '../static/example_tone4'\nimport silentRingtone from '../static/silent_ringtone'\n\nexport interface RingtoneOption {\n name: string\n displayName: string\n base64Audio: string\n}\n\nexport interface RingtonesTypes {\n availableRingtones: RingtoneOption[]\n selectedRingtone: string\n outputDeviceId: string | null\n}\n\nconst AVAILABLE_RINGTONES: RingtoneOption[] = [\n {\n name: 'default',\n displayName: 'Default',\n base64Audio: incomingRingtone,\n },\n {\n name: 'classic',\n displayName: 'Classic',\n base64Audio: exampleTone1,\n },\n {\n name: 'modern',\n displayName: 'Modern',\n base64Audio: exampleTone2,\n },\n {\n name: 'soft',\n displayName: 'Soft',\n base64Audio: exampleTone3,\n },\n {\n name: 'gentle',\n displayName: 'Gentle',\n base64Audio: exampleTone4,\n },\n {\n name: 'silent',\n displayName: 'Silent',\n base64Audio: silentRingtone,\n },\n]\n\nconst defaultState: RingtonesTypes = {\n availableRingtones: AVAILABLE_RINGTONES,\n selectedRingtone: 'default',\n outputDeviceId: null,\n}\n\nexport const ringtones = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n setSelectedRingtone: (state, payload: string) => {\n // Validate that the ringtone exists\n const ringtoneExists = state.availableRingtones.some((r) => r.name === payload)\n if (!ringtoneExists) {\n console.warn(`Ringtone \"${payload}\" not found. Keeping current selection.`)\n return state\n }\n return {\n ...state,\n selectedRingtone: payload,\n }\n },\n setOutputDeviceId: (state, payload: string | null) => {\n return {\n ...state,\n outputDeviceId: payload,\n }\n },\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n /**\n * Gets the currently selected ringtone's base64 audio data\n */\n getSelectedRingtoneAudio: (_: void, rootState): string => {\n const { selectedRingtone, availableRingtones } = rootState.ringtones\n const ringtone = (availableRingtones as RingtoneOption[]).find(\n (r) => r.name === selectedRingtone,\n )\n return ringtone?.base64Audio || (availableRingtones as RingtoneOption[])[0].base64Audio\n },\n }),\n})\n"],"names":["defaultState","availableRingtones","name","displayName","base64Audio","incomingRingtone","exampleTone1","exampleTone2","exampleTone3","exampleTone4","silentRingtone","selectedRingtone","outputDeviceId","ringtones","createModel","state","reducers","setSelectedRingtone","payload","some","r","__assign","console","warn","setOutputDeviceId","reset","effects","dispatch","getSelectedRingtoneAudio","_","rootState","_a","ringtone","find"],"mappings":"0aAyDMA,EAA+B,CACnCC,mBAlC4C,CAC5C,CACEC,KAAM,UACNC,YAAa,UACbC,YAAaC,EAAgB,SAE/B,CACEH,KAAM,UACNC,YAAa,UACbC,YAAaE,EAAY,SAE3B,CACEJ,KAAM,SACNC,YAAa,SACbC,YAAaG,EAAY,SAE3B,CACEL,KAAM,OACNC,YAAa,OACbC,YAAaI,EAAY,SAE3B,CACEN,KAAM,SACNC,YAAa,SACbC,YAAaK,EAAY,SAE3B,CACEP,KAAM,SACNC,YAAa,SACbC,YAAaM,EAAc,UAM7BC,iBAAkB,UAClBC,eAAgB,MAGLC,EAAYC,EAAWA,aAAXA,CAAyB,CAChDC,MAAOf,EACPgB,SAAU,CACRC,oBAAqB,SAACF,EAAOG,GAG3B,OADuBH,EAAMd,mBAAmBkB,MAAK,SAACC,GAAM,OAAAA,EAAElB,OAASgB,CAAO,IAK9EG,EAAAA,SAAAA,EAAAA,SAAA,GACKN,GAAK,CACRJ,iBAAkBO,KALlBI,QAAQC,KAAK,oBAAaL,EAAO,4CAC1BH,EAMV,EACDS,kBAAmB,SAACT,EAAOG,GACzB,OAAAG,EAAAA,SAAAA,EAAAA,SAAA,GACKN,GAAK,CACRH,eAAgBM,GAEnB,EACDO,MAAO,WACL,OAAOzB,CACR,GAEH0B,QAAS,SAACC,GAAa,MAAC,CAItBC,yBAA0B,SAACC,EAASC,GAC5B,IAAAC,EAA2CD,EAAUjB,UAAnDF,EAAgBoB,EAAApB,iBAAEV,EAAkB8B,EAAA9B,mBACtC+B,EAAY/B,EAAwCgC,MACxD,SAACb,GAAM,OAAAA,EAAElB,OAASS,CAAX,IAET,OAAOqB,eAAAA,EAAU5B,cAAgBH,EAAwC,GAAGG,WAC7E,EACD"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="@nethesis/phone-island",s="Nethesis",t="0.18.6",r="NethVoice CTI Phone Island",i=["nethserver","nethesis","nethvoice","phone","island"],o="https://github.com/nethesis/phone-island#readme",n="https://github.com/nethesis/dev/issues",p={type:"git",url:"https://github.com/nethesis/phone-island.git"},l=["dist"],a="dist/index.js",d="dist/index.d.ts",c={access:"public"},u={main:!1,types:!1,default:{distDir:"./dist-widget"}},m={"@fortawesome/free-solid-svg-icons":"^6.2.1","@fortawesome/react-fontawesome":"^0.2.0","@headlessui/react":"^2.2.8","@nethesis/nethesis-light-svg-icons":"github:nethesis/Font-Awesome#ns-light","@nethesis/nethesis-solid-svg-icons":"github:nethesis/Font-Awesome#ns-solid","@rematch/core":"^2.2.0","@rematch/immer":"^2.1.3","@rematch/select":"^3.1.2","@swc/helpers":"^0.4.12","@testing-library/jest-dom":"^5.11.4","@testing-library/user-event":"^12.1.10","framer-motion":"^12.0.0",i18next:"^22.4.9","i18next-browser-languagedetector":"^7.0.1","i18next-http-backend":"^2.1.1","js-base64":"^3.7.3",lodash:"^4.17.21","mic-check":"^1.1.0",react:"^18.2.0","react-dom":"^18.2.0","react-i18next":"^12.1.5","react-moment":"^1.1.2","react-redux":"^8.0.5","react-scripts":"^5.0.1","react-tooltip":"^5.28.0","socket.io-client":"^4.5.3","styled-components":"^5.3.6","webrtc-adapter":"^9.0.1"},b={start:"react-scripts start",dev:"storybook dev -p 6006",test:"react-scripts test",watch:"rollup -w -c","watch:css":"npx tailwindcss -o ./dist/index.css --watch",build:"rm -rf ./dist && npm run build:css && rollup -c","build:css":"NODE_ENV=production npx tailwindcss -o ./dist/index.css --minify","build:win":"del /s /q dist && npm run build:wincss && rollup -c --configPlugin typescript","build:wincss":"set NODE_ENV=production npx tailwindcss -o ./dist/index.css --minify","build:widget":"rm -rf ./dist-widget && parcel build ./src/index.widget.tsx --no-source-maps","serve:widget":"rm -rf ./widget-example/static/* && cp -rf ./dist-widget/* ./widget-example/static && npx http-server ./widget-example -o -c-1","build-storybook":"storybook build -s public",release:"npm publish","release:widget":"np patch",format:"prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc",bump:"node bump-version.js","build-pack":"npm run bump && npm run build && npm pack","build-pack:win":"npm run bump && npm run build:win && npm pack","publish:minor":"npm version minor --allow-same-version -m v%s --force","publish:major":"npm version major --allow-same-version -m v%s --force","publish:patch":"npm version patch --allow-same-version -m v%s --force",preversion:"rm -rf dist-widget && npm run build:widget && git add dist-widget/index.widget.js dist-widget/index.widget.css && git commit -m 'chore(widget): release for jsDelivr'",postversion:"git push origin main --tags","revert-bump":"node revert-bump.js"},g={production:[">0.2%","not dead","not op_mini all"],development:["last 1 chrome version","last 1 firefox version","last 1 safari version"]},h={"@babel/core":"^7.20.2","@babel/preset-env":"^7.20.2","@parcel/transformer-typescript-types":"^2.8.0","@rollup/plugin-babel":"^6.0.2","@rollup/plugin-commonjs":"^23.0.2","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^9.0.2","@storybook/addon-actions":"7.6.21","@storybook/addon-essentials":"7.6.20","@storybook/addon-interactions":"7.6.20","@storybook/addon-links":"7.6.21","@storybook/node-logger":"7.6.20","@storybook/preset-create-react-app":"7.6.21","@storybook/react":"7.6.20","@storybook/react-webpack5":"^7.6.20","@storybook/testing-library":"^0.0.13","@testing-library/react":"^13.4.0","@types/audioworklet":"^0.0.95","@types/jest":"^29.2.2","@types/react":"^18.0.26","@types/react-dom":"^18.0.9","@types/styled-components":"^5.1.26",autoprefixer:"^10.4.20",babel:"^6.23.0","babel-plugin-named-exports-order":"^0.0.2",buffer:"^5.7.1","css-loader":"^7.1.2","eslint-plugin-storybook":"^0.9.0",np:"^7.6.2",parcel:"^2.0.0",postcss:"^8.4.49","postcss-loader":"^8.1.1",prettier:"^2.8.0","prop-types":"^15.8.1",rollup:"^2.79.1","rollup-plugin-generate-package-json":"^3.2.0","rollup-plugin-postcss":"^4.0.2",storybook:"^7.6.20","style-loader":"^4.0.0","tailwind-scrollbar":"^3.1.0",tailwindcss:"^3.4.16",typescript:"^4.8.4","webm-duration-fix":"^1.0.4",webpack:"^5.74.0"},w={"nth-check":"^2.0.1"},x="GPL-3.0-or-later",y={name:e,author:s,version:t,description:r,keywords:i,homepage:o,bugs:n,repository:p,private:!1,files:l,main:a,types:d,publishConfig:c,targets:u,dependencies:m,scripts:b,browserslist:g,devDependencies:h,overrides:w,license:x};exports.author=s,exports.browserslist=g,exports.bugs=n,exports.default=y,exports.dependencies=m,exports.description=r,exports.devDependencies=h,exports.files=l,exports.homepage=o,exports.keywords=i,exports.license=x,exports.main=a,exports.name=e,exports.overrides=w,exports.publishConfig=c,exports.repository=p,exports.scripts=b,exports.targets=u,exports.types=d,exports.version=t;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="@nethesis/phone-island",s="Nethesis",t="0.18.8",r="NethVoice CTI Phone Island",i=["nethserver","nethesis","nethvoice","phone","island"],o="https://github.com/nethesis/phone-island#readme",n="https://github.com/nethesis/dev/issues",p={type:"git",url:"https://github.com/nethesis/phone-island.git"},l=["dist"],a="dist/index.js",d="dist/index.d.ts",c={access:"public"},u={main:!1,types:!1,default:{distDir:"./dist-widget"}},m={"@fortawesome/free-solid-svg-icons":"^6.2.1","@fortawesome/react-fontawesome":"^0.2.0","@headlessui/react":"^2.2.8","@nethesis/nethesis-light-svg-icons":"github:nethesis/Font-Awesome#ns-light","@nethesis/nethesis-solid-svg-icons":"github:nethesis/Font-Awesome#ns-solid","@rematch/core":"^2.2.0","@rematch/immer":"^2.1.3","@rematch/select":"^3.1.2","@swc/helpers":"^0.4.12","@testing-library/jest-dom":"^5.11.4","@testing-library/user-event":"^12.1.10","framer-motion":"^12.0.0",i18next:"^22.4.9","i18next-browser-languagedetector":"^7.0.1","i18next-http-backend":"^2.1.1","js-base64":"^3.7.3",lodash:"^4.17.21","mic-check":"^1.1.0",react:"^18.2.0","react-dom":"^18.2.0","react-i18next":"^12.1.5","react-moment":"^1.1.2","react-redux":"^8.0.5","react-scripts":"^5.0.1","react-tooltip":"^5.28.0","socket.io-client":"^4.5.3","styled-components":"^5.3.6","webrtc-adapter":"^9.0.1"},b={start:"react-scripts start",dev:"storybook dev -p 6006",test:"react-scripts test",watch:"rollup -w -c","watch:css":"npx tailwindcss -o ./dist/index.css --watch",build:"rm -rf ./dist && npm run build:css && rollup -c","build:css":"NODE_ENV=production npx tailwindcss -o ./dist/index.css --minify","build:win":"del /s /q dist && npm run build:wincss && rollup -c --configPlugin typescript","build:wincss":"set NODE_ENV=production npx tailwindcss -o ./dist/index.css --minify","build:widget":"rm -rf ./dist-widget && parcel build ./src/index.widget.tsx --no-source-maps","serve:widget":"rm -rf ./widget-example/static/* && cp -rf ./dist-widget/* ./widget-example/static && npx http-server ./widget-example -o -c-1","build-storybook":"storybook build -s public",release:"npm publish","release:widget":"np patch",format:"prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc",bump:"node bump-version.js","build-pack":"npm run bump && npm run build && npm pack","build-pack:win":"npm run bump && npm run build:win && npm pack","publish:minor":"npm version minor --allow-same-version -m v%s --force","publish:major":"npm version major --allow-same-version -m v%s --force","publish:patch":"npm version patch --allow-same-version -m v%s --force",preversion:"rm -rf dist-widget && npm run build:widget && git add dist-widget/index.widget.js dist-widget/index.widget.css && git commit -m 'chore(widget): release for jsDelivr'",postversion:"git push origin main --tags","revert-bump":"node revert-bump.js"},g={production:[">0.2%","not dead","not op_mini all"],development:["last 1 chrome version","last 1 firefox version","last 1 safari version"]},h={"@babel/core":"^7.20.2","@babel/preset-env":"^7.20.2","@parcel/transformer-typescript-types":"^2.8.0","@rollup/plugin-babel":"^6.0.2","@rollup/plugin-commonjs":"^23.0.2","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^15.0.1","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-typescript":"^9.0.2","@storybook/addon-actions":"7.6.23","@storybook/addon-essentials":"7.6.23","@storybook/addon-interactions":"7.6.23","@storybook/addon-links":"7.6.23","@storybook/node-logger":"7.6.20","@storybook/preset-create-react-app":"7.6.21","@storybook/react":"7.6.20","@storybook/react-webpack5":"^7.6.20","@storybook/testing-library":"^0.0.13","@testing-library/react":"^13.4.0","@types/audioworklet":"^0.0.95","@types/jest":"^29.2.2","@types/react":"^18.0.26","@types/react-dom":"^18.0.9","@types/styled-components":"^5.1.26",autoprefixer:"^10.4.20",babel:"^6.23.0","babel-plugin-named-exports-order":"^0.0.2",buffer:"^5.7.1","css-loader":"^7.1.2","eslint-plugin-storybook":"^0.9.0",np:"^7.6.2",parcel:"^2.0.0",postcss:"^8.4.49","postcss-loader":"^8.1.1",prettier:"^2.8.0","prop-types":"^15.8.1",rollup:"^2.79.1","rollup-plugin-generate-package-json":"^3.2.0","rollup-plugin-postcss":"^4.0.2",storybook:"^7.6.20","style-loader":"^4.0.0","tailwind-scrollbar":"^3.1.0",tailwindcss:"^3.4.16",typescript:"^4.8.4","webm-duration-fix":"^1.0.4",webpack:"^5.74.0"},w={"nth-check":"^2.0.1"},x="GPL-3.0-or-later",y={name:e,author:s,version:t,description:r,keywords:i,homepage:o,bugs:n,repository:p,private:!1,files:l,main:a,types:d,publishConfig:c,targets:u,dependencies:m,scripts:b,browserslist:g,devDependencies:h,overrides:w,license:x};exports.author=s,exports.browserslist=g,exports.bugs=n,exports.default=y,exports.dependencies=m,exports.description=r,exports.devDependencies=h,exports.files=l,exports.homepage=o,exports.keywords=i,exports.license=x,exports.main=a,exports.name=e,exports.overrides=w,exports.publishConfig=c,exports.repository=p,exports.scripts=b,exports.targets=u,exports.types=d,exports.version=t;
2
2
  //# sourceMappingURL=package.json.js.map
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.default="data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAA=";
2
+ //# sourceMappingURL=silent_ringtone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"silent_ringtone.js","sources":["../../src/static/silent_ringtone.ts"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/**\n * Silent ringtone - minimal WAV file with no audio data\n * This can be used to effectively mute the ringtone\n */\nconst silentRingtone = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQAAAAA='\n\nexport default silentRingtone\n"],"names":[],"mappings":"oFAOuB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nethesis/phone-island",
3
3
  "author": "Nethesis",
4
- "version": "0.18.6",
4
+ "version": "0.18.8",
5
5
  "description": "NethVoice CTI Phone Island",
6
6
  "keywords": [
7
7
  "nethserver",
@@ -110,10 +110,10 @@
110
110
  "@rollup/plugin-node-resolve": "^15.0.1",
111
111
  "@rollup/plugin-terser": "^0.4.4",
112
112
  "@rollup/plugin-typescript": "^9.0.2",
113
- "@storybook/addon-actions": "7.6.21",
114
- "@storybook/addon-essentials": "7.6.20",
115
- "@storybook/addon-interactions": "7.6.20",
116
- "@storybook/addon-links": "7.6.21",
113
+ "@storybook/addon-actions": "7.6.23",
114
+ "@storybook/addon-essentials": "7.6.23",
115
+ "@storybook/addon-interactions": "7.6.23",
116
+ "@storybook/addon-links": "7.6.23",
117
117
  "@storybook/node-logger": "7.6.20",
118
118
  "@storybook/preset-create-react-app": "7.6.21",
119
119
  "@storybook/react": "7.6.20",