@nethesis/phone-island 1.0.8-dev.1 → 1.0.8-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/_virtual/index8.js +1 -1
- package/dist/_virtual/index9.js +1 -1
- package/dist/lib/devices/devices.js +1 -1
- package/dist/node_modules/@fortawesome/react-fontawesome/index.es.js +1 -1
- package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +1 -1
- package/dist/node_modules/hoist-non-react-statics/node_modules/react-is/cjs/react-is.development.js +1 -1
- package/dist/node_modules/hoist-non-react-statics/node_modules/react-is/cjs/react-is.production.min.js +1 -1
- package/dist/node_modules/hoist-non-react-statics/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/mic-check/lib/index.js +1 -1
- package/dist/node_modules/prop-types/index.js +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js +1 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/react-moment/dist/index.js +1 -1
- package/dist/node_modules/react-redux/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +1 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/package.json.js +1 -1
- package/dist/services/user.js +1 -1
- package/dist/services/user.js.map +1 -1
- package/package.json +1 -1
package/dist/App.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./node_modules/tslib/tslib.es6.js"),n=require("react"),t=require("./components/Events.js"),i=require("./components/Socket.js"),r=require("./components/WebRTC.js"),s=require("./components/Island.js"),a=require("./components/RestAPI.js"),o=require("./utils/customHooks/useEventListener.js"),c=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js"),d=require("./utils/genericFunctions/summaryEvents.js"),l=require("./store/index.js"),p=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 v=require("./node_modules/js-base64/base64.mjs.js"),h=require("./workers/wake_up.js"),f=require("./lib/i18n.js"),m=require("./lib/webrtc/messages.js"),g=require("./lib/darkTheme.js"),w=require("./utils/genericFunctions/isEmpty.js"),b=require("./utils/genericFunctions/checkConnection.js"),S=require("./utils/genericFunctions/isBackCallVisible.js"),I=require("./lib/phone/trunk.js"),y=require("./lib/phone/call.js"),E=require("./node_modules/react-redux/es/components/Provider.js");function D(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var k=D(n);if("undefined"!=typeof window&&window.location.hostname.includes(".support.my.")){var _=window.fetch;window.fetch=function(n,t){return _(n,e.__assign({credentials:"include"},t))}}var L=n.forwardRef((function(D,_){var L=D.dataConfig,U=D.showAlways,N=void 0!==U&&U,q=D.uaType,C=D.urlParamWithEvent,T=void 0!==C&&C,j=v.Base64.atob(L||"").split(":"),R=j[0],A=j[1],O=j[2],P=j[3],V=j[4],x=j[5],J=j[6],F=n.useState(!1),W=F[0],M=F[1],Q=n.useState(!1),z=Q[0],H=Q[1],$=n.useState(!1),B=$[0],G=$[1],K=n.useRef(0),X=n.useRef(null),Y=n.useRef(null);n.useImperativeHandle(_,(function(){return{reset:function(){console.info("PhoneIsland: Performing full component reset"),M(!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"),M(!0)),e=n}},t=new Worker(h.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(){B&&z&&(M(!1),H(!1),G(!1))}),[B,z]),n.useEffect((function(){var e=setInterval((function(){var e,n,t,i,r=l.store.getState().alerts.data,s=(null===(e=r.webrtc_down)||void 0===e?void 0:e.active)||!1,a=(null===(n=r.socket_down)||void 0===n?void 0:n.active)||!1,o=Date.now(),c=o-K.current,u=l.store.getState().webrtc.sipcall,d=l.store.getState().currentCall,p=d.accepted,v=d.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,m=navigator.onLine;if((s||a)&&!W&&c>1e4&&m){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:s,isSocketDown:a,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:s,isSocketDown:a}),K.current=o,M(!0)}}),1e3);return function(){return clearInterval(e)}}),[W]),o.useEventListener("phone-island-expand",(function(){l.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),o.useEventListener("phone-island-compress",(function(){l.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),o.useEventListener("phone-island-call-keypad-close",(function(){l.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),o.useEventListener("phone-island-call-transfer-close",(function(){l.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),o.useEventListener("phone-island-recording-close",(function(){l.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),o.useEventListener("phone-island-audio-player-close",(function(){l.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),o.useEventListener("phone-island-emergency-stop-ringtone",(function(){null===l.store.getState().island.view?(console.warn("Emergency stop ringtone triggered - phone island inactive"),l.store.dispatch.player.emergencyStopAudioPlayer(),c.eventDispatch("phone-island-emergency-stop-ringtone-completed",{})):console.log("Phone island is active, ringtone stop ignored")})),o.useEventListener("phone-island-detach",(function(e){m.detach(),l.store.dispatch.webrtc.updateWebRTC({sipcall:null,registered:!1,isDetached:!0,jsepGlobal:null}),l.store.dispatch.webrtc.updateRemoteAudioStream(null),l.store.dispatch.webrtc.updateLocalAudioStream(null),l.store.dispatch.webrtc.updateLocalVideoStream(null),l.store.dispatch.webrtc.updateRemoteVideoStream(null),c.eventDispatch("phone-island-detached",{})})),o.useEventListener("phone-island-reload-component",(function(e){(null==e?void 0:e.force)&&l.store.dispatch.island.setForceReload(!0),M(!0)})),o.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,ue(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,de()]);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]}}))}))})),o.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,le(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,pe()]);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 Z=n.useState(!0),ee=Z[0],ne=Z[1],te=n.useState(!0),ie=te[0],re=te[1],se=n.useState(!1),ae=se[0],oe=se[1],ce=n.useSyncExternalStore(l.store.subscribe,(function(){return l.store.getState().fetchDefaults.fetchReady||!1}));n.useEffect((function(){ee&&(f.initI18n(),ne(!1))}),[ee]),n.useEffect((function(){ce&&!ae&&(oe(!0),e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,p.getParamUrl()];case 1:return n=e.sent(),t=(null==n?void 0:n.url)||"",i=t&&""!==t.trim(),l.store.dispatch.paramUrl.setParamUrl({url:t,onlyQueues:(null==n?void 0:n.only_queues)||!1,hasValidUrl:i}),[3,3];case 2:return r=e.sent(),console.warn("Non-blocking param URL fetch failed:",r),l.store.dispatch.paramUrl.setParamUrl({url:"",onlyQueues:!1,hasValidUrl:!1}),[3,3];case 3:return[2]}}))})))}),[ce,ae]);var ue=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]}}))}))},de=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;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 r=e.sent(),console.warn("Error getting default audio input device:",r),[2,"default"];case 3:return[2]}}))}))},le=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]}}))}))},pe=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;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 r=e.sent(),console.warn("Error getting default video input device:",r),[2,"default"];case 3:return[2]}}))}))};o.useEventListener("phone-island-audio-output-change",(function(n){e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r,s,a,o,d,p,v;return e.__generator(this,(function(h){switch(h.label){case 0:return(null==(t=l.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,r;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 r=e.sent(),console.warn("Error getting default device:",r),[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:r=h.sent(),console.log("Direct setSinkId failed, trying with temporary stream:",r),h.label=6;case 6:return h.trys.push([6,7,,14]),s=new(window.AudioContext||window.webkitAudioContext),a=s.createOscillator(),o=s.createGain(),a.frequency.setValueAtTime(440,s.currentTime),o.gain.setValueAtTime(0,s.currentTime),a.connect(o),d=s.createMediaStreamDestination(),o.connect(d),t.current.srcObject=d.stream,a.start(),setTimeout((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,r;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!"),a.stop(),s.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),a.stop(),s.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 r=e.sent(),console.error("Even default device failed:",r),[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}))}))})),o.useEventListener("phone-island-presence-change",(function(e){p.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),o.useEventListener("phone-island-view-changed",(function(e){var n=null==e?void 0:e.viewType;l.store.dispatch.island.setIslandView(n)}));var ve=l.store.getState().player.remoteAudio;n.useEffect((function(){var e;if(ie&&ve){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}),re(!1)}}),[ie,ve]),n.useEffect((function(){g.checkDarkTheme()}),[]),o.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),o.useEventListener("phone-island-default-device-change",(function(e){l.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),c.eventDispatch("phone-island-default-device-changed",{})})),o.useEventListener("phone-island-alert",(function(e){l.store.dispatch.alerts.setAlert(e.toString())})),o.useEventListener("phone-island-ringing-tone-list",(function(){var e=l.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})})),o.useEventListener("phone-island-ringing-tone-select",(function(e){(null==e?void 0:e.name)&&(u.setJSONItem("phone-island-selected-ringtone",{value:e.name}),l.store.dispatch.ringtones.setSelectedRingtone(e.name),c.eventDispatch("phone-island-ringing-tone-selected",{name:e.name}))})),o.useEventListener("phone-island-ringing-tone-output",(function(e){(null==e?void 0:e.deviceId)&&(u.setJSONItem("phone-island-ringtone-output-device",{value:e.deviceId}),l.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)&&l.store.dispatch.ringtones.setSelectedRingtone(e.value),(null==n?void 0:n.value)&&l.store.dispatch.ringtones.setOutputDeviceId(n.value)}),[]),o.useEventListener("phone-island-check-connection",(function(){b.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))})),n.useEffect((function(){var e=setInterval((function(){b.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))}),5e3);return function(){return clearInterval(e)}}),[]),o.useEventListener("phone-island-main-presence",(function(e){var n,t,i,r,s=null===(n=l.store.getState().currentUser)||void 0===n?void 0:n.username,a=l.store.getState().currentUser,o=null==a?void 0:a.mainPresence;if(void 0!==s&&""!==s&&!w.isEmpty(e[s])&&void 0!==(null===(t=e[s])||void 0===t?void 0:t.mainPresence)){var u=null===(i=e[s])||void 0===i?void 0:i.mainPresence;l.store.dispatch.currentUser.updateMainPresence(null===(r=e[s])||void 0===r?void 0:r.mainPresence),"online"===u&&"online"!==o&&c.eventDispatch("phone-island-call-ended",{})}})),o.useEventListener("phone-island-call-status",(function(){var e=l.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var he=function(e,n,t,i,r){var s=l.store.getState().paramUrl;if(null==s?void 0:s.hasValidUrl){var a=s.url||"";if(a){var o=l.store.getState().island.urlOpened,u=s.openParamUrlType;if(!o||"button"===u){var d=a;d.includes("$CALLER_NUMBER")&&e&&(d=d.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),d.includes("$CALLER_NAME")&&n&&(d=d.replace(/\$CALLER_NAME/g,encodeURIComponent(n))),d.includes("$UNIQUEID")&&i&&(d=d.replace(/\$UNIQUEID/g,encodeURIComponent(i))),d.includes("$CALLED")&&t&&(d=d.replace(/\$CALLED/g,encodeURIComponent(t))),d.includes("{phone}")&&e&&(d=d.replace(/\{phone\}/g,encodeURIComponent(e)));var p=d.startsWith("http")?d:"https://".concat(d);if("mobile"!==q&&!T&&r){var v=window.open("about:blank","_blank");v&&(v.location.href=p,l.store.dispatch.island.setUrlOpened(!0))}else c.eventDispatch("phone-island-url-parameter-opened-external",{formattedUrl:p})}}}};return o.useEventListener("phone-island-already-opened-external-page",(function(){l.store.dispatch.island.setUrlOpened(!0)})),o.useEventListener("phone-island-url-parameter-opened",(function(e){var n=l.store.getState().paramUrl;if(n.hasValidUrl&&!l.store.getState().island.urlOpened){var t=n.onlyQueues||!1,i=I.isFromTrunk(null==e?void 0:e.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(i);var r=l.store.getState().currentUser.default_device,s=!("desktop"===q&&"nethlink"===(null==r?void 0:r.type));"in"===(null==e?void 0:e.direction)&&(!0===t&&!0===(null==e?void 0:e.throughQueue)?he(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,s):!1!==t||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||he(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,s))}})),o.useEventListener("phone-island-user-status",(function(){var e=l.store.getState().currentUser;console.log("User status debug informations: ",e)})),o.useEventListener("phone-island-all-users-status",(function(){var e=l.store.getState().users;console.log("Users status debug informations: ",e)})),o.useEventListener("phone-island-status",(function(){var e=l.store.getState().island;console.log("Phone island status debug informations: ",e)})),o.useEventListener("phone-island-webrtc-status",(function(){var e=l.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-player-status",(function(){var e=l.store.getState().player;console.log("Player status debug informations: ",e)})),o.useEventListener("phone-island-conference-status",(function(){var e=l.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-streaming-status",(function(){var e=l.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),o.useEventListener("phone-island-paramurl-status",(function(){var e=l.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),o.useEventListener("phone-island-queue-status",(function(){var e=l.store.getState().queue;console.log("Queue status debug informations: ",e)})),o.useEventListener("phone-island-player-force-stop",(function(){l.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),o.useEventListener("phone-island-stores-download",(function(){l.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),o.useEventListener("phone-island-sideview-open",(function(){l.store.dispatch.island.toggleSideViewVisible(!0),l.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),o.useEventListener("phone-island-sideview-close",(function(){l.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),o.useEventListener("phone-island-transcription-close",(function(){l.store.dispatch.island.toggleTranscriptionViewVisible(!1),(X.current||Y.current)&&(c.eventDispatch("phone-island-stop-transcription",{uniqueid:X.current,linkedid:Y.current}),X.current=null,Y.current=null),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-open",(function(e){var n=null==e?void 0:e.linkedid,t=null==e?void 0:e.uniqueid;(n||t)&&(Y.current=n||null,X.current=t||null,c.eventDispatch("phone-island-start-transcription",{linkedid:n,uniqueid:t}),l.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{}))})),o.useEventListener("phone-island-init-audio",(function(){var e=l.store.getState().currentCall,n=e.accepted,t=e.incoming,i=e.outgoing,r=e.incomingWebRTC,s=e.incomingSocket;if(n||t||i||r||s)console.log("[AUDIO-WARMUP] Skipping audio warm-up: active call in progress");else if(x&&"string"==typeof x&&0!==x.length){var a=l.store.getState().currentUser.featureCodes,o=null==a?void 0:a.audio_test,c=o&&"string"==typeof o&&o.length>0?o:"*41";console.log("[AUDIO-WARMUP] Starting audio warm-up test call",{codeToCall:c,SIP_HOST:x}),y.callNumber(c,x)}else console.warn("[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available",{SIP_HOST:x})})),o.useEventListener("phone-island-transcription-toggle",(function(){var e=!l.store.getState().island.transcriptionViewIsVisible;l.store.dispatch.island.toggleTranscriptionViewVisible(e),c.eventDispatch(e?"phone-island-transcription-opened":"phone-island-transcription-closed",{})})),o.useEventListener("phone-island-summary-call-check",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r,s,a,o,c,u,p,v,h;return e.__generator(this,(function(e){switch(e.label){case 0:return t=(null==n?void 0:n.linkedid)||(null==n?void 0:n.linkedId),i=(null==n?void 0:n.uniqueid)||(null==n?void 0:n.uniqueId),t?i?(r=l.store.getState().conference,s=r.isActive,a=r.usersList,o=r.conferenceStartedFrom,c=l.store.getState().currentUser,u=c.name,p=c.username,v=s&&(o===p||!!a&&Object.values(a).some((function(e){return e.name===u}))),v?[2]:[4,new Promise((function(e){return setTimeout(e,1e3)}))]):(console.warn("[Summary Check] No unique identifier provided"),[2]):(console.warn("[Summary Check] No call identifier provided"),[2]);case 1:e.sent(),e.label=2;case 2:return e.trys.push([2,5,,6]),[4,Promise.resolve().then((function(){return require("./services/user.js")}))];case 3:return[4,(0,e.sent().checkSummaryCall)(i)];case 4:return e.sent(),d.dispatchSummaryReady({linkedid:t,uniqueid:i,source:"check"}),[3,6];case 5:return 204===(null==(h=e.sent())?void 0:h.status)?(console.log("[Summary Check] Summary not ready for ".concat(t)),d.dispatchSummaryNotReady({linkedid:t,uniqueid:i,source:"check"})):console.warn("[Summary Check] Non-blocking summary check failed:",h),[3,6];case 6:return[2]}}))}))})),o.useEventListener("phone-island-call-summary-notify",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=null==n?void 0:n.linkedid,i=null==n?void 0:n.uniqueid,!t)return console.warn("[Summary Notify] No call identifier provided"),[2];if(!i)return console.warn("[Summary Notify] No unique identifier provided"),[2];e.label=1;case 1:return e.trys.push([1,4,,5]),[4,Promise.resolve().then((function(){return require("./services/user.js")}))];case 2:return[4,(0,e.sent().watchSummaryCall)(t,i)];case 3:return e.sent(),c.eventDispatch("phone-island-summary-call-notified",{linkedid:t,uniqueid:i}),[3,5];case 4:return r=e.sent(),console.warn("[Summary Check] Non-blocking summary watch failed:",r),[3,5];case 5:return[2]}}))}))})),o.useEventListener("phone-island-size-change",(function(n){var t=l.store.getState().island,i=t.sideViewIsVisible,r=t.transcriptionViewIsVisible,s=t.actionsExpanded,a=n.sizeInformation,o=e.__assign(e.__assign({},a),{right:i?"42px":"0px",top:S.isBackCallActive()?"40px":"0px",bottomTranscription:r&&s?"335px":r&&!s?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:o})})),o.useEventListener("phone-island-call-ended",(function(){if("online"===l.store.getState().currentUser.mainPresence){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),l.store.dispatch.island.handleResetIslandStore(),l.store.dispatch.paramUrl.setThroughTrunk(!1)}})),o.useEventListener("phone-island-conference-list-open",(function(){l.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),o.useEventListener("phone-island-alert-removed",(function(e){var n=l.store.getState().alerts.status.activeAlertsCount,t=l.store.getState().island,i=t.view,r=t.previousView,s=l.store.getState().conference.isActive,a=l.store.getState().alerts.data,o=l.store.getState().currentCall,u=o.incoming,d=o.outgoing,p=o.accepted,v=null==e?void 0:e.type,h=o.incoming||o.outgoing||o.accepted||""!==o.conversationId;if(!(u||d||p||n>0||"player"===i||"recorder"===i||"physicalPhoneRecorder"===i||"waitingConference"===i&&s||"transfer"===i&&s||"settings"===i&&s||"settings"===i&&("recorder"===r||"player"===r)||"operatorBusy"===i&&!s)&&0===n&&(!v||a[v]&&!a[v].active)&&!h){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),l.store.dispatch.island.handleResetIslandStore()}})),o.useEventListener("phone-island-conference-list-close",(function(){l.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),o.useEventListener("phone-island-conversations",(function(e){var n,t=Object.keys(e)[0];if(t===(null===(n=l.store.getState().currentUser)||void 0===n?void 0:n.username)){var i=e[t].conversations,r=l.store.getState().paramUrl,s=l.store.getState().island.urlOpened;if(!r.hasValidUrl||s)return;if("answered"===r.openParamUrlType&&i&&Object.keys(i).length>0){var a=i[Object.keys(i)[0]],o=l.store.getState().currentUser.default_device,c=!("desktop"===q&&"nethlink"===(null==o?void 0:o.type));if((null==a?void 0:a.connected)&&"in"===(null==a?void 0:a.direction)){var u=r.onlyQueues||!1,d=I.isFromTrunk(a.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(d),!0===u&&!0===(null==a?void 0:a.throughQueue)?he(a.counterpartNum,a.counterpartName,a.owner,a.uniqueId,c):!1!==u||!0!==d&&!0!==(null==a?void 0:a.throughQueue)||he(a.counterpartNum,a.counterpartName,a.owner,a.uniqueId,c)}}}})),k.default.createElement(k.default.Fragment,null,k.default.createElement(E.default,{store:l.store},P&&""!==P.trim()?k.default.createElement(r.WebRTC,{hostName:R,sipExten:P,sipSecret:V,sipHost:x,sipPort:J,reload:W,reloadedCallback:function(){return H(!0)},uaType:q},k.default.createElement(a.RestAPI,{hostName:R,username:A,authToken:O},k.default.createElement(i.Socket,{hostName:R,username:A,authToken:O,reload:W,reloadedCallback:function(){return G(!0)},uaType:q},k.default.createElement(t.Events,{sipHost:x},k.default.createElement(s.Island,{showAlways:N,uaType:q}))))):k.default.createElement(a.RestAPI,{hostName:R,username:A,authToken:O},k.default.createElement(i.Socket,{hostName:R,username:A,authToken:O,reload:W,reloadedCallback:function(){G(!0),H(!0)},uaType:q},k.default.createElement(t.Events,{sipHost:x},k.default.createElement(s.Island,{showAlways:N,uaType:q}))))))}));L.displayName="PhoneIslandComponent";var U=n.forwardRef((function(n,t){return k.default.createElement(L,e.__assign({},n,{ref:t}))}));U.displayName="PhoneIsland",exports.PhoneIsland=U;
|
|
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"),r=require("./components/WebRTC.js"),s=require("./components/Island.js"),a=require("./components/RestAPI.js"),o=require("./utils/customHooks/useEventListener.js"),c=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js"),d=require("./utils/genericFunctions/summaryEvents.js"),l=require("./store/index.js"),p=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 v=require("./node_modules/js-base64/base64.mjs.js"),h=require("./workers/wake_up.js"),f=require("./lib/i18n.js"),m=require("./lib/webrtc/messages.js"),g=require("./lib/darkTheme.js"),w=require("./utils/genericFunctions/isEmpty.js"),b=require("./utils/genericFunctions/checkConnection.js"),S=require("./utils/genericFunctions/isBackCallVisible.js"),I=require("./lib/phone/trunk.js"),y=require("./lib/phone/call.js"),E=require("./node_modules/react-redux/es/components/Provider.js");function D(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("./node_modules/react-redux/node_modules/react-is/index.js"),require("./node_modules/react-redux/es/components/Context.js");var k=D(n);if("undefined"!=typeof window&&window.location.hostname.includes(".support.my.")){var _=window.fetch;window.fetch=function(n,t){return _(n,e.__assign({credentials:"include"},t))}}var L=n.forwardRef((function(D,_){var L=D.dataConfig,U=D.showAlways,N=void 0!==U&&U,q=D.uaType,C=D.urlParamWithEvent,T=void 0!==C&&C,j=v.Base64.atob(L||"").split(":"),R=j[0],A=j[1],O=j[2],P=j[3],V=j[4],x=j[5],J=j[6],F=n.useState(!1),W=F[0],M=F[1],Q=n.useState(!1),z=Q[0],H=Q[1],$=n.useState(!1),B=$[0],G=$[1],K=n.useRef(0),X=n.useRef(null),Y=n.useRef(null);n.useImperativeHandle(_,(function(){return{reset:function(){console.info("PhoneIsland: Performing full component reset"),M(!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"),M(!0)),e=n}},t=new Worker(h.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(){B&&z&&(M(!1),H(!1),G(!1))}),[B,z]),n.useEffect((function(){var e=setInterval((function(){var e,n,t,i,r=l.store.getState().alerts.data,s=(null===(e=r.webrtc_down)||void 0===e?void 0:e.active)||!1,a=(null===(n=r.socket_down)||void 0===n?void 0:n.active)||!1,o=Date.now(),c=o-K.current,u=l.store.getState().webrtc.sipcall,d=l.store.getState().currentCall,p=d.accepted,v=d.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,m=navigator.onLine;if((s||a)&&!W&&c>1e4&&m){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:s,isSocketDown:a,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:s,isSocketDown:a}),K.current=o,M(!0)}}),1e3);return function(){return clearInterval(e)}}),[W]),o.useEventListener("phone-island-expand",(function(){l.store.dispatch.island.toggleIsOpen(!0),c.eventDispatch("phone-island-expanded",{})})),o.useEventListener("phone-island-compress",(function(){l.store.dispatch.island.toggleIsOpen(!1),c.eventDispatch("phone-island-compressed",{})})),o.useEventListener("phone-island-call-keypad-close",(function(){l.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-keypad-closed",{})})),o.useEventListener("phone-island-call-transfer-close",(function(){l.store.dispatch.island.setIslandView("call"),c.eventDispatch("phone-island-call-transfer-closed",{})})),o.useEventListener("phone-island-recording-close",(function(){l.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-recording-closed",{})})),o.useEventListener("phone-island-audio-player-close",(function(){l.store.dispatch.island.setIslandView(null),c.eventDispatch("phone-island-audio-player-closed",{})})),o.useEventListener("phone-island-emergency-stop-ringtone",(function(){null===l.store.getState().island.view?(console.warn("Emergency stop ringtone triggered - phone island inactive"),l.store.dispatch.player.emergencyStopAudioPlayer(),c.eventDispatch("phone-island-emergency-stop-ringtone-completed",{})):console.log("Phone island is active, ringtone stop ignored")})),o.useEventListener("phone-island-detach",(function(e){m.detach(),l.store.dispatch.webrtc.updateWebRTC({sipcall:null,registered:!1,isDetached:!0,jsepGlobal:null}),l.store.dispatch.webrtc.updateRemoteAudioStream(null),l.store.dispatch.webrtc.updateLocalAudioStream(null),l.store.dispatch.webrtc.updateLocalVideoStream(null),l.store.dispatch.webrtc.updateRemoteVideoStream(null),c.eventDispatch("phone-island-detached",{})})),o.useEventListener("phone-island-reload-component",(function(e){(null==e?void 0:e.force)&&l.store.dispatch.island.setForceReload(!0),M(!0)})),o.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,ue(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,de()]);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]}}))}))})),o.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,le(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,pe()]);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 Z=n.useState(!0),ee=Z[0],ne=Z[1],te=n.useState(!0),ie=te[0],re=te[1],se=n.useState(!1),ae=se[0],oe=se[1],ce=n.useSyncExternalStore(l.store.subscribe,(function(){return l.store.getState().fetchDefaults.fetchReady||!1}));n.useEffect((function(){ee&&(f.initI18n(),ne(!1))}),[ee]),n.useEffect((function(){ce&&!ae&&(oe(!0),e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,p.getParamUrl()];case 1:return n=e.sent(),t=(null==n?void 0:n.url)||"",i=t&&""!==t.trim(),l.store.dispatch.paramUrl.setParamUrl({url:t,onlyQueues:(null==n?void 0:n.only_queues)||!1,hasValidUrl:i}),[3,3];case 2:return r=e.sent(),console.warn("Non-blocking param URL fetch failed:",r),l.store.dispatch.paramUrl.setParamUrl({url:"",onlyQueues:!1,hasValidUrl:!1}),[3,3];case 3:return[2]}}))})))}),[ce,ae]);var ue=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]}}))}))},de=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;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 r=e.sent(),console.warn("Error getting default audio input device:",r),[2,"default"];case 3:return[2]}}))}))},le=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]}}))}))},pe=function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,t,i,r;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 r=e.sent(),console.warn("Error getting default video input device:",r),[2,"default"];case 3:return[2]}}))}))};o.useEventListener("phone-island-audio-output-change",(function(n){e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r,s,a,o,d,p,v;return e.__generator(this,(function(h){switch(h.label){case 0:return(null==(t=l.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,r;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 r=e.sent(),console.warn("Error getting default device:",r),[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:r=h.sent(),console.log("Direct setSinkId failed, trying with temporary stream:",r),h.label=6;case 6:return h.trys.push([6,7,,14]),s=new(window.AudioContext||window.webkitAudioContext),a=s.createOscillator(),o=s.createGain(),a.frequency.setValueAtTime(440,s.currentTime),o.gain.setValueAtTime(0,s.currentTime),a.connect(o),d=s.createMediaStreamDestination(),o.connect(d),t.current.srcObject=d.stream,a.start(),setTimeout((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n,r;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!"),a.stop(),s.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),a.stop(),s.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 r=e.sent(),console.error("Even default device failed:",r),[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}))}))})),o.useEventListener("phone-island-presence-change",(function(e){p.changeOperatorStatus(e),c.eventDispatch("phone-island-presence-changed",{})})),o.useEventListener("phone-island-view-changed",(function(e){var n=null==e?void 0:e.viewType;l.store.dispatch.island.setIslandView(n)}));var ve=l.store.getState().player.remoteAudio;n.useEffect((function(){var e;if(ie&&ve){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}),re(!1)}}),[ie,ve]),n.useEffect((function(){g.checkDarkTheme()}),[]),o.useEventListener("phone-island-theme-change",(function(e){g.setTheme(null==e?void 0:e.selectedTheme)})),o.useEventListener("phone-island-default-device-change",(function(e){l.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),c.eventDispatch("phone-island-default-device-changed",{})})),o.useEventListener("phone-island-alert",(function(e){l.store.dispatch.alerts.setAlert(e.toString())})),o.useEventListener("phone-island-ringing-tone-list",(function(){var e=l.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})})),o.useEventListener("phone-island-ringing-tone-select",(function(e){(null==e?void 0:e.name)&&(u.setJSONItem("phone-island-selected-ringtone",{value:e.name}),l.store.dispatch.ringtones.setSelectedRingtone(e.name),c.eventDispatch("phone-island-ringing-tone-selected",{name:e.name}))})),o.useEventListener("phone-island-ringing-tone-output",(function(e){(null==e?void 0:e.deviceId)&&(u.setJSONItem("phone-island-ringtone-output-device",{value:e.deviceId}),l.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)&&l.store.dispatch.ringtones.setSelectedRingtone(e.value),(null==n?void 0:n.value)&&l.store.dispatch.ringtones.setOutputDeviceId(n.value)}),[]),o.useEventListener("phone-island-check-connection",(function(){b.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))})),n.useEffect((function(){var e=setInterval((function(){b.checkInternetConnection().then((function(e){e?c.eventDispatch("phone-island-internet-connected",{}):c.eventDispatch("phone-island-internet-disconnected",{})}))}),5e3);return function(){return clearInterval(e)}}),[]),o.useEventListener("phone-island-main-presence",(function(e){var n,t,i,r,s=null===(n=l.store.getState().currentUser)||void 0===n?void 0:n.username,a=l.store.getState().currentUser,o=null==a?void 0:a.mainPresence;if(void 0!==s&&""!==s&&!w.isEmpty(e[s])&&void 0!==(null===(t=e[s])||void 0===t?void 0:t.mainPresence)){var u=null===(i=e[s])||void 0===i?void 0:i.mainPresence;l.store.dispatch.currentUser.updateMainPresence(null===(r=e[s])||void 0===r?void 0:r.mainPresence),"online"===u&&"online"!==o&&c.eventDispatch("phone-island-call-ended",{})}})),o.useEventListener("phone-island-call-status",(function(){var e=l.store.getState().currentCall;console.log("Call status debug informations: ",e)}));var he=function(e,n,t,i,r){var s=l.store.getState().paramUrl;if(null==s?void 0:s.hasValidUrl){var a=s.url||"";if(a){var o=l.store.getState().island.urlOpened,u=s.openParamUrlType;if(!o||"button"===u){var d=a;d.includes("$CALLER_NUMBER")&&e&&(d=d.replace(/\$CALLER_NUMBER/g,encodeURIComponent(e))),d.includes("$CALLER_NAME")&&n&&(d=d.replace(/\$CALLER_NAME/g,encodeURIComponent(n))),d.includes("$UNIQUEID")&&i&&(d=d.replace(/\$UNIQUEID/g,encodeURIComponent(i))),d.includes("$CALLED")&&t&&(d=d.replace(/\$CALLED/g,encodeURIComponent(t))),d.includes("{phone}")&&e&&(d=d.replace(/\{phone\}/g,encodeURIComponent(e)));var p=d.startsWith("http")?d:"https://".concat(d);if("mobile"!==q&&!T&&r){var v=window.open("about:blank","_blank");v&&(v.location.href=p,l.store.dispatch.island.setUrlOpened(!0))}else c.eventDispatch("phone-island-url-parameter-opened-external",{formattedUrl:p})}}}};return o.useEventListener("phone-island-already-opened-external-page",(function(){l.store.dispatch.island.setUrlOpened(!0)})),o.useEventListener("phone-island-url-parameter-opened",(function(e){var n=l.store.getState().paramUrl;if(n.hasValidUrl&&!l.store.getState().island.urlOpened){var t=n.onlyQueues||!1,i=I.isFromTrunk(null==e?void 0:e.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(i);var r=l.store.getState().currentUser.default_device,s=!("desktop"===q&&"nethlink"===(null==r?void 0:r.type));"in"===(null==e?void 0:e.direction)&&(!0===t&&!0===(null==e?void 0:e.throughQueue)?he(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,s):!1!==t||!0!==i&&!0!==(null==e?void 0:e.throughQueue)||he(null==e?void 0:e.counterpartNum,null==e?void 0:e.counterpartName,null==e?void 0:e.owner,null==e?void 0:e.linkedId,s))}})),o.useEventListener("phone-island-user-status",(function(){var e=l.store.getState().currentUser;console.log("User status debug informations: ",e)})),o.useEventListener("phone-island-all-users-status",(function(){var e=l.store.getState().users;console.log("Users status debug informations: ",e)})),o.useEventListener("phone-island-status",(function(){var e=l.store.getState().island;console.log("Phone island status debug informations: ",e)})),o.useEventListener("phone-island-webrtc-status",(function(){var e=l.store.getState().webrtc;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-player-status",(function(){var e=l.store.getState().player;console.log("Player status debug informations: ",e)})),o.useEventListener("phone-island-conference-status",(function(){var e=l.store.getState().conference;console.log("Webrtc status debug informations: ",e)})),o.useEventListener("phone-island-streaming-status",(function(){var e=l.store.getState().streaming;console.log("Streaming status debug informations: ",e)})),o.useEventListener("phone-island-paramurl-status",(function(){var e=l.store.getState().paramUrl;console.log("Paramurl status debug informations: ",e)})),o.useEventListener("phone-island-queue-status",(function(){var e=l.store.getState().queue;console.log("Queue status debug informations: ",e)})),o.useEventListener("phone-island-player-force-stop",(function(){l.store.dispatch.player.reset(),console.log("Audio player is interrupted")})),o.useEventListener("phone-island-stores-download",(function(){l.downloadStoresAsJSON(),c.eventDispatch("phone-island-stores-downloaded",{})})),o.useEventListener("phone-island-sideview-open",(function(){l.store.dispatch.island.toggleSideViewVisible(!0),l.store.dispatch.island.setUrlOpened(!1),c.eventDispatch("phone-island-sideview-opened",{})})),o.useEventListener("phone-island-sideview-close",(function(){l.store.dispatch.island.toggleSideViewVisible(!1),c.eventDispatch("phone-island-sideview-closed",{})})),o.useEventListener("phone-island-transcription-close",(function(){l.store.dispatch.island.toggleTranscriptionViewVisible(!1),(X.current||Y.current)&&(c.eventDispatch("phone-island-stop-transcription",{uniqueid:X.current,linkedid:Y.current}),X.current=null,Y.current=null),c.eventDispatch("phone-island-transcription-closed",{})})),o.useEventListener("phone-island-transcription-open",(function(e){var n=null==e?void 0:e.linkedid,t=null==e?void 0:e.uniqueid;(n||t)&&(Y.current=n||null,X.current=t||null,c.eventDispatch("phone-island-start-transcription",{linkedid:n,uniqueid:t}),l.store.dispatch.island.toggleTranscriptionViewVisible(!0),c.eventDispatch("phone-island-transcription-opened",{}))})),o.useEventListener("phone-island-init-audio",(function(){var e=l.store.getState().currentCall,n=e.accepted,t=e.incoming,i=e.outgoing,r=e.incomingWebRTC,s=e.incomingSocket;if(n||t||i||r||s)console.log("[AUDIO-WARMUP] Skipping audio warm-up: active call in progress");else if(x&&"string"==typeof x&&0!==x.length){var a=l.store.getState().currentUser.featureCodes,o=null==a?void 0:a.audio_test,c=o&&"string"==typeof o&&o.length>0?o:"*41";console.log("[AUDIO-WARMUP] Starting audio warm-up test call",{codeToCall:c,SIP_HOST:x}),y.callNumber(c,x)}else console.warn("[AUDIO-WARMUP] Skipping audio warm-up: SIP_HOST not available",{SIP_HOST:x})})),o.useEventListener("phone-island-transcription-toggle",(function(){var e=!l.store.getState().island.transcriptionViewIsVisible;l.store.dispatch.island.toggleTranscriptionViewVisible(e),c.eventDispatch(e?"phone-island-transcription-opened":"phone-island-transcription-closed",{})})),o.useEventListener("phone-island-summary-call-check",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r,s,a,o,c,u,p,v,h;return e.__generator(this,(function(e){switch(e.label){case 0:return t=(null==n?void 0:n.linkedid)||(null==n?void 0:n.linkedId),i=(null==n?void 0:n.uniqueid)||(null==n?void 0:n.uniqueId),t?i?(r=l.store.getState().conference,s=r.isActive,a=r.usersList,o=r.conferenceStartedFrom,c=l.store.getState().currentUser,u=c.name,p=c.username,v=s&&(o===p||!!a&&Object.values(a).some((function(e){return e.name===u}))),v?[2]:[4,new Promise((function(e){return setTimeout(e,1e3)}))]):(console.warn("[Summary Check] No unique identifier provided"),[2]):(console.warn("[Summary Check] No call identifier provided"),[2]);case 1:e.sent(),e.label=2;case 2:return e.trys.push([2,5,,6]),[4,Promise.resolve().then((function(){return require("./services/user.js")}))];case 3:return[4,(0,e.sent().checkSummaryCall)(i,t)];case 4:return e.sent(),d.dispatchSummaryReady({linkedid:t,uniqueid:i,source:"check"}),[3,6];case 5:return 204===(null==(h=e.sent())?void 0:h.status)?(console.log("[Summary Check] Summary not ready for ".concat(t)),d.dispatchSummaryNotReady({linkedid:t,uniqueid:i,source:"check"})):console.warn("[Summary Check] Non-blocking summary check failed:",h),[3,6];case 6:return[2]}}))}))})),o.useEventListener("phone-island-call-summary-notify",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,i,r;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=null==n?void 0:n.linkedid,i=null==n?void 0:n.uniqueid,!t)return console.warn("[Summary Notify] No call identifier provided"),[2];if(!i)return console.warn("[Summary Notify] No unique identifier provided"),[2];e.label=1;case 1:return e.trys.push([1,4,,5]),[4,Promise.resolve().then((function(){return require("./services/user.js")}))];case 2:return[4,(0,e.sent().watchSummaryCall)(t,i)];case 3:return e.sent(),c.eventDispatch("phone-island-summary-call-notified",{linkedid:t,uniqueid:i}),[3,5];case 4:return r=e.sent(),console.warn("[Summary Check] Non-blocking summary watch failed:",r),[3,5];case 5:return[2]}}))}))})),o.useEventListener("phone-island-size-change",(function(n){var t=l.store.getState().island,i=t.sideViewIsVisible,r=t.transcriptionViewIsVisible,s=t.actionsExpanded,a=n.sizeInformation,o=e.__assign(e.__assign({},a),{right:i?"42px":"0px",top:S.isBackCallActive()?"40px":"0px",bottomTranscription:r&&s?"335px":r&&!s?"330px":"0px"});c.eventDispatch("phone-island-size-changed",{sizes:o})})),o.useEventListener("phone-island-call-ended",(function(){if("online"===l.store.getState().currentUser.mainPresence){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),l.store.dispatch.island.handleResetIslandStore(),l.store.dispatch.paramUrl.setThroughTrunk(!1)}})),o.useEventListener("phone-island-conference-list-open",(function(){l.store.dispatch.island.toggleConferenceList(!0),c.eventDispatch("phone-island-conference-list-opened",{})})),o.useEventListener("phone-island-alert-removed",(function(e){var n=l.store.getState().alerts.status.activeAlertsCount,t=l.store.getState().island,i=t.view,r=t.previousView,s=l.store.getState().conference.isActive,a=l.store.getState().alerts.data,o=l.store.getState().currentCall,u=o.incoming,d=o.outgoing,p=o.accepted,v=null==e?void 0:e.type,h=o.incoming||o.outgoing||o.accepted||""!==o.conversationId;if(!(u||d||p||n>0||"player"===i||"recorder"===i||"physicalPhoneRecorder"===i||"waitingConference"===i&&s||"transfer"===i&&s||"settings"===i&&s||"settings"===i&&("recorder"===r||"player"===r)||"operatorBusy"===i&&!s)&&0===n&&(!v||a[v]&&!a[v].active)&&!h){c.eventDispatch("phone-island-size-change",{sizeInformation:{width:"0px",height:"0px"}}),c.eventDispatch("phone-island-sideview-close",{}),l.store.dispatch.island.handleResetIslandStore()}})),o.useEventListener("phone-island-conference-list-close",(function(){l.store.dispatch.island.toggleConferenceList(!1),c.eventDispatch("phone-island-conference-list-closed",{})})),o.useEventListener("phone-island-conversations",(function(e){var n,t=Object.keys(e)[0];if(t===(null===(n=l.store.getState().currentUser)||void 0===n?void 0:n.username)){var i=e[t].conversations,r=l.store.getState().paramUrl,s=l.store.getState().island.urlOpened;if(!r.hasValidUrl||s)return;if("answered"===r.openParamUrlType&&i&&Object.keys(i).length>0){var a=i[Object.keys(i)[0]],o=l.store.getState().currentUser.default_device,c=!("desktop"===q&&"nethlink"===(null==o?void 0:o.type));if((null==a?void 0:a.connected)&&"in"===(null==a?void 0:a.direction)){var u=r.onlyQueues||!1,d=I.isFromTrunk(a.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(d),!0===u&&!0===(null==a?void 0:a.throughQueue)?he(a.counterpartNum,a.counterpartName,a.owner,a.uniqueId,c):!1!==u||!0!==d&&!0!==(null==a?void 0:a.throughQueue)||he(a.counterpartNum,a.counterpartName,a.owner,a.uniqueId,c)}}}})),k.default.createElement(k.default.Fragment,null,k.default.createElement(E.default,{store:l.store},P&&""!==P.trim()?k.default.createElement(r.WebRTC,{hostName:R,sipExten:P,sipSecret:V,sipHost:x,sipPort:J,reload:W,reloadedCallback:function(){return H(!0)},uaType:q},k.default.createElement(a.RestAPI,{hostName:R,username:A,authToken:O},k.default.createElement(i.Socket,{hostName:R,username:A,authToken:O,reload:W,reloadedCallback:function(){return G(!0)},uaType:q},k.default.createElement(t.Events,{sipHost:x},k.default.createElement(s.Island,{showAlways:N,uaType:q}))))):k.default.createElement(a.RestAPI,{hostName:R,username:A,authToken:O},k.default.createElement(i.Socket,{hostName:R,username:A,authToken:O,reload:W,reloadedCallback:function(){G(!0),H(!0)},uaType:q},k.default.createElement(t.Events,{sipHost:x},k.default.createElement(s.Island,{showAlways:N,uaType:q}))))))}));L.displayName="PhoneIslandComponent";var U=n.forwardRef((function(n,t){return k.default.createElement(L,e.__assign({},n,{ref:t}))}));U.displayName="PhoneIsland",exports.PhoneIsland=U;
|
|
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, {\n useState,\n useEffect,\n forwardRef,\n useImperativeHandle,\n useRef,\n useSyncExternalStore,\n} 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\n// Enable cookie sending for cross-origin requests when behind the support proxy\nif (typeof window !== 'undefined' && window.location.hostname.includes('.support.my.')) {\n const originalFetch = window.fetch\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit) {\n return originalFetch(input, { credentials: 'include', ...init })\n }\n}\n\nimport {\n useEventListener,\n eventDispatch,\n setJSONItem,\n getJSONItem,\n dispatchSummaryReady,\n dispatchSummaryNotReady,\n} 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 const activeTranscriptionUniqueIdRef = useRef<string | null>(null)\n const activeTranscriptionLinkedIdRef = useRef<string | null>(null)\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 store.dispatch.webrtc.updateWebRTC({\n sipcall: null,\n registered: false,\n isDetached: true,\n jsepGlobal: null,\n })\n store.dispatch.webrtc.updateRemoteAudioStream(null)\n store.dispatch.webrtc.updateLocalAudioStream(null)\n store.dispatch.webrtc.updateLocalVideoStream(null)\n store.dispatch.webrtc.updateRemoteVideoStream(null)\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 const [paramUrlInitialized, setParamUrlInitialized] = useState(false)\n const fetchReady = useSyncExternalStore(\n store.subscribe,\n () => store.getState().fetchDefaults.fetchReady || false,\n )\n\n // Initialize application on first render\n useEffect(() => {\n if (firstRender) {\n // Initialize i18n\n initI18n()\n setFirstRender(false)\n }\n }, [firstRender])\n\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 store.dispatch.paramUrl.setParamUrl({\n url,\n onlyQueues: paramUrlResponse?.only_queues || false,\n hasValidUrl: isValid,\n })\n } catch (error) {\n console.warn('Non-blocking param URL fetch failed:', error)\n store.dispatch.paramUrl.setParamUrl({\n url: '',\n onlyQueues: false,\n hasValidUrl: false,\n })\n }\n }\n\n if (!fetchReady || paramUrlInitialized) {\n return\n }\n\n setParamUrlInitialized(true)\n initParamUrl()\n }, [fetchReady, paramUrlInitialized])\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', (data: any) => {\n setTheme(data?.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', (data: any) => {\n store.dispatch.alerts.setAlert(data.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-queue-status', () => {\n const queueInformation = store.getState().queue\n console.log('Queue status debug informations: ', queueInformation)\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 if (activeTranscriptionUniqueIdRef.current || activeTranscriptionLinkedIdRef.current) {\n eventDispatch('phone-island-stop-transcription', {\n uniqueid: activeTranscriptionUniqueIdRef.current,\n linkedid: activeTranscriptionLinkedIdRef.current,\n })\n activeTranscriptionUniqueIdRef.current = null\n activeTranscriptionLinkedIdRef.current = null\n }\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-open', (data: { linkedid?: string; uniqueid?: string }) => {\n const linkedid = data?.linkedid\n const uniqueid = data?.uniqueid\n if (!linkedid && !uniqueid) {\n return\n }\n activeTranscriptionLinkedIdRef.current = linkedid || null\n activeTranscriptionUniqueIdRef.current = uniqueid || null\n eventDispatch('phone-island-start-transcription', {\n linkedid,\n uniqueid,\n })\n store.dispatch.island.toggleTranscriptionViewVisible(true)\n eventDispatch('phone-island-transcription-opened', {})\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 // Check if call summary/transcription exists\n useEventListener(\n 'phone-island-summary-call-check',\n async (data: { linkedid?: string; uniqueid?: string; linkedId?: string; uniqueId?: string }) => {\n const linkedid = data?.linkedid || data?.linkedId\n const uniqueid = data?.uniqueid || data?.uniqueId\n if (!linkedid) {\n console.warn('[Summary Check] No call identifier provided')\n return\n }\n\n if (!uniqueid) {\n console.warn('[Summary Check] No unique identifier provided')\n return\n }\n\n const { isActive, usersList, conferenceStartedFrom } = store.getState().conference\n const { name, username } = store.getState().currentUser\n const isUserInConference =\n isActive &&\n (conferenceStartedFrom === username ||\n (!!usersList && Object.values(usersList).some((user: any) => user.name === name)))\n\n if (isUserInConference) {\n return\n }\n\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n try {\n const { checkSummaryCall } = await import('./services/user')\n await checkSummaryCall(uniqueid)\n dispatchSummaryReady({\n linkedid,\n uniqueid,\n source: 'check',\n })\n } catch (error: any) {\n // 204 means summary not present yet - not an error, just not ready\n if (error?.status === 204) {\n console.log(`[Summary Check] Summary not ready for ${linkedid}`)\n dispatchSummaryNotReady({\n linkedid,\n uniqueid,\n source: 'check',\n })\n } else {\n console.warn('[Summary Check] Non-blocking summary check failed:', error)\n }\n }\n },\n )\n\n // Watch for call summary/transcription notifications\n useEventListener(\n 'phone-island-call-summary-notify',\n async (data: { linkedid?: string; uniqueid?: string }) => {\n const linkedid = data?.linkedid\n const uniqueid = data?.uniqueid\n\n if (!linkedid) {\n console.warn('[Summary Notify] No call identifier provided')\n return\n }\n\n if (!uniqueid) {\n console.warn('[Summary Notify] No unique identifier provided')\n return\n }\n\n try {\n const { watchSummaryCall } = await import('./services/user')\n await watchSummaryCall(linkedid, uniqueid)\n\n eventDispatch('phone-island-summary-call-notified', {\n linkedid,\n uniqueid,\n })\n } catch (error) {\n console.warn('[Summary Check] Non-blocking summary watch failed:', error)\n }\n },\n )\n\n useEventListener('phone-island-size-change', (data: any) => {\n const { sideViewIsVisible, transcriptionViewIsVisible, actionsExpanded } =\n store.getState().island\n\n // Get current dimensions from data\n const { sizeInformation } = data\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', (data) => {\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 = data?.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 const { default_device } = store.getState().currentUser\n const automatic = !(uaType === 'desktop' && default_device?.type === 'nethlink')\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 automatic\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 automatic\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":["window","location","hostname","includes","originalFetch_1","fetch","input","init","__assign","credentials","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","activeTranscriptionUniqueIdRef","activeTranscriptionLinkedIdRef","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","updateWebRTC","registered","isDetached","jsepGlobal","updateRemoteAudioStream","updateLocalAudioStream","updateLocalVideoStream","updateRemoteVideoStream","force","setForceReload","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","getDefaultAudioInputDevice","setJSONItem","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","_j","paramUrlInitialized","setParamUrlInitialized","fetchReady","useSyncExternalStore","subscribe","fetchDefaults","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","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","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","stop","close","error","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","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","replace","encodeURIComponent","formattedUrl","startsWith","newWindow","open","href","setUrlOpened","throughTrunk","isFromTrunk","counterpartNum","setThroughTrunk","default_device","direction","throughQueue","counterpartName","owner","linkedId","userInformation","allUsersInformation","users","phoneIslandInformation","webrtcInformation","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","queueInformation","queue","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","uniqueid","linkedid","incoming","incomingWebRTC","incomingSocket","length","featureCodes","audioTestCode","audio_test","codeToCall","callNumber","newState","transcriptionViewIsVisible","isActive","usersList","conferenceStartedFrom","isUserInConference","Object","values","user","Promise","resolve","checkSummaryCall","dispatchSummaryReady","source","error_2","status","dispatchSummaryNotReady","watchSummaryCall","error_3","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","right","top","isBackCallActive","bottomTranscription","sizes","width","height","handleResetIslandStore","toggleConferenceList","activeAlertsCount","previousView","alertsData","alertType","isInCall","conversationId","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, {\n useState,\n useEffect,\n forwardRef,\n useImperativeHandle,\n useRef,\n useSyncExternalStore,\n} 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\n// Enable cookie sending for cross-origin requests when behind the support proxy\nif (typeof window !== 'undefined' && window.location.hostname.includes('.support.my.')) {\n const originalFetch = window.fetch\n window.fetch = function (input: RequestInfo | URL, init?: RequestInit) {\n return originalFetch(input, { credentials: 'include', ...init })\n }\n}\n\nimport {\n useEventListener,\n eventDispatch,\n setJSONItem,\n getJSONItem,\n dispatchSummaryReady,\n dispatchSummaryNotReady,\n} 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 const activeTranscriptionUniqueIdRef = useRef<string | null>(null)\n const activeTranscriptionLinkedIdRef = useRef<string | null>(null)\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 store.dispatch.webrtc.updateWebRTC({\n sipcall: null,\n registered: false,\n isDetached: true,\n jsepGlobal: null,\n })\n store.dispatch.webrtc.updateRemoteAudioStream(null)\n store.dispatch.webrtc.updateLocalAudioStream(null)\n store.dispatch.webrtc.updateLocalVideoStream(null)\n store.dispatch.webrtc.updateRemoteVideoStream(null)\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 const [paramUrlInitialized, setParamUrlInitialized] = useState(false)\n const fetchReady = useSyncExternalStore(\n store.subscribe,\n () => store.getState().fetchDefaults.fetchReady || false,\n )\n\n // Initialize application on first render\n useEffect(() => {\n if (firstRender) {\n // Initialize i18n\n initI18n()\n setFirstRender(false)\n }\n }, [firstRender])\n\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 store.dispatch.paramUrl.setParamUrl({\n url,\n onlyQueues: paramUrlResponse?.only_queues || false,\n hasValidUrl: isValid,\n })\n } catch (error) {\n console.warn('Non-blocking param URL fetch failed:', error)\n store.dispatch.paramUrl.setParamUrl({\n url: '',\n onlyQueues: false,\n hasValidUrl: false,\n })\n }\n }\n\n if (!fetchReady || paramUrlInitialized) {\n return\n }\n\n setParamUrlInitialized(true)\n initParamUrl()\n }, [fetchReady, paramUrlInitialized])\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', (data: any) => {\n setTheme(data?.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', (data: any) => {\n store.dispatch.alerts.setAlert(data.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-queue-status', () => {\n const queueInformation = store.getState().queue\n console.log('Queue status debug informations: ', queueInformation)\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 if (activeTranscriptionUniqueIdRef.current || activeTranscriptionLinkedIdRef.current) {\n eventDispatch('phone-island-stop-transcription', {\n uniqueid: activeTranscriptionUniqueIdRef.current,\n linkedid: activeTranscriptionLinkedIdRef.current,\n })\n activeTranscriptionUniqueIdRef.current = null\n activeTranscriptionLinkedIdRef.current = null\n }\n eventDispatch('phone-island-transcription-closed', {})\n })\n\n useEventListener('phone-island-transcription-open', (data: { linkedid?: string; uniqueid?: string }) => {\n const linkedid = data?.linkedid\n const uniqueid = data?.uniqueid\n if (!linkedid && !uniqueid) {\n return\n }\n activeTranscriptionLinkedIdRef.current = linkedid || null\n activeTranscriptionUniqueIdRef.current = uniqueid || null\n eventDispatch('phone-island-start-transcription', {\n linkedid,\n uniqueid,\n })\n store.dispatch.island.toggleTranscriptionViewVisible(true)\n eventDispatch('phone-island-transcription-opened', {})\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 // Check if call summary/transcription exists\n useEventListener(\n 'phone-island-summary-call-check',\n async (data: { linkedid?: string; uniqueid?: string; linkedId?: string; uniqueId?: string }) => {\n const linkedid = data?.linkedid || data?.linkedId\n const uniqueid = data?.uniqueid || data?.uniqueId\n if (!linkedid) {\n console.warn('[Summary Check] No call identifier provided')\n return\n }\n\n if (!uniqueid) {\n console.warn('[Summary Check] No unique identifier provided')\n return\n }\n\n const { isActive, usersList, conferenceStartedFrom } = store.getState().conference\n const { name, username } = store.getState().currentUser\n const isUserInConference =\n isActive &&\n (conferenceStartedFrom === username ||\n (!!usersList && Object.values(usersList).some((user: any) => user.name === name)))\n\n if (isUserInConference) {\n return\n }\n\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n try {\n const { checkSummaryCall } = await import('./services/user')\n await checkSummaryCall(uniqueid, linkedid)\n dispatchSummaryReady({\n linkedid,\n uniqueid,\n source: 'check',\n })\n } catch (error: any) {\n // 204 means summary not present yet - not an error, just not ready\n if (error?.status === 204) {\n console.log(`[Summary Check] Summary not ready for ${linkedid}`)\n dispatchSummaryNotReady({\n linkedid,\n uniqueid,\n source: 'check',\n })\n } else {\n console.warn('[Summary Check] Non-blocking summary check failed:', error)\n }\n }\n },\n )\n\n // Watch for call summary/transcription notifications\n useEventListener(\n 'phone-island-call-summary-notify',\n async (data: { linkedid?: string; uniqueid?: string }) => {\n const linkedid = data?.linkedid\n const uniqueid = data?.uniqueid\n\n if (!linkedid) {\n console.warn('[Summary Notify] No call identifier provided')\n return\n }\n\n if (!uniqueid) {\n console.warn('[Summary Notify] No unique identifier provided')\n return\n }\n\n try {\n const { watchSummaryCall } = await import('./services/user')\n await watchSummaryCall(linkedid, uniqueid)\n\n eventDispatch('phone-island-summary-call-notified', {\n linkedid,\n uniqueid,\n })\n } catch (error) {\n console.warn('[Summary Check] Non-blocking summary watch failed:', error)\n }\n },\n )\n\n useEventListener('phone-island-size-change', (data: any) => {\n const { sideViewIsVisible, transcriptionViewIsVisible, actionsExpanded } =\n store.getState().island\n\n // Get current dimensions from data\n const { sizeInformation } = data\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', (data) => {\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 = data?.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 const { default_device } = store.getState().currentUser\n const automatic = !(uaType === 'desktop' && default_device?.type === 'nethlink')\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 automatic\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 automatic\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":["window","location","hostname","includes","originalFetch_1","fetch","input","init","__assign","credentials","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","activeTranscriptionUniqueIdRef","activeTranscriptionLinkedIdRef","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","updateWebRTC","registered","isDetached","jsepGlobal","updateRemoteAudioStream","updateLocalAudioStream","updateLocalVideoStream","updateRemoteVideoStream","force","setForceReload","__awaiter","targetDeviceId","deviceId","isAudioInputDeviceAvailable","sent","getDefaultAudioInputDevice","setJSONItem","concat","isVideoInputDeviceAvailable","getDefaultVideoInputDevice","_g","firstRender","setFirstRender","_h","firstAudioOutputInit","setFirstAudioOutputInit","_j","paramUrlInitialized","setParamUrlInitialized","fetchReady","useSyncExternalStore","subscribe","fetchDefaults","initI18n","getParamUrl","paramUrlResponse","url","isValid","trim","paramUrl","setParamUrl","onlyQueues","only_queues","hasValidUrl","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","AudioContext","webkitAudioContext","oscillator_1","createOscillator","gainNode","createGain","frequency","setValueAtTime","currentTime","gain","connect","destination","createMediaStreamDestination","srcObject","stream","start","stop","close","error","finalErr_1","defaultErr_2","streamErr_1","defaultErr_1","changeOperatorStatus","viewType","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","setTheme","selectedTheme","currentUser","updateCurrentDefaultDevice","deviceInformationObject","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","replace","encodeURIComponent","formattedUrl","startsWith","newWindow","open","href","setUrlOpened","throughTrunk","isFromTrunk","counterpartNum","setThroughTrunk","default_device","direction","throughQueue","counterpartName","owner","linkedId","userInformation","allUsersInformation","users","phoneIslandInformation","webrtcInformation","playerInformation","conferenceInformation","conference","streamingInformation","streaming","paramurl","queueInformation","queue","downloadStoresAsJSON","toggleSideViewVisible","toggleTranscriptionViewVisible","uniqueid","linkedid","incoming","incomingWebRTC","incomingSocket","length","featureCodes","audioTestCode","audio_test","codeToCall","callNumber","newState","transcriptionViewIsVisible","isActive","usersList","conferenceStartedFrom","isUserInConference","Object","values","user","Promise","resolve","checkSummaryCall","dispatchSummaryReady","source","error_2","status","dispatchSummaryNotReady","watchSummaryCall","error_3","sideViewIsVisible","actionsExpanded","sizeInformation","updatedSizeInformation","right","top","isBackCallActive","bottomTranscription","sizes","width","height","handleResetIslandStore","toggleConferenceList","activeAlertsCount","previousView","alertsData","alertType","isInCall","conversationId","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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"}
|
package/dist/_virtual/index8.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0})
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.exports={};var e={get exports(){return exports.exports},set exports(e){exports.exports=e}};exports.__module=e;
|
|
2
2
|
//# sourceMappingURL=index8.js.map
|
package/dist/_virtual/index9.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0})
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.__exports={};
|
|
2
2
|
//# sourceMappingURL=index9.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("../../node_modules/mic-check/lib/index.js");var e=require("../webrtc/janus.js"),i=require("../../store/index.js"),r=require("../user/default_device.js");require("react");var t=require("../../utils/genericFunctions/localStorage.js");require("../../node_modules/tslib/tslib.es6.js");var n=require("../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("../../node_modules/mic-check/lib/index.js");var e=require("../webrtc/janus.js"),i=require("../../store/index.js"),r=require("../user/default_device.js");require("react");var t=require("../../utils/genericFunctions/localStorage.js");require("../../node_modules/tslib/tslib.es6.js");var n=require("../../_virtual/index9.js"),o=e.default;exports.checkMediaPermissions=function(){if(r.isPhysical())return i.store.dispatch.alerts.removeAlert("browser_permissions"),i.store.dispatch.alerts.removeAlert("user_permissions"),i.store.dispatch.alerts.removeAlert("busy_camera"),void i.store.dispatch.alerts.removeAlert("unknown_media_permissions");n.__exports.requestMediaPermissions({audio:!0}).then((function(){})).catch((function(e){var r,t,s=e.type,d=null!==(t=((r={})[n.__exports.MediaPermissionsErrorType.SystemPermissionDenied]={alert:"browser_permissions",message:"WebRTC: browser does not have permission to access camera or microphone"},r[n.__exports.MediaPermissionsErrorType.UserPermissionDenied]={alert:"user_permissions",message:"WebRTC: user didn't allow app to access camera or microphone"},r)[s])&&void 0!==t?t:{alert:"unknown_media_permissions",message:"WebRTC: can't access audio or camera on this device. unknown error"};i.store.dispatch.alerts.setAlert(d.alert),o.error&&o.error(d.message)}))},exports.checkWebCamPermission=function(){return new Promise((function(e){n.__exports.requestMediaPermissions({video:!0}).then((function(){e(!0)})).catch((function(i){console.error("Error requesting webcam permission:",i),e(!1)}))}))},exports.getCurrentAudioInputDeviceId=function(){var e=t.getJSONItem("phone-island-audio-input-device").deviceId||null,r=i.store.select.mediaDevices.audioInputDevices(i.store.getState());if(r.find((function(i){return i.deviceId===e})))return e;var n=r.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||r[0],o=n?n.deviceId:"default";return null!==e&&o!==e&&(console.warn("Audio input device ".concat(e," no longer available, falling back to default device")),t.setJSONItem("phone-island-audio-input-device",{deviceId:o})),o},exports.getCurrentAudioOutputDeviceId=function(){var e=t.getJSONItem("phone-island-audio-output-device").deviceId||null,r=i.store.select.mediaDevices.audioOutputDevices(i.store.getState());if(r.find((function(i){return i.deviceId===e})))return e;var n=r.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||r[0],o=n?n.deviceId:"default";return null!==e&&o!==e&&(console.warn("Audio output device ".concat(e," no longer available, falling back to default device")),t.setJSONItem("phone-island-audio-output-device",{deviceId:o})),o},exports.getCurrentVideoInputDeviceId=function(){var e=t.getJSONItem("phone-island-video-input-device").deviceId||null,r=i.store.select.mediaDevices.videoInputDevices(i.store.getState());if(r.find((function(i){return i.deviceId===e})))return e;var n=r.find((function(e){return"default"===e.deviceId||""===e.deviceId}))||r[0],o=n?n.deviceId:"default";return null!==e&&o!==e&&(console.warn("Video input device ".concat(e," no longer available, falling back to default device")),t.setJSONItem("phone-island-video-input-device",{deviceId:o})),o},exports.getSupportedDevices=function(e){var i,r,t=!1,n=!1,s=!1,d=!1;i=function(){var i={audio:t,audioCap:s,video:n,videoCap:d};o.log&&o.log("supportedDevices=",i),e()},r=[],navigator.mediaDevices.enumerateDevices().then((function(e){e.forEach((function(e){var i=!1;r.forEach((function(r){r.deviceId===e.deviceId&&r.kind===e.kind&&(i=!0)})),i||("videoinput"!==e.kind||d||(d=!0),"audioinput"!==e.kind||s||(s=!0),"audioinput"===e.kind&&(t=!0),e.kind,"videoinput"===e.kind&&(n=!0),r.push(e))})),i&&i()}))};
|
|
2
2
|
//# sourceMappingURL=devices.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("../fontawesome-svg-core/index.mjs.js");require("../../prop-types/index.js");var e=require("react"),r=require("../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("../fontawesome-svg-core/index.mjs.js");require("../../prop-types/index.js");var e=require("react"),r=require("../../../_virtual/index7.js");function o(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=o(e);function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,o=Array(e);r<e;r++)o[r]=t[r];return o}function i(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var o=r.call(t,e||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function s(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,o)}return r}function l(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?s(Object(r),!0).forEach((function(e){i(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):s(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function f(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var o,n,a,i,s=[],l=!0,f=!1;try{if(a=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(o=a.call(r)).done)&&(s.push(o.value),s.length!==e);l=!0);}catch(t){f=!0,n=t}finally{try{if(!l&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(f)throw n}}return s}}(t,e)||p(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||p(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function p(t,e){if(t){if("string"==typeof t)return a(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?a(t,e):void 0}}var b;try{var y=require("@fortawesome/fontawesome-svg-core/package.json");b=y.version}catch(t){b="undefined"!=typeof process&&process.env.FA_VERSION||"7.0.0"}function m(t){var e=t.beat,r=t.fade,o=t.beatFade,n=t.bounce,a=t.shake,s=t.flash,l=t.spin,u=t.spinPulse,c=t.spinReverse,p=t.pulse,y=t.fixedWidth,m=t.inverse,d=t.border,x=t.listItem,v=t.flip,h=t.size,g=t.rotation,O=t.pull,w=t.swapOpacity,j=t.rotateBy,A=t.widthAuto,I=function(t,e){for(var r=f(t.split("-"),2),o=r[0],n=r[1],a=f(e.split("-"),2),i=a[0],s=a[1],l=o.split("."),u=i.split("."),c=0;c<Math.max(l.length,u.length);c++){var p=l[c]||"0",b=u[c]||"0",y=parseInt(p,10),m=parseInt(b,10);if(y!==m)return y>m}for(var d=0;d<Math.max(l.length,u.length);d++){var x=l[d]||"0",v=u[d]||"0";if(x!==v&&x.length!==v.length)return x.length<v.length}return!(n&&!s)}(b,"7.0.0"),k=i(i(i(i(i(i({"fa-beat":e,"fa-fade":r,"fa-beat-fade":o,"fa-bounce":n,"fa-shake":a,"fa-flash":s,"fa-spin":l,"fa-spin-reverse":c,"fa-spin-pulse":u,"fa-pulse":p,"fa-fw":y,"fa-inverse":m,"fa-border":d,"fa-li":x,"fa-flip":!0===v,"fa-flip-horizontal":"horizontal"===v||"both"===v,"fa-flip-vertical":"vertical"===v||"both"===v},"fa-".concat(h),null!=h),"fa-rotate-".concat(g),null!=g&&0!==g),"fa-pull-".concat(O),null!=O),"fa-swap-opacity",w),"fa-rotate-by",I&&j),"fa-width-auto",I&&A);return Object.keys(k).map((function(t){return k[t]?t:null})).filter((function(t){return t}))}function d(t){return e=t,(e-=0)==e?t:(t=t.replace(/[\-_\s]+(.)?/g,(function(t,e){return e?e.toUpperCase():""}))).substr(0,1).toLowerCase()+t.substr(1);var e}var x=["style"];var v=!1;try{v="production"===process.env.NODE_ENV}catch(t){}function h(e){return e&&"object"===c(e)&&e.prefix&&e.iconName&&e.icon?e:t.parse.icon?t.parse.icon(e):null===e?null:e&&"object"===c(e)&&e.prefix&&e.iconName?e:Array.isArray(e)&&2===e.length?{prefix:e[0],iconName:e[1]}:"string"==typeof e?{prefix:"fas",iconName:e}:void 0}function g(t,e){return Array.isArray(e)&&e.length>0||!Array.isArray(e)&&e?i({},t,e):{}}var O={border:!1,className:"",mask:null,maskId:null,fixedWidth:!1,inverse:!1,flip:!1,icon:null,listItem:!1,pull:null,pulse:!1,rotation:null,rotateBy:!1,size:null,spin:!1,spinPulse:!1,spinReverse:!1,beat:!1,fade:!1,beatFade:!1,bounce:!1,shake:!1,symbol:!1,title:"",titleId:null,transform:null,swapOpacity:!1,widthAuto:!1},w=n.default.forwardRef((function(e,r){var o=l(l({},O),e),n=o.icon,a=o.mask,i=o.symbol,s=o.className,f=o.title,c=o.titleId,p=o.maskId,b=h(n),y=g("classes",[].concat(u(m(o)),u((s||"").split(" ")))),d=g("transform","string"==typeof o.transform?t.parse.transform(o.transform):o.transform),x=g("mask",h(a)),w=t.icon(b,l(l(l(l({},y),d),x),{},{symbol:i,title:f,titleId:c,maskId:p}));if(!w)return function(){var t;!v&&console&&"function"==typeof console.error&&(t=console).error.apply(t,arguments)}("Could not find icon",b),null;var A=w.abstract,I={ref:r};return Object.keys(o).forEach((function(t){O.hasOwnProperty(t)||(I[t]=o[t])})),j(A[0],I)}));w.displayName="FontAwesomeIcon",w.propTypes={beat:r.exports.bool,border:r.exports.bool,beatFade:r.exports.bool,bounce:r.exports.bool,className:r.exports.string,fade:r.exports.bool,flash:r.exports.bool,mask:r.exports.oneOfType([r.exports.object,r.exports.array,r.exports.string]),maskId:r.exports.string,fixedWidth:r.exports.bool,inverse:r.exports.bool,flip:r.exports.oneOf([!0,!1,"horizontal","vertical","both"]),icon:r.exports.oneOfType([r.exports.object,r.exports.array,r.exports.string]),listItem:r.exports.bool,pull:r.exports.oneOf(["right","left"]),pulse:r.exports.bool,rotation:r.exports.oneOf([0,90,180,270]),rotateBy:r.exports.bool,shake:r.exports.bool,size:r.exports.oneOf(["2xs","xs","sm","lg","xl","2xl","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:r.exports.bool,spinPulse:r.exports.bool,spinReverse:r.exports.bool,symbol:r.exports.oneOfType([r.exports.bool,r.exports.string]),title:r.exports.string,titleId:r.exports.string,transform:r.exports.oneOfType([r.exports.string,r.exports.object]),swapOpacity:r.exports.bool,widthAuto:r.exports.bool};var j=function t(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"==typeof r)return r;var n=(r.children||[]).map((function(r){return t(e,r)})),a=Object.keys(r.attributes||{}).reduce((function(t,e){var o=r.attributes[e];switch(e){case"class":t.attrs.className=o,delete r.attributes.class;break;case"style":t.attrs.style=o.split(";").map((function(t){return t.trim()})).filter((function(t){return t})).reduce((function(t,e){var r,o=e.indexOf(":"),n=d(e.slice(0,o)),a=e.slice(o+1).trim();return n.startsWith("webkit")?t[(r=n,r.charAt(0).toUpperCase()+r.slice(1))]=a:t[n]=a,t}),{});break;default:0===e.indexOf("aria-")||0===e.indexOf("data-")?t.attrs[e.toLowerCase()]=o:t.attrs[d(e)]=o}return t}),{attrs:{}}),i=o.style,s=void 0===i?{}:i,f=function(t,e){if(null==t)return{};var r,o,n=function(t,e){if(null==t)return{};var r={};for(var o in t)if({}.hasOwnProperty.call(t,o)){if(-1!==e.indexOf(o))continue;r[o]=t[o]}return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(o=0;o<a.length;o++)r=a[o],-1===e.indexOf(r)&&{}.propertyIsEnumerable.call(t,r)&&(n[r]=t[r])}return n}(o,x);return a.attrs.style=l(l({},a.attrs.style),s),e.apply(void 0,[r.tag,l(l({},a.attrs),f)].concat(u(n)))}.bind(null,n.default.createElement);exports.FontAwesomeIcon=w;
|
|
2
2
|
//# sourceMappingURL=index.es.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("../node_modules/react-is/index.js");var e=require("../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("../node_modules/react-is/index.js");var e=require("../../../_virtual/index6.js").exports,t={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},r={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},o={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},p={};function a(r){return e.isMemo(r)?o:p[r.$$typeof]||t}p[e.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},p[e.Memo]=o;var s=Object.defineProperty,i=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,n=Object.getOwnPropertyDescriptor,c=Object.getPrototypeOf,l=Object.prototype;var d=function e(t,o,p){if("string"!=typeof o){if(l){var d=c(o);d&&d!==l&&e(t,d,p)}var f=i(o);y&&(f=f.concat(y(o)));for(var u=a(t),m=a(o),v=0;v<f.length;++v){var g=f[v];if(!(r[g]||p&&p[g]||m&&m[g]||u&&u[g])){var O=n(o,g);try{s(t,g,O)}catch(e){}}}}return t};exports.default=d;
|
|
2
2
|
//# sourceMappingURL=hoist-non-react-statics.cjs.js.map
|
package/dist/node_modules/hoist-non-react-statics/node_modules/react-is/cjs/react-is.development.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.development3.js");
|
|
2
2
|
/** @license React v16.13.1
|
|
3
3
|
* react-is.development.js
|
|
4
4
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.production.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.production.min3.js");
|
|
2
2
|
/** @license React v16.13.1
|
|
3
3
|
* react-is.production.min.js
|
|
4
4
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e,r=require("../../../../_virtual/
|
|
1
|
+
"use strict";var e,r=require("../../../../_virtual/index6.js"),i=require("./cjs/react-is.production.min.js"),s=require("./cjs/react-is.development.js");e=r.__module,"production"===process.env.NODE_ENV?e.exports=i.__require():e.exports=s.__require();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../../../_virtual/
|
|
1
|
+
"use strict";var e=require("../../../_virtual/index9.js");require("./requestMediaPermissions.js");var r=require("../../../_virtual/requestMediaPermissions.js");!function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.requestMediaPermissions=e.MediaPermissionsErrorType=void 0;var i=r.__exports;Object.defineProperty(e,"MediaPermissionsErrorType",{enumerable:!0,get:function(){return i.MediaPermissionsErrorType}}),Object.defineProperty(e,"requestMediaPermissions",{enumerable:!0,get:function(){return i.requestMediaPermissions}})}(e.__exports);
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/index7.js"),r=require("./node_modules/react-is/index.js"),t=require("./factoryWithTypeCheckers.js"),i=require("./factoryWithThrowingShims.js");if("production"!==process.env.NODE_ENV){var s=r.__require();e.__module.exports=t.__require()(s.isElement,!0)}else e.__module.exports=i.__require()();Object.defineProperty(exports,"default",{enumerable:!0,get:function(){return e.exports}});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.development4.js");
|
|
2
2
|
/** @license React v16.13.1
|
|
3
3
|
* react-is.development.js
|
|
4
4
|
*
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.production.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../../_virtual/react-is.production.min4.js");
|
|
2
2
|
/** @license React v16.13.1
|
|
3
3
|
* react-is.production.min.js
|
|
4
4
|
*
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("../../../../_virtual/index8.js"),s=require("./cjs/react-is.production.min.js"),t=require("./cjs/react-is.development.js");exports.__require=function(){return e||(e=1,i=r.__module,"production"===process.env.NODE_ENV?i.exports=s.__require():i.exports=t.__require()),r.exports;var i};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../_virtual/_commonjsHelpers.js"),t=require("../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../_virtual/_commonjsHelpers.js"),t=require("../../../_virtual/index3.js"),n=require("../../moment/moment.js");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o,i,a,l=r(require("react"));o=t.__module,e.commonjsGlobal,o.exports=(i=n.__require(),a=l.default,function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t,n){e.exports=n(3)()},function(e,t){e.exports=i},function(e,t){e.exports=a},function(e,t,n){var r=n(4);function o(){}function i(){}i.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,i,a){if(a!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:o};return n.PropTypes=n,n}},function(e,t,n){e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){var r,o,i,a,l;
|
|
2
2
|
/*! Moment Duration Format v2.2.2
|
|
3
3
|
* https://github.com/jsmreese/moment-duration-format
|
|
4
4
|
* Date: 2018-02-16
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e,r=require("../../../../_virtual/
|
|
1
|
+
"use strict";var e,r=require("../../../../_virtual/index5.js"),i=require("./cjs/react-is.production.min.js"),s=require("./cjs/react-is.development.js");e=r.__module,"production"===process.env.NODE_ENV?e.exports=i.__require():e.exports=s.__require();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../../_virtual/with-selector.development.js"),r=require("react");require("../../shim/index.js");var t=require("../../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../../_virtual/with-selector.development.js"),r=require("react");require("../../shim/index.js");var t=require("../../../../_virtual/index4.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u,_=n(r);
|
|
2
2
|
/**
|
|
3
3
|
* @license React
|
|
4
4
|
* use-sync-external-store-shim/with-selector.development.js
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../../_virtual/with-selector.production.js"),r=require("react");require("../../shim/index.js");var u=require("../../../../_virtual/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../../_virtual/with-selector.production.js"),r=require("react");require("../../shim/index.js");var u=require("../../../../_virtual/index4.js");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n,i=t(r);
|
|
2
2
|
/**
|
|
3
3
|
* @license React
|
|
4
4
|
* use-sync-external-store-shim/with-selector.production.js
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e,r=require("../../../_virtual/
|
|
1
|
+
"use strict";var e,r=require("../../../_virtual/index4.js"),s=require("../cjs/use-sync-external-store-shim.production.js"),i=require("../cjs/use-sync-external-store-shim.development.js");e=r.__module,"production"===process.env.NODE_ENV?e.exports=s.__require():e.exports=i.__require();
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/package.json.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="@nethesis/phone-island",s="Nethesis",t="1.0.8-dev.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="@nethesis/phone-island",s="Nethesis",t="1.0.8-dev.2",i="NethVoice CTI Phone Island",r=["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"],d="dist/index.js",a="dist/index.d.ts",c={access:"public"},m={main:!1,types:!1,default:{distDir:"./dist-widget"}},u={"@fortawesome/fontawesome-svg-core":"6.2.1","@fortawesome/free-solid-svg-icons":"6.2.1","@fortawesome/react-fontawesome":"0.2.0","@headlessui/react":"^2.2.8","@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","@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-tooltip":"^5.28.0","socket.io-client":"^4.5.3","styled-components":"^5.3.6","webrtc-adapter":"^9.0.1"},h={start:"npm run dev",dev:"node scripts/generate-dev-host.js && parcel .dev/phone-island-dev.html --port 6006 --open",test:"tsc --noEmit",watch:"rollup -w -c","watch:css":"BROWSERSLIST_IGNORE_OLD_DATA=1 npx tailwindcss -o ./dist/index.css --watch",build:"rm -rf ./dist && npm run build:css && rollup -c","build:css":"BROWSERSLIST_IGNORE_OLD_DATA=1 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 BROWSERSLIST_IGNORE_OLD_DATA=1 && 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",release:"npm publish","release:widget":"node check-publish.js patch && npm version patch -m v%s",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":"node check-publish.js minor && npm version minor --allow-same-version -m v%s --force","publish:major":"node check-publish.js major && npm version major --allow-same-version -m v%s --force","publish:patch":"node check-publish.js patch && npm version patch --allow-same-version -m v%s --force","publish:dev":"node publish-dev.js",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"},b={production:[">0.2%","not dead","not op_mini all"],development:["last 1 chrome version","last 1 firefox version","last 1 safari version"]},g={"@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","@testing-library/react":"^13.4.0","@types/audioworklet":"^0.0.98","@types/jest":"^29.2.2","@types/react":"^18.0.26","@types/react-dom":"^18.0.9","@types/styled-components":"^5.1.26",babel:"^6.23.0",buffer:"^5.7.1",parcel:"^2.0.0",postcss:"^8.4.49",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","tailwind-scrollbar":"^3.1.0",tailwindcss:"^3.4.16",typescript:"^4.8.4","webm-duration-fix":"^1.0.4",webpack:"^5.74.0"},v={"@tootallnate/once":"^3.0.0",esbuild:"^0.25.11","nth-check":"^2.0.1","serialize-javascript":"^7.0.0",tar:"^7.5.1"},w="GPL-3.0-or-later",x={name:e,author:s,version:t,description:i,keywords:r,homepage:o,bugs:n,repository:p,private:!1,files:l,main:d,types:a,publishConfig:c,targets:m,dependencies:u,scripts:h,browserslist:b,devDependencies:g,overrides:v,license:w};exports.author=s,exports.browserslist=b,exports.bugs=n,exports.default=x,exports.dependencies=u,exports.description=i,exports.devDependencies=g,exports.files=l,exports.homepage=o,exports.keywords=r,exports.license=w,exports.main=d,exports.name=e,exports.overrides=v,exports.publishConfig=c,exports.repository=p,exports.scripts=h,exports.targets=m,exports.types=a,exports.version=t;
|
|
2
2
|
//# sourceMappingURL=package.json.js.map
|
package/dist/services/user.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../store/index.js");exports.changeDefaultDevice=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/default_device"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.changeOperatorStatus=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/presence"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.checkSummaryCall=function(r){return e.__awaiter(this,void 0,void 0,(function(){var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../store/index.js");exports.changeDefaultDevice=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/default_device"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.changeOperatorStatus=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/presence"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.checkSummaryCall=function(r,s){return e.__awaiter(this,void 0,void 0,(function(){var n,a,o,c,i,u,h;return e.__generator(this,(function(f){switch(f.label){case 0:return n=t.store.getState().fetchDefaults,a=n.baseURL,o=n.headers,c=s?"?linkedid=".concat(encodeURIComponent(s)):"",[4,fetch("".concat(a,"/summary/").concat(r).concat(c),{method:"HEAD",headers:e.__assign({},o)})];case 1:if(200===(i=f.sent()).status)return[2];if(204===i.status)throw(u=new Error("Summary not ready")).status=204,u;throw(h=new Error("Failed to check summary: ".concat(i.statusText))).status=i.status,h}}))}))},exports.getAllAvatars=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/user/all_avatars"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.getAllUsersEndpoints=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/user/endpoints/all"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.getCurrentUserInfo=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/user/me"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.getFeatureCodes=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/astproxy/feature_codes"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.getParamUrl=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/user/paramurl"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.getVideoSources=function(){return e.__awaiter(this,void 0,void 0,(function(){var r,s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,3,,4]),r=t.store.getState().fetchDefaults,s=r.baseURL,n=r.headers,[4,fetch("".concat(s,"/streaming/sources"),{headers:e.__assign({},n)})];case 1:if(!(a=c.sent()).ok)throw new Error(a.statusText);return[4,a.json()];case 2:return[2,c.sent()];case 3:throw o=c.sent(),new Error(o);case 4:return[2]}}))}))},exports.openVideoSource=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/streaming/open"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.setDefaultDevice=function(r,s){return e.__awaiter(this,void 0,void 0,(function(){var n,a,o,c,i,u,h;return e.__generator(this,(function(f){switch(f.label){case 0:return f.trys.push([0,2,,3]),n=t.store.getState().fetchDefaults,a=n.baseURL,o=n.headers,c={id:s},i={id:s},[4,fetch("".concat(a,"/user/default_device"),{method:"POST",headers:e.__assign({},o),body:"physical"===r?JSON.stringify(i):JSON.stringify(c)})];case 1:if(!(u=f.sent()).ok)throw new Error(u.statusText);return[3,3];case 2:throw h=f.sent(),new Error(h);case 3:return[2]}}))}))},exports.setIncomingCallsPreference=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o,c,i,u;return e.__generator(this,(function(h){switch(h.label){case 0:return h.trys.push([0,4,,5]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/settings"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=h.sent()).ok)throw new Error(o.statusText);return(c=o.headers.get("content-type"))&&c.includes("application/json")?[4,o.text()]:[3,3];case 2:return[2,(i=h.sent())?JSON.parse(i):{}];case 3:return[2,{success:!0}];case 4:throw u=h.sent(),console.error("Error updating user settings:",u),u;case 5:return[2]}}))}))},exports.setMainDevice=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/user/default_device"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.subscribe=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/streaming/subscribe"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.unsubscribe=function(r){return e.__awaiter(this,void 0,void 0,(function(){var s,n,a,o;return e.__generator(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),s=t.store.getState().fetchDefaults,n=s.baseURL,a=s.headers,[4,fetch("".concat(n,"/streaming/unsubscribe"),{method:"POST",headers:e.__assign({},a),body:JSON.stringify(r)})];case 1:if(!(o=c.sent()).ok)throw new Error(o.statusText);return[2,!0];case 2:throw c.sent();case 3:return[2]}}))}))},exports.watchSummaryCall=function(r,s){return e.__awaiter(this,void 0,void 0,(function(){var n,a,o,c,i;return e.__generator(this,(function(u){switch(u.label){case 0:return u.trys.push([0,2,,3]),n=t.store.getState().fetchDefaults,a=n.baseURL,o=n.headers,[4,fetch("".concat(a,"/summary/watch"),{method:"POST",headers:e.__assign({},o),body:JSON.stringify({linkedid:r,uniqueid:s})})];case 1:if(!(c=u.sent()).ok)throw new Error("Failed to watch summary call: ".concat(c.status," ").concat(c.statusText));return[3,3];case 2:throw i=u.sent(),console.error("Error watching summary call:",i),i;case 3:return[2]}}))}))};
|
|
2
2
|
//# sourceMappingURL=user.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sources":["../../src/services/user.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { store } from '../store'\nimport type { UserInfoTypes, AvatarsTypes, UsersEndpointsTypes } from '../types'\n\n/**\n * Get current user info\n */\nexport async function getCurrentUserInfo(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/me`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function setDefaultDevice(\n default_type: string,\n extensionNumber: string,\n): Promise<any> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n\n let webrtcId: any = { id: extensionNumber }\n let physicalId: any = { id: extensionNumber }\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: default_type === 'physical' ? JSON.stringify(physicalId) : JSON.stringify(webrtcId),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Get all avatars\n */\nexport async function getAllAvatars(): Promise<AvatarsTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n\n const response = await fetch(`${baseURL}/user/all_avatars`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Get all users endpoints\n */\nexport async function getAllUsersEndpoints(): Promise<UsersEndpointsTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/endpoints/all`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function changeOperatorStatus(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/presence`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function changeDefaultDevice(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function setMainDevice(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\n/**\n * Get parameter URL information\n */\nexport async function getParamUrl(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/paramurl`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function getVideoSources(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/sources`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function openVideoSource(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/open`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function subscribe(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/subscribe`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function unsubscribe(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/unsubscribe`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function setIncomingCallsPreference(settingsStatus: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/settings`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(settingsStatus),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType && contentType.includes('application/json')) {\n const text = await response.text()\n return text ? JSON.parse(text) : {}\n }\n\n return { success: true }\n } catch (error: any) {\n console.error('Error updating user settings:', error)\n throw error\n }\n}\n\n/**\n * Get feature codes\n */\nexport async function getFeatureCodes(): Promise<any> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/feature_codes`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Check if a call summary/transcription exists for a given uniqueid\n * Returns: { has_summary: boolean }\n * Throws:\n * - Error with status 204 when the summary is not ready yet.\n * - Error with the corresponding HTTP status code for any other non-200 response\n * (including, but not limited to, 401, 403, 404, 503).\n */\nexport async function checkSummaryCall(uniqueid: string): Promise<void> {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/summary/${uniqueid}`, {\n method: 'HEAD',\n headers: { ...headers },\n })\n\n // 200 - Summary exists\n if (response.status === 200) {\n return\n }\n\n // 204 - Summary not present yet (not an error, just not ready)\n if (response.status === 204) {\n const error: any = new Error('Summary not ready')\n error.status = 204\n throw error\n }\n\n // 401, 403, 404, 503 - Real errors\n const error: any = new Error(`Failed to check summary: ${response.statusText}`)\n error.status = response.status\n throw error\n}\n\n/**\n * Watch for call summary/transcription for a given linkedid and uniqueid.\n * If uniqueid differs from linkedid (e.g. queue call), both are sent.\n */\nexport async function watchSummaryCall(linkedid: string, uniqueid: string): Promise<void> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/summary/watch`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify({ linkedid, uniqueid }),\n })\n if (!response.ok) {\n throw new Error(`Failed to watch summary call: ${response.status} ${response.statusText}`)\n }\n } catch (error: any) {\n console.error('Error watching summary call:', error)\n throw error\n }\n}\n"],"names":["obj","_a","store","getState","fetchDefaults","baseURL","headers","fetch","concat","method","__assign","body","JSON","stringify","response","_b","sent","ok","Error","statusText","uniqueid","status","error_15","error","json","error_3","error_4","error_1","error_14","error_8","error_9","default_type","extensionNumber","webrtcId","id","physicalId","error_2","settingsStatus","contentType","get","includes","text","parse","success","console","error_13","linkedid","error_16"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"user.js","sources":["../../src/services/user.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { store } from '../store'\nimport type { UserInfoTypes, AvatarsTypes, UsersEndpointsTypes } from '../types'\n\n/**\n * Get current user info\n */\nexport async function getCurrentUserInfo(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/me`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function setDefaultDevice(\n default_type: string,\n extensionNumber: string,\n): Promise<any> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n\n let webrtcId: any = { id: extensionNumber }\n let physicalId: any = { id: extensionNumber }\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: default_type === 'physical' ? JSON.stringify(physicalId) : JSON.stringify(webrtcId),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Get all avatars\n */\nexport async function getAllAvatars(): Promise<AvatarsTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n\n const response = await fetch(`${baseURL}/user/all_avatars`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Get all users endpoints\n */\nexport async function getAllUsersEndpoints(): Promise<UsersEndpointsTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/endpoints/all`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function changeOperatorStatus(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/presence`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function changeDefaultDevice(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function setMainDevice(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/default_device`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\n/**\n * Get parameter URL information\n */\nexport async function getParamUrl(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/paramurl`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function getVideoSources(): Promise<UserInfoTypes | undefined> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/sources`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\nexport async function openVideoSource(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/open`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function subscribe(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/subscribe`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function unsubscribe(obj: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/streaming/unsubscribe`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(obj),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n return true\n } catch (error: any) {\n throw error\n }\n}\n\nexport async function setIncomingCallsPreference(settingsStatus: any) {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/user/settings`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify(settingsStatus),\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n const contentType = response.headers.get('content-type')\n if (contentType && contentType.includes('application/json')) {\n const text = await response.text()\n return text ? JSON.parse(text) : {}\n }\n\n return { success: true }\n } catch (error: any) {\n console.error('Error updating user settings:', error)\n throw error\n }\n}\n\n/**\n * Get feature codes\n */\nexport async function getFeatureCodes(): Promise<any> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/astproxy/feature_codes`, {\n headers: { ...headers },\n })\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n const data = await response.json()\n return data\n } catch (error: any) {\n throw new Error(error)\n }\n}\n\n/**\n * Check if a call summary/transcription exists for a given uniqueid\n * Returns: { has_summary: boolean }\n * Throws:\n * - Error with status 204 when the summary is not ready yet.\n * - Error with the corresponding HTTP status code for any other non-200 response\n * (including, but not limited to, 401, 403, 404, 503).\n */\nexport async function checkSummaryCall(uniqueid: string, linkedid?: string): Promise<void> {\n const { baseURL, headers } = store.getState().fetchDefaults\n const queryString = linkedid ? `?linkedid=${encodeURIComponent(linkedid)}` : ''\n const response = await fetch(`${baseURL}/summary/${uniqueid}${queryString}`, {\n method: 'HEAD',\n headers: { ...headers },\n })\n\n // 200 - Summary exists\n if (response.status === 200) {\n return\n }\n\n // 204 - Summary not present yet (not an error, just not ready)\n if (response.status === 204) {\n const error: any = new Error('Summary not ready')\n error.status = 204\n throw error\n }\n\n // 401, 403, 404, 503 - Real errors\n const error: any = new Error(`Failed to check summary: ${response.statusText}`)\n error.status = response.status\n throw error\n}\n\n/**\n * Watch for call summary/transcription for a given linkedid and uniqueid.\n * If uniqueid differs from linkedid (e.g. queue call), both are sent.\n */\nexport async function watchSummaryCall(linkedid: string, uniqueid: string): Promise<void> {\n try {\n const { baseURL, headers } = store.getState().fetchDefaults\n const response = await fetch(`${baseURL}/summary/watch`, {\n method: 'POST',\n headers: { ...headers },\n body: JSON.stringify({ linkedid, uniqueid }),\n })\n if (!response.ok) {\n throw new Error(`Failed to watch summary call: ${response.status} ${response.statusText}`)\n }\n } catch (error: any) {\n console.error('Error watching summary call:', error)\n throw error\n }\n}\n"],"names":["obj","_a","store","getState","fetchDefaults","baseURL","headers","fetch","concat","method","__assign","body","JSON","stringify","response","_b","sent","ok","Error","statusText","uniqueid","linkedid","queryString","encodeURIComponent","status","error_15","error","json","error_3","error_4","error_1","error_14","error_8","error_9","default_type","extensionNumber","webrtcId","id","physicalId","error_2","settingsStatus","contentType","get","includes","text","parse","success","console","error_13","error_16"],"mappings":"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"}
|