@nethesis/phone-island 0.14.3 → 0.14.5
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/components/SideView/SideView.js +1 -1
- package/dist/components/SideView/SideView.js.map +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/package.json +1 -1
|
@@ -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");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../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 r=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var n=require("../../lib/phone/call.js"),l=require("../CustomThemedTooltip.js"),s=require("./hooks/useSideViewLogic.js"),a=require("./components/SideViewButton.js"),u=require("../../services/user.js"),d=require("../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js"),c=require("../../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(t),h={initial:{x:-76},animate:{x:4,transition:{duration:.1,ease:"easeOut"}},exit:{x:-76,transition:{duration:.1,ease:"easeIn"}}},v={borderTopRightRadius:"20px",borderBottomRightRadius:"20px",width:"80px",transformOrigin:"right"},b=t.memo((function(m){var b=m.isVisible,g=m.uaType,_=p.useSelector((function(e){return e.island})).isOpen,j=p.useSelector((function(e){return e.currentCall})).isRecording,x=r.useTranslation().t,T=t.useState(!1),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../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 r=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var n=require("../../lib/phone/call.js"),l=require("../CustomThemedTooltip.js"),s=require("./hooks/useSideViewLogic.js"),a=require("./components/SideViewButton.js"),u=require("../../services/user.js"),d=require("../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js"),c=require("../../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(t),h={initial:{x:-76},animate:{x:4,transition:{duration:.1,ease:"easeOut"}},exit:{x:-76,transition:{duration:.1,ease:"easeIn"}}},v={borderTopRightRadius:"20px",borderBottomRightRadius:"20px",width:"80px",transformOrigin:"right"},b=t.memo((function(m){var b=m.isVisible,g=m.uaType,_=p.useSelector((function(e){return e.island})).isOpen,j=p.useSelector((function(e){return e.currentCall})).isRecording,x=r.useTranslation().t,T=t.useState(!1),S=T[0],y=T[1],q=t.useState(void 0),C=q[0],k=q[1],w=t.useState(void 0),E=w[0],V=w[1],R=s.useSideViewLogic(g,C,E),B=R.videoInputDevices,I=R.isVideoCallButtonVisible,A=R.canRecord,D=R.canShareScreen,P=R.canSwitchDevice,U=R.showUrlButton,O=R.isUrlButtonEnabled,L=R.goToVideoCall,M=R.goToScreenSharing,N=R.closeSideViewAndLaunchEvent;t.useEffect((function(){b&&e.__awaiter(void 0,void 0,void 0,(function(){var t,i,o,r;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,u.getParamUrl()];case 1:return t=e.sent(),i=(null==t?void 0:t.url)||"",o=i&&""!==i.trim(),y(o),k(null==t?void 0:t.only_queues),V(i),[3,3];case 2:return r=e.sent(),y(!1),k(void 0),V(void 0),console.error("Error fetching URL parameter:",r),[3,3];case 3:return[2]}}))}))}),[b]);var W=t.useCallback((function(){n.recordCurrentCall(j)}),[j]),F=t.useMemo((function(){return[A&&{key:"record",active:j,onClick:W,tooltipId:"tooltip-record",tooltipContent:j?x("Tooltip.Stop recording")||"":x("Tooltip.Record")||"",icon:j?i.faStop:o.faRecord},(null==B?void 0:B.length)>0&&{key:"video",onClick:L,tooltipId:"tooltip-video",tooltipContent:I?x("Tooltip.Enable camera")||"":x("Tooltip.Enable camera permission")||"",disabled:!I,icon:I?i.faVideo:i.faVideoSlash},D&&{key:"screen-share",onClick:M,tooltipId:"tooltip-screen-share",tooltipContent:x("Tooltip.Share screen")||"",icon:i.faDisplay},U&&S&&O&&{key:"url",onClick:function(){return N("openUrl")},tooltipId:"tooltip-open-url",tooltipContent:x("Tooltip.Open url")||"",icon:i.faArrowUpRightFromSquare},P&&{key:"switch-device",onClick:function(){return N("switchDevice")},tooltipId:"tooltip-switch-device",tooltipContent:x("Tooltip.Switch device")||"",icon:o.faArrowsRepeat}].filter((function(e){return Boolean(e)}))}),[A,j,W,x,null==B?void 0:B.length,L,I,D,M,U,S,O,N,P]),z=t.useMemo((function(){return"pi-absolute pi-h-full pi-bg-surfaceSidebar dark:pi-bg-surfaceSidebarDark pi-flex pi-flex-col pi-items-center pi-text-iconWhite dark:pi-text-iconWhiteDark -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ".concat(_?"pi-py-6":"pi-py-4")}),[_]);return f.default.createElement(f.default.Fragment,null,f.default.createElement(d.AnimatePresence,null,b&&f.default.createElement(c.motion.div,e.__assign({className:z,style:v},h),f.default.createElement("div",{className:"pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9"},F.map((function(t){var i=t.key,o=e.__rest(t,["key"]);return f.default.createElement(a.SideViewButton,e.__assign({key:i},o))}))))),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-record",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-video",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-screen-share",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-switch-device",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-open-url",place:"left"}))}));b.displayName="SideView",exports.default=b;
|
|
2
2
|
//# sourceMappingURL=SideView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideView.js","sources":["../../../src/components/SideView/SideView.tsx"],"sourcesContent":["import React, { FC, useCallback, useMemo, memo, useEffect, useState } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState } from '../../store'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n faArrowUpRightFromSquare,\n faDisplay,\n faStop,\n faVideo,\n faVideoSlash,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faArrowsRepeat, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\nimport { recordCurrentCall } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { useSideViewLogic } from './hooks/useSideViewLogic'\nimport { SideViewButton } from './components/SideViewButton'\nimport { getParamUrl } from '../../services/user'\n\nconst ANIMATION_CONFIG = {\n initial: { x: -76 },\n animate: { x: 4, transition: { duration: 0.1, ease: 'easeOut' } },\n exit: { x: -76, transition: { duration: 0.1, ease: 'easeIn' } },\n} as const\n\nconst STYLE_CONFIG = {\n borderTopRightRadius: '20px',\n borderBottomRightRadius: '20px',\n width: '80px',\n transformOrigin: 'right',\n} as const\n\ninterface ButtonConfig {\n active?: boolean\n onClick: () => void | Promise<void>\n tooltipId: string\n tooltipContent: string\n icon: any\n disabled?: boolean\n}\n\ninterface ButtonConfigWithKey extends ButtonConfig {\n key: string\n}\n\nconst SideView: FC<SideViewTypes> = memo(({ isVisible, uaType }) => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { isRecording } = useSelector((state: RootState) => state.currentCall)\n const { t } = useTranslation()\n const [hasValidUrl, setHasValidUrl] = useState(false)\n const [onlyQueues, setOnlyQueues] = useState<boolean | undefined>(undefined)\n\n const {\n videoInputDevices,\n isVideoCallButtonVisible,\n canRecord,\n canShareScreen,\n canSwitchDevice,\n showUrlButton,\n isUrlButtonEnabled,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n } = useSideViewLogic(uaType, onlyQueues)\n useEffect(() => {\n const checkParamUrl = async () => {\n try {\n const paramUrlResponse: any = await getParamUrl()\n // Verify that the response contains a valid URL (not empty)\n const url = paramUrlResponse?.url || ''\n const isValid = url && url.trim() !== ''\n\n setHasValidUrl(isValid)\n setOnlyQueues(paramUrlResponse?.only_queues)\n } catch (error) {\n setHasValidUrl(false)\n setOnlyQueues(undefined)\n console.error('Error fetching URL parameter:', error)\n }\n }\n\n if (isVisible) {\n checkParamUrl()\n }\n }, [isVisible])\n\n const handleRecordClick = useCallback(() => {\n recordCurrentCall(isRecording)\n }, [isRecording])\n\n const buttonConfigs = useMemo(() => {\n const configs: (ButtonConfigWithKey | false)[] = [\n canRecord && {\n key: 'record',\n active: isRecording,\n onClick: handleRecordClick,\n tooltipId: 'tooltip-record',\n tooltipContent: isRecording ? t('Tooltip.Stop recording') || '' : t('Tooltip.Record') || '',\n icon: isRecording ? faStop : faRecord,\n },\n videoInputDevices?.length > 0 && {\n key: 'video',\n onClick: goToVideoCall,\n tooltipId: 'tooltip-video',\n tooltipContent: isVideoCallButtonVisible\n ? t('Tooltip.Enable camera') || ''\n : t('Tooltip.Enable camera permission') || '',\n disabled: !isVideoCallButtonVisible,\n icon: isVideoCallButtonVisible ? faVideo : faVideoSlash,\n },\n canShareScreen && {\n key: 'screen-share',\n onClick: goToScreenSharing,\n tooltipId: 'tooltip-screen-share',\n tooltipContent: t('Tooltip.Share screen') || '',\n icon: faDisplay,\n },\n showUrlButton &&\n hasValidUrl &&\n isUrlButtonEnabled && {\n key: 'url',\n onClick: () => closeSideViewAndLaunchEvent('openUrl'),\n tooltipId: 'tooltip-open-url',\n tooltipContent: t('Tooltip.Open url') || '',\n icon: faArrowUpRightFromSquare,\n },\n canSwitchDevice && {\n key: 'switch-device',\n onClick: () => closeSideViewAndLaunchEvent('switchDevice'),\n tooltipId: 'tooltip-switch-device',\n tooltipContent: t('Tooltip.Switch device') || '',\n icon: faArrowsRepeat,\n },\n ]\n\n return configs.filter((config): config is ButtonConfigWithKey => Boolean(config))\n }, [\n canRecord,\n isRecording,\n handleRecordClick,\n t,\n videoInputDevices?.length,\n goToVideoCall,\n isVideoCallButtonVisible,\n canShareScreen,\n goToScreenSharing,\n showUrlButton,\n hasValidUrl,\n isUrlButtonEnabled,\n closeSideViewAndLaunchEvent,\n canSwitchDevice,\n ])\n\n const containerClassName = useMemo(\n () =>\n `pi-absolute pi-h-full pi-bg-surfaceSidebar dark:pi-bg-surfaceSidebarDark pi-flex pi-flex-col pi-items-center pi-text-iconWhite dark:pi-text-iconWhiteDark -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ${\n isOpen ? 'pi-py-6' : 'pi-py-4'\n }`,\n [isOpen],\n )\n\n return (\n <>\n <AnimatePresence>\n {isVisible && (\n <motion.div className={containerClassName} style={STYLE_CONFIG} {...ANIMATION_CONFIG}>\n <div className='pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9'>\n {buttonConfigs.map(({ key, ...config }) => (\n <SideViewButton key={key} {...config} />\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <CustomThemedTooltip id='tooltip-record' place='left' />\n <CustomThemedTooltip id='tooltip-video' place='left' />\n <CustomThemedTooltip id='tooltip-screen-share' place='left' />\n <CustomThemedTooltip id='tooltip-switch-device' place='left' />\n <CustomThemedTooltip id='tooltip-open-url' place='left' />\n </>\n )\n})\n\nSideView.displayName = 'SideView'\n\nexport default SideView\n\ninterface SideViewTypes {\n isVisible: boolean\n uaType?: string\n}\n"],"names":["ANIMATION_CONFIG","initial","x","animate","transition","duration","ease","exit","STYLE_CONFIG","borderTopRightRadius","borderBottomRightRadius","width","transformOrigin","SideView","memo","_a","isVisible","uaType","isOpen","useSelector","state","island","isRecording","currentCall","t","useTranslation","_b","useState","hasValidUrl","setHasValidUrl","_c","undefined","onlyQueues","setOnlyQueues","_d","useSideViewLogic","videoInputDevices","isVideoCallButtonVisible","canRecord","canShareScreen","canSwitchDevice","showUrlButton","isUrlButtonEnabled","goToVideoCall","goToScreenSharing","closeSideViewAndLaunchEvent","useEffect","__awaiter","getParamUrl","paramUrlResponse","sent","url","isValid","trim","only_queues","console","error","error_1","handleRecordClick","useCallback","recordCurrentCall","buttonConfigs","useMemo","key","active","onClick","tooltipId","tooltipContent","icon","faStop","faRecord","length","disabled","faVideo","faVideoSlash","faDisplay","faArrowUpRightFromSquare","faArrowsRepeat","filter","config","Boolean","containerClassName","concat","React","createElement","Fragment","AnimatePresence","motion","div","__assign","className","style","map","__rest","SideViewButton","CustomThemedTooltip","id","place","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SideView.js","sources":["../../../src/components/SideView/SideView.tsx"],"sourcesContent":["import React, { FC, useCallback, useMemo, memo, useEffect, useState } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState } from '../../store'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport {\n faArrowUpRightFromSquare,\n faDisplay,\n faStop,\n faVideo,\n faVideoSlash,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faArrowsRepeat, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\nimport { recordCurrentCall } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { useSideViewLogic } from './hooks/useSideViewLogic'\nimport { SideViewButton } from './components/SideViewButton'\nimport { getParamUrl } from '../../services/user'\n\nconst ANIMATION_CONFIG = {\n initial: { x: -76 },\n animate: { x: 4, transition: { duration: 0.1, ease: 'easeOut' } },\n exit: { x: -76, transition: { duration: 0.1, ease: 'easeIn' } },\n} as const\n\nconst STYLE_CONFIG = {\n borderTopRightRadius: '20px',\n borderBottomRightRadius: '20px',\n width: '80px',\n transformOrigin: 'right',\n} as const\n\ninterface ButtonConfig {\n active?: boolean\n onClick: () => void | Promise<void>\n tooltipId: string\n tooltipContent: string\n icon: any\n disabled?: boolean\n}\n\ninterface ButtonConfigWithKey extends ButtonConfig {\n key: string\n}\n\nconst SideView: FC<SideViewTypes> = memo(({ isVisible, uaType }) => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { isRecording } = useSelector((state: RootState) => state.currentCall)\n const { t } = useTranslation()\n const [hasValidUrl, setHasValidUrl] = useState(false)\n const [onlyQueues, setOnlyQueues] = useState<boolean | undefined>(undefined)\n const [urlParam, setUrlParam] = useState<string | undefined>(undefined)\n\n const {\n videoInputDevices,\n isVideoCallButtonVisible,\n canRecord,\n canShareScreen,\n canSwitchDevice,\n showUrlButton,\n isUrlButtonEnabled,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n } = useSideViewLogic(uaType, onlyQueues, urlParam)\n useEffect(() => {\n const checkParamUrl = async () => {\n try {\n const paramUrlResponse: any = await getParamUrl()\n // Verify that the response contains a valid URL (not empty)\n const url = paramUrlResponse?.url || ''\n const isValid = url && url.trim() !== ''\n\n setHasValidUrl(isValid)\n setOnlyQueues(paramUrlResponse?.only_queues)\n setUrlParam(url)\n } catch (error) {\n setHasValidUrl(false)\n setOnlyQueues(undefined)\n setUrlParam(undefined)\n console.error('Error fetching URL parameter:', error)\n }\n }\n\n if (isVisible) {\n checkParamUrl()\n }\n }, [isVisible])\n\n const handleRecordClick = useCallback(() => {\n recordCurrentCall(isRecording)\n }, [isRecording])\n\n const buttonConfigs = useMemo(() => {\n const configs: (ButtonConfigWithKey | false)[] = [\n canRecord && {\n key: 'record',\n active: isRecording,\n onClick: handleRecordClick,\n tooltipId: 'tooltip-record',\n tooltipContent: isRecording ? t('Tooltip.Stop recording') || '' : t('Tooltip.Record') || '',\n icon: isRecording ? faStop : faRecord,\n },\n videoInputDevices?.length > 0 && {\n key: 'video',\n onClick: goToVideoCall,\n tooltipId: 'tooltip-video',\n tooltipContent: isVideoCallButtonVisible\n ? t('Tooltip.Enable camera') || ''\n : t('Tooltip.Enable camera permission') || '',\n disabled: !isVideoCallButtonVisible,\n icon: isVideoCallButtonVisible ? faVideo : faVideoSlash,\n },\n canShareScreen && {\n key: 'screen-share',\n onClick: goToScreenSharing,\n tooltipId: 'tooltip-screen-share',\n tooltipContent: t('Tooltip.Share screen') || '',\n icon: faDisplay,\n },\n showUrlButton &&\n hasValidUrl &&\n isUrlButtonEnabled && {\n key: 'url',\n onClick: () => closeSideViewAndLaunchEvent('openUrl'),\n tooltipId: 'tooltip-open-url',\n tooltipContent: t('Tooltip.Open url') || '',\n icon: faArrowUpRightFromSquare,\n },\n canSwitchDevice && {\n key: 'switch-device',\n onClick: () => closeSideViewAndLaunchEvent('switchDevice'),\n tooltipId: 'tooltip-switch-device',\n tooltipContent: t('Tooltip.Switch device') || '',\n icon: faArrowsRepeat,\n },\n ]\n\n return configs.filter((config): config is ButtonConfigWithKey => Boolean(config))\n }, [\n canRecord,\n isRecording,\n handleRecordClick,\n t,\n videoInputDevices?.length,\n goToVideoCall,\n isVideoCallButtonVisible,\n canShareScreen,\n goToScreenSharing,\n showUrlButton,\n hasValidUrl,\n isUrlButtonEnabled,\n closeSideViewAndLaunchEvent,\n canSwitchDevice,\n ])\n\n const containerClassName = useMemo(\n () =>\n `pi-absolute pi-h-full pi-bg-surfaceSidebar dark:pi-bg-surfaceSidebarDark pi-flex pi-flex-col pi-items-center pi-text-iconWhite dark:pi-text-iconWhiteDark -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ${\n isOpen ? 'pi-py-6' : 'pi-py-4'\n }`,\n [isOpen],\n )\n\n return (\n <>\n <AnimatePresence>\n {isVisible && (\n <motion.div className={containerClassName} style={STYLE_CONFIG} {...ANIMATION_CONFIG}>\n <div className='pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9'>\n {buttonConfigs.map(({ key, ...config }) => (\n <SideViewButton key={key} {...config} />\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <CustomThemedTooltip id='tooltip-record' place='left' />\n <CustomThemedTooltip id='tooltip-video' place='left' />\n <CustomThemedTooltip id='tooltip-screen-share' place='left' />\n <CustomThemedTooltip id='tooltip-switch-device' place='left' />\n <CustomThemedTooltip id='tooltip-open-url' place='left' />\n </>\n )\n})\n\nSideView.displayName = 'SideView'\n\nexport default SideView\n\ninterface SideViewTypes {\n isVisible: boolean\n uaType?: string\n}\n"],"names":["ANIMATION_CONFIG","initial","x","animate","transition","duration","ease","exit","STYLE_CONFIG","borderTopRightRadius","borderBottomRightRadius","width","transformOrigin","SideView","memo","_a","isVisible","uaType","isOpen","useSelector","state","island","isRecording","currentCall","t","useTranslation","_b","useState","hasValidUrl","setHasValidUrl","_c","undefined","onlyQueues","setOnlyQueues","_d","urlParam","setUrlParam","_e","useSideViewLogic","videoInputDevices","isVideoCallButtonVisible","canRecord","canShareScreen","canSwitchDevice","showUrlButton","isUrlButtonEnabled","goToVideoCall","goToScreenSharing","closeSideViewAndLaunchEvent","useEffect","__awaiter","getParamUrl","paramUrlResponse","sent","url","isValid","trim","only_queues","console","error","error_1","handleRecordClick","useCallback","recordCurrentCall","buttonConfigs","useMemo","key","active","onClick","tooltipId","tooltipContent","icon","faStop","faRecord","length","disabled","faVideo","faVideoSlash","faDisplay","faArrowUpRightFromSquare","faArrowsRepeat","filter","config","Boolean","containerClassName","concat","React","createElement","Fragment","AnimatePresence","motion","div","__assign","className","style","map","__rest","SideViewButton","CustomThemedTooltip","id","place","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/tslib/tslib.es6.js"),n=require("react");require("../../../node_modules/react-redux/es/index.js");var i=require("../../../store/index.js"),r=require("../../../utils/deviceUtils.js"),u=require("../../../lib/webrtc/janus.js"),o=require("../../../lib/devices/devices.js"),t=require("../../../utils/genericFunctions/eventDispatch.js"),l=require("../../../node_modules/react-redux/es/hooks/useDispatch.js"),s=require("../../../node_modules/react-redux/es/hooks/useSelector.js");exports.useSideViewLogic=function(d,c){var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../../node_modules/tslib/tslib.es6.js"),n=require("react");require("../../../node_modules/react-redux/es/index.js");var i=require("../../../store/index.js"),r=require("../../../utils/deviceUtils.js"),u=require("../../../lib/webrtc/janus.js"),o=require("../../../lib/devices/devices.js"),t=require("../../../utils/genericFunctions/eventDispatch.js"),l=require("../../../node_modules/react-redux/es/hooks/useDispatch.js"),s=require("../../../node_modules/react-redux/es/hooks/useSelector.js");exports.useSideViewLogic=function(d,c,a){var v,h,g,p,f,m,b,_,S=l.useDispatch(),w=s.useSelector((function(e){return e.currentUser})),j=s.useSelector((function(e){return e.users})),k=i.store.select.mediaDevices.videoInputDevices(i.store.getState()),q=n.useRef(u.default),C=s.useSelector((function(e){return e.currentUser.conversations})),D=n.useState([]),V=D[0],T=D[1],I=n.useState(!0),N=I[0],Q=I[1],x=n.useCallback((function(e){if(S.island.toggleSideViewVisible(!1),"openUrl"===e){var n=Object.values(C).find((function(e){return Object.keys(e).length>0})),i=n?Object.values(n)[0]:null;if((null==i?void 0:i.connected)&&"in"===(null==i?void 0:i.direction))if(c&&(null==i?void 0:i.throughQueue)){var r={counterpartNum:i.counterpartNum,counterpartName:i.counterpartName,owner:i.owner,uniqueId:i.uniqueId,throughQueue:i.throughQueue,throughTrunk:i.throughTrunk,direction:i.direction,connected:i.connected,url:a};t.eventDispatch("phone-island-url-parameter-opened",r)}else if(!c&&((null==i?void 0:i.throughTrunk)||(null==i?void 0:i.throughQueue))){r={counterpartNum:i.counterpartNum,counterpartName:i.counterpartName,owner:i.owner,uniqueId:i.uniqueId,throughQueue:i.throughQueue,throughTrunk:i.throughTrunk,direction:i.direction,connected:i.connected,url:a};t.eventDispatch("phone-island-url-parameter-opened",r)}}else null!==e&&S.island.setIslandView(e)}),[S.island,C,c,a]),O=n.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){var n;return e.__generator(this,(function(e){switch(e.label){case 0:return k.length>0?[4,o.checkWebCamPermission()]:[3,2];case 1:return n=e.sent(),Q(n),[2,n];case 2:return Q(!1),[2,!1]}}))}))}),[k.length]),U=n.useCallback((function(){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,O()];case 1:return e.sent()&&(x("video"),i.store.dispatch.currentCall.updateCurrentCall({isLocalVideoEnabled:!0,isStartingVideoCall:!0})),[2]}}))}))}),[O,x]),y=n.useCallback((function(){x("video"),i.store.dispatch.screenShare.update({isStartingScreenShare:!0})}),[x]),E=n.useMemo((function(){var e;return(null===(e=null==w?void 0:w.profile)||void 0===e?void 0:e.macro_permissions)||{}}),[null===(v=null==w?void 0:w.profile)||void 0===v?void 0:v.macro_permissions]),M=n.useMemo((function(){var e,n,i,r,u,o,t;return{canRecord:(null===(i=null===(n=null===(e=null==E?void 0:E.settings)||void 0===e?void 0:e.permissions)||void 0===n?void 0:n.recording)||void 0===i?void 0:i.value)||!1,canShareScreen:"safari"!==q.current.webRTCAdapter.browserDetails.browser&&((null===(o=null===(u=null===(r=null==E?void 0:E.nethvoice_cti)||void 0===r?void 0:r.permissions)||void 0===u?void 0:u.screen_sharing)||void 0===o?void 0:o.value)||!1),canSwitchDevice:(null==V?void 0:V.length)>0,showUrlButton:"nethlink"!==(null===(t=null==w?void 0:w.default_device)||void 0===t?void 0:t.type)&&"desktop"===d}}),[null===(p=null===(g=null===(h=null==E?void 0:E.settings)||void 0===h?void 0:h.permissions)||void 0===g?void 0:g.recording)||void 0===p?void 0:p.value,null===(b=null===(m=null===(f=null==E?void 0:E.nethvoice_cti)||void 0===f?void 0:f.permissions)||void 0===m?void 0:m.screen_sharing)||void 0===b?void 0:b.value,null==V?void 0:V.length,null===(_=null==w?void 0:w.default_device)||void 0===_?void 0:_.type,d]),A=n.useMemo((function(){var e=Object.values(C).find((function(e){return Object.keys(e).length>0})),n=e?Object.values(e)[0]:null;return!(!(null==n?void 0:n.connected)||"in"!==(null==n?void 0:n.direction))&&(!(!c||!(null==n?void 0:n.throughQueue))||!(c||!(null==n?void 0:n.throughTrunk)&&!(null==n?void 0:n.throughQueue)))}),[C,c]);return n.useEffect((function(){if(w&&j){var e=r.getAvailableDevices(w,j);T(e)}}),[w,j]),e.__assign(e.__assign({userInformation:w,availableDevices:V,videoInputDevices:k,isVideoCallButtonVisible:N,isUrlButtonEnabled:A},M),{goToVideoCall:U,goToScreenSharing:y,closeSideViewAndLaunchEvent:x})};
|
|
2
2
|
//# sourceMappingURL=useSideViewLogic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSideViewLogic.js","sources":["../../../../src/components/SideView/hooks/useSideViewLogic.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../../store'\nimport { getAvailableDevices } from '../../../utils/deviceUtils'\nimport JanusLib from '../../../lib/webrtc/janus.js'\nimport { checkWebCamPermission } from '../../../lib/devices/devices'\nimport { eventDispatch } from '../../../utils'\n\nexport const useSideViewLogic = (uaType?: string, onlyQueues?: boolean) => {\n const dispatch = useDispatch<Dispatch>()\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n const janus = useRef<any>(JanusLib)\n const conversations = useSelector((state: RootState) => state.currentUser.conversations)\n\n const [availableDevices, setAvailableDevices] = useState([])\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const closeSideViewAndLaunchEvent = useCallback(\n (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType === 'openUrl') {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (conversationData?.connected && conversationData?.direction === 'in') {\n if (onlyQueues && conversationData?.throughQueue) {\n // Open URL only for queue calls when onlyQueues is true\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n } else if (\n !onlyQueues &&\n (conversationData?.throughTrunk || conversationData?.throughQueue)\n ) {\n // Open URL for both trunk and queue calls when onlyQueues is false\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n }\n }\n } else if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n },\n [dispatch.island, conversations, onlyQueues],\n )\n\n const checkCameraPermission = useCallback(async () => {\n if (videoInputDevices.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n setIsVideoCallButtonVisible(isWebCamAccepted)\n return isWebCamAccepted\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }, [videoInputDevices.length])\n\n const goToVideoCall = useCallback(async () => {\n const cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n isStartingVideoCall: true,\n })\n }\n }, [checkCameraPermission, closeSideViewAndLaunchEvent])\n\n const goToScreenSharing = useCallback(() => {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.screenShare.update({\n isStartingScreenShare: true,\n })\n }, [closeSideViewAndLaunchEvent])\n\n const permissions = useMemo(\n () => userInformation?.profile?.macro_permissions || {},\n [userInformation?.profile?.macro_permissions],\n )\n\n const userCapabilities = useMemo(\n () => ({\n canRecord: permissions?.settings?.permissions?.recording?.value || false,\n canShareScreen:\n janus.current.webRTCAdapter.browserDetails.browser !== 'safari' &&\n (permissions?.nethvoice_cti?.permissions?.screen_sharing?.value || false),\n canSwitchDevice: availableDevices?.length > 0,\n showUrlButton: userInformation?.default_device?.type !== 'nethlink' && uaType === 'desktop',\n }),\n [\n permissions?.settings?.permissions?.recording?.value,\n permissions?.nethvoice_cti?.permissions?.screen_sharing?.value,\n availableDevices?.length,\n userInformation?.default_device?.type,\n uaType,\n ],\n )\n\n const isUrlButtonEnabled = useMemo(() => {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (!conversationData?.connected || conversationData?.direction !== 'in') {\n return false\n }\n\n if (onlyQueues && conversationData?.throughQueue) {\n return true\n } else if (!onlyQueues && (conversationData?.throughTrunk || conversationData?.throughQueue)) {\n return true\n }\n\n return false\n }, [conversations, onlyQueues])\n\n useEffect(() => {\n if (userInformation && allUsersInformation) {\n const devices = getAvailableDevices(userInformation, allUsersInformation)\n setAvailableDevices(devices)\n }\n }, [userInformation, allUsersInformation])\n\n return {\n userInformation,\n availableDevices,\n videoInputDevices,\n isVideoCallButtonVisible,\n isUrlButtonEnabled,\n ...userCapabilities,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n }\n}\n"],"names":["uaType","onlyQueues","dispatch","useDispatch","userInformation","useSelector","state","currentUser","allUsersInformation","users","videoInputDevices","store","select","mediaDevices","getState","janus","useRef","JanusLib","conversations","_j","useState","availableDevices","setAvailableDevices","_k","isVideoCallButtonVisible","setIsVideoCallButtonVisible","closeSideViewAndLaunchEvent","useCallback","viewType","island","toggleSideViewVisible","activeConversation","Object","values","find","conv","keys","length","conversationData","connected","direction","throughQueue","eventData","counterpartNum","counterpartName","owner","uniqueId","throughTrunk","eventDispatch","setIslandView","checkCameraPermission","__awaiter","checkWebCamPermission","isWebCamAccepted","_a","sent","goToVideoCall","currentCall","updateCurrentCall","isLocalVideoEnabled","isStartingVideoCall","goToScreenSharing","screenShare","update","isStartingScreenShare","permissions","useMemo","profile","macro_permissions","userCapabilities","canRecord","_c","settings","_b","recording","value","canShareScreen","current","webRTCAdapter","browserDetails","browser","_f","_e","nethvoice_cti","_d","screen_sharing","canSwitchDevice","showUrlButton","_g","default_device","type","_h","isUrlButtonEnabled","useEffect","devices","getAvailableDevices","__assign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSideViewLogic.js","sources":["../../../../src/components/SideView/hooks/useSideViewLogic.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../../store'\nimport { getAvailableDevices } from '../../../utils/deviceUtils'\nimport JanusLib from '../../../lib/webrtc/janus.js'\nimport { checkWebCamPermission } from '../../../lib/devices/devices'\nimport { eventDispatch } from '../../../utils'\n\nexport const useSideViewLogic = (uaType?: string, onlyQueues?: boolean, urlParam?: string) => {\n const dispatch = useDispatch<Dispatch>()\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n const janus = useRef<any>(JanusLib)\n const conversations = useSelector((state: RootState) => state.currentUser.conversations)\n\n const [availableDevices, setAvailableDevices] = useState([])\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const closeSideViewAndLaunchEvent = useCallback(\n (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType === 'openUrl') {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (conversationData?.connected && conversationData?.direction === 'in') {\n if (onlyQueues && conversationData?.throughQueue) {\n // Open URL only for queue calls when onlyQueues is true\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n url: urlParam,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n } else if (\n !onlyQueues &&\n (conversationData?.throughTrunk || conversationData?.throughQueue)\n ) {\n // Open URL for both trunk and queue calls when onlyQueues is false\n const eventData = {\n counterpartNum: conversationData.counterpartNum,\n counterpartName: conversationData.counterpartName,\n owner: conversationData.owner,\n uniqueId: conversationData.uniqueId,\n throughQueue: conversationData.throughQueue,\n throughTrunk: conversationData.throughTrunk,\n direction: conversationData.direction,\n connected: conversationData.connected,\n url: urlParam,\n }\n eventDispatch('phone-island-url-parameter-opened', eventData)\n }\n }\n } else if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n },\n [dispatch.island, conversations, onlyQueues, urlParam],\n )\n\n const checkCameraPermission = useCallback(async () => {\n if (videoInputDevices.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n setIsVideoCallButtonVisible(isWebCamAccepted)\n return isWebCamAccepted\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }, [videoInputDevices.length])\n\n const goToVideoCall = useCallback(async () => {\n const cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n isStartingVideoCall: true,\n })\n }\n }, [checkCameraPermission, closeSideViewAndLaunchEvent])\n\n const goToScreenSharing = useCallback(() => {\n closeSideViewAndLaunchEvent('video')\n store.dispatch.screenShare.update({\n isStartingScreenShare: true,\n })\n }, [closeSideViewAndLaunchEvent])\n\n const permissions = useMemo(\n () => userInformation?.profile?.macro_permissions || {},\n [userInformation?.profile?.macro_permissions],\n )\n\n const userCapabilities = useMemo(\n () => ({\n canRecord: permissions?.settings?.permissions?.recording?.value || false,\n canShareScreen:\n janus.current.webRTCAdapter.browserDetails.browser !== 'safari' &&\n (permissions?.nethvoice_cti?.permissions?.screen_sharing?.value || false),\n canSwitchDevice: availableDevices?.length > 0,\n showUrlButton: userInformation?.default_device?.type !== 'nethlink' && uaType === 'desktop',\n }),\n [\n permissions?.settings?.permissions?.recording?.value,\n permissions?.nethvoice_cti?.permissions?.screen_sharing?.value,\n availableDevices?.length,\n userInformation?.default_device?.type,\n uaType,\n ],\n )\n\n const isUrlButtonEnabled = useMemo(() => {\n const activeConversation = Object.values(conversations).find(\n (conv) => Object.keys(conv).length > 0,\n )\n const conversationData = activeConversation ? Object.values(activeConversation)[0] : null\n\n if (!conversationData?.connected || conversationData?.direction !== 'in') {\n return false\n }\n\n if (onlyQueues && conversationData?.throughQueue) {\n return true\n } else if (!onlyQueues && (conversationData?.throughTrunk || conversationData?.throughQueue)) {\n return true\n }\n\n return false\n }, [conversations, onlyQueues])\n\n useEffect(() => {\n if (userInformation && allUsersInformation) {\n const devices = getAvailableDevices(userInformation, allUsersInformation)\n setAvailableDevices(devices)\n }\n }, [userInformation, allUsersInformation])\n\n return {\n userInformation,\n availableDevices,\n videoInputDevices,\n isVideoCallButtonVisible,\n isUrlButtonEnabled,\n ...userCapabilities,\n goToVideoCall,\n goToScreenSharing,\n closeSideViewAndLaunchEvent,\n }\n}\n"],"names":["uaType","onlyQueues","urlParam","dispatch","useDispatch","userInformation","useSelector","state","currentUser","allUsersInformation","users","videoInputDevices","store","select","mediaDevices","getState","janus","useRef","JanusLib","conversations","_j","useState","availableDevices","setAvailableDevices","_k","isVideoCallButtonVisible","setIsVideoCallButtonVisible","closeSideViewAndLaunchEvent","useCallback","viewType","island","toggleSideViewVisible","activeConversation","Object","values","find","conv","keys","length","conversationData","connected","direction","throughQueue","eventData","counterpartNum","counterpartName","owner","uniqueId","throughTrunk","url","eventDispatch","setIslandView","checkCameraPermission","__awaiter","checkWebCamPermission","isWebCamAccepted","_a","sent","goToVideoCall","currentCall","updateCurrentCall","isLocalVideoEnabled","isStartingVideoCall","goToScreenSharing","screenShare","update","isStartingScreenShare","permissions","useMemo","profile","macro_permissions","userCapabilities","canRecord","_c","settings","_b","recording","value","canShareScreen","current","webRTCAdapter","browserDetails","browser","_f","_e","nethvoice_cti","_d","screen_sharing","canSwitchDevice","showUrlButton","_g","default_device","type","_h","isUrlButtonEnabled","useEffect","devices","getAvailableDevices","__assign"],"mappings":"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"}
|
package/dist/lib/phone/call.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../webrtc/messages.js"),r=require("../../store/index.js"),n=require("../user/default_device.js"),s=require("../../services/astproxy.js"),o=require("../../static/dtmf/index.js");require("react");var i=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../services/user.js"),c=require("../../utils/genericFunctions/isEmpty.js"),u=require("../../utils/streaming/getStreamingSourceId.js");function l(){var e=r.store.getState().currentCall,o=e.outgoing,c=e.accepted,l=e.streamingSourceNumber,d=r.store.getState().island.isFromStreaming;if(o||c){if(n.isWebRTC()?t.hangup():s.hangupPhysical(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset(),d&&l){var v=u.getStreamingSourceId(l);v&&(a.unsubscribe({id:v}).then((function(){return console.debug("Unsubscribed from streaming source: ".concat(v))})).catch((function(e){return console.error("Error unsubscribing from streaming source:",e)})),r.store.dispatch.streaming.clearSourceImages())}r.store.dispatch.island.setIsFromStreaming(!1)}i.eventDispatch("phone-island-call-ended",{})}function d(t){return e.__awaiter(this,void 0,void 0,(function(){var n,o,i;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,o=r.store.getState().currentUser.default_device,i=(null==o?void 0:o.id)||(null==o?void 0:o.exten),n&&i&&t?[4,s.attendedTransfer({convid:n,to:t,endpointId:i})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))}function v(){var t;return e.__awaiter(this,void 0,void 0,(function(){var n,o,a,u,l,d,v,p,f,h,g,C,m,b;return e.__generator(this,(function(e){switch(e.label){case 0:if(n=null===(t=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===t?void 0:t.currentCall,o=n.accepted,a=n.chSource,u=n.chDest,l=n.incoming,d=n.outgoing,v=n.incomingSocket,p=n.outgoingSocket,f=n.conversationId,h=r.store.getState().currentUser.default_device,g=(null==h?void 0:h.id)||(null==h?void 0:h.exten),C="",o&&(l||v)&&!c.isEmpty(a)?C=null==a?void 0:a.callerNum:o&&(d||p)&&!c.isEmpty(u)&&(C=null==u?void 0:u.callerNum),""===g||""===f||""===C)return[3,4];if(!(m={convid:null==f?void 0:f.toString(),addEndpointId:null==C?void 0:C.toString(),ownerEndpointId:null==g?void 0:g.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.startConf(m)];case 2:return e.sent()?(r.store.dispatch.currentCall.updateCurrentCall({conferencing:!0,paused:!1}),i.eventDispatch("phone-island-call-conferenced",{}),[2,!0]):[2,!1];case 3:return b=e.sent(),console.error(b),[2,!1];case 4:return[2,!1]}}))}))}function p(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===(t=r.store.getState().conference.conferenceId))return[3,4];if(!(n={confId:null==t?void 0:t.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.endConf(n)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-finished",{}),[2,!0]):[2,!1];case 3:return o=e.sent(),console.error(o),[2,!1];case 4:return[2,!1]}}))}))}var f=function(){return!!r.store.getState().island.isConferenceList},h=function(e,t){var n=r.store.getState().currentUser.username,s=r.store.getState().conference,o=s.isActive,a=s.isOwnerInside;o||(t.conference.setConferenceActive(!0),t.conference.setConferenceStartedFrom(n)),a?(l(),t.conference.toggleIsOwnerInside(!1),requestAnimationFrame((function(){setTimeout((function(){i.eventDispatch("phone-island-call-start",{number:e})}),800)}))):requestAnimationFrame((function(){setTimeout((function(){i.eventDispatch("phone-island-call-start",{number:e})}),800)}))};function g(t,r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,d(t)];case 1:return e.sent()&&(r.currentCall.updateCurrentCall({transferring:!0,paused:!1}),requestAnimationFrame((function(){r.player.playRemoteAudio(),i.eventDispatch("phone-island-call-transfered",{})}))),[2]}}))}))}exports.answerIncomingCall=function(){n.isWebRTC()?t.answerWebRTC():s.answerPhysical()},exports.attendedTransfer=d,exports.blindTransferFunction=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o;return e.__generator(this,(function(e){switch(e.label){case 0:return(o=r.store.getState().currentCall.conversationId)&&n&&t?[4,s.blindTransfer({convid:o,to:t,endpointId:n})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,r){var o="sip:".concat(e,"@").concat(r);n.isWebRTC()?t.callSipURI(o):s.callPhysical(e),i.eventDispatch("phone-island-call-started",{})},exports.clickTransferOrConference=function(t,n){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return f()?r.store.getState().conference.isActive?[3,2]:[4,v()]:[3,4];case 1:return e.sent()&&h(t,n),[3,3];case 2:h(t,n),e.label=3;case 3:return[3,5];case 4:g(t,n),e.label=5;case 5:return[2]}}))}))},exports.endConference=p,exports.forceHangupConversation=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.forceHangup({convid:e,endpointId:t,endpointType:"extension"})}))};for(var n in e)t(n)},exports.handleAttendedTransfer=g,exports.hangupAllExtensions=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.hangupConversation({convid:e,endpointId:t})}))};for(var n in e)t(n)},exports.hangupCurrentCall=l,exports.hangupCurrentPhysicalRecording=function(){s.hangupPhysicalRecordingCall(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.physicalRecorder.reset(),r.store.dispatch.physicalRecorder.setRecording(!1),r.store.dispatch.island.setIslandView(null),r.store.dispatch.listen.reset(),i.eventDispatch("phone-island-call-ended",{})},exports.isInsideConferenceList=f,exports.joinConference=function(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o,a;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=r.store.getState().currentUser.default_device,""===(n=(null==t?void 0:t.id)||(null==t?void 0:t.exten)))return[3,4];if(!(o={endpointId:null==n?void 0:n.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.joinMyConf(o)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-enter",{}),[2,!0]):[2,!1];case 3:return a=e.sent(),console.error(a),[2,!1];case 4:return[2,!1]}}))}))},exports.muteAllUsersConference=function(t,n){var o;return e.__awaiter(this,void 0,void 0,(function(){var i,a,c,u,l,d,v,p;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t)return[2,!1];if(!(i=r.store.getState().conference.usersList)||0===Object.keys(i).length)return[2,!1];e.label=1;case 1:e.trys.push([1,6,,7]),a=Object.values(i),c=n?s.unmuteUserConf:s.muteUserConf,u=0,l=a,e.label=2;case 2:return u<l.length?(d=l[u],v={confId:null==t?void 0:t.toString(),userId:null===(o=d.id)||void 0===o?void 0:o.toString()},[4,c(v)]):[3,5];case 3:e.sent()&&r.store.dispatch.conference.toggleUserMuted({extenId:d.extenId,muted:!n}),e.label=4;case 4:return u++,[3,2];case 5:return[2,!0];case 6:return p=e.sent(),console.error(p),[2,!1];case 7:return[2]}}))}))},exports.muteCurrentCall=function(){n.isWebRTC()?t.muteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!0}):s.mutePhysical(!0),i.eventDispatch("phone-island-call-muted",{})},exports.muteUserConference=function(t,r,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t||""===r)return[2,!1];o={confId:null==t?void 0:t.toString(),userId:null==r?void 0:r.toString()},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n?s.unmuteUserConf:s.muteUserConf)(o)];case 2:return[2,!!e.sent()];case 3:return i=e.sent(),console.error(i),[2,!1];case 4:return[2]}}))}))},exports.parkCurrentCall=function(){var e,t,n,o,a=null===(t=null===(e=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===e?void 0:e.currentCall)||void 0===t?void 0:t.conversationId,c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.conversations,u={};if(a){if(c)for(var l in c)if(c.hasOwnProperty(l)){var d=c[l];Object.keys(d).length>0&&(u={numberParkId:l,idConversation:a})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&(s.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:a,endpointId:null==u?void 0:u.numberParkId}),r.store.dispatch.currentCall.setParked(!0),i.eventDispatch("phone-island-call-parked",{}))}},exports.pauseCurrentCall=function(){n.isWebRTC()?t.pauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!0}),r.store.dispatch.player.pauseRemoteAudio()):s.pausePhysical(!0),i.eventDispatch("phone-island-call-held",{})},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),r.store.dispatch.player.updateStartAudioPlayer({src:o.default["dtmf_".concat(e)]})},exports.recordCurrentCall=function(t){var n,o,i,a;return e.__awaiter(this,void 0,void 0,(function(){var c,u,l,d,v,p,f;return e.__generator(this,(function(e){switch(e.label){case 0:return r.store.dispatch.currentCall.updateRecordingStatus(!t),c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.conversations,(u=function(e){for(var t in e)if(0!==Object.keys(e[t]).length){var r=Object.values(e[t])[0];return{id:r.id,recording:r.recording}}return null}(c))?[3,1]:[2];case 1:switch(l=null===(i=null==u?void 0:u.id)||void 0===i?void 0:i.match(/\/(\d+)-/),d=l[1],v={convid:null===(a=null==u?void 0:u.id)||void 0===a?void 0:a.toString(),endpointId:null==d?void 0:d.toString()},p="",null==u?void 0:u.recording){case"false":p="start_record";break;case"true":p="mute_record";break;case"mute":p="unmute_record";break;default:p=""}if(!v)return[3,5];e.label=2;case 2:return e.trys.push([2,4,,5]),[4,s.toggleRecord(p,v)];case 3:return e.sent(),[3,5];case 4:return f=e.sent(),console.error(f),[2,[]];case 5:return[2]}}))}))},exports.removeUserConference=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i,a=this;return e.__generator(this,(function(c){switch(c.label){case 0:if(""===t||""===n)return[3,4];if(!(o={confId:null==t?void 0:t.toString(),extenId:null==n?void 0:n.toString()}))return[3,4];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,s.hangupUserConf(o)];case 2:return c.sent()?(setTimeout((function(){return e.__awaiter(a,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return t=r.store.getState().conference.usersList,s=Object.values(t||{}).filter((function(e){return!e.owner&&e.extenId!==n})).length,0!==s?[3,2]:[4,p()];case 1:e.sent(),e.label=2;case 2:return[2]}}))}))}),500),[2,!0]):[2,!1];case 3:return i=c.sent(),console.error(i),[2,!1];case 4:return[2,!1]}}))}))},exports.startConference=v,exports.unmuteCurrentCall=function(){n.isWebRTC()?t.unmuteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!1}):s.mutePhysical(!1),i.eventDispatch("phone-island-call-unmuted",{})},exports.unpauseCurrentCall=function(){n.isWebRTC()?t.unpauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!1}),r.store.dispatch.player.playRemoteAudio()):s.pausePhysical(!1),i.eventDispatch("phone-island-call-unheld",{})},exports.waitingConferenceView=h;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("../webrtc/messages.js"),r=require("../../store/index.js"),n=require("../user/default_device.js"),s=require("../../services/astproxy.js"),o=require("../../static/dtmf/index.js");require("react");var i=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../services/user.js"),c=require("../../utils/genericFunctions/isEmpty.js"),u=require("../../utils/streaming/getStreamingSourceId.js");function l(){var e=r.store.getState().currentCall,o=e.outgoing,c=e.accepted,l=e.streamingSourceNumber,d=r.store.getState().island.isFromStreaming;if(o||c){if(n.isWebRTC()?t.hangup():s.hangupPhysical(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.currentCall.reset(),r.store.dispatch.listen.reset(),d&&l){var v=u.getStreamingSourceId(l);v&&(a.unsubscribe({id:v}).then((function(){return console.debug("Unsubscribed from streaming source: ".concat(v))})).catch((function(e){return console.error("Error unsubscribing from streaming source:",e)})),r.store.dispatch.streaming.clearSourceImages())}r.store.dispatch.island.setIsFromStreaming(!1)}i.eventDispatch("phone-island-call-ended",{})}function d(){n.isWebRTC()?t.unpauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!1}),r.store.dispatch.player.playRemoteAudio()):s.pausePhysical(!1);i.eventDispatch("phone-island-call-unheld",{})}function v(t){return e.__awaiter(this,void 0,void 0,(function(){var n,o,i;return e.__generator(this,(function(e){switch(e.label){case 0:return n=r.store.getState().currentCall.conversationId,o=r.store.getState().currentUser.default_device,i=(null==o?void 0:o.id)||(null==o?void 0:o.exten),n&&i&&t?[4,s.attendedTransfer({convid:n,to:t,endpointId:i})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))}function p(){var t;return e.__awaiter(this,void 0,void 0,(function(){var n,o,a,u,l,d,v,p,f,h,g,C,m,b;return e.__generator(this,(function(e){switch(e.label){case 0:if(n=null===(t=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===t?void 0:t.currentCall,o=n.accepted,a=n.chSource,u=n.chDest,l=n.incoming,d=n.outgoing,v=n.incomingSocket,p=n.outgoingSocket,f=n.conversationId,h=r.store.getState().currentUser.default_device,g=(null==h?void 0:h.id)||(null==h?void 0:h.exten),C="",o&&(l||v)&&!c.isEmpty(a)?C=null==a?void 0:a.callerNum:o&&(d||p)&&!c.isEmpty(u)&&(C=null==u?void 0:u.callerNum),""===g||""===f||""===C)return[3,4];if(!(m={convid:null==f?void 0:f.toString(),addEndpointId:null==C?void 0:C.toString(),ownerEndpointId:null==g?void 0:g.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.startConf(m)];case 2:return e.sent()?(r.store.dispatch.currentCall.updateCurrentCall({conferencing:!0,paused:!1}),i.eventDispatch("phone-island-call-conferenced",{}),[2,!0]):[2,!1];case 3:return b=e.sent(),console.error(b),[2,!1];case 4:return[2,!1]}}))}))}function f(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===(t=r.store.getState().conference.conferenceId))return[3,4];if(!(n={confId:null==t?void 0:t.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.endConf(n)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-finished",{}),[2,!0]):[2,!1];case 3:return o=e.sent(),console.error(o),[2,!1];case 4:return[2,!1]}}))}))}var h=function(){return!!r.store.getState().island.isConferenceList},g=function(e,t){var n=r.store.getState().currentUser.username,s=r.store.getState().conference,o=s.isActive,a=s.isOwnerInside;o||(t.conference.setConferenceActive(!0),t.conference.setConferenceStartedFrom(n)),a?(l(),t.conference.toggleIsOwnerInside(!1),requestAnimationFrame((function(){setTimeout((function(){i.eventDispatch("phone-island-call-start",{number:e})}),800)}))):requestAnimationFrame((function(){setTimeout((function(){i.eventDispatch("phone-island-call-start",{number:e})}),800)}))};function C(t,r){return e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return d(),[4,v(t)];case 1:return e.sent()&&(r.currentCall.updateCurrentCall({transferring:!0,paused:!1}),requestAnimationFrame((function(){r.player.playRemoteAudio(),i.eventDispatch("phone-island-call-transfered",{})}))),[2]}}))}))}exports.answerIncomingCall=function(){n.isWebRTC()?t.answerWebRTC():s.answerPhysical()},exports.attendedTransfer=v,exports.blindTransferFunction=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o;return e.__generator(this,(function(e){switch(e.label){case 0:return(o=r.store.getState().currentCall.conversationId)&&n&&t?[4,s.blindTransfer({convid:o,to:t,endpointId:n})]:[3,2];case 1:return[2,e.sent()];case 2:return[2]}}))}))},exports.callNumber=function(e,r){var o="sip:".concat(e,"@").concat(r);n.isWebRTC()?t.callSipURI(o):s.callPhysical(e),i.eventDispatch("phone-island-call-started",{})},exports.clickTransferOrConference=function(t,n){return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return h()?r.store.getState().conference.isActive?[3,2]:[4,p()]:[3,4];case 1:return e.sent()&&g(t,n),[3,3];case 2:g(t,n),e.label=3;case 3:return[3,5];case 4:C(t,n),e.label=5;case 5:return[2]}}))}))},exports.endConference=f,exports.forceHangupConversation=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.forceHangup({convid:e,endpointId:t,endpointType:"extension"})}))};for(var n in e)t(n)},exports.handleAttendedTransfer=C,exports.hangupAllExtensions=function(){var e=r.store.getState().currentUser.conversations,t=function(t){Object.keys(e[t]).forEach((function(e){s.hangupConversation({convid:e,endpointId:t})}))};for(var n in e)t(n)},exports.hangupCurrentCall=l,exports.hangupCurrentPhysicalRecording=function(){s.hangupPhysicalRecordingCall(),r.store.dispatch.player.stopAudioPlayer(),r.store.dispatch.physicalRecorder.reset(),r.store.dispatch.physicalRecorder.setRecording(!1),r.store.dispatch.island.setIslandView(null),r.store.dispatch.listen.reset(),i.eventDispatch("phone-island-call-ended",{})},exports.isInsideConferenceList=h,exports.joinConference=function(){return e.__awaiter(this,void 0,void 0,(function(){var t,n,o,a;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=r.store.getState().currentUser.default_device,""===(n=(null==t?void 0:t.id)||(null==t?void 0:t.exten)))return[3,4];if(!(o={endpointId:null==n?void 0:n.toString()}))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,s.joinMyConf(o)];case 2:return e.sent()?(i.eventDispatch("phone-island-owner-conference-enter",{}),[2,!0]):[2,!1];case 3:return a=e.sent(),console.error(a),[2,!1];case 4:return[2,!1]}}))}))},exports.muteAllUsersConference=function(t,n){var o;return e.__awaiter(this,void 0,void 0,(function(){var i,a,c,u,l,d,v,p;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t)return[2,!1];if(!(i=r.store.getState().conference.usersList)||0===Object.keys(i).length)return[2,!1];e.label=1;case 1:e.trys.push([1,6,,7]),a=Object.values(i),c=n?s.unmuteUserConf:s.muteUserConf,u=0,l=a,e.label=2;case 2:return u<l.length?(d=l[u],v={confId:null==t?void 0:t.toString(),userId:null===(o=d.id)||void 0===o?void 0:o.toString()},[4,c(v)]):[3,5];case 3:e.sent()&&r.store.dispatch.conference.toggleUserMuted({extenId:d.extenId,muted:!n}),e.label=4;case 4:return u++,[3,2];case 5:return[2,!0];case 6:return p=e.sent(),console.error(p),[2,!1];case 7:return[2]}}))}))},exports.muteCurrentCall=function(){n.isWebRTC()?t.muteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!0}):s.mutePhysical(!0),i.eventDispatch("phone-island-call-muted",{})},exports.muteUserConference=function(t,r,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i;return e.__generator(this,(function(e){switch(e.label){case 0:if(""===t||""===r)return[2,!1];o={confId:null==t?void 0:t.toString(),userId:null==r?void 0:r.toString()},e.label=1;case 1:return e.trys.push([1,3,,4]),[4,(n?s.unmuteUserConf:s.muteUserConf)(o)];case 2:return[2,!!e.sent()];case 3:return i=e.sent(),console.error(i),[2,!1];case 4:return[2]}}))}))},exports.parkCurrentCall=function(){var e,t,n,o,a=null===(t=null===(e=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===e?void 0:e.currentCall)||void 0===t?void 0:t.conversationId,c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.conversations,u={};if(a){if(c)for(var l in c)if(c.hasOwnProperty(l)){var d=c[l];Object.keys(d).length>0&&(u={numberParkId:l,idConversation:a})}Object.keys(u).length>0&&(null==u?void 0:u.numberParkId)&&(s.parkConversation({applicantId:null==u?void 0:u.numberParkId,convid:a,endpointId:null==u?void 0:u.numberParkId}),r.store.dispatch.currentCall.setParked(!0),i.eventDispatch("phone-island-call-parked",{}))}},exports.pauseCurrentCall=function(){n.isWebRTC()?t.pauseWebRTC()&&(r.store.dispatch.currentCall.updateCurrentCall({paused:!0}),r.store.dispatch.player.pauseRemoteAudio()):s.pausePhysical(!0),i.eventDispatch("phone-island-call-held",{})},exports.playDtmfAudio=function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),r.store.dispatch.player.updateStartAudioPlayer({src:o.default["dtmf_".concat(e)]})},exports.recordCurrentCall=function(t){var n,o,i,a;return e.__awaiter(this,void 0,void 0,(function(){var c,u,l,d,v,p,f;return e.__generator(this,(function(e){switch(e.label){case 0:return r.store.dispatch.currentCall.updateRecordingStatus(!t),c=null===(o=null===(n=null===r.store||void 0===r.store?void 0:r.store.getState())||void 0===n?void 0:n.currentUser)||void 0===o?void 0:o.conversations,(u=function(e){for(var t in e)if(0!==Object.keys(e[t]).length){var r=Object.values(e[t])[0];return{id:r.id,recording:r.recording}}return null}(c))?[3,1]:[2];case 1:switch(l=null===(i=null==u?void 0:u.id)||void 0===i?void 0:i.match(/\/(\d+)-/),d=l[1],v={convid:null===(a=null==u?void 0:u.id)||void 0===a?void 0:a.toString(),endpointId:null==d?void 0:d.toString()},p="",null==u?void 0:u.recording){case"false":p="start_record";break;case"true":p="mute_record";break;case"mute":p="unmute_record";break;default:p=""}if(!v)return[3,5];e.label=2;case 2:return e.trys.push([2,4,,5]),[4,s.toggleRecord(p,v)];case 3:return e.sent(),[3,5];case 4:return f=e.sent(),console.error(f),[2,[]];case 5:return[2]}}))}))},exports.removeUserConference=function(t,n){return e.__awaiter(this,void 0,void 0,(function(){var o,i,a=this;return e.__generator(this,(function(c){switch(c.label){case 0:if(""===t||""===n)return[3,4];if(!(o={confId:null==t?void 0:t.toString(),extenId:null==n?void 0:n.toString()}))return[3,4];c.label=1;case 1:return c.trys.push([1,3,,4]),[4,s.hangupUserConf(o)];case 2:return c.sent()?(setTimeout((function(){return e.__awaiter(a,void 0,void 0,(function(){var t,s;return e.__generator(this,(function(e){switch(e.label){case 0:return t=r.store.getState().conference.usersList,s=Object.values(t||{}).filter((function(e){return!e.owner&&e.extenId!==n})).length,0!==s?[3,2]:[4,f()];case 1:e.sent(),e.label=2;case 2:return[2]}}))}))}),500),[2,!0]):[2,!1];case 3:return i=c.sent(),console.error(i),[2,!1];case 4:return[2,!1]}}))}))},exports.startConference=p,exports.unmuteCurrentCall=function(){n.isWebRTC()?t.unmuteWebRTC()&&r.store.dispatch.currentCall.updateCurrentCall({muted:!1}):s.mutePhysical(!1),i.eventDispatch("phone-island-call-unmuted",{})},exports.unpauseCurrentCall=d,exports.waitingConferenceView=g;
|
|
2
2
|
//# sourceMappingURL=call.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport {\n callSipURI,\n hangup,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { Dispatch, store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n hangupPhysical,\n answerPhysical,\n mutePhysical,\n pausePhysical,\n callPhysical,\n toggleRecord,\n hangupPhysicalRecordingCall,\n startConf,\n joinMyConf,\n endConf,\n muteUserConf,\n unmuteUserConf,\n hangupUserConf,\n forceHangup,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\nimport { getStreamingSourceId } from '../../utils/streaming/getStreamingSourceId'\nimport { unsubscribe } from '../../services/user'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string, sipHost: string) {\n const sipURI = `sip:${number}@${sipHost}`\n if (isWebRTC()) {\n callSipURI(sipURI)\n } else {\n callPhysical(number)\n }\n\n eventDispatch('phone-island-call-started', {})\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n } else {\n answerPhysical()\n }\n}\n\n/**\n * Hangup all the conversations of all the extensions of the current user\n */\nexport function hangupAllExtensions() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n hangupConversation({\n convid: id,\n endpointId: extension,\n })\n })\n }\n}\n\nexport function forceHangupConversation() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n forceHangup({\n convid: id,\n endpointId: extension,\n endpointType: 'extension',\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted, streamingSourceNumber } = store.getState().currentCall\n const { isFromStreaming } = store.getState().island\n \n if (outgoing || accepted) {\n if (isWebRTC()) {\n hangup()\n } else {\n hangupPhysical()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n store.dispatch.listen.reset()\n \n // If call was from a streaming source, unsubscribe and clear images\n if (isFromStreaming && streamingSourceNumber) {\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n if (sourceId) {\n // Unsubscribe from streaming updates\n unsubscribe({ id: sourceId })\n .then(() => console.debug(`Unsubscribed from streaming source: ${sourceId}`))\n .catch(error => console.error('Error unsubscribing from streaming source:', error))\n \n // Clear source images to free up memory\n store.dispatch.streaming.clearSourceImages()\n }\n }\n \n // Reset isFromStreaming flag\n store.dispatch.island.setIsFromStreaming(false)\n }\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Hangup current physical recording\n */\nexport function hangupCurrentPhysicalRecording() {\n hangupPhysicalRecordingCall()\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.physicalRecorder.reset()\n store.dispatch.physicalRecorder.setRecording(false)\n store.dispatch.island.setIslandView(null)\n store.dispatch.listen.reset()\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Mute the current call\n */\nexport function muteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const muted = muteWebRTC()\n if (muted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: true,\n })\n }\n } else {\n mutePhysical(true)\n }\n eventDispatch('phone-island-call-muted', {})\n}\n\n/**\n * Unmute the current call\n */\nexport function unmuteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unmuted = unmuteWebRTC()\n if (unmuted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: false,\n })\n }\n } else {\n mutePhysical(false)\n }\n eventDispatch('phone-island-call-unmuted', {})\n}\n\n/**\n * Pause the current call\n */\nexport function pauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const paused = pauseWebRTC()\n if (paused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: true,\n })\n // Pause remote audio\n store.dispatch.player.pauseRemoteAudio()\n }\n } else {\n pausePhysical(true)\n }\n eventDispatch('phone-island-call-held', {})\n}\n\n/**\n * Unpause the current call\n */\nexport function unpauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unpaused = unpauseWebRTC()\n if (unpaused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: false,\n })\n // Play remote audio\n store.dispatch.player.playRemoteAudio()\n }\n } else {\n pausePhysical(false)\n }\n eventDispatch('phone-island-call-unheld', {})\n}\n\n/**\n * Transfer the current call through a blind transfer (not in use)\n */\nexport async function blindTransferFunction(number: string, endpointIdInConversation: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n // Transfer the call through blind transfer\n if (conversationId && endpointIdInConversation && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: endpointIdInConversation,\n })\n }\n}\n\n/**\n * Transfer the current call through a attended transfer\n */\nexport async function attendedTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n let default_device_details = default_device?.id || default_device?.exten\n // Transfer the call through attended transfer\n if (conversationId && default_device_details && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device_details,\n })\n }\n}\n\n/**\n * Play the dtmf audio files\n */\nexport function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n store.dispatch.player.updateStartAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n}\n\n/**\n * Park the current call\n */\nexport function parkCurrentCall() {\n const conversationId = store?.getState()?.currentCall?.conversationId\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n let parkingInformation: any = {}\n\n if (conversationId) {\n if (userConversationInformations) {\n for (const key in userConversationInformations) {\n if (userConversationInformations.hasOwnProperty(key)) {\n const conversation = userConversationInformations[key]\n if (Object.keys(conversation).length > 0) {\n parkingInformation = {\n numberParkId: key,\n idConversation: conversationId,\n }\n }\n }\n }\n }\n\n if (Object.keys(parkingInformation).length > 0) {\n if (parkingInformation?.numberParkId) {\n // If park information are not empty park call\n parkConversation({\n applicantId: parkingInformation?.numberParkId,\n convid: conversationId,\n endpointId: parkingInformation?.numberParkId,\n })\n\n store.dispatch.currentCall.setParked(true)\n\n eventDispatch('phone-island-call-parked', {})\n }\n }\n }\n}\n\nconst findFirstExtesnionNotEmpty = (data) => {\n for (const key in data) {\n if (Object.keys(data[key]).length !== 0) {\n const firstEntry: any = Object.values(data[key])[0]\n return {\n id: firstEntry.id,\n recording: firstEntry.recording,\n }\n }\n }\n return null\n}\n\nexport async function recordCurrentCall(recordingValue: boolean) {\n store.dispatch.currentCall.updateRecordingStatus(!recordingValue)\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n const firstExtensionNotEmpty = findFirstExtesnionNotEmpty(userConversationInformations)\n\n if (!firstExtensionNotEmpty) {\n return\n } else {\n const numberToSendCall = firstExtensionNotEmpty?.id?.match(/\\/(\\d+)-/)\n const endpointId = numberToSendCall[1]\n\n const listenInformations = {\n convid: firstExtensionNotEmpty?.id?.toString(),\n endpointId: endpointId?.toString(),\n }\n\n let recordingValues = ''\n switch (firstExtensionNotEmpty?.recording) {\n case 'false':\n recordingValues = 'start_record'\n break\n case 'true':\n recordingValues = 'mute_record'\n break\n case 'mute':\n recordingValues = 'unmute_record'\n break\n default:\n recordingValues = ''\n break\n }\n\n if (listenInformations) {\n try {\n await toggleRecord(recordingValues, listenInformations)\n } catch (e) {\n console.error(e)\n return []\n }\n }\n }\n}\n\nexport async function startConference() {\n const {\n accepted,\n chSource,\n chDest,\n incoming,\n outgoing,\n incomingSocket,\n outgoingSocket,\n conversationId,\n }: any = store?.getState()?.currentCall\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n let addedUserExtension = ''\n if (accepted && (incoming || incomingSocket) && !isEmpty(chSource)) {\n addedUserExtension = chSource?.callerNum\n } else if (accepted && (outgoing || outgoingSocket) && !isEmpty(chDest)) {\n addedUserExtension = chDest?.callerNum\n }\n\n if (defaultDeviceId !== '' && conversationId !== '' && addedUserExtension !== '') {\n const startConferenceInformations = {\n convid: conversationId?.toString(),\n addEndpointId: addedUserExtension?.toString(),\n ownerEndpointId: defaultDeviceId?.toString(),\n }\n\n if (startConferenceInformations) {\n try {\n const result = await startConf(startConferenceInformations)\n if (result) {\n // Set conferencing and disable pause\n store.dispatch.currentCall.updateCurrentCall({\n conferencing: true,\n paused: false,\n })\n\n eventDispatch('phone-island-call-conferenced', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function joinConference() {\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n\n if (defaultDeviceId !== '') {\n const joinConferenceInformation = {\n endpointId: defaultDeviceId?.toString(),\n }\n\n if (joinConferenceInformation) {\n try {\n const result = await joinMyConf(joinConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-enter', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function endConference() {\n const { conferenceId } = store.getState().conference\n\n if (conferenceId !== '') {\n const endConferenceInformation = {\n confId: conferenceId?.toString(),\n }\n\n if (endConferenceInformation) {\n try {\n const result = await endConf(endConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-finished', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function muteUserConference(confId, userId, isAlreadyMuted) {\n if (confId === '' || userId === '') {\n return false\n }\n\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: userId?.toString(),\n }\n\n try {\n // Check if the user is already muted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n const result = await actionFunction(muteUnmuteUserInformation)\n return !!result\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function muteAllUsersConference(confId, isAlreadyMuted) {\n if (confId === '') {\n return false\n }\n\n // Get the conference users from the store\n const { usersList } = store.getState().conference\n\n if (!usersList || Object.keys(usersList).length === 0) {\n return false\n }\n\n try {\n // Iterate through all users (except the owner) and mute/unmute them\n const nonOwnerUsers = Object.values(usersList)\n\n // Determine which function to use based on isAlreadyMuted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n\n // For each user, call the appropriate function directly\n for (const user of nonOwnerUsers) {\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: user.id?.toString(),\n }\n\n const result = await actionFunction(muteUnmuteUserInformation)\n\n if (result) {\n store.dispatch.conference.toggleUserMuted({\n extenId: user.extenId,\n muted: !isAlreadyMuted,\n })\n }\n }\n\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function removeUserConference(conferenceId, extensionId) {\n if (conferenceId !== '' && extensionId !== '') {\n const removeUserInformation = {\n confId: conferenceId?.toString(),\n extenId: extensionId?.toString(),\n }\n\n if (removeUserInformation) {\n try {\n const result = await hangupUserConf(removeUserInformation)\n if (result) {\n // Check if this was the last participant (excluding owner)\n setTimeout(async () => {\n const { usersList } = store.getState().conference\n const remainingParticipants = Object.values(usersList || {}).filter(\n (user) => !user.owner && user.extenId !== extensionId,\n ).length\n\n // If no more participants left, end the conference\n if (remainingParticipants === 0) {\n await endConference()\n }\n }, 500)\n\n return true\n }\n\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport const clickTransferOrConference = async (number: string, dispatch: Dispatch) => {\n if (isInsideConferenceList()) {\n const { isActive } = store.getState().conference\n // Put current call user inside conference mode (only for first user to add not for the second one)\n if (!isActive) {\n const conferenceStarted = await startConference()\n if (conferenceStarted) {\n waitingConferenceView(number, dispatch)\n }\n } else {\n waitingConferenceView(number, dispatch)\n }\n } else {\n handleAttendedTransfer(number, dispatch)\n }\n}\n\nexport const isInsideConferenceList = () => {\n const { isConferenceList } = store.getState().island\n if (isConferenceList) {\n return true\n }\n return false\n}\n\nexport const waitingConferenceView = (numberToCall, dispatch: Dispatch) => {\n const { username }: any = store.getState().currentUser\n const { isActive, isOwnerInside } = store.getState().conference\n\n // show current waiting user in back view ( only on first)\n if (!isActive) {\n dispatch.conference.setConferenceActive(true)\n dispatch.conference.setConferenceStartedFrom(username)\n }\n // start new call with selected user from conference list\n if (isOwnerInside) {\n // if owner has already started the conference hangup before make a new call\n hangupCurrentCall()\n dispatch.conference.toggleIsOwnerInside(false)\n\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 800)\n })\n } else {\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 800)\n })\n }\n}\n\nexport async function handleAttendedTransfer(number: string, dispatch: Dispatch) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n\n // Use requestAnimationFrame to ensure state update is complete before audio operations\n requestAnimationFrame(() => {\n dispatch.player.playRemoteAudio()\n eventDispatch('phone-island-call-transfered', {})\n })\n }\n}\n"],"names":["hangupCurrentCall","_a","store","getState","currentCall","outgoing","accepted","streamingSourceNumber","isFromStreaming","island","isWebRTC","hangup","hangupPhysical","dispatch","player","stopAudioPlayer","reset","listen","sourceId_1","getStreamingSourceId","unsubscribe","id","then","console","debug","concat","catch","error","streaming","clearSourceImages","setIsFromStreaming","eventDispatch","attendedTransfer","number","conversationId","default_device","currentUser","default_device_details","exten","attendedTransferRequest","convid","to","endpointId","startConference","_b","chSource","chDest","incoming","incomingSocket","outgoingSocket","defaultDeviceId","addedUserExtension","isEmpty","callerNum","startConferenceInformations","toString","addEndpointId","ownerEndpointId","startConf","_c","sent","updateCurrentCall","conferencing","paused","e_2","endConference","conferenceId","conference","endConferenceInformation","confId","endConf","e_4","isInsideConferenceList","isConferenceList","waitingConferenceView","numberToCall","username","isActive","isOwnerInside","setConferenceActive","setConferenceStartedFrom","toggleIsOwnerInside","requestAnimationFrame","setTimeout","handleAttendedTransfer","transferring","playRemoteAudio","answerWebRTC","answerPhysical","endpointIdInConversation","blindTransferRequest","sipHost","sipURI","callSipURI","callPhysical","__awaiter","conversations","extension","Object","keys","forEach","forceHangup","endpointType","hangupConversation","hangupPhysicalRecordingCall","physicalRecorder","setRecording","setIslandView","joinConferenceInformation","joinMyConf","e_3","isAlreadyMuted","usersList","length","nonOwnerUsers","values","actionFunction","unmuteUserConf","muteUserConf","_i","nonOwnerUsers_1","user","muteUnmuteUserInformation","userId","toggleUserMuted","extenId","muted","e_6","muteWebRTC","mutePhysical","e_5","userConversationInformations","_d","parkingInformation","key","hasOwnProperty","conversation","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","pauseRemoteAudio","pausePhysical","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","recordingValues","toggleRecord","_e","e_1","extensionId","removeUserInformation","hangupUserConf","_this","remainingParticipants","filter","owner","e_7","unmuteWebRTC","unpauseWebRTC"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"call.js","sources":["../../../src/lib/phone/call.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport {\n callSipURI,\n hangup,\n answerWebRTC,\n muteWebRTC,\n unmuteWebRTC,\n pauseWebRTC,\n unpauseWebRTC,\n} from '../webrtc/messages'\nimport { Dispatch, store } from '../../store'\nimport { isWebRTC } from '../user/default_device'\nimport {\n blindTransfer as blindTransferRequest,\n attendedTransfer as attendedTransferRequest,\n hangupPhysical,\n answerPhysical,\n mutePhysical,\n pausePhysical,\n callPhysical,\n toggleRecord,\n hangupPhysicalRecordingCall,\n startConf,\n joinMyConf,\n endConf,\n muteUserConf,\n unmuteUserConf,\n hangupUserConf,\n forceHangup,\n} from '../../services/astproxy'\nimport dtmfAudios from '../../static/dtmf'\nimport { hangupConversation, parkConversation } from '../../services/astproxy'\nimport { eventDispatch } from '../../utils'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\nimport { getStreamingSourceId } from '../../utils/streaming/getStreamingSourceId'\nimport { unsubscribe } from '../../services/user'\n\n/**\n * Starts a call to a number\n * @param number The number string\n */\nexport function callNumber(number: string, sipHost: string) {\n const sipURI = `sip:${number}@${sipHost}`\n if (isWebRTC()) {\n callSipURI(sipURI)\n } else {\n callPhysical(number)\n }\n\n eventDispatch('phone-island-call-started', {})\n}\n\n/**\n * Answer incoming call\n */\nexport function answerIncomingCall() {\n if (isWebRTC()) {\n answerWebRTC()\n } else {\n answerPhysical()\n }\n}\n\n/**\n * Hangup all the conversations of all the extensions of the current user\n */\nexport function hangupAllExtensions() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n hangupConversation({\n convid: id,\n endpointId: extension,\n })\n })\n }\n}\n\nexport function forceHangupConversation() {\n // Get current user endpoints\n const { conversations } = store.getState().currentUser\n // Hangup all the conversations of all extensions of the current user\n for (const extension in conversations) {\n const conversationsIds = Object.keys(conversations[extension])\n conversationsIds.forEach((id) => {\n forceHangup({\n convid: id,\n endpointId: extension,\n endpointType: 'extension',\n })\n })\n }\n}\n\n/**\n * Hangup current call\n */\nexport function hangupCurrentCall() {\n const { outgoing, accepted, streamingSourceNumber } = store.getState().currentCall\n const { isFromStreaming } = store.getState().island\n \n if (outgoing || accepted) {\n if (isWebRTC()) {\n hangup()\n } else {\n hangupPhysical()\n }\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n store.dispatch.listen.reset()\n \n // If call was from a streaming source, unsubscribe and clear images\n if (isFromStreaming && streamingSourceNumber) {\n const sourceId = getStreamingSourceId(streamingSourceNumber)\n if (sourceId) {\n // Unsubscribe from streaming updates\n unsubscribe({ id: sourceId })\n .then(() => console.debug(`Unsubscribed from streaming source: ${sourceId}`))\n .catch(error => console.error('Error unsubscribing from streaming source:', error))\n \n // Clear source images to free up memory\n store.dispatch.streaming.clearSourceImages()\n }\n }\n \n // Reset isFromStreaming flag\n store.dispatch.island.setIsFromStreaming(false)\n }\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Hangup current physical recording\n */\nexport function hangupCurrentPhysicalRecording() {\n hangupPhysicalRecordingCall()\n store.dispatch.player.stopAudioPlayer()\n store.dispatch.physicalRecorder.reset()\n store.dispatch.physicalRecorder.setRecording(false)\n store.dispatch.island.setIslandView(null)\n store.dispatch.listen.reset()\n // Caller close the call before the call is accepted\n eventDispatch('phone-island-call-ended', {})\n}\n\n/**\n * Mute the current call\n */\nexport function muteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const muted = muteWebRTC()\n if (muted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: true,\n })\n }\n } else {\n mutePhysical(true)\n }\n eventDispatch('phone-island-call-muted', {})\n}\n\n/**\n * Unmute the current call\n */\nexport function unmuteCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unmuted = unmuteWebRTC()\n if (unmuted) {\n store.dispatch.currentCall.updateCurrentCall({\n muted: false,\n })\n }\n } else {\n mutePhysical(false)\n }\n eventDispatch('phone-island-call-unmuted', {})\n}\n\n/**\n * Pause the current call\n */\nexport function pauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const paused = pauseWebRTC()\n if (paused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: true,\n })\n // Pause remote audio\n store.dispatch.player.pauseRemoteAudio()\n }\n } else {\n pausePhysical(true)\n }\n eventDispatch('phone-island-call-held', {})\n}\n\n/**\n * Unpause the current call\n */\nexport function unpauseCurrentCall() {\n // Check the current user default device\n if (isWebRTC()) {\n const unpaused = unpauseWebRTC()\n if (unpaused) {\n store.dispatch.currentCall.updateCurrentCall({\n paused: false,\n })\n // Play remote audio\n store.dispatch.player.playRemoteAudio()\n }\n } else {\n pausePhysical(false)\n }\n eventDispatch('phone-island-call-unheld', {})\n}\n\n/**\n * Transfer the current call through a blind transfer (not in use)\n */\nexport async function blindTransferFunction(number: string, endpointIdInConversation: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n // Transfer the call through blind transfer\n if (conversationId && endpointIdInConversation && number) {\n return await blindTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: endpointIdInConversation,\n })\n }\n}\n\n/**\n * Transfer the current call through a attended transfer\n */\nexport async function attendedTransfer(number: string) {\n // Retrieve current conversation info\n const { conversationId } = store.getState().currentCall\n const { default_device } = store.getState().currentUser\n let default_device_details = default_device?.id || default_device?.exten\n // Transfer the call through attended transfer\n if (conversationId && default_device_details && number) {\n return await attendedTransferRequest({\n convid: conversationId,\n to: number,\n endpointId: default_device_details,\n })\n }\n}\n\n/**\n * Play the dtmf audio files\n */\nexport function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n store.dispatch.player.updateStartAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n}\n\n/**\n * Park the current call\n */\nexport function parkCurrentCall() {\n const conversationId = store?.getState()?.currentCall?.conversationId\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n let parkingInformation: any = {}\n\n if (conversationId) {\n if (userConversationInformations) {\n for (const key in userConversationInformations) {\n if (userConversationInformations.hasOwnProperty(key)) {\n const conversation = userConversationInformations[key]\n if (Object.keys(conversation).length > 0) {\n parkingInformation = {\n numberParkId: key,\n idConversation: conversationId,\n }\n }\n }\n }\n }\n\n if (Object.keys(parkingInformation).length > 0) {\n if (parkingInformation?.numberParkId) {\n // If park information are not empty park call\n parkConversation({\n applicantId: parkingInformation?.numberParkId,\n convid: conversationId,\n endpointId: parkingInformation?.numberParkId,\n })\n\n store.dispatch.currentCall.setParked(true)\n\n eventDispatch('phone-island-call-parked', {})\n }\n }\n }\n}\n\nconst findFirstExtesnionNotEmpty = (data) => {\n for (const key in data) {\n if (Object.keys(data[key]).length !== 0) {\n const firstEntry: any = Object.values(data[key])[0]\n return {\n id: firstEntry.id,\n recording: firstEntry.recording,\n }\n }\n }\n return null\n}\n\nexport async function recordCurrentCall(recordingValue: boolean) {\n store.dispatch.currentCall.updateRecordingStatus(!recordingValue)\n const userConversationInformations = store?.getState()?.currentUser?.conversations\n\n const firstExtensionNotEmpty = findFirstExtesnionNotEmpty(userConversationInformations)\n\n if (!firstExtensionNotEmpty) {\n return\n } else {\n const numberToSendCall = firstExtensionNotEmpty?.id?.match(/\\/(\\d+)-/)\n const endpointId = numberToSendCall[1]\n\n const listenInformations = {\n convid: firstExtensionNotEmpty?.id?.toString(),\n endpointId: endpointId?.toString(),\n }\n\n let recordingValues = ''\n switch (firstExtensionNotEmpty?.recording) {\n case 'false':\n recordingValues = 'start_record'\n break\n case 'true':\n recordingValues = 'mute_record'\n break\n case 'mute':\n recordingValues = 'unmute_record'\n break\n default:\n recordingValues = ''\n break\n }\n\n if (listenInformations) {\n try {\n await toggleRecord(recordingValues, listenInformations)\n } catch (e) {\n console.error(e)\n return []\n }\n }\n }\n}\n\nexport async function startConference() {\n const {\n accepted,\n chSource,\n chDest,\n incoming,\n outgoing,\n incomingSocket,\n outgoingSocket,\n conversationId,\n }: any = store?.getState()?.currentCall\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n let addedUserExtension = ''\n if (accepted && (incoming || incomingSocket) && !isEmpty(chSource)) {\n addedUserExtension = chSource?.callerNum\n } else if (accepted && (outgoing || outgoingSocket) && !isEmpty(chDest)) {\n addedUserExtension = chDest?.callerNum\n }\n\n if (defaultDeviceId !== '' && conversationId !== '' && addedUserExtension !== '') {\n const startConferenceInformations = {\n convid: conversationId?.toString(),\n addEndpointId: addedUserExtension?.toString(),\n ownerEndpointId: defaultDeviceId?.toString(),\n }\n\n if (startConferenceInformations) {\n try {\n const result = await startConf(startConferenceInformations)\n if (result) {\n // Set conferencing and disable pause\n store.dispatch.currentCall.updateCurrentCall({\n conferencing: true,\n paused: false,\n })\n\n eventDispatch('phone-island-call-conferenced', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function joinConference() {\n const { default_device } = store.getState().currentUser\n const defaultDeviceId = default_device?.id || default_device?.exten\n\n if (defaultDeviceId !== '') {\n const joinConferenceInformation = {\n endpointId: defaultDeviceId?.toString(),\n }\n\n if (joinConferenceInformation) {\n try {\n const result = await joinMyConf(joinConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-enter', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function endConference() {\n const { conferenceId } = store.getState().conference\n\n if (conferenceId !== '') {\n const endConferenceInformation = {\n confId: conferenceId?.toString(),\n }\n\n if (endConferenceInformation) {\n try {\n const result = await endConf(endConferenceInformation)\n if (result) {\n eventDispatch('phone-island-owner-conference-finished', {})\n return true\n }\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport async function muteUserConference(confId, userId, isAlreadyMuted) {\n if (confId === '' || userId === '') {\n return false\n }\n\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: userId?.toString(),\n }\n\n try {\n // Check if the user is already muted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n const result = await actionFunction(muteUnmuteUserInformation)\n return !!result\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function muteAllUsersConference(confId, isAlreadyMuted) {\n if (confId === '') {\n return false\n }\n\n // Get the conference users from the store\n const { usersList } = store.getState().conference\n\n if (!usersList || Object.keys(usersList).length === 0) {\n return false\n }\n\n try {\n // Iterate through all users (except the owner) and mute/unmute them\n const nonOwnerUsers = Object.values(usersList)\n\n // Determine which function to use based on isAlreadyMuted\n const actionFunction = isAlreadyMuted ? unmuteUserConf : muteUserConf\n\n // For each user, call the appropriate function directly\n for (const user of nonOwnerUsers) {\n const muteUnmuteUserInformation = {\n confId: confId?.toString(),\n userId: user.id?.toString(),\n }\n\n const result = await actionFunction(muteUnmuteUserInformation)\n\n if (result) {\n store.dispatch.conference.toggleUserMuted({\n extenId: user.extenId,\n muted: !isAlreadyMuted,\n })\n }\n }\n\n return true\n } catch (e) {\n console.error(e)\n return false\n }\n}\n\nexport async function removeUserConference(conferenceId, extensionId) {\n if (conferenceId !== '' && extensionId !== '') {\n const removeUserInformation = {\n confId: conferenceId?.toString(),\n extenId: extensionId?.toString(),\n }\n\n if (removeUserInformation) {\n try {\n const result = await hangupUserConf(removeUserInformation)\n if (result) {\n // Check if this was the last participant (excluding owner)\n setTimeout(async () => {\n const { usersList } = store.getState().conference\n const remainingParticipants = Object.values(usersList || {}).filter(\n (user) => !user.owner && user.extenId !== extensionId,\n ).length\n\n // If no more participants left, end the conference\n if (remainingParticipants === 0) {\n await endConference()\n }\n }, 500)\n\n return true\n }\n\n return false\n } catch (e) {\n console.error(e)\n return false\n }\n }\n }\n return false\n}\n\nexport const clickTransferOrConference = async (number: string, dispatch: Dispatch) => {\n if (isInsideConferenceList()) {\n const { isActive } = store.getState().conference\n // Put current call user inside conference mode (only for first user to add not for the second one)\n if (!isActive) {\n const conferenceStarted = await startConference()\n if (conferenceStarted) {\n waitingConferenceView(number, dispatch)\n }\n } else {\n waitingConferenceView(number, dispatch)\n }\n } else {\n handleAttendedTransfer(number, dispatch)\n }\n}\n\nexport const isInsideConferenceList = () => {\n const { isConferenceList } = store.getState().island\n if (isConferenceList) {\n return true\n }\n return false\n}\n\nexport const waitingConferenceView = (numberToCall, dispatch: Dispatch) => {\n const { username }: any = store.getState().currentUser\n const { isActive, isOwnerInside } = store.getState().conference\n\n // show current waiting user in back view ( only on first)\n if (!isActive) {\n dispatch.conference.setConferenceActive(true)\n dispatch.conference.setConferenceStartedFrom(username)\n }\n // start new call with selected user from conference list\n if (isOwnerInside) {\n // if owner has already started the conference hangup before make a new call\n hangupCurrentCall()\n dispatch.conference.toggleIsOwnerInside(false)\n\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 800)\n })\n } else {\n // Use requestAnimationFrame to ensure state updates are complete before dispatching event\n requestAnimationFrame(() => {\n setTimeout(() => {\n eventDispatch('phone-island-call-start', { number: numberToCall })\n }, 800)\n })\n }\n}\n\nexport async function handleAttendedTransfer(number: string, dispatch: Dispatch) {\n // Send attended transfer message\n unpauseCurrentCall()\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n\n // Use requestAnimationFrame to ensure state update is complete before audio operations\n requestAnimationFrame(() => {\n dispatch.player.playRemoteAudio()\n eventDispatch('phone-island-call-transfered', {})\n })\n }\n}\n"],"names":["hangupCurrentCall","_a","store","getState","currentCall","outgoing","accepted","streamingSourceNumber","isFromStreaming","island","isWebRTC","hangup","hangupPhysical","dispatch","player","stopAudioPlayer","reset","listen","sourceId_1","getStreamingSourceId","unsubscribe","id","then","console","debug","concat","catch","error","streaming","clearSourceImages","setIsFromStreaming","eventDispatch","unpauseCurrentCall","unpauseWebRTC","updateCurrentCall","paused","playRemoteAudio","pausePhysical","attendedTransfer","number","conversationId","default_device","currentUser","default_device_details","exten","attendedTransferRequest","convid","to","endpointId","startConference","_b","chSource","chDest","incoming","incomingSocket","outgoingSocket","defaultDeviceId","addedUserExtension","isEmpty","callerNum","startConferenceInformations","toString","addEndpointId","ownerEndpointId","startConf","_c","sent","conferencing","e_2","endConference","conferenceId","conference","endConferenceInformation","confId","endConf","e_4","isInsideConferenceList","isConferenceList","waitingConferenceView","numberToCall","username","isActive","isOwnerInside","setConferenceActive","setConferenceStartedFrom","toggleIsOwnerInside","requestAnimationFrame","setTimeout","handleAttendedTransfer","transferring","answerWebRTC","answerPhysical","endpointIdInConversation","blindTransferRequest","sipHost","sipURI","callSipURI","callPhysical","__awaiter","conversations","extension","Object","keys","forEach","forceHangup","endpointType","hangupConversation","hangupPhysicalRecordingCall","physicalRecorder","setRecording","setIslandView","joinConferenceInformation","joinMyConf","e_3","isAlreadyMuted","usersList","length","nonOwnerUsers","values","actionFunction","unmuteUserConf","muteUserConf","_i","nonOwnerUsers_1","user","muteUnmuteUserInformation","userId","toggleUserMuted","extenId","muted","e_6","muteWebRTC","mutePhysical","e_5","userConversationInformations","_d","parkingInformation","key","hasOwnProperty","conversation","numberParkId","idConversation","parkConversation","applicantId","setParked","pauseWebRTC","pauseRemoteAudio","updateStartAudioPlayer","src","dtmfAudios","recordingValue","updateRecordingStatus","firstExtensionNotEmpty","data","firstEntry","recording","findFirstExtesnionNotEmpty","numberToSendCall","match","listenInformations","recordingValues","toggleRecord","_e","e_1","extensionId","removeUserInformation","hangupUserConf","_this","remainingParticipants","filter","owner","e_7","unmuteWebRTC"],"mappings":"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"}
|