@nethesis/phone-island 0.7.119 → 0.7.121
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/components/AudioPlayerView/index.js +1 -1
- package/dist/components/AudioPlayerView/index.js.map +1 -1
- package/dist/components/CallView/Actions.js +1 -1
- package/dist/components/CallView/Actions.js.map +1 -1
- package/dist/components/KeypadView/index.js +1 -1
- package/dist/components/KeypadView/index.js.map +1 -1
- package/dist/components/RecorderView/Actions.js +1 -1
- package/dist/components/RecorderView/Actions.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/TransferView/TransferActions.js +1 -1
- package/dist/components/TransferView/TransferActions.js.map +1 -1
- package/dist/components/TransferView/TransferList.js +1 -1
- package/dist/components/TransferView/TransferList.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/events/CallEvents.d.ts +0 -4
- package/dist/events/CallEvents.js +1 -1
- package/dist/events/CallEvents.js.map +1 -1
- package/dist/events/RecorderEvents.js +1 -1
- package/dist/events/RecorderEvents.js.map +1 -1
- package/dist/lib/phone/call.d.ts +4 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/user/default_device.js.map +1 -1
- package/dist/models/currentUser.d.ts +1 -0
- package/dist/models/currentUser.js +1 -1
- package/dist/models/currentUser.js.map +1 -1
- package/dist/models/fetchDefaults.js.map +1 -1
- package/dist/services/user.d.ts +1 -0
- package/dist/services/user.js.map +1 -1
- package/dist/static/test_audio.d.ts +2 -0
- 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("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),n=require("./components/WebRTC.js"),r=require("./components/Island.js"),a=require("./components/RestAPI.js"),o=require("./utils/customHooks/useEventListener.js"),i=require("./utils/genericFunctions/eventDispatch.js");require("./node_modules/react-redux/es/index.js");var l=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var u=require("./node_modules/js-base64/base64.mjs.js"),d=require("./workers/wake_up.js"),c=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var p=require("./lib/webrtc/messages.js"),m=require("./node_modules/react-redux/es/components/Provider.js");function f(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 h=f(e),v=function(f){var v=f.dataConfig,j=f.showAlways,q=void 0!==j&&j,E=u.Base64.atob(v||"").split(":"),w=E[0],b=E[1],k=E[2],_=E[3],x=E[4],I=E[5],y=E[6],D=e.useState(!1),g=D[0],C=D[1],P=e.useState(!1),S=P[0],L=P[1],A=e.useState(!1),N=A[0],R=A[1];e.useEffect((function(){var e=new Worker(d.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&C(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){N&&S&&(C(!1),L(!1),R(!1))}),[N,S]),o.useEventListener("phone-island-call-keypad-close",(function(){l.store.dispatch.island.setIslandView("call"),i.eventDispatch("phone-island-call-keypad-closed",{})})),o.useEventListener("phone-island-call-transfer-close",(function(){l.store.dispatch.island.setIslandView("call"),i.eventDispatch("phone-island-call-transfer-closed",{})})),o.useEventListener("phone-island-recording-close",(function(){l.store.dispatch.island.setIslandView(null),i.eventDispatch("phone-island-recording-closed",{})})),o.useEventListener("phone-island-audio-player-close",(function(){l.store.dispatch.island.setIslandView(null),i.eventDispatch("phone-island-audio-player-closed",{})})),o.useEventListener("phone-island-detach",(function(e){p.detach(),l.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),i.eventDispatch("phone-island-detached",{})}));var T=e.useState(!0),V=T[0],H=T[1];return e.useEffect((function(){V&&(c.loadI18n(),H(!1))}),[V]),h.default.createElement(h.default.Fragment,null,h.default.createElement(m.default,{store:l.store},h.default.createElement(n.WebRTC,{hostName:w,sipExten:_,sipSecret:x,sipHost:I,sipPort:y,reload:g,reloadedCallback:function(){return L(!0)}},h.default.createElement(a.RestAPI,{hostName:w,username:b,authToken:k},h.default.createElement(s.Socket,{hostName:w,username:b,authToken:k,reload:g,reloadedCallback:function(){return R(!0)}},h.default.createElement(t.Events,{sipHost:I},h.default.createElement(r.Island,{showAlways:q})))))))};v.displayName="PhoneIsland",exports.PhoneIsland=v;
|
|
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'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener } from './utils'\nimport { detach } from './lib/webrtc/messages'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\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-
|
|
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'\n\nimport 'react-tooltip/dist/react-tooltip.css'\nimport { useEventListener, eventDispatch } from './utils'\nimport { detach } from './lib/webrtc/messages'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\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-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 const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n()\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\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 >\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 >\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","showAlways","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","SIP_HOST","SIP_PORT","_c","useState","reload","setReload","_d","reloadedWebRTC","setReloadedWebRTC","_e","reloadedSocket","setReloadedSocket","useEffect","worker","Worker","wakeUpWorker","type","onmessage","event","data","terminate","useEventListener","store","dispatch","island","setIslandView","eventDispatch","detach","currentUser","updateCurrentDefaultDevice","deviceInformationObject","_f","firstRenderI18n","setFirstRenderI18n","loadI18n","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"uqCAiBaA,EAAoC,SAACC,GAAE,IAAAC,eAAYC,EAAAF,EAAAG,WAAAA,OAAU,IAAAD,GAAQA,EAC1EE,EAAmBC,EAAMA,OAACC,KAAKL,GAAc,IAAIM,MAAM,KACvDC,EAAoBJ,EAAO,GAC3BK,EAAmBL,EAAO,GAC1BM,EAAqBN,EAAO,GAC5BO,EAAoBP,EAAO,GAC3BQ,EAAqBR,EAAO,GAC5BS,EAAmBT,EAAO,GAC1BU,EAAmBV,EAAO,GAG1BW,EAAsBC,EAAAA,UAAkB,GAAvCC,EAAMF,EAAA,GAAEG,EAASH,EAAA,GAClBI,EAAsCH,EAAAA,UAAkB,GAAvDI,EAAcD,EAAA,GAAEE,EAAiBF,EAAA,GAClCG,EAAsCN,EAAAA,UAAkB,GAAvDO,EAAcD,EAAA,GAAEE,EAAiBF,EAAA,GAExCG,EAAAA,WAAU,WACR,IAAMC,EAAS,IAAIC,OAAOC,EAAAA,QAAc,CAAEC,KAAM,WAQhD,OAPAH,EAAOI,UAAY,SAACC,GAEC,WAAfA,EAAMC,MACRd,GAAU,EAEd,EAEO,WACLQ,EAAOO,WACT,CACD,GAAE,IAEHR,EAAAA,WAAU,WACJF,GAAkBH,IACpBF,GAAU,GACVG,GAAkB,GAClBG,GAAkB,GAEtB,GAAG,CAACD,EAAgBH,IAEpBc,EAAgBA,iBAAC,kCAAkC,WACjDC,EAAAA,MAAMC,SAASC,OAAOC,cAAc,QACpCC,gBAAc,kCAAmC,CAAA,EACnD,IACAL,EAAgBA,iBAAC,oCAAoC,WACnDC,EAAAA,MAAMC,SAASC,OAAOC,cAAc,QACpCC,gBAAc,oCAAqC,CAAA,EACrD,IACAL,EAAgBA,iBAAC,gCAAgC,WAC/CC,EAAAA,MAAMC,SAASC,OAAOC,cAAc,MACpCC,gBAAc,gCAAiC,CAAA,EACjD,IACAL,EAAgBA,iBAAC,mCAAmC,WAClDC,EAAAA,MAAMC,SAASC,OAAOC,cAAc,MACpCC,gBAAc,mCAAoC,CAAA,EACpD,IAEAL,mBAAiB,uBAAuB,SAACF,GACvCQ,EAAAA,SACAL,EAAAA,MAAMC,SAASK,YAAYC,2BAA2BV,aAAA,EAAAA,EAAMW,yBAC5DJ,gBAAc,wBAAyB,CAAA,EACzC,IAEM,IAAAK,EAAwC5B,EAAAA,UAAS,GAAhD6B,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GAS1C,OAPAnB,EAAAA,WAAU,WACJoB,IACFE,EAAAA,WACAD,GAAmB,GAEvB,GAAG,CAACD,IAGFG,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,EAAAA,QAAQ,CAAChB,MAAOA,EAAAA,OACfa,UAAAC,cAACG,EAAMA,OAAA,CACLC,SAAU7C,EACV8C,SAAU3C,EACV4C,UAAW3C,EACX4C,QAAS3C,EACT4C,QAAS3C,EACTG,OAAQA,EACRyC,iBAAkB,WAAM,OAAArC,GAAkB,KAE1C2B,UAAAC,cAACU,EAAOA,QAAA,CAACN,SAAU7C,EAAWoD,SAAUnD,EAAUoD,UAAWnD,GAC3DsC,EAAC,QAAAC,cAAAa,SACC,CAAAT,SAAU7C,EACVoD,SAAUnD,EACVoD,UAAWnD,EACXO,OAAQA,EACRyC,iBAAkB,WAAM,OAAAlC,GAAkB,KAE1CwB,EAAAA,QAAAC,cAACc,EAAAA,OAAM,CAACP,QAAS3C,GACfmC,UAAAC,cAACe,EAAMA,OAAA,CAAC7D,WAAYA,SAQpC,EAEAJ,EAAYkE,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Avatar.js"),r=require("../AudioBars.js"),a=require("./Progress.js"),i=require("../Button.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Avatar.js"),r=require("../AudioBars.js"),a=require("./Progress.js"),i=require("../Button.js"),s=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),l=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),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 u=require("../../utils/customHooks/useEventListener.js"),d=require("../../utils/genericFunctions/eventDispatch.js"),c=require("../../node_modules/react-redux/es/hooks/useSelector.js"),p=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e),y=function(){var e=c.useSelector((function(e){return e.player})),m=e.audioPlayerTrackType,y=e.audioPlayerTrackName,x=e.audioPlayer,j=e.audioPlayerPlaying,v=c.useSelector((function(e){return e.island})).isOpen,h=p.useDispatch();function q(){h.player.startAudioPlayer((function(){})),d.eventDispatch("phone-island-audio-player-played",{})}function _(){h.player.pauseAudioPlayer(),d.eventDispatch("phone-island-audio-player-paused",{})}u.useEventListener("phone-island-audio-player-play",(function(e){q()})),u.useEventListener("phone-island-audio-player-pause",(function(e){_()}));var E=n.useTranslation().t;return f.default.createElement("div",{className:"pi-flex pi-gap-7 pi-flex-col"},f.default.createElement("div",{className:"pi-flex pi-gap-4"},f.default.createElement(t.Avatar,{type:m}),f.default.createElement("div",{className:"pi-flex pi-items-center pi-w-full"},f.default.createElement("div",{style:{width:v?"202px":"60px"},className:"pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block"},y)),f.default.createElement(r.AudioBars,{audioElement:x&&x.current,size:v?"large":"small"})),v&&f.default.createElement("div",null,f.default.createElement(a.Progress,null),f.default.createElement("div",{className:"pi-w-full pi-flex pi-justify-center pi-items-center pi-pt-7"},f.default.createElement(i.Button,{onClick:j?_:q,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(E(j?"Tooltip.Pause":"Tooltip.Play"))},j?f.default.createElement(s.FontAwesomeIcon,{icon:l.faPause,size:"xl"}):f.default.createElement(s.FontAwesomeIcon,{icon:l.faPlay,size:"xl"})))),f.default.createElement(o.Tooltip,{className:"pi-z-20",id:"tooltip",place:"bottom"}))};exports.KeypadView=y,exports.default=y;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/AudioPlayerView/index.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 { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Avatar } from './Avatar'\nimport { AudioBars } from '../AudioBars'\nimport Progress from './Progress'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPause, faPlay } from '@fortawesome/free-solid-svg-icons'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\n\nexport const KeypadView: FC<KeypadViewTypes> = () => {\n const { audioPlayerTrackType, audioPlayerTrackName, audioPlayer, audioPlayerPlaying } =\n useSelector((state: RootState) => state.player)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const dispatch = useDispatch<Dispatch>()\n\n function startPlaying() {\n dispatch.player.startAudioPlayer(() => {})\n }\n\n function pausePlaying() {\n dispatch.player.pauseAudioPlayer()\n }\n\n const { t } = useTranslation()\n\n return (\n <div className='pi-flex pi-gap-7 pi-flex-col'>\n <div className='pi-flex pi-gap-4'>\n <Avatar type={audioPlayerTrackType} />\n <div className='pi-flex pi-items-center pi-w-full'>\n <div\n style={{\n width: isOpen ? '202px' : '60px',\n }}\n className={`pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block`}\n >\n {audioPlayerTrackName}\n </div>\n </div>\n <AudioBars\n audioElement={audioPlayer && audioPlayer.current}\n size={isOpen ? 'large' : 'small'}\n />\n </div>\n {isOpen && (\n <div>\n <Progress />\n <div className='pi-w-full pi-flex pi-justify-center pi-items-center pi-pt-7'>\n <Button\n onClick={audioPlayerPlaying ? pausePlaying : startPlaying}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={audioPlayerPlaying ? `${t('Tooltip.Pause')}` : `${t('Tooltip.Play')}`}\n >\n {audioPlayerPlaying ? (\n <FontAwesomeIcon icon={faPause} size='xl' />\n ) : (\n <FontAwesomeIcon icon={faPlay} size='xl' />\n )}\n </Button>\n </div>\n </div>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </div>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["KeypadView","_a","useSelector","state","player","audioPlayerTrackType","audioPlayerTrackName","audioPlayer","audioPlayerPlaying","isOpen","island","dispatch","useDispatch","t","useTranslation","React","createElement","className","Avatar","type","style","width","AudioBars","audioElement","current","size","Progress","Button","onClick","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/AudioPlayerView/index.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 { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Avatar } from './Avatar'\nimport { AudioBars } from '../AudioBars'\nimport Progress from './Progress'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPause, faPlay } from '@fortawesome/free-solid-svg-icons'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\n\nexport const KeypadView: FC<KeypadViewTypes> = () => {\n const { audioPlayerTrackType, audioPlayerTrackName, audioPlayer, audioPlayerPlaying } =\n useSelector((state: RootState) => state.player)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const dispatch = useDispatch<Dispatch>()\n\n function startPlaying() {\n dispatch.player.startAudioPlayer(() => {})\n eventDispatch('phone-island-audio-player-played', {})\n }\n useEventListener('phone-island-audio-player-play', (data: {}) => {\n startPlaying()\n })\n\n function pausePlaying() {\n dispatch.player.pauseAudioPlayer()\n eventDispatch('phone-island-audio-player-paused', {})\n }\n useEventListener('phone-island-audio-player-pause', (data: {}) => {\n pausePlaying()\n })\n\n const { t } = useTranslation()\n\n return (\n <div className='pi-flex pi-gap-7 pi-flex-col'>\n <div className='pi-flex pi-gap-4'>\n <Avatar type={audioPlayerTrackType} />\n <div className='pi-flex pi-items-center pi-w-full'>\n <div\n style={{\n width: isOpen ? '202px' : '60px',\n }}\n className={`pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block`}\n >\n {audioPlayerTrackName}\n </div>\n </div>\n <AudioBars\n audioElement={audioPlayer && audioPlayer.current}\n size={isOpen ? 'large' : 'small'}\n />\n </div>\n {isOpen && (\n <div>\n <Progress />\n <div className='pi-w-full pi-flex pi-justify-center pi-items-center pi-pt-7'>\n <Button\n onClick={audioPlayerPlaying ? pausePlaying : startPlaying}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={audioPlayerPlaying ? `${t('Tooltip.Pause')}` : `${t('Tooltip.Play')}`}\n >\n {audioPlayerPlaying ? (\n <FontAwesomeIcon icon={faPause} size='xl' />\n ) : (\n <FontAwesomeIcon icon={faPlay} size='xl' />\n )}\n </Button>\n </div>\n </div>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </div>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["KeypadView","_a","useSelector","state","player","audioPlayerTrackType","audioPlayerTrackName","audioPlayer","audioPlayerPlaying","isOpen","island","dispatch","useDispatch","startPlaying","startAudioPlayer","eventDispatch","pausePlaying","pauseAudioPlayer","useEventListener","data","t","useTranslation","React","createElement","className","Avatar","type","style","width","AudioBars","audioElement","current","size","Progress","Button","onClick","variant","transform","concat","FontAwesomeIcon","icon","faPause","faPlay","Tooltip","id","place"],"mappings":"45CAgBaA,EAAkC,WACvC,IAAAC,EACJC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,UADlCC,EAAoBJ,EAAAI,qBAAEC,EAAoBL,EAAAK,qBAAEC,EAAWN,EAAAM,YAAEC,EAAkBP,EAAAO,mBAE3EC,EAAWP,eAAY,SAACC,GAAqB,OAAAA,EAAMO,iBACrDC,EAAWC,EAAAA,cAEjB,SAASC,IACPF,EAASP,OAAOU,kBAAiB,WAAQ,IACzCC,gBAAc,mCAAoC,CAAA,EACnD,CAKD,SAASC,IACPL,EAASP,OAAOa,mBAChBF,gBAAc,mCAAoC,CAAA,EACnD,CAPDG,mBAAiB,kCAAkC,SAACC,GAClDN,GACF,IAMAK,mBAAiB,mCAAmC,SAACC,GACnDH,GACF,IAEQ,IAAAI,EAAMC,qBAEd,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,gCACbF,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,oBACbF,EAAAA,QAAAC,cAACE,EAAAA,OAAM,CAACC,KAAMrB,IACdiB,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,qCACbF,EAAAA,QAAAC,cAAA,MAAA,CACEI,MAAO,CACLC,MAAOnB,EAAS,QAAU,QAE5Be,UAAW,yFAEVlB,IAGLgB,EAAAA,QAACC,cAAAM,EAAAA,WACCC,aAAcvB,GAAeA,EAAYwB,QACzCC,KAAMvB,EAAS,QAAU,WAG5BA,GACCa,EAAA,QAAAC,cAAA,MAAA,KACED,UAAAC,cAACU,EAAQA,SAAG,MACZX,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,+DACbF,EAAAA,QAAAC,cAACW,SACC,CAAAC,QAAS3B,EAAqBQ,EAAeH,EAC7CuB,QAAQ,UACRT,MAAO,CAAEU,UAAW,iCACJ,UAAS,uBACkB,GAAAC,OAAGlB,EAAxBZ,EAA0B,gBAA0B,kBAEzEA,EACCc,EAAAA,QAACC,cAAAgB,mBAAgBC,KAAMC,EAAAA,QAAST,KAAK,OAErCV,wBAACiB,EAAeA,gBAAA,CAACC,KAAME,SAAQV,KAAK,UAO9CV,EAAAA,QAAAC,cAACoB,UAAQ,CAAAnB,UAAU,UAAUoB,GAAG,UAAUC,MAAM,WAGtD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../lib/phone/call.js"),o=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../lib/phone/call.js"),n=require("../../utils/customHooks/useEventListener.js"),o=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js");var r=require("../../lib/webrtc/messages.js");require("../../node_modules/mic-check/lib/index.js");var i=require("../../static/outgoing_ringtone.js");require("../Island.js");var l=require("../../services/astproxy.js"),s=require("../Button.js"),u=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),c=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/framer-motion/dist/framer-motion.js");var d=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),p=require("../TransferView/TransferActions.js"),m=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 f=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var j=require("../../lib/user/default_device.js"),v=require("../../node_modules/react-redux/es/hooks/useSelector.js"),x=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var q=h(e);exports.default=function(){var e=v.useSelector((function(e){return e.currentCall})),h=e.paused,y=e.muted,E=v.useSelector((function(e){return e.currentCall.parked})),g=v.useSelector((function(e){return e.island})),T=g.view,_=g.actionsExpanded,C=v.useSelector((function(e){return e.currentCall.transferring})),w=x.useDispatch();function b(){w.island.setIslandView("keypad"!==T?"keypad":"call"),o.eventDispatch("phone-island-call-keypad-opened",{})}function A(){w.island.setIslandView("transfer"!==T?"transfer":"call"),o.eventDispatch("phone-island-call-transfer-opened",{})}function k(){j.isWebRTC()?r.sendDTMF("*"):l.sendPhysicalDTMF("*"),a.store.getState().player.audioPlayerPlaying||w.player.updateStartAudioPlayer({src:i.default,loop:!0}),setTimeout((function(){j.isWebRTC()?r.sendDTMF("1"):l.sendPhysicalDTMF("1"),w.player.stopAudioPlayer(),C&&setTimeout((function(){w.currentCall.updateTransferring(!1)}),500),o.eventDispatch("phone-island-call-transfer-canceled",{})}),500)}n.useEventListener("phone-island-call-keypad-open",(function(){b()})),n.useEventListener("phone-island-call-transfer-open",(function(){A()})),n.useEventListener("phone-island-call-transfer-cancel",(function(){k()}));var F=f.useTranslation().t;return q.default.createElement(q.default.Fragment,null,q.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},q.default.createElement(s.Button,{variant:"default",active:!!h,onClick:function(){return h?t.unpauseCurrentCall():t.pauseCurrentCall()},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(F(h?"Tooltip.Play":"Tooltip.Pause"))},h?q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faPlay}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faPause})),q.default.createElement(s.Button,{variant:"default",active:!!y,onClick:function(){return y?t.unmuteCurrentCall():t.muteCurrentCall()},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(F(y?"Tooltip.Unmute":"Tooltip.Mute"))},y?q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faMicrophoneSlash}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faMicrophone})),q.default.createElement(s.Button,{active:C,onClick:C?k:A,variant:"default","data-tooltip-id":"tooltip","data-tooltip-content":"".concat(F(C?"Tooltip.Cancel transfer":"Tooltip.Transfer"))},C?q.default.createElement(u.FontAwesomeIcon,{className:"",size:"xl",icon:c.faArrowDownUpAcrossLine}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",className:"pi-rotate-90",icon:c.faArrowRightArrowLeft})),q.default.createElement(s.Button,{active:_,variant:"transparent",onClick:function(){_?w.island.toggleActionsExpanded(!1):w.island.toggleActionsExpanded(!0)},"data-tooltip-id":"tooltip","data-tooltip-content":"".concat(F(_?"Tooltip.Collapse":"Tooltip.Expand"))},_?q.default.createElement(u.FontAwesomeIcon,{className:"",size:"xl",icon:c.faChevronUp}):q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faChevronDown}))),_?q.default.createElement(q.default.Fragment,null," ",q.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},q.default.createElement(s.Button,{active:"keypad"===T,variant:"default",onClick:b,"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Keyboard")},q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:d.faGridRound})),q.default.createElement(s.Button,{active:E,variant:"default",onClick:t.parkCurrentCall,"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Park")},q.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:c.faSquareParking})),C&&q.default.createElement(p.TransferActions,null))):q.default.createElement(q.default.Fragment,null),q.default.createElement(m.Tooltip,{className:"pi-z-20",id:"tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.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 {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n attendedTransfer,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faArrowDownUpAcrossLine,\n faSquareParking,\n faChevronDown,\n faChevronUp,\n faArrowRightArrowLeft,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faGridRound } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { TransferActions } from '../TransferView'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { park } from '../../lib/phone/call'\nimport { eventDispatch, useEventListener } from '../../utils'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const parked = useSelector((state: RootState) => state.currentCall.parked)\n\n // Get isOpen and view from island store\n const { view, actionsExpanded } = useSelector((state: RootState) => state.island)\n const transferring = useSelector((state: RootState) => state.currentCall.transferring)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n }\n\n function transfer() {\n // Open the transfer view\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n }\n\n // Cancels the current transfer through dtmfs\n function calcelTransfer() {\n if (isWebRTC()) {\n sendDTMF('*')\n } else {\n sendPhysicalDTMF('*')\n }\n\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n if (isWebRTC()) {\n sendDTMF('1')\n } else {\n sendPhysicalDTMF('1')\n }\n\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n }, 500)\n }\n\n function toggleActionsExpanded() {\n if (actionsExpanded) {\n dispatch.island.toggleActionsExpanded(false)\n } else {\n dispatch.island.toggleActionsExpanded(true)\n }\n }\n\n function parkAction() {\n park()\n dispatch.currentCall.setParked(true)\n eventDispatch('phone-island-call-parked', {})\n }\n\n const { t } = useTranslation()\n\n // Phone island header section\n return (\n <>\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={paused ? `${t('Tooltip.Play')}` : `${t('Tooltip.Pause')}`}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPause} />\n )}\n </Button>\n\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophone} />\n )}\n </Button>\n\n <Button\n active={transferring}\n onClick={transferring ? calcelTransfer : transfer}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={\n transferring ? `${t('Tooltip.Cancel transfer')}` : `${t('Tooltip.Transfer')}`\n }\n >\n {transferring ? (\n <FontAwesomeIcon className='' size='xl' icon={faArrowDownUpAcrossLine} />\n ) : (\n <FontAwesomeIcon size='xl' className='pi-rotate-90' icon={faArrowRightArrowLeft} />\n )}\n </Button>\n\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={() => toggleActionsExpanded()}\n data-tooltip-id='tooltip'\n data-tooltip-content={\n actionsExpanded ? `${t('Tooltip.Collapse')}` : `${t('Tooltip.Expand')}`\n }\n >\n {actionsExpanded ? (\n <FontAwesomeIcon className='' size='xl' icon={faChevronUp} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faChevronDown} />\n )}\n </Button>\n </div>\n {/* Actions expanded section */}\n {actionsExpanded ? (\n <>\n {' '}\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n active={view === 'keypad'}\n variant='default'\n onClick={openKeypad}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Keyboard')}\n >\n <FontAwesomeIcon size='xl' icon={faGridRound} />\n </Button>\n <Button\n active={parked}\n variant='default'\n onClick={parkAction}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Park')}\n >\n <FontAwesomeIcon size='xl' icon={faSquareParking} />\n </Button>\n {transferring && <TransferActions />}\n </div>\n </>\n ) : (\n <></>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","parked","_b","island","view","actionsExpanded","transferring","dispatch","useDispatch","t","useTranslation","React","createElement","Fragment","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","concat","FontAwesomeIcon","size","icon","faPlay","faPause","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophone","isWebRTC","sendDTMF","sendPhysicalDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","setIslandView","faArrowDownUpAcrossLine","faArrowRightArrowLeft","toggleActionsExpanded","faChevronUp","faChevronDown","faGridRound","park","setParked","eventDispatch","faSquareParking","TransferActions","Tooltip","id","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.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 {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n parkCurrentCall,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faArrowDownUpAcrossLine,\n faSquareParking,\n faChevronDown,\n faChevronUp,\n faArrowRightArrowLeft,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faGridRound } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { TransferActions } from '../TransferView'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { useEventListener, eventDispatch } from '../../utils'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n const parked = useSelector((state: RootState) => state.currentCall.parked)\n\n // Get isOpen and view from island store\n const { view, actionsExpanded } = useSelector((state: RootState) => state.island)\n const transferring = useSelector((state: RootState) => state.currentCall.transferring)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n eventDispatch('phone-island-call-keypad-opened', {})\n }\n useEventListener('phone-island-call-keypad-open', () => {\n openKeypad()\n })\n\n function transfer() {\n // Open the transfer view\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n eventDispatch('phone-island-call-transfer-opened', {})\n }\n useEventListener('phone-island-call-transfer-open', () => {\n transfer()\n })\n useEventListener('phone-island-call-transfer-cancel', () => {\n cancelTransfer()\n })\n\n // Cancels the current transfer through dtmfs\n function cancelTransfer() {\n if (isWebRTC()) {\n sendDTMF('*')\n } else {\n sendPhysicalDTMF('*')\n }\n\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n setTimeout(() => {\n if (isWebRTC()) {\n sendDTMF('1')\n } else {\n sendPhysicalDTMF('1')\n }\n\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n\n eventDispatch('phone-island-call-transfer-canceled', {})\n }, 500)\n }\n\n function toggleActionsExpanded() {\n if (actionsExpanded) {\n dispatch.island.toggleActionsExpanded(false)\n } else {\n dispatch.island.toggleActionsExpanded(true)\n }\n }\n\n const { t } = useTranslation()\n\n // Phone island header section\n return (\n <>\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={paused ? `${t('Tooltip.Play')}` : `${t('Tooltip.Pause')}`}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPause} />\n )}\n </Button>\n\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophone} />\n )}\n </Button>\n\n <Button\n active={transferring}\n onClick={transferring ? cancelTransfer : transfer}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={\n transferring ? `${t('Tooltip.Cancel transfer')}` : `${t('Tooltip.Transfer')}`\n }\n >\n {transferring ? (\n <FontAwesomeIcon className='' size='xl' icon={faArrowDownUpAcrossLine} />\n ) : (\n <FontAwesomeIcon size='xl' className='pi-rotate-90' icon={faArrowRightArrowLeft} />\n )}\n </Button>\n\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={() => toggleActionsExpanded()}\n data-tooltip-id='tooltip'\n data-tooltip-content={\n actionsExpanded ? `${t('Tooltip.Collapse')}` : `${t('Tooltip.Expand')}`\n }\n >\n {actionsExpanded ? (\n <FontAwesomeIcon className='' size='xl' icon={faChevronUp} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faChevronDown} />\n )}\n </Button>\n </div>\n {/* Actions expanded section */}\n {actionsExpanded ? (\n <>\n {' '}\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n active={view === 'keypad'}\n variant='default'\n onClick={openKeypad}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Keyboard')}\n >\n <FontAwesomeIcon size='xl' icon={faGridRound} />\n </Button>\n <Button\n active={parked}\n variant='default'\n onClick={parkCurrentCall}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Park')}\n >\n <FontAwesomeIcon size='xl' icon={faSquareParking} />\n </Button>\n {transferring && <TransferActions />}\n </div>\n </>\n ) : (\n <></>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","parked","_b","island","view","actionsExpanded","transferring","dispatch","useDispatch","openKeypad","setIslandView","eventDispatch","transfer","cancelTransfer","isWebRTC","sendDTMF","sendPhysicalDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","useEventListener","t","useTranslation","React","createElement","Fragment","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","concat","FontAwesomeIcon","size","icon","faPlay","faPause","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophone","faArrowDownUpAcrossLine","faArrowRightArrowLeft","toggleActionsExpanded","faChevronUp","faChevronDown","faGridRound","parkCurrentCall","faSquareParking","TransferActions","Tooltip","id","place"],"mappings":"2hEAqCoB,WAEZ,IAAAA,EAAoBC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,WAAW,IAArEC,WAAQC,UACVC,EAASL,eAAY,SAACC,GAAqB,OAAAA,EAAMC,YAAYG,MAAlB,IAG3CC,EAA4BN,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMM,MAAM,IAAxEC,SAAMC,oBACRC,EAAeV,eAAY,SAACC,GAAqB,OAAAA,EAAMC,YAAYQ,YAAlB,IAEjDC,EAAWC,EAAAA,cAEjB,SAASC,IACPF,EAASJ,OAAOO,cAAuB,WAATN,EAAoB,SAAW,QAC7DO,gBAAc,kCAAmC,CAAA,EAClD,CAKD,SAASC,IAEPL,EAASJ,OAAOO,cAAuB,aAATN,EAAsB,WAAa,QACjEO,gBAAc,oCAAqC,CAAA,EACpD,CASD,SAASE,IACHC,EAAQA,WACVC,EAAQA,SAAC,KAETC,EAAgBA,iBAAC,KAGYC,EAAKA,MAACC,WAAWC,OAAMC,oBAGpDb,EAASY,OAAOE,uBAAuB,CACrCC,IAAKC,EAAgB,QACrBC,MAAM,IAGVC,YAAW,WACLX,EAAQA,WACVC,EAAQA,SAAC,KAETC,EAAgBA,iBAAC,KAGnBT,EAASY,OAAOO,kBAEZpB,GACFmB,YAAW,WACTlB,EAAST,YAAY6B,oBAAmB,EACzC,GAAE,KAGLhB,gBAAc,sCAAuC,CAAA,EACtD,GAAE,IACJ,CAjDDiB,EAAgBA,iBAAC,iCAAiC,WAChDnB,GACF,IAOAmB,EAAgBA,iBAAC,mCAAmC,WAClDhB,GACF,IACAgB,EAAgBA,iBAAC,qCAAqC,WACpDf,GACF,IA6CQ,IAAAgB,EAAMC,qBAGd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,EAAAA,QAACC,cAAAG,UACCC,QAAQ,UACRC,SAAQtC,EACRuC,QAAS,WAAM,OAACvC,EAASwC,uBAAuBC,oBAAmB,oBACnD,UAAS,uBACM,GAAGC,OAAAZ,EAAZ9B,EAAc,eAAyB,mBAE5DA,EACCgC,UAACC,cAAAU,EAAeA,iBAACC,KAAK,KAAKC,KAAMC,WAEjCd,EAAA,QAAAC,cAACU,EAAeA,gBAAC,CAAAC,KAAK,KAAKC,KAAME,EAAOA,WAI5Cf,EAAAA,QAACC,cAAAG,UACCC,QAAQ,UACRC,SAAQrC,EACRsC,QAAS,WAAM,OAACtC,EAAQ+C,sBAAsBC,mBAAkB,oBAChD,UAAS,uBACK,GAAGP,OAAAZ,EAAX7B,EAAa,iBAA2B,kBAE7DA,EACC+B,UAACC,cAAAU,EAAeA,iBAACC,KAAK,KAAKC,KAAMK,sBAEjClB,EAAA,QAAAC,cAACU,EAAeA,gBAAC,CAAAC,KAAK,KAAKC,KAAMM,EAAYA,gBAIjDnB,EAAAA,QAAAC,cAACG,SACC,CAAAE,OAAQ/B,EACRgC,QAAShC,EAAeO,EAAiBD,EACzCwB,QAAQ,UAAS,kBACD,UAEd,uBAAe,UAAGP,EAAlBvB,EAAoB,0BAAoC,sBAGzDA,EACCyB,UAAAC,cAACU,EAAeA,gBAAC,CAAAR,UAAU,GAAGS,KAAK,KAAKC,KAAMO,EAAuBA,0BAErEpB,EAAAA,sBAACW,kBAAe,CAACC,KAAK,KAAKT,UAAU,eAAeU,KAAMQ,EAAqBA,yBAInFrB,EAAAA,QAAAC,cAACG,SACC,CAAAE,OAAQhC,EACR+B,QAAQ,cACRE,QAAS,WA5DXjC,EACFE,EAASJ,OAAOkD,uBAAsB,GAEtC9C,EAASJ,OAAOkD,uBAAsB,EAyDI,EACtB,kBAAA,iCAEI,UAAGxB,EAArBxB,EAAuB,mBAA6B,oBAGrDA,EACC0B,wBAACW,EAAeA,gBAAA,CAACR,UAAU,GAAGS,KAAK,KAAKC,KAAMU,EAAWA,cAEzDvB,EAAAA,QAAAC,cAACU,kBAAgB,CAAAC,KAAK,KAAKC,KAAMW,oBAKtClD,EACC0B,EAAAA,QAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG,IACDF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,EAAC,QAAAC,cAAAG,EAAMA,QACLE,OAAiB,WAATjC,EACRgC,QAAQ,UACRE,QAAS7B,EAAU,kBACH,UACM,uBAAAoB,EAAE,qBAExBE,UAACC,cAAAU,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMY,EAAWA,eAE9CzB,EAAA,QAAAC,cAACG,EAAMA,OACL,CAAAE,OAAQpC,EACRmC,QAAQ,UACRE,QAASmB,EAAAA,gBACO,kBAAA,iCACM5B,EAAE,iBAExBE,UAACC,cAAAU,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMc,EAAeA,mBAEjDpD,GAAgByB,EAAA,QAAAC,cAAC2B,EAAAA,gBAAe,QAIrC5B,EAAAA,QAAAC,cAAAD,EAAAA,QAAAE,SAAA,MAGFF,EAAAA,QAAAC,cAAC4B,UAAQ,CAAA1B,UAAU,UAAU2B,GAAG,UAAUC,MAAM,WAGtD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),s=require("./Actions.js"),n=require("../../lib/webrtc/messages.js"),o=require("../../lib/island/island.js"),a=require("../../lib/phone/call.js"),l=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 u=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var d=require("../../lib/user/default_device.js"),c=require("../../services/astproxy.js"),p=require("../../utils/customHooks/useEventListener.js"),m=require("../../utils/genericFunctions/eventDispatch.js"),f=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),b=require("../../node_modules/react-redux/es/hooks/useSelector.js");function j(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var x=j(e),y=["0","1","2","3","4","5","6","7","8","9","*","#"];exports.default=function(){var j=f.useDispatch(),v=b.useSelector((function(e){return e.currentCall})).keypadValue,q=b.useSelector((function(e){return e.island})).isOpen,_=e.useRef(v);function h(e){j.currentCall.updateKeypadValue("".concat(_.current).concat(e)),_.current="".concat(_.current).concat(e),a.playDtmfAudio(e),d.isWebRTC()?n.sendDTMF(e):c.sendPhysicalDTMF(e),m.eventDispatch("phone-island-call-keypad-sent",{})}p.useEventListener("phone-island-call-keypad-send",(function(e){h(e.key)})),e.useEffect((function(){function e(e){y.includes(e.key)&&h(e.key)}return window.addEventListener("keydown",e),function(){return window.removeEventListener("keydown",e)}}),[]);var k=u.useTranslation().t;return x.default.createElement(x.default.Fragment,null,q?x.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-7"},x.default.createElement("div",{className:"pi-flex pi-gap-4"},x.default.createElement(t.Button,{variant:"transparent",onClick:o.backToCallView,"data-tooltip-id":"keyboard-tooltip","data-tooltip-content":k("Tooltip.Back to call")},x.default.createElement(r.FontAwesomeIcon,{size:"xl",icon:i.faArrowLeft})),x.default.createElement("input",{"data-stop-propagation":!0,type:"text",readOnly:!0,value:v,autoFocus:!0,className:"pi-w-full pi-rounded-full pi-bg-black pi-border-2 pi-border-emerald-500 active:pi-border-emerald-500 focus:pi-border-emerald-500 pi-text-white pi-font-sans pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0"})),x.default.createElement(s.default,{keyCallback:h})):x.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Keypad"),x.default.createElement(l.Tooltip,{className:"pi-z-1000",id:"keyboard-tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons'\nimport Actions from './Actions'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { backToCallView } from '../../lib/island/island'\nimport { playDtmfAudio } from '../../lib/phone/call'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n if (isWebRTC()) {\n sendDTMF(key)\n } else {\n sendPhysicalDTMF(key)\n }\n }\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n const { t } = useTranslation()\n\n return (\n <>\n {isOpen ? (\n <div className='pi-flex pi-flex-col pi-gap-7'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={backToCallView}\n data-tooltip-id='keyboard-tooltip'\n data-tooltip-content={t('Tooltip.Back to call')}\n >\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n readOnly\n value={keypadValue}\n autoFocus\n className='pi-w-full pi-rounded-full pi-bg-black pi-border-2 pi-border-emerald-500 active:pi-border-emerald-500 focus:pi-border-emerald-500 pi-text-white pi-font-sans pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0'\n />\n </div>\n <Actions keyCallback={sendKey} />\n </div>\n ) : (\n <div className='pi-font-medium pi-text-base'>Keypad</div>\n )}\n <Tooltip className='pi-z-1000' id='keyboard-tooltip' place='bottom' />\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","playDtmfAudio","isWebRTC","sendDTMF","sendPhysicalDTMF","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","t","useTranslation","React","createElement","Fragment","className","Button","variant","onClick","backToCallView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","value","autoFocus","Actions","keyCallback","Tooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons'\nimport Actions from './Actions'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { backToCallView } from '../../lib/island/island'\nimport { playDtmfAudio } from '../../lib/phone/call'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { useEventListener, eventDispatch } from '../../utils'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n if (isWebRTC()) {\n sendDTMF(key)\n } else {\n sendPhysicalDTMF(key)\n }\n\n eventDispatch('phone-island-call-keypad-sent', {})\n }\n useEventListener('phone-island-call-keypad-send', (data: KeypadTypes) => {\n sendKey(data.key)\n })\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n const { t } = useTranslation()\n\n return (\n <>\n {isOpen ? (\n <div className='pi-flex pi-flex-col pi-gap-7'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={backToCallView}\n data-tooltip-id='keyboard-tooltip'\n data-tooltip-content={t('Tooltip.Back to call')}\n >\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n readOnly\n value={keypadValue}\n autoFocus\n className='pi-w-full pi-rounded-full pi-bg-black pi-border-2 pi-border-emerald-500 active:pi-border-emerald-500 focus:pi-border-emerald-500 pi-text-white pi-font-sans pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0'\n />\n </div>\n <Actions keyCallback={sendKey} />\n </div>\n ) : (\n <div className='pi-font-medium pi-text-base'>Keypad</div>\n )}\n <Tooltip className='pi-z-1000' id='keyboard-tooltip' place='bottom' />\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n\ninterface KeypadTypes {\n key: string\n}"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","playDtmfAudio","isWebRTC","sendDTMF","sendPhysicalDTMF","eventDispatch","useEventListener","data","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","t","useTranslation","React","createElement","Fragment","className","Button","variant","onClick","backToCallView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","value","autoFocus","Actions","keyCallback","Tooltip","id","place"],"mappings":"kjDAmBMA,EAAY,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qBAElC,WACtC,IAAMC,EAAWC,EAAAA,cACTC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BACxDC,EAAWH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,iBACrDC,EAAiBC,SAA2BP,GAElD,SAASQ,EAAQC,GACfX,EAASK,YAAYO,kBAAkB,GAAAC,OAAGL,EAAeM,SAAOD,OAAGF,IACnEH,EAAeM,QAAU,GAAGD,OAAAL,EAAeM,SAAOD,OAAGF,GACrDI,EAAaA,cAACJ,GACVK,EAAQA,WACVC,EAAQA,SAACN,GAETO,EAAgBA,iBAACP,GAGnBQ,gBAAc,gCAAiC,CAAA,EAChD,CACDC,mBAAiB,iCAAiC,SAACC,GACjDX,EAAQW,EAAKV,IACf,IAEAW,EAAAA,WAAU,WACR,SAASC,EAAsBC,GACzBzB,EAAU0B,SAASD,EAAMb,MAC3BD,EAAQc,EAAMb,IAEjB,CAED,OADAe,OAAOC,iBAAiB,UAAWJ,GAC5B,WAAM,OAAAG,OAAOE,oBAAoB,UAAWL,GACpD,GAAE,IAEK,IAAAM,EAAMC,qBAEd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG3B,EACCyB,EAAK,QAAAC,cAAA,MAAA,CAAAE,UAAU,gCACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oBACbH,EAAAA,QAAAC,cAACG,EAAAA,OAAM,CACLC,QAAQ,cACRC,QAASC,EAAcA,iCACP,mBAAkB,uBACZT,EAAE,yBAExBE,UAACC,cAAAO,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMC,EAAWA,eAE9CX,EAAA,QAAAC,cAAA,QAAA,CAAA,yBACyB,EACvBW,KAAK,OACLC,UACA,EAAAC,MAAO3C,EACP4C,WAAS,EACTZ,UAAU,oPAGdH,EAAA,QAAAC,cAACe,EAAO,QAAC,CAAAC,YAAatC,KAGxBqB,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,yCAEjBH,EAAAA,QAAAC,cAACiB,UAAQ,CAAAf,UAAU,YAAYgB,GAAG,mBAAmBC,MAAM,WAGjE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../Button.js"),o=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),i=require("../../services/offhour.js");require("../../node_modules/react-redux/es/index.js");var s=require("../../lib/phone/call.js"),a=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../store/index.js");var d=require("../../events/RecorderEvents.js"),c=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 u=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var p=require("../../node_modules/react-redux/es/utils/shallowEqual.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 m=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),f=require("../../node_modules/react-redux/es/hooks/useSelector.js");function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var h=g(t);exports.Actions=function(){var g=m.useDispatch(),v=f.useSelector((function(e){return{incoming:e.recorder.incoming,waiting:e.recorder.waiting,recording:e.recorder.recording,recorded:e.recorder.recorded,playing:e.recorder.playing}}),p.default),j=v.incoming,_=v.waiting,x=v.recording,y=v.recorded,E=v.playing;function q(){return e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return g.recorder.setRecording(!0),g.recorder.setWaiting(!0),[4,i.startAnnouncementRecording()];case 1:return(t=e.sent()).tempFilename&&g.recorder.setTempFilename(t.tempFilename),g.recorder.setStartTime("".concat(Date.now()/1e3)),l.eventDispatch("phone-island-recording-started",{}),[2]}}))}))}function w(){g.recorder.setWaiting(!0),s.hangupCurrentCall(),g.recorder.setRecorded(!0),l.eventDispatch("phone-island-recording-stopped",{})}function b(){g.player.startAudioPlayer((function(){g.recorder.setPlaying(!1),g.recorder.setPaused(!0)})),g.recorder.setPlaying(!0),l.eventDispatch("phone-island-recording-played",{})}function C(){g.player.pauseAudioPlayer(),g.recorder.setPlaying(!1),g.recorder.setPaused(!0),l.eventDispatch("phone-island-recording-paused",{})}function P(){g.recorder.resetRecorded(),l.eventDispatch("phone-island-recording-deleted",{})}function T(){d.dispatchRecordingSave(),g.island.setIslandView(null)}a.useEventListener("phone-island-recording-start",(function(e){q()})),a.useEventListener("phone-island-recording-stop",(function(e){w()})),a.useEventListener("phone-island-recording-play",(function(e){b()})),a.useEventListener("phone-island-recording-pause",(function(e){C()})),a.useEventListener("phone-island-recording-delete",(function(e){P()})),a.useEventListener("phone-island-recording-save",(function(e){T()})),t.useEffect((function(){x||g.recorder.setWaiting(!1)}),[x]),t.useEffect((function(){j&&(s.answerIncomingCall(),g.recorder.setIncoming(!1),g.recorder.setWaiting(!1))}),[j]);var A=u.useTranslation().t;return h.default.createElement("div",{className:"pi-flex pi-justify-center pi-items-center pi-pt-9 pi-gap-6",style:y?{paddingTop:"2rem"}:{}},x&&h.default.createElement(r.Button,{onClick:w,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Stop")},_?h.default.createElement(o.FontAwesomeIcon,{icon:n.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):h.default.createElement(o.FontAwesomeIcon,{icon:n.faStop,size:"xl"})),y&&!x&&h.default.createElement(h.default.Fragment,null,h.default.createElement(r.Button,{onClick:P,variant:"default","data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Delete")},h.default.createElement(o.FontAwesomeIcon,{icon:n.faTrash,size:"xl"})),E?h.default.createElement(r.Button,{onClick:C,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Pause")},h.default.createElement(o.FontAwesomeIcon,{icon:n.faPause,size:"xl"})):h.default.createElement(r.Button,{onClick:b,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Play")},h.default.createElement(o.FontAwesomeIcon,{icon:n.faPlay,size:"xl"})),h.default.createElement(r.Button,{onClick:T,variant:"green","data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Confirm")},h.default.createElement(o.FontAwesomeIcon,{icon:n.faCheck,size:"xl"}))),!x&&!y&&h.default.createElement(r.Button,{onClick:q,variant:"red",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":A("Tooltip.Start recording")},_?h.default.createElement(o.FontAwesomeIcon,{icon:n.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):h.default.createElement(o.FontAwesomeIcon,{icon:n.faRecordVinyl,size:"xl"})),h.default.createElement(c.Tooltip,{className:"pi-z-20",id:"tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/RecorderView/Actions.tsx"],"sourcesContent":["//\n// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n//\n\nimport React, { type FC, useEffect } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faTrash,\n faCheck,\n faRecordVinyl,\n faStop,\n faCircleNotch,\n} from '@fortawesome/free-solid-svg-icons'\nimport { startAnnouncementRecording } from '../../services/offhour'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport { dispatchRecordingSave } from '../../events'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\n\nexport const Actions: FC<{}> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { incoming, waiting, recording, recorded, playing } = useSelector(\n (state: RootState) => ({\n incoming: state.recorder.incoming,\n waiting: state.recorder.waiting,\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n playing: state.recorder.playing,\n }),\n shallowEqual,\n )\n\n async function handleStart() {\n // Update the recorder state\n dispatch.recorder.setRecording(true)\n dispatch.recorder.setWaiting(true)\n // Call the api to start the recording call\n const data: { tempFilename: string } | null = await startAnnouncementRecording()\n // Set the returned temp file name to the store\n if (data.tempFilename) dispatch.recorder.setTempFilename(data.tempFilename)\n // Set the start time of recording\n dispatch.recorder.setStartTime(`${Date.now() / 1000}`)\n }\n\n function handleStop() {\n // Set waiting to true\n dispatch.recorder.setWaiting(true)\n // Call the function to hangup the current call used for recording\n hangupCurrentCall()\n dispatch.recorder.setRecorded(true)\n }\n\n function handlePlay() {\n dispatch.player.startAudioPlayer(() => {\n // The callback for the end event of the audio player\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n })\n dispatch.recorder.setPlaying(true)\n }\n\n function handlePause() {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n }\n\n function handleDelete() {\n dispatch.recorder.resetRecorded()\n }\n\n function handleSaveRecording() {\n // Dispatch the reconrding save event\n dispatchRecordingSave()\n // Close the Island\n dispatch.island.setIslandView(null)\n }\n\n useEffect(() => {\n if (!recording) {\n dispatch.recorder.setWaiting(false)\n }\n }, [recording])\n\n useEffect(() => {\n if (incoming) {\n // Answer the incoming call for recording\n answerIncomingCall()\n // Reset incoming to recorder state\n dispatch.recorder.setIncoming(false)\n dispatch.recorder.setWaiting(false)\n }\n }, [incoming])\n\n const { t } = useTranslation()\n\n return (\n <div\n className={`pi-flex pi-justify-center pi-items-center pi-pt-9 pi-gap-6`}\n style={recorded ? { paddingTop: '2rem' } : {}}\n >\n {recording && (\n <Button\n onClick={handleStop}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Stop')}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faStop} size='xl' />\n )}\n </Button>\n )}\n {recorded && !recording && (\n <>\n <Button\n onClick={handleDelete}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Delete')}\n >\n <FontAwesomeIcon icon={faTrash} size='xl' />\n </Button>\n {playing ? (\n <Button\n onClick={handlePause}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Pause')}\n >\n <FontAwesomeIcon icon={faPause} size='xl' />\n </Button>\n ) : (\n <Button\n onClick={handlePlay}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Play')}\n >\n <FontAwesomeIcon icon={faPlay} size='xl' />\n </Button>\n )}\n <Button\n onClick={handleSaveRecording}\n variant='green'\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Confirm')}\n >\n <FontAwesomeIcon icon={faCheck} size='xl' />\n </Button>\n </>\n )}\n {!recording && !recorded && (\n <Button\n onClick={handleStart}\n variant='red'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Start recording')}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faRecordVinyl} size='xl' />\n )}\n </Button>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </div>\n )\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","incoming","recorder","waiting","recording","recorded","playing","shallowEqual","useEffect","setWaiting","answerIncomingCall","setIncoming","t","useTranslation","React","className","style","paddingTop","createElement","Button","onClick","hangupCurrentCall","setRecorded","variant","transform","FontAwesomeIcon","icon","faCircleNotch","size","faStop","Fragment","resetRecorded","faTrash","player","pauseAudioPlayer","setPlaying","setPaused","faPause","startAudioPlayer","faPlay","dispatchRecordingSave","island","setIslandView","faCheck","setRecording","startAnnouncementRecording","data","sent","tempFilename","setTempFilename","setStartTime","concat","Date","now","faRecordVinyl","Tooltip","id","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/RecorderView/Actions.tsx"],"sourcesContent":["//\n// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n//\n\nimport React, { type FC, useEffect } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faTrash,\n faCheck,\n faRecordVinyl,\n faStop,\n faCircleNotch,\n} from '@fortawesome/free-solid-svg-icons'\nimport { startAnnouncementRecording } from '../../services/offhour'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport { dispatchRecordingSave } from '../../events'\nimport { Tooltip } from 'react-tooltip/dist/react-tooltip.min.cjs'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\n\nexport const Actions: FC<{}> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { incoming, waiting, recording, recorded, playing } = useSelector(\n (state: RootState) => ({\n incoming: state.recorder.incoming,\n waiting: state.recorder.waiting,\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n playing: state.recorder.playing,\n }),\n shallowEqual,\n )\n\n async function handleStart() {\n // Update the recorder state\n dispatch.recorder.setRecording(true)\n dispatch.recorder.setWaiting(true)\n // Call the api to start the recording call\n const data: { tempFilename: string } | null = await startAnnouncementRecording()\n // Set the returned temp file name to the store\n if (data.tempFilename) dispatch.recorder.setTempFilename(data.tempFilename)\n // Set the start time of recording\n dispatch.recorder.setStartTime(`${Date.now() / 1000}`)\n eventDispatch('phone-island-recording-started', {})\n }\n useEventListener('phone-island-recording-start', (data: {}) => {\n handleStart()\n })\n\n function handleStop() {\n // Set waiting to true\n dispatch.recorder.setWaiting(true)\n // Call the function to hangup the current call used for recording\n hangupCurrentCall()\n dispatch.recorder.setRecorded(true)\n eventDispatch('phone-island-recording-stopped', {})\n }\n useEventListener('phone-island-recording-stop', (data: {}) => {\n handleStop()\n })\n\n function handlePlay() {\n dispatch.player.startAudioPlayer(() => {\n // The callback for the end event of the audio player\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n })\n dispatch.recorder.setPlaying(true)\n eventDispatch('phone-island-recording-played', {})\n }\n useEventListener('phone-island-recording-play', (data: {}) => {\n handlePlay()\n })\n\n function handlePause() {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n eventDispatch('phone-island-recording-paused', {})\n }\n useEventListener('phone-island-recording-pause', (data: {}) => {\n handlePause()\n })\n\n function handleDelete() {\n dispatch.recorder.resetRecorded()\n eventDispatch('phone-island-recording-deleted', {})\n }\n useEventListener('phone-island-recording-delete', (data: {}) => {\n handleDelete()\n })\n\n function handleSaveRecording() {\n // Dispatch the reconrding save event\n dispatchRecordingSave()\n // Close the Island\n dispatch.island.setIslandView(null)\n }\n useEventListener('phone-island-recording-save', (data: {}) => {\n handleSaveRecording()\n })\n\n useEffect(() => {\n if (!recording) {\n dispatch.recorder.setWaiting(false)\n }\n }, [recording])\n\n useEffect(() => {\n if (incoming) {\n // Answer the incoming call for recording\n answerIncomingCall()\n // Reset incoming to recorder state\n dispatch.recorder.setIncoming(false)\n dispatch.recorder.setWaiting(false)\n }\n }, [incoming])\n\n const { t } = useTranslation()\n\n return (\n <div\n className={`pi-flex pi-justify-center pi-items-center pi-pt-9 pi-gap-6`}\n style={recorded ? { paddingTop: '2rem' } : {}}\n >\n {recording && (\n <Button\n onClick={handleStop}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Stop')}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faStop} size='xl' />\n )}\n </Button>\n )}\n {recorded && !recording && (\n <>\n <Button\n onClick={handleDelete}\n variant='default'\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Delete')}\n >\n <FontAwesomeIcon icon={faTrash} size='xl' />\n </Button>\n {playing ? (\n <Button\n onClick={handlePause}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Pause')}\n >\n <FontAwesomeIcon icon={faPause} size='xl' />\n </Button>\n ) : (\n <Button\n onClick={handlePlay}\n variant='default'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Play')}\n >\n <FontAwesomeIcon icon={faPlay} size='xl' />\n </Button>\n )}\n <Button\n onClick={handleSaveRecording}\n variant='green'\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Confirm')}\n >\n <FontAwesomeIcon icon={faCheck} size='xl' />\n </Button>\n </>\n )}\n {!recording && !recorded && (\n <Button\n onClick={handleStart}\n variant='red'\n style={{ transform: 'scale(1.15)' }}\n data-tooltip-id='tooltip'\n data-tooltip-content={t('Tooltip.Start recording')}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faRecordVinyl} size='xl' />\n )}\n </Button>\n )}\n {/* Buttons tooltips */}\n <Tooltip className='pi-z-20' id='tooltip' place='bottom' />\n </div>\n )\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","incoming","recorder","waiting","recording","recorded","playing","shallowEqual","handleStart","setRecording","setWaiting","startAnnouncementRecording","data","sent","tempFilename","setTempFilename","setStartTime","concat","Date","now","eventDispatch","handleStop","hangupCurrentCall","setRecorded","handlePlay","player","startAudioPlayer","setPlaying","setPaused","handlePause","pauseAudioPlayer","handleDelete","resetRecorded","handleSaveRecording","dispatchRecordingSave","island","setIslandView","useEventListener","useEffect","answerIncomingCall","setIncoming","t","useTranslation","React","className","style","paddingTop","createElement","Button","onClick","variant","transform","FontAwesomeIcon","icon","faCircleNotch","size","faStop","Fragment","faTrash","faPause","faPlay","faCheck","faRecordVinyl","Tooltip","id","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var
|
|
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("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var s=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var a=require("../events/SocketEvents.js"),u=require("../utils/genericFunctions/timestamp.js"),i=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,g=p.username,v=p.authToken,h=p.reload,b=p.reloadedCallback,k=p.children,y=l.useDispatch(),_=n.useRef(),C=n.useRef(),N=d.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t,o=s.store.getState().currentCall,a=o.transferring,d=o.transferSwitching,l=o.transferCalls;if(Object.keys(n).length>0){if(e.status){var p=s.store.getState().users.extensions;switch(e.status){case"ringing":y.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)y.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)||""}),y.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(u.getTimestampInSeconds())}),"webrtc"!==(null===(t=null==N?void 0:N.default_device)||void 0===t?void 0:t.type)&&function(e){y.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),s.store.dispatch.player.stopAudioPlayer()}(n);else if(n&&!n.connected&&a&&!d){var m=l.find((function(e){return e.number===n.counterpartNum}));!n.connected&&m&&(y.currentCall.updateCurrentCall({transferring:!1}),y.currentCall.updateTransferSwitching(!1))}n&&!n.connected&&"out"===n.direction&&y.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,g=n.counterpartNum,v=n.startTime;a&&g&&f&&"<unknown>"!==f&&(y.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:g,startTime:"".concat(u.getTimestampInSeconds())}),y.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:g,startTime:"".concat(v/1e3),conversationId:n.id}),y.island.setIslandView("call"))}}}else"online"==e.status&&i.userTotallyFree()&&(y.player.stopAudioPlayer(),y.currentCall.reset())};return C.current=t.io("https://"+f,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),C.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(C.current.id)),c.eventDispatch("phone-island-socket-connected",{})})),C.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",{})})),C.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),C.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),C.current.io.on("reconnect",(function(e){c.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(C.current.id,")"))})),C.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),C.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),C.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),_.current=setInterval((function(){var e=Date.now();C.current.volatile.emit("ping",o.withTimeout((function(){y.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){y.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),7e3))}),7e3),C.current.on("connect",(function(){console.debug("Socket on: "+f+" is connected!"),C.current.emit("login",{accessKeyId:"".concat(g),token:v,uaType:"desktop"})})),C.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),C.current.on("userMainPresenceUpdate",(function(n){s.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),a.dispatchMainPresence(n)})),C.current.on("extenUpdate",(function(e){y.users.updateExtension(e),a.dispatchConversations(e);var t=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===g&&(n(e,t),y.currentUser.updateConversations(e))})),C.current.on("queueUpdate",(function(e){a.dispatchQueueUpdate(e)})),C.current.on("queueMemberUpdate",(function(e){a.dispatchQueueMemberUpdate(e)})),C.current.on("takeOver",(function(){a.dispatchAlreadyLogin()})),C.current.on("serverReloaded",(function(){a.dispatchServerReload()})),C.current.on("parkingUpdate",(function(){a.dispatchParkingUpdate()})),function(){clearInterval(_.current),C.current.close()}}),[]),n.useEffect((function(){h&&(console.info("websocket reconnection"),C.current.disconnect(),C.current.connect(),b())}),[h]),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}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\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\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 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 !== 'webrtc') {\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 // 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 }\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 }\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 })\n socket.current.on('disconnect', (reason) => {\n console.log(`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 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.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('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","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","connected","updateCurrentCall","startTime","addTransferCalls","type","getTimestampInSeconds","default_device","accepted","incoming","direction","undefined","player","stopAudioPlayer","checkDefaultDeviceConversationActive","inTransferCalls","find","item","updateTransferSwitching","checkOutgoingUpdate","outgoingSocket","counterpartName","island","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","log","includes","eventDispatch","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","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}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\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\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 !== 'webrtc') {\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 // 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 }\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 }\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 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: 'desktop',\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","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","checkOutgoingUpdate","outgoingSocket","counterpartName","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","uaType","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,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),s=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),s=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../lib/webrtc/messages.js"),o=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js");var n=require("../../static/outgoing_ringtone.js"),a=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 l=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var u=require("../../utils/customHooks/useEventListener.js"),d=require("../../utils/genericFunctions/eventDispatch.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),m=require("../../node_modules/react-redux/es/hooks/useSelector.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=p(e);exports.TransferActions=function(){var e=c.useDispatch(),p=m.useSelector((function(e){return e.currentCall}));function j(){e.currentCall.updateTransferSwitching(!0),i.sendDTMF("*"),o.store.getState().player.audioPlayerPlaying||e.player.updateStartAudioPlayer({src:n.default,loop:!0}),setTimeout((function(){i.sendDTMF("4"),e.player.stopAudioPlayer(),d.eventDispatch("phone-island-call-transfer-switched",{})}),500)}p.transferCalls,p.number,u.useEventListener("phone-island-call-transfer-switch",(function(){j()}));var h=l.useTranslation().t;return f.default.createElement(f.default.Fragment,null,f.default.createElement("div",{className:"pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},f.default.createElement("div",null),f.default.createElement(t.Button,{onClick:j,variant:"default","data-tooltip-id":"transfer-actions-tooltip","data-tooltip-content":h("Tooltip.Switch call")},f.default.createElement(r.FontAwesomeIcon,{size:"xl",icon:s.faArrowsRepeat})),f.default.createElement("div",null)),f.default.createElement(a.Tooltip,{className:"pi-z-1000",id:"transfer-actions-tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=TransferActions.js.map
|