@nethesis/phone-island 0.8.16 → 0.8.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/App.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),n=require("./components/Socket.js"),s=require("./components/WebRTC.js"),a=require("./components/Island.js"),o=require("./components/RestAPI.js"),i=require("./utils/customHooks/useEventListener.js"),r=require("./utils/genericFunctions/eventDispatch.js"),d=require("./utils/genericFunctions/localStorage.js");require("./node_modules/react-redux/es/index.js");var u=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var c=require("./node_modules/js-base64/base64.mjs.js"),l=require("./workers/wake_up.js"),p=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var h=require("./lib/webrtc/messages.js"),f=require("./lib/darkTheme.js"),v=require("./node_modules/react-redux/es/components/Provider.js");function m(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 j=m(e),E=function(m){var E=m.dataConfig,g=m.i18nLoadPath,I=void 0===g?void 0:g,q=m.showAlways,D=void 0!==q&&q,k=m.uaType,y=c.Base64.atob(E||"").split(":"),w=y[0],b=y[1],L=y[2],S=y[3],x=y[4],_=y[5],T=y[6],C=e.useState(!1),O=C[0],P=C[1],N=e.useState(!1),A=N[0],R=N[1],V=e.useState(!1),F=V[0],H=V[1];e.useEffect((function(){var e=new Worker(l.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&P(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){F&&A&&(P(!1),R(!1),H(!1))}),[F,A]),i.useEventListener("phone-island-expand",(function(){u.store.dispatch.island.toggleIsOpen(!0),r.eventDispatch("phone-island-expanded",{})})),i.useEventListener("phone-island-compress",(function(){u.store.dispatch.island.toggleIsOpen(!1),r.eventDispatch("phone-island-compressed",{})})),i.useEventListener("phone-island-call-keypad-close",(function(){u.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-keypad-closed",{})})),i.useEventListener("phone-island-call-transfer-close",(function(){u.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-transfer-closed",{})})),i.useEventListener("phone-island-recording-close",(function(){u.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-recording-closed",{})})),i.useEventListener("phone-island-audio-player-close",(function(){u.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-audio-player-closed",{})})),i.useEventListener("phone-island-detach",(function(e){h.detach(),u.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),r.eventDispatch("phone-island-detached",{})})),i.useEventListener("phone-island-audio-input-change",(function(e){d.setJSONItem("phone-island-audio-input-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-input-changed",{})})),i.useEventListener("phone-island-audio-output-change",(function(e){var t=u.store.getState().player.remoteAudio;null==t||t.current.setSinkId(e.deviceId).then((function(){console.info("Default audio output device change with success!"),d.setJSONItem("phone-island-audio-output-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-output-changed",{})})).catch((function(e){console.error("Default audio output device change error:",e)}))}));var J=e.useState(!0),W=J[0],U=J[1],B=e.useState(!0),M=B[0],z=B[1];e.useEffect((function(){W&&(p.loadI18n(I),U(!1))}),[W]);var G=u.store.getState().player.remoteAudio;return e.useEffect((function(){var e;if(M&&G){var t=null===(e=d.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;r.eventDispatch("phone-island-audio-output-change",{deviceId:t}),z(!1)}}),[M,G]),e.useEffect((function(){f.checkDarkTheme()}),[]),i.useEventListener("phone-island-theme-change",(function(e){f.setTheme(null==e?void 0:e.selectedTheme)})),i.useEventListener("phone-island-default-device-change",(function(e){u.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),r.eventDispatch("phone-island-default-device-changed",{})})),i.useEventListener("phone-island-call-transfer-successfully",(function(){console.log("Call transferred successfully")})),i.useEventListener("phone-island-call-transfer-failed",(function(){console.log("Transfer failed")})),j.default.createElement(j.default.Fragment,null,j.default.createElement(v.default,{store:u.store},j.default.createElement(s.WebRTC,{hostName:w,sipExten:S,sipSecret:x,sipHost:_,sipPort:T,reload:O,reloadedCallback:function(){return R(!0)},uaType:k},j.default.createElement(o.RestAPI,{hostName:w,username:b,authToken:L},j.default.createElement(n.Socket,{hostName:w,username:b,authToken:L,reload:O,reloadedCallback:function(){return H(!0)},uaType:k},j.default.createElement(t.Events,{sipHost:_},j.default.createElement(a.Island,{showAlways:D})))))))};E.displayName="PhoneIsland",exports.PhoneIsland=E;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),n=require("./components/Socket.js"),s=require("./components/WebRTC.js"),o=require("./components/Island.js"),a=require("./components/RestAPI.js"),i=require("./utils/customHooks/useEventListener.js"),r=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js");require("./node_modules/react-redux/es/index.js");var d=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var l=require("./node_modules/js-base64/base64.mjs.js"),c=require("./workers/wake_up.js"),p=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var h=require("./lib/webrtc/messages.js"),f=require("./lib/darkTheme.js"),v=require("./node_modules/react-redux/es/components/Provider.js");function m(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 E=m(e),g=function(m){var g=m.dataConfig,j=m.i18nLoadPath,I=void 0===j?void 0:j,q=m.showAlways,y=void 0!==q&&q,D=m.uaType,k=l.Base64.atob(g||"").split(":"),w=k[0],L=k[1],b=k[2],S=k[3],x=k[4],_=k[5],T=k[6],C=e.useState(!1),O=C[0],P=C[1],N=e.useState(!1),A=N[0],R=N[1],V=e.useState(!1),F=V[0],H=V[1];e.useEffect((function(){var e=new Worker(c.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&P(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){F&&A&&(P(!1),R(!1),H(!1))}),[F,A]),i.useEventListener("phone-island-expand",(function(){d.store.dispatch.island.toggleIsOpen(!0),r.eventDispatch("phone-island-expanded",{})})),i.useEventListener("phone-island-compress",(function(){d.store.dispatch.island.toggleIsOpen(!1),r.eventDispatch("phone-island-compressed",{})})),i.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-keypad-closed",{})})),i.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-transfer-closed",{})})),i.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-recording-closed",{})})),i.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-audio-player-closed",{})})),i.useEventListener("phone-island-detach",(function(e){h.detach(),d.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),r.eventDispatch("phone-island-detached",{})})),i.useEventListener("phone-island-audio-input-change",(function(e){u.setJSONItem("phone-island-audio-input-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-input-changed",{})})),i.useEventListener("phone-island-audio-output-change",(function(e){var t=d.store.getState().player.remoteAudio;null==t||t.current.setSinkId(e.deviceId).then((function(){console.info("Default audio output device change with success!"),u.setJSONItem("phone-island-audio-output-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-output-changed",{})})).catch((function(e){console.error("Default audio output device change error:",e)}))}));var J=e.useState(!0),W=J[0],U=J[1],B=e.useState(!0),M=B[0],z=B[1];e.useEffect((function(){W&&(p.loadI18n(I),U(!1))}),[W]);var G=d.store.getState().player.remoteAudio;return e.useEffect((function(){var e;if(M&&G){var t=null===(e=u.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;r.eventDispatch("phone-island-audio-output-change",{deviceId:t}),z(!1)}}),[M,G]),e.useEffect((function(){f.checkDarkTheme()}),[]),i.useEventListener("phone-island-theme-change",(function(e){f.setTheme(null==e?void 0:e.selectedTheme)})),i.useEventListener("phone-island-default-device-change",(function(e){d.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),r.eventDispatch("phone-island-default-device-changed",{})})),i.useEventListener("phone-island-call-transfer-successfully-popup-open",(function(){console.log("Call transferred successfully and popup opened")})),i.useEventListener("phone-island-call-transfer-successfully-popup-close",(function(){console.log("Call transferred successfully and popup closed")})),i.useEventListener("phone-island-call-transfer-failed",(function(){console.log("Transfer failed")})),E.default.createElement(E.default.Fragment,null,E.default.createElement(v.default,{store:d.store},E.default.createElement(s.WebRTC,{hostName:w,sipExten:S,sipSecret:x,sipHost:_,sipPort:T,reload:O,reloadedCallback:function(){return R(!0)},uaType:D},E.default.createElement(a.RestAPI,{hostName:w,username:L,authToken:b},E.default.createElement(n.Socket,{hostName:w,username:L,authToken:b,reload:O,reloadedCallback:function(){return H(!0)},uaType:D},E.default.createElement(t.Events,{sipHost:_},E.default.createElement(o.Island,{showAlways:y})))))))};g.displayName="PhoneIsland",exports.PhoneIsland=g;
2
2
  //# sourceMappingURL=App.js.map
package/dist/App.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport loadI18n from './lib/i18n'\nimport i18next, { i18n } from 'i18next'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener, eventDispatch, setJSONItem, getJSONItem } from './utils'\nimport { detach } from './lib/webrtc/messages'\nimport { checkDarkTheme, setTheme } from './lib/darkTheme'\n\ninterface PhoneIslandProps {\n dataConfig: string\n i18nLoadPath?: string\n showAlways?: boolean\n uaType: string\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({\n dataConfig,\n i18nLoadPath = undefined,\n showAlways = false,\n uaType,\n}: PhoneIslandProps) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-expand', () => {\n store.dispatch.island.toggleIsOpen(true)\n eventDispatch('phone-island-expanded', {})\n })\n useEventListener('phone-island-compress', () => {\n store.dispatch.island.toggleIsOpen(false)\n eventDispatch('phone-island-compressed', {})\n })\n\n useEventListener('phone-island-call-keypad-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-keypad-closed', {})\n })\n useEventListener('phone-island-call-transfer-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-transfer-closed', {})\n })\n useEventListener('phone-island-recording-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-recording-closed', {})\n })\n useEventListener('phone-island-audio-player-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-audio-player-closed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-audio-input-change', (data: DeviceInputOutputTypes) => {\n setJSONItem('phone-island-audio-input-device', { deviceId: data.deviceId })\n eventDispatch('phone-island-audio-input-changed', {})\n })\n useEventListener('phone-island-audio-output-change', (data: DeviceInputOutputTypes) => {\n const remoteAudioElement: any = store.getState().player.remoteAudio\n // set audio output\n remoteAudioElement?.current\n .setSinkId(data.deviceId)\n .then(function () {\n console.info('Default audio output device change with success!')\n // set device to localstorage\n setJSONItem('phone-island-audio-output-device', { deviceId: data.deviceId })\n\n // dispatch event\n eventDispatch('phone-island-audio-output-changed', {})\n })\n .catch(function (err) {\n console.error('Default audio output device change error:', err)\n })\n })\n\n const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n const [firstAudioOutputInit, setFirstAudioOutputInit] = useState(true)\n\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n(i18nLoadPath)\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\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', { deviceId: defaultAudioOutputDevice })\n setFirstAudioOutputInit(false)\n }\n }, [firstAudioOutputInit, remoteAudioElement])\n\n useEffect(() => {\n checkDarkTheme()\n }, [])\n\n useEventListener('phone-island-theme-change', (theme: any) => {\n setTheme(theme?.selectedTheme)\n })\n\n useEventListener('phone-island-default-device-change', (data) => {\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-default-device-changed', {})\n })\n\n useEventListener('phone-island-call-transfer-successfully', () => {\n console.log('Call transferred successfully')\n })\n\n useEventListener('phone-island-call-transfer-failed', () => {\n console.log('Transfer failed')\n })\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n uaType={uaType}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","i18nLoadPath","undefined","_c","showAlways","uaType","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","_d","useState","reload","setReload","_e","reloadedWebRTC","setReloadedWebRTC","_f","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","island","toggleIsOpen","eventDispatch","setIslandView","detach","currentUser","updateCurrentDefaultDevice","deviceInformationObject","setJSONItem","deviceId","remoteAudioElement","getState","player","remoteAudio","current","setSinkId","then","console","info","catch","err","error","_g","firstRenderI18n","setFirstRenderI18n","_h","firstAudioOutputInit","setFirstAudioOutputInit","loadI18n","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","log","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\nimport wakeUpWorker from './workers/wake_up'\nimport loadI18n from './lib/i18n'\nimport i18next, { i18n } from 'i18next'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener, eventDispatch, setJSONItem, getJSONItem } from './utils'\nimport { detach } from './lib/webrtc/messages'\nimport { checkDarkTheme, setTheme } from './lib/darkTheme'\n\ninterface PhoneIslandProps {\n dataConfig: string\n i18nLoadPath?: string\n showAlways?: boolean\n uaType: string\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({\n dataConfig,\n i18nLoadPath = undefined,\n showAlways = false,\n uaType,\n}: PhoneIslandProps) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n const SIP_HOST: string = CONFIG[5]\n const SIP_PORT: string = CONFIG[6]\n\n // Initialize the state to manage the reload events\n const [reload, setReload] = useState<boolean>(false)\n const [reloadedWebRTC, setReloadedWebRTC] = useState<boolean>(false)\n const [reloadedSocket, setReloadedSocket] = useState<boolean>(false)\n\n useEffect(() => {\n const worker = new Worker(wakeUpWorker, { type: 'module' })\n worker.onmessage = (event: MessageEvent<string>) => {\n // Handle wakeup message\n if (event.data === 'wakeup') {\n setReload(true)\n }\n }\n\n return () => {\n worker.terminate()\n }\n }, [])\n\n useEffect(() => {\n if (reloadedSocket && reloadedWebRTC) {\n setReload(false)\n setReloadedWebRTC(false)\n setReloadedSocket(false)\n }\n }, [reloadedSocket, reloadedWebRTC])\n\n useEventListener('phone-island-expand', () => {\n store.dispatch.island.toggleIsOpen(true)\n eventDispatch('phone-island-expanded', {})\n })\n useEventListener('phone-island-compress', () => {\n store.dispatch.island.toggleIsOpen(false)\n eventDispatch('phone-island-compressed', {})\n })\n\n useEventListener('phone-island-call-keypad-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-keypad-closed', {})\n })\n useEventListener('phone-island-call-transfer-close', () => {\n store.dispatch.island.setIslandView('call')\n eventDispatch('phone-island-call-transfer-closed', {})\n })\n useEventListener('phone-island-recording-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-recording-closed', {})\n })\n useEventListener('phone-island-audio-player-close', () => {\n store.dispatch.island.setIslandView(null)\n eventDispatch('phone-island-audio-player-closed', {})\n })\n\n useEventListener('phone-island-detach', (data) => {\n detach()\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-detached', {})\n })\n\n useEventListener('phone-island-audio-input-change', (data: DeviceInputOutputTypes) => {\n setJSONItem('phone-island-audio-input-device', { deviceId: data.deviceId })\n eventDispatch('phone-island-audio-input-changed', {})\n })\n useEventListener('phone-island-audio-output-change', (data: DeviceInputOutputTypes) => {\n const remoteAudioElement: any = store.getState().player.remoteAudio\n // set audio output\n remoteAudioElement?.current\n .setSinkId(data.deviceId)\n .then(function () {\n console.info('Default audio output device change with success!')\n // set device to localstorage\n setJSONItem('phone-island-audio-output-device', { deviceId: data.deviceId })\n\n // dispatch event\n eventDispatch('phone-island-audio-output-changed', {})\n })\n .catch(function (err) {\n console.error('Default audio output device change error:', err)\n })\n })\n\n const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n const [firstAudioOutputInit, setFirstAudioOutputInit] = useState(true)\n\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n(i18nLoadPath)\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\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', { deviceId: defaultAudioOutputDevice })\n setFirstAudioOutputInit(false)\n }\n }, [firstAudioOutputInit, remoteAudioElement])\n\n useEffect(() => {\n checkDarkTheme()\n }, [])\n\n useEventListener('phone-island-theme-change', (theme: any) => {\n setTheme(theme?.selectedTheme)\n })\n\n useEventListener('phone-island-default-device-change', (data) => {\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-default-device-changed', {})\n })\n\n useEventListener('phone-island-call-transfer-successfully-popup-open', () => {\n console.log('Call transferred successfully and popup opened')\n })\n\n useEventListener('phone-island-call-transfer-successfully-popup-close', () => {\n console.log('Call transferred successfully and popup closed')\n })\n\n useEventListener('phone-island-call-transfer-failed', () => {\n console.log('Transfer failed')\n })\n\n return (\n <>\n <Provider store={store}>\n <WebRTC\n hostName={HOST_NAME}\n sipExten={SIP_EXTEN}\n sipSecret={SIP_SECRET}\n sipHost={SIP_HOST}\n sipPort={SIP_PORT}\n reload={reload}\n reloadedCallback={() => setReloadedWebRTC(true)}\n uaType={uaType}\n >\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket\n hostName={HOST_NAME}\n username={USERNAME}\n authToken={AUTH_TOKEN}\n reload={reload}\n reloadedCallback={() => setReloadedSocket(true)}\n uaType={uaType}\n >\n <Events sipHost={SIP_HOST}>\n <Island showAlways={showAlways} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","i18nLoadPath","undefined","_c","showAlways","uaType","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","_d","useState","reload","setReload","_e","reloadedWebRTC","setReloadedWebRTC","_f","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","island","toggleIsOpen","eventDispatch","setIslandView","detach","currentUser","updateCurrentDefaultDevice","deviceInformationObject","setJSONItem","deviceId","remoteAudioElement","getState","player","remoteAudio","current","setSinkId","then","console","info","catch","err","error","_g","firstRenderI18n","setFirstRenderI18n","_h","firstAudioOutputInit","setFirstAudioOutputInit","loadI18n","defaultAudioOutputDevice","getJSONItem","checkDarkTheme","theme","setTheme","selectedTheme","log","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/framer-motion/dist/framer-motion.js");var t=require("./Button.js"),r=require("../node_modules/@fortawesome/react-fontawesome/index.es.js"),i=require("../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),s=require("../lib/phone/call.js");require("../node_modules/react-redux/es/index.js");var o=require("../node_modules/react-tooltip/dist/react-tooltip.min.cjs.js");require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/defineProperty.js"),require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/typeof.js"),require("../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../node_modules/react-i18next/dist/es/context.js");var n=require("../node_modules/react-i18next/dist/es/useTranslation.js");require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var a=require("./SwitchInputView/DropdownContent.js"),l=require("../utils/genericFunctions/eventDispatch.js"),u=require("../node_modules/react-redux/es/hooks/useSelector.js"),d=require("../node_modules/react-redux/es/hooks/useDispatch.js"),c=require("../_virtual/framer-motion.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=p(e);exports.default=function(e){e.clickCallback,e.isDestination;var p=e.description,f=e.isPhysicalRecording,j=u.useSelector((function(e){return e.currentCall})),h=j.transferring,x=j.incoming,_=j.accepted,g=d.useDispatch(),v=u.useSelector((function(e){return e.island})).isOpen;var q=n.useTranslation().t;return m.default.createElement(m.default.Fragment,null,m.default.createElement("div",{className:" ".concat(h?"pi-grid pi-w-full pi-space-x-2 pi-justify-start":"pi-flex pi-justify-center")},m.default.createElement(c.framerMotion.exports.motion.div,{className:"".concat(h&&p?"pi-grid pi-grid-cols-[12rem,1rem] pi-ml-4 pi-justify-start":"pi-flex pi-w-12"," ")},m.default.createElement(t.Button,{onClick:function(){return f?s.hangupCurrentPhysicalRecording():(x?s.hangupAllExtensions():s.hangupCurrentCall(),setTimeout((function(){g.listen.setUpdateIntrudeStatus(!1,""),g.listen.setUpdateListenStatus(!1,"")}),2e3),void(h&&setTimeout((function(){g.alerts.setAlert("call_transfered"),l.eventDispatch("phone-island-call-transfer-successfully",{}),setTimeout((function(){g.alerts.removeAlert("call_transfered")}),2e3)}),300)))},variant:"red",className:"pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full","data-tooltip-id":p&&h?"tooltip-top-transfer":"tooltip-left-transfer","data-tooltip-content":p&&h?p:"".concat(q("Tooltip.Hangup"))},m.default.createElement(r.FontAwesomeIcon,{className:"pi-rotate-135 pi-h-6 pi-w-6",icon:i.faPhone}),h&&p&&m.default.createElement(c.framerMotion.exports.motion.div,{style:{height:"17px"},className:"pi-whitespace-nowrap pi-overflow-hidden"},p)),v&&_&&m.default.createElement("div",{className:"".concat(h&&p?"pi-grid pi-grid-cols-1 pi-ml-8":"pi-flex pi-items-center pi-justify-end pi-ml-16")},m.default.createElement(a.default,{"data-stop-propagation":!0})))),m.default.createElement(o.Tooltip,{className:"pi-z-20",id:"tooltip-left-transfer",place:"left"}),m.default.createElement(o.Tooltip,{className:"pi-z-20",id:"tooltip-top-transfer",place:"top"}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/framer-motion/dist/framer-motion.js");var t=require("./Button.js"),r=require("../node_modules/@fortawesome/react-fontawesome/index.es.js"),i=require("../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),s=require("../lib/phone/call.js");require("../node_modules/react-redux/es/index.js");var o=require("../node_modules/react-tooltip/dist/react-tooltip.min.cjs.js");require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/defineProperty.js"),require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/typeof.js"),require("../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../node_modules/react-i18next/dist/es/context.js");var n=require("../node_modules/react-i18next/dist/es/useTranslation.js");require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var a=require("./SwitchInputView/DropdownContent.js"),l=require("../utils/genericFunctions/eventDispatch.js"),u=require("../node_modules/react-redux/es/hooks/useSelector.js"),d=require("../node_modules/react-redux/es/hooks/useDispatch.js"),c=require("../_virtual/framer-motion.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=p(e);exports.default=function(e){e.clickCallback,e.isDestination;var p=e.description,f=e.isPhysicalRecording,h=u.useSelector((function(e){return e.currentCall})),j=h.transferring,x=h.incoming,_=h.accepted,v=d.useDispatch(),g=u.useSelector((function(e){return e.island})).isOpen;var q=n.useTranslation().t;return m.default.createElement(m.default.Fragment,null,m.default.createElement("div",{className:" ".concat(j?"pi-grid pi-w-full pi-space-x-2 pi-justify-start":"pi-flex pi-justify-center")},m.default.createElement(c.framerMotion.exports.motion.div,{className:"".concat(j&&p?"pi-grid pi-grid-cols-[12rem,1rem] pi-ml-4 pi-justify-start":"pi-flex pi-w-12"," ")},m.default.createElement(t.Button,{onClick:function(){return f?s.hangupCurrentPhysicalRecording():(x?s.hangupAllExtensions():s.hangupCurrentCall(),setTimeout((function(){v.listen.setUpdateIntrudeStatus(!1,""),v.listen.setUpdateListenStatus(!1,"")}),2e3),void(j&&setTimeout((function(){v.alerts.setAlert("call_transfered"),l.eventDispatch("phone-island-call-transfer-successfully-popup-open",{}),setTimeout((function(){v.alerts.removeAlert("call_transfered"),l.eventDispatch("phone-island-call-transfer-successfully-popup-close",{})}),2e3)}),300)))},variant:"red",className:"pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full","data-tooltip-id":p&&j?"tooltip-top-transfer":"tooltip-left-transfer","data-tooltip-content":p&&j?p:"".concat(q("Tooltip.Hangup"))},m.default.createElement(r.FontAwesomeIcon,{className:"pi-rotate-135 pi-h-6 pi-w-6",icon:i.faPhone}),j&&p&&m.default.createElement(c.framerMotion.exports.motion.div,{style:{height:"17px"},className:"pi-whitespace-nowrap pi-overflow-hidden"},p)),g&&_&&m.default.createElement("div",{className:"".concat(j&&p?"pi-grid pi-grid-cols-1 pi-ml-8":"pi-flex pi-items-center pi-justify-end pi-ml-16")},m.default.createElement(a.default,{"data-stop-propagation":!0})))),m.default.createElement(o.Tooltip,{className:"pi-z-20",id:"tooltip-left-transfer",place:"left"}),m.default.createElement(o.Tooltip,{className:"pi-z-20",id:"tooltip-top-transfer",place:"top"}))};
2
2
  //# sourceMappingURL=Hangup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Hangup.js","sources":["../../src/components/Hangup.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { Button } from './Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone } from '@fortawesome/free-solid-svg-icons'\nimport { hangupCurrentCall, hangupCurrentPhysicalRecording } from '../lib/phone/call'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Dispatch } from '../store'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { hangupAllExtensions } from '../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport DropdownContent from './SwitchInputView/DropdownContent'\nimport { eventDispatch } from '../utils'\n\n/**\n * Return the status of the\n */\nconst Hangup: FC<HangupProps> = ({\n clickCallback,\n isDestination,\n description,\n isPhysicalRecording,\n}) => {\n const { transferring, incoming, accepted } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n function handleHangup() {\n if (incoming) {\n hangupAllExtensions()\n } else {\n hangupCurrentCall()\n }\n\n // Delay the dispatch actions\n setTimeout(() => {\n dispatch.listen.setUpdateIntrudeStatus(false, '')\n dispatch.listen.setUpdateListenStatus(false, '')\n }, 2000)\n\n // Show confirmation message when a call is transferred\n if (transferring) {\n setTimeout(() => {\n dispatch.alerts.setAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully', {})\n setTimeout(() => {\n dispatch.alerts.removeAlert('call_transfered')\n }, 2000)\n }, 300)\n }\n }\n\n const { t } = useTranslation()\n\n // Phone island footer section\n return (\n <>\n <div\n className={` ${\n transferring\n ? 'pi-grid pi-w-full pi-space-x-2 pi-justify-start'\n : 'pi-flex pi-justify-center'\n }`}\n >\n {/* The button to hangup the currentCall */}\n <motion.div\n className={`${\n transferring && description\n ? 'pi-grid pi-grid-cols-[12rem,1rem] pi-ml-4 pi-justify-start'\n : 'pi-flex pi-w-12'\n } `}\n >\n <Button\n onClick={() =>\n !isPhysicalRecording ? handleHangup() : hangupCurrentPhysicalRecording()\n }\n variant='red'\n className='pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full'\n data-tooltip-id={\n description && transferring ? 'tooltip-top-transfer' : 'tooltip-left-transfer'\n }\n data-tooltip-content={\n description && transferring ? description : `${t('Tooltip.Hangup')}`\n }\n // data-tooltip-placement=\"top\"\n >\n <FontAwesomeIcon className='pi-rotate-135 pi-h-6 pi-w-6' icon={faPhone} />\n {transferring && description && (\n <motion.div\n style={{ height: '17px' }}\n className='pi-whitespace-nowrap pi-overflow-hidden'\n >\n {description}\n </motion.div>\n )}\n </Button>\n {isOpen && accepted && (\n <div\n className={`${\n transferring && description\n ? 'pi-grid pi-grid-cols-1 pi-ml-8'\n : 'pi-flex pi-items-center pi-justify-end pi-ml-16'\n }`}\n >\n <DropdownContent data-stop-propagation={true}></DropdownContent>\n </div>\n )}\n </motion.div>\n </div>\n <Tooltip className='pi-z-20' id='tooltip-left-transfer' place='left' />\n <Tooltip className='pi-z-20' id='tooltip-top-transfer' place='top' />\n </>\n )\n}\n\nexport default Hangup\n\ninterface HangupProps {\n clickCallback?: () => void\n isDestination?: boolean\n description?: any\n isPhysicalRecording?: boolean\n}\n"],"names":["_a","clickCallback","isDestination","description","isPhysicalRecording","_b","useSelector","state","currentCall","transferring","incoming","accepted","dispatch","useDispatch","isOpen","island","t","useTranslation","React","createElement","Fragment","className","concat","motion","div","Button","onClick","hangupCurrentPhysicalRecording","hangupAllExtensions","hangupCurrentCall","setTimeout","listen","setUpdateIntrudeStatus","setUpdateListenStatus","alerts","setAlert","eventDispatch","removeAlert","variant","FontAwesomeIcon","icon","faPhone","framerMotion","exports","style","height","DropdownContent","Tooltip","id","place"],"mappings":"w7CAqBgC,SAACA,GAClBA,EAAAC,cACAD,EAAAE,kBACbC,EAAWH,EAAAG,YACXC,EAAmBJ,EAAAI,oBAEbC,EAAuCC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAA7EC,EAAYJ,EAAAI,aAAEC,EAAQL,EAAAK,SAAEC,EAAQN,EAAAM,SAClCC,EAAWC,EAAAA,cACTC,EAAWR,eAAY,SAACC,GAAqB,OAAAA,EAAMQ,iBA2BnD,IAAAC,EAAMC,qBAGd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EACE,QAAAC,cAAA,MAAA,CAAAE,UAAW,IAAAC,OACTb,EACI,kDACA,8BAINS,UAACC,cAAAI,EAAAA,aAAAA,QAAAA,OAAOC,IAAG,CACTH,UAAW,GAAAC,OACTb,GAAgBN,EACZ,6DACA,kBACH,MAEHe,EAAAA,QAACC,cAAAM,SACC,CAAAC,QAAS,WACP,OAACtB,EAAuCuB,EAA8BA,kCA9C5EjB,EACFkB,EAAAA,sBAEAC,EAAAA,oBAIFC,YAAW,WACTlB,EAASmB,OAAOC,wBAAuB,EAAO,IAC9CpB,EAASmB,OAAOE,uBAAsB,EAAO,GAC9C,GAAE,UAGCxB,GACFqB,YAAW,WACTlB,EAASsB,OAAOC,SAAS,mBACzBC,gBAAc,0CAA2C,CAAA,GACzDN,YAAW,WACTlB,EAASsB,OAAOG,YAAY,kBAC7B,GAAE,IACJ,GAAE,MA0BK,EAEFC,QAAQ,MACRjB,UAAU,2EAER,kBAAAlB,GAAeM,EAAe,uBAAyB,+CAGvDN,GAAeM,EAAeN,EAAc,GAAGmB,OAAAN,EAAE,oBAInDE,EAAC,QAAAC,cAAAoB,mBAAgBlB,UAAU,8BAA8BmB,KAAMC,EAAAA,UAC9DhC,GAAgBN,GACfe,EAAA,QAAAC,cAACI,EAAMmB,aAAAC,QAAApB,OAACC,IACN,CAAAoB,MAAO,CAAEC,OAAQ,QACjBxB,UAAU,2CAETlB,IAINW,GAAUH,GACTO,EAAA,QAAAC,cAAA,MAAA,CACEE,UAAW,GAAAC,OACTb,GAAgBN,EACZ,iCACA,oDAGNe,EAAA,QAAAC,cAAC2B,UAAuC,CAAA,yBAAA,OAKhD5B,UAAAC,cAAC4B,EAAOA,QAAA,CAAC1B,UAAU,UAAU2B,GAAG,wBAAwBC,MAAM,SAC9D/B,EAAAA,QAAAC,cAAC4B,UAAQ,CAAA1B,UAAU,UAAU2B,GAAG,uBAAuBC,MAAM,QAGnE"}
1
+ {"version":3,"file":"Hangup.js","sources":["../../src/components/Hangup.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { Button } from './Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone } from '@fortawesome/free-solid-svg-icons'\nimport { hangupCurrentCall, hangupCurrentPhysicalRecording } from '../lib/phone/call'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Dispatch } from '../store'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { hangupAllExtensions } from '../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport DropdownContent from './SwitchInputView/DropdownContent'\nimport { eventDispatch } from '../utils'\n\n/**\n * Return the status of the\n */\nconst Hangup: FC<HangupProps> = ({\n clickCallback,\n isDestination,\n description,\n isPhysicalRecording,\n}) => {\n const { transferring, incoming, accepted } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n function handleHangup() {\n if (incoming) {\n hangupAllExtensions()\n } else {\n hangupCurrentCall()\n }\n\n // Delay the dispatch actions\n setTimeout(() => {\n dispatch.listen.setUpdateIntrudeStatus(false, '')\n dispatch.listen.setUpdateListenStatus(false, '')\n }, 2000)\n\n // Show confirmation message when a call is transferred\n if (transferring) {\n setTimeout(() => {\n dispatch.alerts.setAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-open', {})\n setTimeout(() => {\n dispatch.alerts.removeAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-close', {})\n }, 2000)\n }, 300)\n }\n }\n\n const { t } = useTranslation()\n\n // Phone island footer section\n return (\n <>\n <div\n className={` ${\n transferring\n ? 'pi-grid pi-w-full pi-space-x-2 pi-justify-start'\n : 'pi-flex pi-justify-center'\n }`}\n >\n {/* The button to hangup the currentCall */}\n <motion.div\n className={`${\n transferring && description\n ? 'pi-grid pi-grid-cols-[12rem,1rem] pi-ml-4 pi-justify-start'\n : 'pi-flex pi-w-12'\n } `}\n >\n <Button\n onClick={() =>\n !isPhysicalRecording ? handleHangup() : hangupCurrentPhysicalRecording()\n }\n variant='red'\n className='pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full'\n data-tooltip-id={\n description && transferring ? 'tooltip-top-transfer' : 'tooltip-left-transfer'\n }\n data-tooltip-content={\n description && transferring ? description : `${t('Tooltip.Hangup')}`\n }\n // data-tooltip-placement=\"top\"\n >\n <FontAwesomeIcon className='pi-rotate-135 pi-h-6 pi-w-6' icon={faPhone} />\n {transferring && description && (\n <motion.div\n style={{ height: '17px' }}\n className='pi-whitespace-nowrap pi-overflow-hidden'\n >\n {description}\n </motion.div>\n )}\n </Button>\n {isOpen && accepted && (\n <div\n className={`${\n transferring && description\n ? 'pi-grid pi-grid-cols-1 pi-ml-8'\n : 'pi-flex pi-items-center pi-justify-end pi-ml-16'\n }`}\n >\n <DropdownContent data-stop-propagation={true}></DropdownContent>\n </div>\n )}\n </motion.div>\n </div>\n <Tooltip className='pi-z-20' id='tooltip-left-transfer' place='left' />\n <Tooltip className='pi-z-20' id='tooltip-top-transfer' place='top' />\n </>\n )\n}\n\nexport default Hangup\n\ninterface HangupProps {\n clickCallback?: () => void\n isDestination?: boolean\n description?: any\n isPhysicalRecording?: boolean\n}\n"],"names":["_a","clickCallback","isDestination","description","isPhysicalRecording","_b","useSelector","state","currentCall","transferring","incoming","accepted","dispatch","useDispatch","isOpen","island","t","useTranslation","React","createElement","Fragment","className","concat","motion","div","Button","onClick","hangupCurrentPhysicalRecording","hangupAllExtensions","hangupCurrentCall","setTimeout","listen","setUpdateIntrudeStatus","setUpdateListenStatus","alerts","setAlert","eventDispatch","removeAlert","variant","FontAwesomeIcon","icon","faPhone","framerMotion","exports","style","height","DropdownContent","Tooltip","id","place"],"mappings":"w7CAqBgC,SAACA,GAClBA,EAAAC,cACAD,EAAAE,kBACbC,EAAWH,EAAAG,YACXC,EAAmBJ,EAAAI,oBAEbC,EAAuCC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAA7EC,EAAYJ,EAAAI,aAAEC,EAAQL,EAAAK,SAAEC,EAAQN,EAAAM,SAClCC,EAAWC,EAAAA,cACTC,EAAWR,eAAY,SAACC,GAAqB,OAAAA,EAAMQ,iBA4BnD,IAAAC,EAAMC,qBAGd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EACE,QAAAC,cAAA,MAAA,CAAAE,UAAW,IAAAC,OACTb,EACI,kDACA,8BAINS,UAACC,cAAAI,EAAAA,aAAAA,QAAAA,OAAOC,IAAG,CACTH,UAAW,GAAAC,OACTb,GAAgBN,EACZ,6DACA,kBACH,MAEHe,EAAAA,QAACC,cAAAM,SACC,CAAAC,QAAS,WACP,OAACtB,EAAuCuB,EAA8BA,kCA/C5EjB,EACFkB,EAAAA,sBAEAC,EAAAA,oBAIFC,YAAW,WACTlB,EAASmB,OAAOC,wBAAuB,EAAO,IAC9CpB,EAASmB,OAAOE,uBAAsB,EAAO,GAC9C,GAAE,UAGCxB,GACFqB,YAAW,WACTlB,EAASsB,OAAOC,SAAS,mBACzBC,gBAAc,qDAAsD,CAAA,GACpEN,YAAW,WACTlB,EAASsB,OAAOG,YAAY,mBAC5BD,gBAAc,sDAAuD,CAAA,EACtE,GAAE,IACJ,GAAE,MA0BK,EAEFE,QAAQ,MACRjB,UAAU,2EAER,kBAAAlB,GAAeM,EAAe,uBAAyB,+CAGvDN,GAAeM,EAAeN,EAAc,GAAGmB,OAAAN,EAAE,oBAInDE,EAAC,QAAAC,cAAAoB,mBAAgBlB,UAAU,8BAA8BmB,KAAMC,EAAAA,UAC9DhC,GAAgBN,GACfe,EAAA,QAAAC,cAACI,EAAMmB,aAAAC,QAAApB,OAACC,IACN,CAAAoB,MAAO,CAAEC,OAAQ,QACjBxB,UAAU,2CAETlB,IAINW,GAAUH,GACTO,EAAA,QAAAC,cAAA,MAAA,CACEE,UAAW,GAAAC,OACTb,GAAgBN,EACZ,iCACA,oDAGNe,EAAA,QAAAC,cAAC2B,UAAuC,CAAA,yBAAA,OAKhD5B,UAAAC,cAAC4B,EAAOA,QAAA,CAAC1B,UAAU,UAAU2B,GAAG,wBAAwBC,MAAM,SAC9D/B,EAAAA,QAAAC,cAAC4B,UAAQ,CAAA1B,UAAU,UAAU2B,GAAG,uBAAuBC,MAAM,QAGnE"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../lib/webrtc/janus.js");var a=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js");var s=require("../events/SocketEvents.js"),i=require("../utils/genericFunctions/timestamp.js"),u=require("../lib/user/extensions.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/react-redux/es/components/Context.js"),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");var l=require("../node_modules/react-redux/es/hooks/useDispatch.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=p(n);exports.Socket=function(p){var f=p.hostName,h=p.username,g=p.authToken,v=p.reload,b=p.reloadedCallback,k=p.children,y=p.uaType,_=l.useDispatch(),C=n.useRef(),N=n.useRef(),S=d.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t,o=a.store.getState().currentCall,s=o.transferring,d=o.transferSwitching,l=o.transferCalls;if(Object.keys(n).length>0){if(e.status){var p=a.store.getState().users.extensions;switch(e.status){case"ringing":_.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||"",ownerExtension:n.owner}),c.eventDispatch("phone-island-call-ringing",{});break;case"busy":if(n&&n.connected)_.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),ownerExtension:n.owner,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""}),_.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(i.getTimestampInSeconds())}),"physical"===(null===(t=null==S?void 0:S.default_device)||void 0===t?void 0:t.type)&&function(e){_.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),c.eventDispatch("phone-island-call-answered",{}),a.store.dispatch.player.stopAudioPlayer()}(n);else if(n&&!n.connected){if(s&&!d){var m=l.find((function(e){return e.number===n.counterpartNum}));!n.connected&&m&&(_.currentCall.updateCurrentCall({transferring:!1}),c.eventDispatch("phone-island-call-transfer-failed",{}),_.currentCall.updateTransferSwitching(!1))}"REC"===(null==n?void 0:n.counterpartName)&&_.physicalRecorder.setRecordingTempVariable(!0)}n&&!n.connected&&"out"===n.direction&&_.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""});case"onhold":var f=n.counterpartName,h=n.counterpartNum,g=n.startTime;s&&h&&f&&"<unknown>"!==f&&(_.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:h,startTime:"".concat(i.getTimestampInSeconds())}),_.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:h,startTime:"".concat(g/1e3),conversationId:n.id}),_.island.setIslandView("call"))}}}else"online"==e.status&&u.userTotallyFree()&&(_.player.stopAudioPlayer(),_.currentCall.reset(),_.physicalRecorder.setRecordingTempVariable(!1))};return N.current=t.io("https://"+f,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),N.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(N.current.id)),c.eventDispatch("phone-island-socket-connected",{})})),N.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),e.includes("server disconnect")?c.eventDispatch("phone-island-server-disconnected",{}):c.eventDispatch("phone-island-socket-disconnected",{})})),N.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),N.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),N.current.io.on("reconnect",(function(e){c.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(N.current.id,")"))})),N.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),N.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),N.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),C.current=setInterval((function(){var e=Date.now();N.current.volatile.emit("ping",o.withTimeout((function(){_.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){_.alerts.setAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected",{}),console.debug("Socket is unreachable!")}),7e3))}),7e3),N.current.on("connect",(function(){console.debug("Socket on: "+f+" is connected!"),N.current.emit("login",{accessKeyId:"".concat(h),token:g,uaType:y})})),N.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),N.current.on("userMainPresenceUpdate",(function(n){a.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),s.dispatchMainPresence(n)})),N.current.on("extenUpdate",(function(e){_.users.updateExtension(e),s.dispatchConversations(e);var t=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===h&&(n(e,t),_.currentUser.updateConversations(e))})),N.current.on("queueUpdate",(function(e){s.dispatchQueueUpdate(e)})),N.current.on("queueMemberUpdate",(function(e){s.dispatchQueueMemberUpdate(e)})),N.current.on("takeOver",(function(){s.dispatchAlreadyLogin()})),N.current.on("serverReloaded",(function(){s.dispatchServerReload()})),N.current.on("parkingUpdate",(function(){s.dispatchParkingUpdate()})),function(){clearInterval(C.current),N.current.close()}}),[]),n.useEffect((function(){v&&(console.info("websocket reconnection"),N.current.disconnect(),N.current.connect(),b())}),[v]),m.default.createElement(m.default.Fragment,null,k)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../lib/webrtc/janus.js");var a=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js");var s=require("../events/SocketEvents.js"),i=require("../utils/genericFunctions/timestamp.js"),u=require("../lib/user/extensions.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/react-redux/es/components/Context.js"),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");var l=require("../node_modules/react-redux/es/hooks/useDispatch.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=p(n);exports.Socket=function(p){var f=p.hostName,h=p.username,g=p.authToken,v=p.reload,b=p.reloadedCallback,k=p.children,y=p.uaType,_=l.useDispatch(),C=n.useRef(),N=n.useRef(),S=d.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t,o=a.store.getState().currentCall,s=o.transferring,d=o.transferSwitching,l=o.transferCalls;if(Object.keys(n).length>0){if(e.status){var p=a.store.getState().users.extensions;switch(e.status){case"ringing":_.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||"",ownerExtension:n.owner}),c.eventDispatch("phone-island-call-ringing",{});break;case"busy":if(n&&n.connected)_.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),ownerExtension:n.owner,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""}),_.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(i.getTimestampInSeconds())}),"physical"===(null===(t=null==S?void 0:S.default_device)||void 0===t?void 0:t.type)&&function(e){_.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),c.eventDispatch("phone-island-call-answered",{}),a.store.dispatch.player.stopAudioPlayer()}(n);else if(n&&!n.connected){if(s&&!d){var m=l.find((function(e){return e.number===n.counterpartNum}));!n.connected&&m&&(_.currentCall.updateCurrentCall({transferring:!1}),c.eventDispatch("phone-island-call-transfer-failed",{}),_.currentCall.updateTransferSwitching(!1))}"REC"===(null==n?void 0:n.counterpartName)&&_.physicalRecorder.setRecordingTempVariable(!0)}n&&!n.connected&&"out"===n.direction&&_.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""});case"onhold":var f=n.counterpartName,h=n.counterpartNum,g=n.startTime;s&&h&&f&&"<unknown>"!==f&&(_.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:h,startTime:"".concat(i.getTimestampInSeconds())}),_.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:h,startTime:"".concat(g/1e3),conversationId:n.id}),_.island.setIslandView("call"))}}}else"online"==e.status&&u.userTotallyFree()&&(_.player.stopAudioPlayer(),_.currentCall.reset(),_.physicalRecorder.setRecordingTempVariable(!1))};return N.current=t.io("https://"+f,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),N.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(N.current.id)),c.eventDispatch("phone-island-socket-connected",{})})),N.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),e.includes("server disconnect")?c.eventDispatch("phone-island-server-disconnected",{}):c.eventDispatch("phone-island-socket-disconnected",{})})),N.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),N.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),N.current.io.on("reconnect",(function(e){c.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(N.current.id,")"))})),N.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),N.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),N.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),C.current=setInterval((function(){var e=Date.now();N.current.volatile.emit("ping",o.withTimeout((function(){_.alerts.removeAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-close",{});var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){_.alerts.setAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.debug("Socket is unreachable!")}),7e3))}),7e3),N.current.on("connect",(function(){console.debug("Socket on: "+f+" is connected!"),N.current.emit("login",{accessKeyId:"".concat(h),token:g,uaType:y})})),N.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),N.current.on("userMainPresenceUpdate",(function(n){a.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),s.dispatchMainPresence(n)})),N.current.on("extenUpdate",(function(e){_.users.updateExtension(e),s.dispatchConversations(e);var t=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===h&&(n(e,t),_.currentUser.updateConversations(e))})),N.current.on("queueUpdate",(function(e){s.dispatchQueueUpdate(e)})),N.current.on("queueMemberUpdate",(function(e){s.dispatchQueueMemberUpdate(e)})),N.current.on("takeOver",(function(){s.dispatchAlreadyLogin()})),N.current.on("serverReloaded",(function(){s.dispatchServerReload()})),N.current.on("parkingUpdate",(function(){s.dispatchParkingUpdate()})),function(){clearInterval(C.current),N.current.close()}}),[]),n.useEffect((function(){v&&(console.info("websocket reconnection"),N.current.disconnect(),N.current.connect(),b())}),[v]),m.default.createElement(m.default.Fragment,null,k)};
2
2
  //# sourceMappingURL=Socket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n\n eventDispatch('phone-island-call-ringing', {})\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n if (userInformation?.default_device?.type === 'physical') {\n checkDefaultDeviceConversationActive(conv)\n }\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected', {})\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","userInformation","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","_b","store","getState","currentCall","transferring","transferSwitching","transferCalls","Object","keys","length","status","extensions","users","checkIncomingUpdatePlay","conversationId","id","displayName","getDisplayName","number","concat","counterpartNum","incomingSocket","ownerExtension","owner","eventDispatch","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","default_device","accepted","incoming","direction","undefined","player","stopAudioPlayer","checkDefaultDeviceConversationActive","inTransferCalls","find","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","island","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n\n eventDispatch('phone-island-call-ringing', {})\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n if (userInformation?.default_device?.type === 'physical') {\n checkDefaultDeviceConversationActive(conv)\n }\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-close', {})\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-open', {})\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","userInformation","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","_b","store","getState","currentCall","transferring","transferSwitching","transferCalls","Object","keys","length","status","extensions","users","checkIncomingUpdatePlay","conversationId","id","displayName","getDisplayName","number","concat","counterpartNum","incomingSocket","ownerExtension","owner","eventDispatch","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","default_device","accepted","incoming","direction","undefined","player","stopAudioPlayer","checkDefaultDeviceConversationActive","inTransferCalls","find","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","island","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nethesis/phone-island",
3
3
  "author": "Nethesis",
4
- "version": "0.8.16",
4
+ "version": "0.8.17",
5
5
  "description": "NethVoice CTI Phone Island",
6
6
  "keywords": [
7
7
  "nethserver",