@nethesis/phone-island 0.7.120 → 0.7.122
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/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/KeypadView/Actions.js +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/RecorderView/index.js +1 -1
- package/dist/components/RecorderView/index.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/SwitchInputView/DropdownContent.js +1 -1
- package/dist/components/SwitchInputView/DropdownContent.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/index.css +1 -1
- package/dist/lib/phone/call.d.ts +4 -7
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/webrtc/messages.d.ts +1 -7
- package/dist/lib/webrtc/messages.js +1 -1
- package/dist/lib/webrtc/messages.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"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),n=require("./components/Socket.js"),s=require("./components/WebRTC.js"),o=require("./components/Island.js"),a=require("./components/RestAPI.js"),i=require("./utils/customHooks/useEventListener.js"),r=require("./utils/genericFunctions/eventDispatch.js"),u=require("./utils/genericFunctions/localStorage.js");require("./node_modules/react-redux/es/index.js");var d=require("./store/index.js");require("./node_modules/@fortawesome/react-fontawesome/index.es.js"),require("./node_modules/framer-motion/dist/framer-motion.js");var c=require("./node_modules/js-base64/base64.mjs.js"),l=require("./workers/wake_up.js"),p=require("./lib/i18n.js");require("./node_modules/react-tooltip/dist/react-tooltip.min.css.js");var h=require("./lib/webrtc/messages.js"),f=require("./node_modules/react-redux/es/components/Provider.js");function v(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 m=v(e),j=function(v){var j=v.dataConfig,I=v.showAlways,q=void 0!==I&&I,E=c.Base64.atob(j||"").split(":"),g=E[0],w=E[1],S=E[2],k=E[3],b=E[4],D=E[5],_=E[6],x=e.useState(!1),y=x[0],L=x[1],C=e.useState(!1),N=C[0],P=C[1],A=e.useState(!1),O=A[0],R=A[1];e.useEffect((function(){var e=new Worker(l.default,{type:"module"});return e.onmessage=function(e){"wakeup"===e.data&&L(!0)},function(){e.terminate()}}),[]),e.useEffect((function(){O&&N&&(L(!1),P(!1),R(!1))}),[O,N]),i.useEventListener("phone-island-call-keypad-close",(function(){d.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-keypad-closed",{})})),i.useEventListener("phone-island-call-transfer-close",(function(){d.store.dispatch.island.setIslandView("call"),r.eventDispatch("phone-island-call-transfer-closed",{})})),i.useEventListener("phone-island-recording-close",(function(){d.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-recording-closed",{})})),i.useEventListener("phone-island-audio-player-close",(function(){d.store.dispatch.island.setIslandView(null),r.eventDispatch("phone-island-audio-player-closed",{})})),i.useEventListener("phone-island-detach",(function(e){h.detach(),d.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),r.eventDispatch("phone-island-detached",{})})),i.useEventListener("phone-island-audio-input-change",(function(e){u.setJSONItem("phone-island-audio-input-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-input-changed",{})})),i.useEventListener("phone-island-audio-output-change",(function(e){var t=d.store.getState().player.remoteAudio;null==t||t.current.setSinkId(e.deviceId).then((function(){console.info("Default audio output device change with success!"),u.setJSONItem("phone-island-audio-output-device",{deviceId:e.deviceId}),r.eventDispatch("phone-island-audio-output-changed",{})})).catch((function(e){console.error("Default audio output device change error:",e)}))}));var T=e.useState(!0),V=T[0],F=T[1],H=e.useState(!0),J=H[0],W=H[1];e.useEffect((function(){V&&(p.loadI18n(),F(!1))}),[V]);var B=d.store.getState().player.remoteAudio;return e.useEffect((function(){var e;if(J&&B){var t=null===(e=u.getJSONItem("phone-island-audio-output-device"))||void 0===e?void 0:e.deviceId;r.eventDispatch("phone-island-audio-output-change",{deviceId:t}),W(!1)}}),[J,B]),m.default.createElement(m.default.Fragment,null,m.default.createElement(f.default,{store:d.store},m.default.createElement(s.WebRTC,{hostName:g,sipExten:k,sipSecret:b,sipHost:D,sipPort:_,reload:y,reloadedCallback:function(){return P(!0)}},m.default.createElement(a.RestAPI,{hostName:g,username:w,authToken:S},m.default.createElement(n.Socket,{hostName:g,username:w,authToken:S,reload:y,reloadedCallback:function(){return R(!0)}},m.default.createElement(t.Events,{sipHost:D},m.default.createElement(o.Island,{showAlways:q})))))))};j.displayName="PhoneIsland",exports.PhoneIsland=j;
|
|
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, setJSONItem, getJSONItem } from './utils'\nimport { detach } from './lib/webrtc/messages'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\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 useEventListener('phone-island-audio-input-change', (data: DeviceInputOutputTypes) => {\n setJSONItem('phone-island-audio-input-device', { deviceId: data.deviceId })\n eventDispatch('phone-island-audio-input-changed', {})\n })\n useEventListener('phone-island-audio-output-change', (data: DeviceInputOutputTypes) => {\n const remoteAudioElement: any = store.getState().player.remoteAudio\n // set audio output\n remoteAudioElement?.current\n .setSinkId(data.deviceId)\n .then(function () {\n console.info('Default audio output device change with success!')\n // set device to localstorage\n setJSONItem('phone-island-audio-output-device', { deviceId: data.deviceId })\n\n // dispatch event\n eventDispatch('phone-island-audio-output-changed', {})\n })\n .catch(function (err) {\n console.error('Default audio output device change error:', err)\n })\n })\n\n const [firstRenderI18n, setFirstRenderI18n] = useState(true)\n const [firstAudioOutputInit, setFirstAudioOutputInit] = useState(true)\n\n //initialize i18n\n useEffect(() => {\n if (firstRenderI18n) {\n loadI18n()\n setFirstRenderI18n(false)\n }\n }, [firstRenderI18n])\n\n const remoteAudioElement: any = store.getState().player.remoteAudio\n\n //initialize i18n\n useEffect(() => {\n if (firstAudioOutputInit && remoteAudioElement) {\n const defaultAudioOutputDevice: any = getJSONItem(`phone-island-audio-output-device`)?.deviceId\n eventDispatch('phone-island-audio-output-change', { deviceId: defaultAudioOutputDevice })\n setFirstAudioOutputInit(false)\n }\n }, [firstAudioOutputInit, remoteAudioElement])\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","setJSONItem","deviceId","remoteAudioElement","getState","player","remoteAudio","current","setSinkId","then","console","info","catch","err","error","_f","firstRenderI18n","setFirstRenderI18n","_g","firstAudioOutputInit","setFirstAudioOutputInit","loadI18n","defaultAudioOutputDevice","getJSONItem","React","createElement","Fragment","Provider","WebRTC","hostName","sipExten","sipSecret","sipHost","sipPort","reloadedCallback","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/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":"k+DAsCoB,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,cA0DT,IAAAC,EAAMC,qBAGd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,EAAAA,QAACC,cAAAG,UACCC,QAAQ,UACRC,SAAQlB,EACRmB,QAAS,WAAM,OAACnB,EAASoB,uBAAuBC,oBAAmB,oBACnD,UAAS,uBACM,GAAGC,OAAAZ,EAAZV,EAAc,eAAyB,mBAE5DA,EACCY,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,SAAQjB,EACRkB,QAAS,WAAM,OAAClB,EAAQ2B,sBAAsBC,mBAAkB,oBAChD,UAAS,uBACK,GAAGP,OAAAZ,EAAXT,EAAa,iBAA2B,kBAE7DA,EACCW,UAACC,cAAAU,EAAeA,iBAACC,KAAK,KAAKC,KAAMK,sBAEjClB,EAAA,QAAAC,cAACU,EAAeA,gBAAC,CAAAC,KAAK,KAAKC,KAAMM,EAAYA,gBAIjDnB,EAAAA,QAAAC,cAACG,SACC,CAAAE,OAAQX,EACRY,QAASZ,EAlFjB,WACMyB,EAAQA,WACVC,EAAQA,SAAC,KAETC,EAAgBA,iBAAC,KAGYC,EAAKA,MAACC,WAAWC,OAAMC,oBAGpD9B,EAAS6B,OAAOE,uBAAuB,CACrCC,IAAKC,EAAgB,QACrBC,MAAM,IAGVC,YAAW,WACLX,EAAQA,WACVC,EAAQA,SAAC,KAETC,EAAgBA,iBAAC,KAGnB1B,EAAS6B,OAAOO,kBAEZrC,GACFoC,YAAW,WACTnC,EAAST,YAAY8C,oBAAmB,EACzC,GAAE,IAEN,GAAE,IACJ,EApCD,WAEErC,EAASJ,OAAO0C,cAAuB,aAATzC,EAAsB,WAAa,OAClE,EAsFOY,QAAQ,UAAS,kBACD,UAEd,uBAAe,UAAGP,EAAlBH,EAAoB,0BAAoC,sBAGzDA,EACCK,UAAAC,cAACU,EAAeA,gBAAC,CAAAR,UAAU,GAAGS,KAAK,KAAKC,KAAMsB,EAAuBA,0BAErEnC,EAAAA,sBAACW,kBAAe,CAACC,KAAK,KAAKT,UAAU,eAAeU,KAAMuB,EAAqBA,yBAInFpC,EAAAA,QAAAC,cAACG,SACC,CAAAE,OAAQZ,EACRW,QAAQ,cACRE,QAAS,WAlEXb,EACFE,EAASJ,OAAO6C,uBAAsB,GAEtCzC,EAASJ,OAAO6C,uBAAsB,EA+DI,EACtB,kBAAA,iCAEI,UAAGvC,EAArBJ,EAAuB,mBAA6B,oBAGrDA,EACCM,wBAACW,EAAeA,gBAAA,CAACR,UAAU,GAAGS,KAAK,KAAKC,KAAMyB,EAAWA,cAEzDtC,EAAAA,QAAAC,cAACU,kBAAgB,CAAAC,KAAK,KAAKC,KAAM0B,oBAKtC7C,EACCM,EAAAA,QAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG,IACDF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,EAAC,QAAAC,cAAAG,EAAMA,QACLE,OAAiB,WAATb,EACRY,QAAQ,UACRE,QAlIZ,WACEX,EAASJ,OAAO0C,cAAuB,WAATzC,EAAoB,SAAW,OAC9D,EAgI8B,kBACH,UACM,uBAAAK,EAAE,qBAExBE,UAACC,cAAAU,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAM2B,EAAWA,eAE9CxC,EAAA,QAAAC,cAACG,EAAMA,OACL,CAAAE,OAAQhB,EACRe,QAAQ,UACRE,QAzFZ,WACEkC,EAAAA,OACA7C,EAAST,YAAYuD,WAAU,GAC/BC,gBAAc,2BAA4B,CAAA,EAC3C,EAsF2B,kBAAA,iCACM7C,EAAE,iBAExBE,UAACC,cAAAU,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAM+B,EAAeA,mBAEjDjD,GAAgBK,EAAA,QAAAC,cAAC4C,EAAAA,gBAAe,QAIrC7C,EAAAA,QAAAC,cAAAD,EAAAA,QAAAE,SAAA,MAGFF,EAAAA,QAAAC,cAAC6C,UAAQ,CAAA3C,UAAU,UAAU4C,GAAG,UAAUC,MAAM,WAGtD"}
|
|
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":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../utils/customHooks/useIsomorphicLayoutEffect.js"),t=require("./CallView/index.js"),l=require("./KeypadView/index.js"),a=require("./AudioPlayerView/index.js"),u=require("./AlertGuard.js"),n=require("./CallView/BackCall.js"),i=require("./ViewsTransition.js");require("../node_modules/@fortawesome/react-fontawesome/index.es.js"),require("../lib/webrtc/janus.js"),require("../store/index.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js"),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"),require("../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var s=require("./TransferView/TransferList.js"),o=require("./RecorderView/index.js"),d=require("./IslandMotion.js"),c=require("./IslandDrag.js"),f=require("./Close.js"),m=require("../node_modules/react-redux/es/hooks/useSelector.js"),p=require("../node_modules/react-redux/es/hooks/useDispatch.js");function j(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var y=j(e),q=function(j){var q=j.showAlways,E=m.useSelector((function(e){return e.currentCall})),w=E.incoming,x=E.accepted,_=E.outgoing,h=E.transferring,V=m.useSelector((function(e){return e.island})).view,b=m.useSelector((function(e){return e.alerts.status})).activeAlertsCount,v=m.useSelector((function(e){return e.player})).audioPlayerLoop,g=e.useRef(null),P=p.useDispatch(),I=e.useRef(null),R=e.useRef(null),k=e.useRef(null),A=e.useRef(null),C=e.useRef(null);r.useIsomorphicLayoutEffect((function(){P.player.updatePlayer({audioPlayer:I,localAudio:R,localVideo:A,remoteVideo:C,remoteAudio:k})}),[]),e.useEffect((function(){(w||_)&&P.island.setIslandView("call")}),[w,_]);var S=e.useState(""),T=S[0],L=S[1];return e.useEffect((function(){setTimeout((function(){L(V)}),200)}),[V]),y.default.createElement("div",{ref:g,className:"pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000"},(w||_||x||q||b>0||"player"===V||"recorder"===V)&&y.default.createElement(y.default.Fragment,null,y.default.createElement(c.IslandDrag,{islandContainerRef:g},y.default.createElement(n.default,{isVisible:"keypad"===V||"transfer"===V||h}),y.default.createElement(d.IslandMotion,null,y.default.createElement(u.AlertGuard,null,"call"===T?y.default.createElement(i.default,{forView:"call"},y.default.createElement(t.default,null)):"keypad"===T?y.default.createElement(i.default,{forView:"keypad"},y.default.createElement(l.default,null)):"transfer"===T?y.default.createElement(i.default,{forView:"transfer"},y.default.createElement(s.TransferListView,null)):"player"===T?y.default.createElement(i.default,{forView:"player"},y.default.createElement(a.KeypadView,null)):"recorder"===T?y.default.createElement(i.default,{forView:"recorder"},y.default.createElement(o.RecorderView,null)):y.default.createElement(y.default.Fragment,null))),y.default.createElement(f.Close,null))),y.default.createElement("div",{className:"pi-hidden"},y.default.createElement("audio",{loop:v,ref:I}),y.default.createElement("audio",{muted:!0,ref:R}),y.default.createElement("audio",{autoPlay:!0,ref:k}),y.default.createElement("video",{muted:!0,autoPlay:!0,ref:A}),y.default.createElement("video",{autoPlay:!0,muted:!0,ref:C})))};q.displayName="Island",exports.Island=q;
|
|
2
2
|
//# sourceMappingURL=Island.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport { useIsomorphicLayoutEffect } from '../utils'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport AudioPlayerView from './AudioPlayerView'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport ViewsTransition from './ViewsTransition'\nimport { TransferListView } from './TransferView'\nimport { RecorderView } from './RecorderView'\nimport IslandMotions from './IslandMotion'\nimport IslandDrag from './IslandDrag'\nimport Close from './Close'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n */\nexport const Island: FC<IslandProps> = ({ showAlways }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n\n // Get isOpen from island store\n const { view } = useSelector((state: RootState) => state.island)\n\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const remoteVideo = useRef<HTMLVideoElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer,\n localAudio: localAudio,\n localVideo: localVideo,\n remoteVideo: remoteVideo,\n remoteAudio: remoteAudio,\n })\n }, [])\n\n // Handle and apply view switch logic\n // ...set callview as the current view\n useEffect(() => {\n // Check and switch the view\n if (incoming || outgoing) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n // Handle island view change\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n return (\n <div\n ref={islandContainerRef}\n className='pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000'\n >\n {(incoming ||\n outgoing ||\n accepted ||\n showAlways ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder') && (\n <>\n <IslandDrag islandContainerRef={islandContainerRef}>\n {/* Add background call visibility logic */}\n <BackCall isVisible={view === 'keypad' || view === 'transfer' || transferring} />\n <IslandMotions>\n {/* The views logic */}\n <AlertGuard>\n {currentView === 'call' ? (\n <ViewsTransition forView='call'>\n <CallView />\n </ViewsTransition>\n ) : currentView === 'keypad' ? (\n <ViewsTransition forView='keypad'>\n <KeyboardView />\n </ViewsTransition>\n ) : currentView === 'transfer' ? (\n <ViewsTransition forView='transfer'>\n <TransferListView />\n </ViewsTransition>\n ) : currentView === 'player' ? (\n <ViewsTransition forView='player'>\n <AudioPlayerView />\n </ViewsTransition>\n ) : currentView === 'recorder' ? (\n <ViewsTransition forView='recorder'>\n <RecorderView />\n </ViewsTransition>\n ) : (\n <></>\n )}\n </AlertGuard>\n </IslandMotions>\n <Close />\n </IslandDrag>\n </>\n )}\n <div className='pi-hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n <video muted={true} autoPlay ref={localVideo}></video>\n <video autoPlay muted={true} ref={remoteVideo}></video>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n}\n"],"names":["Island","_a","showAlways","_b","useSelector","state","currentCall","incoming","accepted","outgoing","transferring","view","island","activeAlertsCount","alerts","status","audioPlayerLoop","player","islandContainerRef","useRef","dispatch","useDispatch","audioPlayer","localAudio","remoteAudio","localVideo","remoteVideo","useIsomorphicLayoutEffect","updatePlayer","useEffect","setIslandView","_c","useState","currentView","setCurrentView","setTimeout","React","ref","className","createElement","Fragment","IslandDrag","BackCall","isVisible","IslandMotions","AlertGuard","ViewsTransition","forView","CallView","KeyboardView","TransferListView","AudioPlayerView","RecorderView","Close","loop","muted","autoPlay","displayName"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport { useIsomorphicLayoutEffect } from '../utils'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport AudioPlayerView from './AudioPlayerView'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport ViewsTransition from './ViewsTransition'\nimport { TransferListView } from './TransferView'\nimport { RecorderView } from './RecorderView'\nimport IslandMotions from './IslandMotion'\nimport IslandDrag from './IslandDrag'\nimport Close from './Close'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n */\nexport const Island: FC<IslandProps> = ({ showAlways }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n\n // Get isOpen from island store\n const { view } = useSelector((state: RootState) => state.island)\n\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const remoteVideo = useRef<HTMLVideoElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer,\n localAudio: localAudio,\n localVideo: localVideo,\n remoteVideo: remoteVideo,\n remoteAudio: remoteAudio,\n })\n }, [])\n\n // Handle and apply view switch logic\n // ...set callview as the current view\n useEffect(() => {\n // Check and switch the view\n if (incoming || outgoing) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n // Handle island view change\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n return (\n <div\n ref={islandContainerRef}\n className='pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center pi-phone-island-container pi-z-1000'\n >\n {(incoming ||\n outgoing ||\n accepted ||\n showAlways ||\n activeAlertsCount > 0 ||\n view === 'player' ||\n view === 'recorder') && (\n <>\n <IslandDrag islandContainerRef={islandContainerRef}>\n {/* Add background call visibility logic */}\n <BackCall isVisible={view === 'keypad' || view === 'transfer' || transferring} />\n <IslandMotions>\n {/* The views logic */}\n <AlertGuard>\n {currentView === 'call' ? (\n <ViewsTransition forView='call'>\n <CallView />\n </ViewsTransition>\n ) : currentView === 'keypad' ? (\n <ViewsTransition forView='keypad'>\n <KeyboardView />\n </ViewsTransition>\n ) : currentView === 'transfer' ? (\n <ViewsTransition forView='transfer'>\n <TransferListView />\n </ViewsTransition>\n ) : currentView === 'player' ? (\n <ViewsTransition forView='player'>\n <AudioPlayerView />\n </ViewsTransition>\n ) : currentView === 'recorder' ? (\n <ViewsTransition forView='recorder'>\n <RecorderView />\n </ViewsTransition>\n ) : (\n <></>\n )}\n </AlertGuard>\n </IslandMotions>\n <Close />\n </IslandDrag>\n </>\n )}\n <div className='pi-hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n <video muted={true} autoPlay ref={localVideo}></video>\n <video autoPlay muted={true} ref={remoteVideo}></video>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n}\n"],"names":["Island","_a","showAlways","_b","useSelector","state","currentCall","incoming","accepted","outgoing","transferring","view","island","activeAlertsCount","alerts","status","audioPlayerLoop","player","islandContainerRef","useRef","dispatch","useDispatch","audioPlayer","localAudio","remoteAudio","localVideo","remoteVideo","useIsomorphicLayoutEffect","updatePlayer","useEffect","setIslandView","_c","useState","currentView","setCurrentView","setTimeout","React","ref","className","createElement","Fragment","IslandDrag","BackCall","isVisible","IslandMotions","AlertGuard","ViewsTransition","forView","CallView","KeyboardView","TransferListView","AudioPlayerView","RecorderView","Close","loop","muted","autoPlay","displayName"],"mappings":"kmDAwBaA,EAA0B,SAACC,GAAE,IAAAC,EAAUD,EAAAC,WAE5CC,EAAiDC,eACrD,SAACC,GAAqB,OAAAA,EAAMC,eADtBC,EAAQJ,EAAAI,SAAEC,EAAQL,EAAAK,SAAEC,EAAQN,EAAAM,SAAEC,EAAYP,EAAAO,aAK1CC,EAASP,eAAY,SAACC,GAAqB,OAAAA,EAAMO,eAGjDC,EAAsBT,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMS,OAAOC,4BAGrEC,EAAoBZ,eAAY,SAACC,GAAqB,OAAAA,EAAMY,0BAG9DC,EAAqBC,SAAY,MAGjCC,EAAWC,EAAAA,cAEXC,EAAcH,SAAyB,MACvCI,EAAaJ,SAAyB,MACtCK,EAAcL,SAAyB,MACvCM,EAAaN,SAAyB,MACtCO,EAAcP,SAAyB,MAE7CQ,EAAAA,2BAA0B,WACxBP,EAASH,OAAOW,aAAa,CAC3BN,YAAaA,EACbC,WAAYA,EACZE,WAAYA,EACZC,YAAaA,EACbF,YAAaA,GAEhB,GAAE,IAIHK,EAAAA,WAAU,YAEJtB,GAAYE,IACdW,EAASR,OAAOkB,cAAc,OAElC,GAAG,CAACvB,EAAUE,IAER,IAAAsB,EAAgCC,EAAAA,SAAc,IAA7CC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GASlC,OANAF,EAAAA,WAAU,WACRM,YAAW,WACTD,EAAevB,EAChB,GAAE,IACL,GAAG,CAACA,IAGFyB,EAAAA,6BACEC,IAAKnB,EACLoB,UAAU,yMAER/B,GACAE,GACAD,GACAN,GACAW,EAAoB,GACX,WAATF,GACS,aAATA,IACAyB,EAAA,QAAAG,cAAAH,EAAA,QAAAI,SAAA,KACEJ,EAAAA,QAAAG,cAACE,EAAAA,WAAU,CAACvB,mBAAoBA,GAE9BkB,UAAAG,cAACG,EAAQ,QAAA,CAACC,UAAoB,WAAThC,GAA8B,aAATA,GAAuBD,IACjE0B,UAAAG,cAACK,EAAAA,aAAa,KAEZR,EAAAA,QAAAG,cAACM,aAAU,KACQ,SAAhBZ,EACCG,EAAC,QAAAG,cAAAO,EAAAA,QAAgB,CAAAC,QAAQ,QACvBX,EAAAA,QAAAG,cAACS,EAAAA,QAAW,OAEI,WAAhBf,EACFG,EAAAA,QAAAG,cAACO,EAAAA,QAAgB,CAAAC,QAAQ,UACvBX,EAAAA,QAAAG,cAACU,EAAAA,QAAe,OAEA,aAAhBhB,EACFG,EAAAA,QAAAG,cAACO,EAAAA,QAAgB,CAAAC,QAAQ,YACvBX,EAAAA,QAAAG,cAACW,EAAAA,iBAAmB,OAEJ,WAAhBjB,EACFG,EAAAA,QAAAG,cAACO,EAAAA,QAAgB,CAAAC,QAAQ,UACvBX,EAAAA,QAAAG,cAACY,EAAAA,WAAkB,OAEH,aAAhBlB,EACFG,EAAAA,QAAAG,cAACO,EAAAA,QAAgB,CAAAC,QAAQ,YACvBX,EAAAA,QAACG,cAAAa,eAAe,OAGlBhB,EAAAA,QAAAG,cAAAH,UAAAI,SAAA,QAINJ,EAAAA,QAAAG,cAACc,EAAAA,MAAK,QAIZjB,EAAAA,QAAKG,cAAA,MAAA,CAAAD,UAAU,aACbF,EAAA,QAAAG,cAAA,QAAA,CAAOe,KAAMtC,EAAiBqB,IAAKf,IACnCc,EAAA,QAAAG,cAAA,QAAA,CAAOgB,OAAO,EAAMlB,IAAKd,IACzBa,EAAA,QAAAG,cAAA,QAAA,CAAOiB,UAAQ,EAACnB,IAAKb,IACrBY,UAAOG,cAAA,QAAA,CAAAgB,OAAO,EAAMC,UAAS,EAAAnB,IAAKZ,IAClCW,EAAAA,QAAAG,cAAA,QAAA,CAAOiB,UAAQ,EAACD,OAAO,EAAMlB,IAAKX,KAI1C,EAEA1B,EAAOyD,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"),require("../../
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../lib/webrtc/janus.js"),require("../../store/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../node_modules/mic-check/lib/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../Island.js");var r=require("../Button.js");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),require("../../node_modules/framer-motion/dist/framer-motion.js");var i=t(e),a=Array.from(Array(9).keys()),n=["*","0","#"];exports.default=function(e){var t=e.keyCallback;return i.default.createElement("div",{className:"pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-6 pi-justify-items-center pi-place-items-center pi-justify-center pi-px-3"},a.map((function(e){return i.default.createElement(r.Button,{key:e+1,onClick:function(){return t(e+1)},variant:"default",className:"pi-text-2xl",style:{transform:"scale(1.15)"}},e+1)})),n.map((function(e){return i.default.createElement(r.Button,{key:e+1,onClick:function(){return t(e)},variant:"default",className:"pi-text-2xl",style:{transform:"scale(1.15)"}},e)})))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -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 a=require("../../lib/phone/call.js"),s=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("../SwitchInputView/DropdownContent.js"),m=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 f=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),g=require("../../node_modules/react-redux/es/hooks/useSelector.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=h(t);exports.Actions=function(){var h=f.useDispatch(),j=g.useSelector((function(e){return{incoming:e.recorder.incoming,waiting:e.recorder.waiting,recording:e.recorder.recording,recorded:e.recorder.recorded,playing:e.recorder.playing}}),m.default),x=j.incoming,y=j.waiting,E=j.recording,_=j.recorded,q=j.playing;function w(){return e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return h.recorder.setRecording(!0),h.recorder.setWaiting(!0),[4,i.startAnnouncementRecording()];case 1:return(t=e.sent()).tempFilename&&h.recorder.setTempFilename(t.tempFilename),h.recorder.setStartTime("".concat(Date.now()/1e3)),l.eventDispatch("phone-island-recording-started",{}),[2]}}))}))}function b(){h.recorder.setWaiting(!0),a.hangupCurrentCall(),h.recorder.setRecorded(!0),l.eventDispatch("phone-island-recording-stopped",{})}function C(){h.player.startAudioPlayer((function(){h.recorder.setPlaying(!1),h.recorder.setPaused(!0)})),h.recorder.setPlaying(!0),l.eventDispatch("phone-island-recording-played",{})}function P(){h.player.pauseAudioPlayer(),h.recorder.setPlaying(!1),h.recorder.setPaused(!0),l.eventDispatch("phone-island-recording-paused",{})}function T(){h.recorder.resetRecorded(),l.eventDispatch("phone-island-recording-deleted",{})}function A(){d.dispatchRecordingSave(),h.island.setIslandView(null)}s.useEventListener("phone-island-recording-start",(function(e){w()})),s.useEventListener("phone-island-recording-stop",(function(e){b()})),s.useEventListener("phone-island-recording-play",(function(e){C()})),s.useEventListener("phone-island-recording-pause",(function(e){P()})),s.useEventListener("phone-island-recording-delete",(function(e){T()})),s.useEventListener("phone-island-recording-save",(function(e){A()})),t.useEffect((function(){E||h.recorder.setWaiting(!1)}),[E]),t.useEffect((function(){x&&(a.answerIncomingCall(),h.recorder.setIncoming(!1),h.recorder.setWaiting(!1))}),[x]);var F=u.useTranslation().t;return v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-pt-9 pi-gap-6",style:_?{paddingTop:"2rem"}:{}},E&&v.default.createElement(r.Button,{onClick:b,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Stop")},y?v.default.createElement(o.FontAwesomeIcon,{icon:n.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):v.default.createElement(o.FontAwesomeIcon,{icon:n.faStop,size:"xl"})),_&&!E&&v.default.createElement(v.default.Fragment,null,v.default.createElement(r.Button,{onClick:T,variant:"default","data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Delete")},v.default.createElement(o.FontAwesomeIcon,{icon:n.faTrash,size:"xl"})),q?v.default.createElement(r.Button,{onClick:P,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Pause")},v.default.createElement(o.FontAwesomeIcon,{icon:n.faPause,size:"xl"})):v.default.createElement(r.Button,{onClick:C,variant:"default",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Play")},v.default.createElement(o.FontAwesomeIcon,{icon:n.faPlay,size:"xl"})),v.default.createElement(r.Button,{onClick:A,variant:"green","data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Confirm")},v.default.createElement(o.FontAwesomeIcon,{icon:n.faCheck,size:"xl"}))),!E&&!_&&v.default.createElement(r.Button,{onClick:w,variant:"red",style:{transform:"scale(1.15)"},"data-tooltip-id":"tooltip","data-tooltip-content":F("Tooltip.Start recording"),className:"pi-flex pi-justify-center pi-ml-[4.7rem]"},y?v.default.createElement(o.FontAwesomeIcon,{icon:n.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):v.default.createElement(o.FontAwesomeIcon,{icon:n.faRecordVinyl,size:"xl"})),!E&&!_&&v.default.createElement("div",{className:"pi-flex-none pi-justify-end pi-ml-11 pi-w-2"},v.default.createElement(p.default,{"data-stop-propagation":!0})),v.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'\nimport DropdownContent from '../SwitchInputView/DropdownContent'\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-items-center pi-justify-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 className='pi-flex pi-justify-center pi-ml-[4.7rem]'\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 {!recording && !recorded && (\n <div\n className='pi-flex-none pi-justify-end pi-ml-11 pi-w-2'\n >\n <DropdownContent data-stop-propagation={true}></DropdownContent>\n </div>\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","DropdownContent","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"),r=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Actions.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),r=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Actions.js"),i=require("./BarsGroup.js"),n=require("../AudioPlayerView/Progress.js"),u=require("../../lib/phone/audio.js"),s=require("../../node_modules/webm-duration-fix/lib/index.js"),a=require("./Timer.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 o=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/react-i18next/node_modules/@babel/runtime/helpers/slicedToArray.js");var l=require("../../node_modules/react-redux/es/hooks/useSelector.js"),d=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),c=require("../../node_modules/react-redux/es/utils/shallowEqual.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=f(r);exports.RecorderView=function(){var f=l.useSelector((function(e){return e.island})).isOpen,p=r.useRef(null),x=r.useRef(null),b=r.useRef([]),h=d.useDispatch(),v=l.useSelector((function(e){return e.webrtc.localAudioStream})),j=l.useSelector((function(e){return{recording:e.recorder.recording,recorded:e.recorder.recorded,waiting:e.recorder.waiting}}),c.default),w=j.recording,_=j.recorded,q=j.waiting;function g(e){b.current.push(e.data)}function E(){return e.__awaiter(this,void 0,void 0,(function(){var r,t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,s.default(new Blob(b.current,{type:"audio/webm"}))];case 1:return r=e.sent(),t=URL.createObjectURL(r),u.updateAudioPlayerSource(t),[2]}}))}))}r.useEffect((function(){(null==v?void 0:v.active)&&w&&(x.current=new MediaRecorder(v,{mimeType:"audio/webm"}),x.current.ondataavailable=g,x.current.onstop=E,x.current.start())}),[null==v?void 0:v.active,w]),r.useEffect((function(){var e;_&&(b.current=[],null===(e=x.current)||void 0===e||e.stop())}),[_]),r.useEffect((function(){return h.recorder.setVisibleContainerRef(p),function(){h.recorder.reset()}}),[]);var y=o.useTranslation().t;return m.default.createElement(m.default.Fragment,null,f?m.default.createElement(m.default.Fragment,null," ",m.default.createElement("div",{className:"pi-flex pi-w-full pi-justify-center pi-items-center pi-pt-4 pi-pb-9"},m.default.createElement("div",{className:"pi-font-medium pi-text-4xl pi-w-fit pi-h-fit pi-text-white"},m.default.createElement(a.default,null))),m.default.createElement("div",{className:"pi-relative pi-w-full pi-justify-center ".concat(_?"":"pi-h-8"," pi-overflow-x-hidden pi-flex"),ref:p},_?m.default.createElement(n.Progress,null):w&&!q?Array.from({length:2}).map((function(e,r){return m.default.createElement(i.BarsGroup,{key:r,index:r,startAnimation:w,audioStream:v})})):w&&q?m.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit pi-text-white"},y("Common.Start recording message after")):m.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit pi-text-white"},y("Common.Start recording message before"))),m.default.createElement(t.Actions,null)):m.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Recorder"))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/RecorderView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useState, useRef, useEffect, useCallback, memo } from 'react'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Actions } from './Actions'\nimport { BarsGroup } from './BarsGroup'\nimport Progress from '../AudioPlayerView/Progress'\nimport { updateAudioPlayerSource } from '../../lib/phone/audio'\nimport fixWebmDuration from 'webm-duration-fix'\nimport Timer from './Timer'\n\n// The number of groups to be created\n// ...the minimun to have this effect is 2\nconst BAR_GROUPS_COUNT = 2\n\n// The mime type of the recorded audio\nconst MIME_TYPE = 'audio/webm'\n\nexport const RecorderView: FC<RecorderViewProps> = () => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const visibleContainerRef = useRef<HTMLDivElement>(null)\n const recorderRef = useRef<MediaRecorder | null>(null)\n const mediaChunks = useRef<BlobPart[]>([])\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Retrieve the local audio stream from webrtc state\n const localAudioStream = useSelector((state: RootState) => state.webrtc.localAudioStream)\n\n // Retrieve the local audio stream from recorder state\n const { recording, recorded } = useSelector(\n (state: RootState) => ({\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n }),\n shallowEqual,\n )\n\n function handleRecordedMedia(event: BlobEvent) {\n mediaChunks.current.push(event.data)\n }\n\n async function handleRecordingStopped() {\n const blob = await fixWebmDuration(new Blob(mediaChunks.current, { type: MIME_TYPE }))\n const audioURL = URL.createObjectURL(blob)\n // The next function is async\n updateAudioPlayerSource(audioURL)\n }\n\n // Handle and manage audio recording start\n useEffect(() => {\n // @ts-ignore\n if (localAudioStream?.active && recording) {\n recorderRef.current = new MediaRecorder(localAudioStream, {\n mimeType: MIME_TYPE,\n })\n recorderRef.current.ondataavailable = handleRecordedMedia\n recorderRef.current.onstop = handleRecordingStopped\n // Start the media recording\n recorderRef.current.start()\n }\n // @ts-ignore\n }, [localAudioStream?.active, recording])\n\n // Handle and manage audio recorded\n useEffect(() => {\n if (recorded) {\n mediaChunks.current = []\n recorderRef.current?.stop()\n }\n }, [recorded])\n\n // Handle view close and reset state\n useEffect(() => {\n // Set visible container reference to recorder state\n dispatch.recorder.setVisibleContainerRef(visibleContainerRef)\n\n return () => {\n dispatch.recorder.reset()\n }\n }, [])\n\n return (\n <>\n {isOpen ? (\n <>\n {' '}\n <div className='pi-flex pi-w-full pi-justify-center pi-items-center pi-pt-4 pi-pb-9'>\n <div className='pi-font-medium pi-text-4xl pi-w-fit pi-h-fit pi-text-white'>\n <Timer />\n </div>\n </div>\n {/* Bars animation section */}\n <div\n className={`pi-relative pi-w-full ${\n !recorded ? 'pi-h-8' : ''\n } pi-overflow-x-hidden pi-flex`}\n ref={visibleContainerRef}\n >\n {recorded ? (\n <Progress />\n ) : (\n // Create a custom numbers of bars groups\n Array.from({ length: BAR_GROUPS_COUNT }).map((_, i) => (\n <BarsGroup\n key={i}\n index={i}\n startAnimation={recording}\n audioStream={localAudioStream}\n />\n ))\n )}\n </div>\n {/* Actions section */}\n <Actions />\n </>\n ) : (\n <div className='pi-font-medium pi-text-base'>Recorder</div>\n )}\n </>\n )\n}\n\nexport interface RecorderViewProps {}\n"],"names":["isOpen","useSelector","state","island","visibleContainerRef","useRef","recorderRef","mediaChunks","dispatch","useDispatch","localAudioStream","webrtc","_a","recording","recorder","recorded","shallowEqual","handleRecordedMedia","event","current","push","data","handleRecordingStopped","fixWebmDuration","Blob","type","blob","sent","audioURL","URL","createObjectURL","updateAudioPlayerSource","useEffect","active","MediaRecorder","mimeType","ondataavailable","onstop","start","stop","setVisibleContainerRef","reset","React","createElement","Fragment","className","Timer","concat","ref","Progress","Array","from","length","map","_","i","BarsGroup","key","index","startAnimation","audioStream","Actions"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/RecorderView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useState, useRef, useEffect, useCallback, memo } from 'react'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Actions } from './Actions'\nimport { BarsGroup } from './BarsGroup'\nimport Progress from '../AudioPlayerView/Progress'\nimport { updateAudioPlayerSource } from '../../lib/phone/audio'\nimport fixWebmDuration from 'webm-duration-fix'\nimport Timer from './Timer'\nimport { useTranslation } from 'react-i18next'\n\n// The number of groups to be created\n// ...the minimun to have this effect is 2\nconst BAR_GROUPS_COUNT = 2\n\n// The mime type of the recorded audio\nconst MIME_TYPE = 'audio/webm'\n\nexport const RecorderView: FC<RecorderViewProps> = () => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const visibleContainerRef = useRef<HTMLDivElement>(null)\n const recorderRef = useRef<MediaRecorder | null>(null)\n const mediaChunks = useRef<BlobPart[]>([])\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Retrieve the local audio stream from webrtc state\n const localAudioStream = useSelector((state: RootState) => state.webrtc.localAudioStream)\n\n // Retrieve the local audio stream from recorder state\n const { recording, recorded, waiting } = useSelector(\n (state: RootState) => ({\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n waiting: state.recorder.waiting,\n }),\n shallowEqual,\n )\n\n function handleRecordedMedia(event: BlobEvent) {\n mediaChunks.current.push(event.data)\n }\n\n async function handleRecordingStopped() {\n const blob = await fixWebmDuration(new Blob(mediaChunks.current, { type: MIME_TYPE }))\n const audioURL = URL.createObjectURL(blob)\n // The next function is async\n updateAudioPlayerSource(audioURL)\n }\n\n // Handle and manage audio recording start\n useEffect(() => {\n // @ts-ignore\n if (localAudioStream?.active && recording) {\n recorderRef.current = new MediaRecorder(localAudioStream, {\n mimeType: MIME_TYPE,\n })\n recorderRef.current.ondataavailable = handleRecordedMedia\n recorderRef.current.onstop = handleRecordingStopped\n // Start the media recording\n recorderRef.current.start()\n }\n // @ts-ignore\n }, [localAudioStream?.active, recording])\n\n // Handle and manage audio recorded\n useEffect(() => {\n if (recorded) {\n mediaChunks.current = []\n recorderRef.current?.stop()\n }\n }, [recorded])\n\n // Handle view close and reset state\n useEffect(() => {\n // Set visible container reference to recorder state\n dispatch.recorder.setVisibleContainerRef(visibleContainerRef)\n\n return () => {\n dispatch.recorder.reset()\n }\n }, [])\n\n const { t } = useTranslation()\n\n return (\n <>\n {isOpen ? (\n <>\n {' '}\n <div className='pi-flex pi-w-full pi-justify-center pi-items-center pi-pt-4 pi-pb-9'>\n <div className='pi-font-medium pi-text-4xl pi-w-fit pi-h-fit pi-text-white'>\n <Timer />\n </div>\n </div>\n {/* Bars animation section */}\n <div\n className={`pi-relative pi-w-full pi-justify-center ${\n !recorded ? 'pi-h-8' : ''\n } pi-overflow-x-hidden pi-flex`}\n ref={visibleContainerRef}\n >\n {recorded ? (\n <Progress />\n ) : recording && !waiting ? (\n // Create a custom numbers of bars groups\n Array.from({ length: BAR_GROUPS_COUNT }).map((_, i) => (\n <BarsGroup\n key={i}\n index={i}\n startAnimation={recording}\n audioStream={localAudioStream}\n />\n ))\n ) : recording && waiting ? (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit pi-text-white'>\n {t('Common.Start recording message after')}\n </div>\n ) : (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit pi-text-white'>\n {t('Common.Start recording message before')}\n </div>\n )}\n </div>\n {/* Actions section */}\n <Actions />\n </>\n ) : (\n <div className='pi-font-medium pi-text-base'>Recorder</div>\n )}\n </>\n )\n}\n\nexport interface RecorderViewProps {}\n"],"names":["isOpen","useSelector","state","island","visibleContainerRef","useRef","recorderRef","mediaChunks","dispatch","useDispatch","localAudioStream","webrtc","_a","recording","recorder","recorded","waiting","shallowEqual","handleRecordedMedia","event","current","push","data","handleRecordingStopped","fixWebmDuration","Blob","type","blob","sent","audioURL","URL","createObjectURL","updateAudioPlayerSource","useEffect","active","MediaRecorder","mimeType","ondataavailable","onstop","start","stop","setVisibleContainerRef","reset","t","useTranslation","React","createElement","Fragment","className","Timer","concat","ref","Progress","Array","from","length","map","_","i","BarsGroup","key","index","startAnimation","audioStream","Actions"],"mappings":"m0CAqBmD,WACzC,IAAAA,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,iBACrDC,EAAsBC,SAAuB,MAC7CC,EAAcD,SAA6B,MAC3CE,EAAcF,SAAmB,IAGjCG,EAAWC,EAAAA,cAGXC,EAAmBT,eAAY,SAACC,GAAqB,OAAAA,EAAMS,OAAOD,gBAAb,IAGrDE,EAAmCX,EAAAA,aACvC,SAACC,GAAqB,MAAC,CACrBW,UAAWX,EAAMY,SAASD,UAC1BE,SAAUb,EAAMY,SAASC,SACzBC,QAASd,EAAMY,SAASE,WAE1BC,EAAAA,SANMJ,EAASD,EAAAC,UAAEE,EAAQH,EAAAG,SAAEC,YAS7B,SAASE,EAAoBC,GAC3BZ,EAAYa,QAAQC,KAAKF,EAAMG,KAChC,CAED,SAAeC,qHACA,KAAA,EAAA,MAAA,CAAA,EAAMC,EAAAA,QAAgB,IAAIC,KAAKlB,EAAYa,QAAS,CAAEM,KA7BrD,+BA6BRC,EAAOf,EAAyEgB,OAChFC,EAAWC,IAAIC,gBAAgBJ,GAErCK,EAAuBA,wBAACH,aACzB,CAGDI,EAAAA,WAAU,YAEJvB,aAAgB,EAAhBA,EAAkBwB,SAAUrB,IAC9BP,EAAYc,QAAU,IAAIe,cAAczB,EAAkB,CACxD0B,SAxCU,eA0CZ9B,EAAYc,QAAQiB,gBAAkBnB,EACtCZ,EAAYc,QAAQkB,OAASf,EAE7BjB,EAAYc,QAAQmB,QAGvB,GAAE,CAAC7B,aAAgB,EAAhBA,EAAkBwB,OAAQrB,IAG9BoB,EAAAA,WAAU,iBACJlB,IACFR,EAAYa,QAAU,GACD,QAArBR,EAAAN,EAAYc,eAAS,IAAAR,GAAAA,EAAA4B,OAEzB,GAAG,CAACzB,IAGJkB,EAAAA,WAAU,WAIR,OAFAzB,EAASM,SAAS2B,uBAAuBrC,GAElC,WACLI,EAASM,SAAS4B,OACpB,CACD,GAAE,IAEK,IAAAC,EAAMC,qBAEd,OACEC,UACGC,cAAAD,EAAA,QAAAE,SAAA,KAAA/C,EACC6C,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG,IACDF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,uEACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,8DACbH,EAAAA,QAACC,cAAAG,UAAQ,QAIbJ,UAAAC,cAAA,MAAA,CACEE,UAAW,2CAAAE,OACRnC,EAAsB,GAAX,SACiB,iCAC/BoC,IAAK/C,GAEJW,EACC8B,EAAA,QAAAC,cAACM,EAAAA,SAAW,MACVvC,IAAcG,EAEhBqC,MAAMC,KAAK,CAAEC,OA9FF,IA8F8BC,KAAI,SAACC,EAAGC,GAAM,OACrDb,EAAAA,QAAAC,cAACa,EAASA,UACR,CAAAC,IAAKF,EACLG,MAAOH,EACPI,eAAgBjD,EAChBkD,YAAarD,GALsC,IAQrDG,GAAaG,EACf6B,UAAAC,cAAA,MAAA,CAAKE,UAAU,sDACZL,EAAE,yCAGLE,EAAK,QAAAC,cAAA,MAAA,CAAAE,UAAU,sDACZL,EAAE,2CAKTE,EAAAA,QAAAC,cAACkB,EAAAA,QAAU,OAGbnB,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,+BAA6B,YAIpD"}
|