@nethesis/phone-island 1.0.0-dev.11 → 1.0.0-dev.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useLayoutEffect, useMemo, memo } from 'react'\nimport { StyledName } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport {\n getDisplayText,\n getTextClassName,\n MemoizedTextScroll,\n} from './DisplayNameUtils'\n\nconst selectDisplayNameAndIncoming = (state: RootState) => ({\n displayName: state?.currentCall?.displayName,\n incoming: state?.currentCall?.incoming,\n})\n\nconst selectIntrudeListenStatus = (state: RootState) => state.listen\n\nconst DisplayName: React.FC<DisplayNameProps> = () => {\n const [animateText, setAnimateText] = useState<boolean>(false)\n const nameContainer = useRef<null | HTMLDivElement>(null)\n const nameText = useRef<null | HTMLDivElement>(null)\n const NameMotion = motion(StyledName)\n\n const { displayName, incoming } = useSelector(selectDisplayNameAndIncoming)\n const intrudeListenStatus = useSelector(selectIntrudeListenStatus)\n\n const { t } = useTranslation()\n\n useLayoutEffect(() => {\n if (\n nameContainer?.current &&\n nameText?.current &&\n nameText?.current?.clientWidth - nameContainer?.current?.clientWidth > 5\n ) {\n setAnimateText(true)\n }\n }, [nameContainer, nameText])\n\n const textClassName = useMemo(\n () => getTextClassName({ intrudeListenStatus, animateText }),\n [intrudeListenStatus, animateText],\n )\n\n const displayTextResult = useMemo(\n () => getDisplayText({ intrudeListenStatus, displayName, incoming, t }),\n [intrudeListenStatus, displayName, incoming, t],\n )\n\n const renderDisplayContent = () => {\n if (displayTextResult.type === 'scroll') {\n return <MemoizedTextScroll text={displayTextResult.content} />\n }\n return displayTextResult.content\n }\n\n return (\n <div ref={nameContainer} className='pi-whitespace-nowrap pi-relative pi-overflow-hidden'>\n <NameMotion>\n <div className={textClassName} ref={nameText}>\n {renderDisplayContent()}\n </div>\n <div className='pi-w-6 pi-absolute pi-right-0 pi-top-0 pi-h-full pi-bg-gradient-to-r pi-from-transparent dark:pi-to-gray-950 pi-to-gray-50' />\n </NameMotion>\n </div>\n )\n}\n\nexport default memo(DisplayName)\n\nexport interface DisplayNameProps {}\n"],"names":["selectDisplayNameAndIncoming","state","displayName","_a","currentCall","incoming","_b","selectIntrudeListenStatus","listen","memo","useState","animateText","setAnimateText","nameContainer","useRef","nameText","NameMotion","motion","StyledName","useSelector","intrudeListenStatus","t","useTranslation","useLayoutEffect","current","clientWidth","textClassName","useMemo","getTextClassName","displayTextResult","getDisplayText","React","ref","className","createElement","type","MemoizedTextScroll","text","content"],"mappings":"68BAeMA,EAA+B,SAACC,WAAqB,MAAC,CAC1DC,YAA+B,QAAlBC,EAAAF,eAAAA,EAAOG,mBAAW,IAAAD,OAAA,EAAAA,EAAED,YACjCG,SAA4B,QAAlBC,EAAAL,eAAAA,EAAOG,mBAAW,IAAAE,OAAA,EAAAA,EAAED,WAG1BE,EAA4B,SAACN,GAAqB,OAAAA,EAAMO,MAAN,EAoDzCC,EAAAA,EAAAA,MAlDiC,WACxC,IAAAN,EAAgCO,EAAAA,UAAkB,GAAjDC,EAAWR,EAAA,GAAES,EAAcT,EAAA,GAC5BU,EAAgBC,SAA8B,MAC9CC,EAAWD,SAA8B,MACzCE,EAAaC,SAAOC,EAAAA,YAEpBZ,EAA4Ba,cAAYnB,GAAtCE,EAAWI,EAAAJ,YAAEG,EAAQC,EAAAD,SACvBe,EAAsBD,cAAYZ,GAEhCc,EAAMC,qBAEdC,EAAAA,iBAAgB,oBAEZV,aAAA,EAAAA,EAAeW,WACfT,aAAQ,EAARA,EAAUS,WACS,QAAnBrB,EAAAY,aAAQ,EAARA,EAAUS,eAAS,IAAArB,OAAA,EAAAA,EAAAsB,sBAAcnB,EAAAO,aAAA,EAAAA,EAAeW,8BAASC,aAAc,GAEvEb,GAAe,EAEnB,GAAG,CAACC,EAAeE,IAEnB,IAAMW,EAAgBC,EAAAA,SACpB,WAAM,OAAAC,EAAgBA,iBAAC,CAAER,oBAAmBA,EAAET,YAAWA,GAAG,GAC5D,CAACS,EAAqBT,IAGlBkB,EAAoBF,WACxB,WAAM,OAAAG,EAAAA,eAAe,CAAEV,oBAAmBA,EAAElB,YAAWA,EAAEG,SAAQA,EAAEgB,KAAI,GACvE,CAACD,EAAqBlB,EAAaG,EAAUgB,IAU/C,OACEU,EAAAA,6BAAKC,IAAKnB,EAAeoB,UAAU,uDACjCF,UAAAG,cAAClB,EAAU,KACTe,UAAKG,cAAA,MAAA,CAAAD,UAAWP,EAAeM,IAAKjB,GATT,WAA3Bc,EAAkBM,KACbJ,EAAAA,QAAAG,cAACE,EAAkBA,mBAAC,CAAAC,KAAMR,EAAkBS,UAE9CT,EAAkBS,SASrBP,EAAA,QAAAG,cAAA,MAAA,CAAKD,UAAU,gIAIvB"}
1
+ {"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useLayoutEffect, useMemo, memo } from 'react'\nimport { StyledName } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport {\n getDisplayText,\n getTextClassName,\n MemoizedTextScroll,\n DisplayTextResult,\n} from './DisplayNameUtils'\n\nconst selectDisplayNameAndIncoming = (state: RootState) => ({\n displayName: state?.currentCall?.displayName,\n incoming: state?.currentCall?.incoming,\n})\n\nconst selectIntrudeListenStatus = (state: RootState) => state.listen\n\nconst DisplayName: React.FC<DisplayNameProps> = () => {\n const [animateText, setAnimateText] = useState<boolean>(false)\n const nameContainer = useRef<null | HTMLDivElement>(null)\n const nameText = useRef<null | HTMLDivElement>(null)\n const NameMotion = motion(StyledName)\n\n const { displayName, incoming } = useSelector(selectDisplayNameAndIncoming)\n const intrudeListenStatus = useSelector(selectIntrudeListenStatus)\n\n const { t } = useTranslation()\n\n useLayoutEffect(() => {\n if (\n nameContainer?.current &&\n nameText?.current &&\n nameText?.current?.clientWidth - nameContainer?.current?.clientWidth > 5\n ) {\n setAnimateText(true)\n }\n }, [nameContainer, nameText])\n\n const textClassName = useMemo(\n () => getTextClassName({ intrudeListenStatus, animateText }),\n [intrudeListenStatus, animateText],\n )\n\n const displayTextResult = useMemo(\n () => getDisplayText({ intrudeListenStatus, displayName, incoming, t }),\n [intrudeListenStatus, displayName, incoming, t],\n )\n\n const renderDisplayContent = () => {\n if (displayTextResult.type === 'scroll') {\n return <MemoizedTextScroll text={displayTextResult.content} />\n }\n return displayTextResult.content\n }\n\n return (\n <NameMotion ref={nameContainer} className='pi-whitespace-nowrap pi-relative pi-overflow-hidden'>\n <div className={textClassName} ref={nameText}>\n {renderDisplayContent()}\n </div>\n <div className='pi-w-6 pi-absolute pi-right-0 pi-top-0 pi-h-full pi-bg-gradient-to-r pi-from-transparent dark:pi-to-gray-950 pi-to-gray-50' />\n </NameMotion>\n )\n}\n\nexport default memo(DisplayName)\n\nexport interface DisplayNameProps {}\n"],"names":["selectDisplayNameAndIncoming","state","displayName","_a","currentCall","incoming","_b","selectIntrudeListenStatus","listen","memo","useState","animateText","setAnimateText","nameContainer","useRef","nameText","NameMotion","motion","StyledName","useSelector","intrudeListenStatus","t","useTranslation","useLayoutEffect","current","clientWidth","textClassName","useMemo","getTextClassName","displayTextResult","getDisplayText","React","createElement","ref","className","type","MemoizedTextScroll","text","content"],"mappings":"68BAgBMA,EAA+B,SAACC,WAAqB,MAAC,CAC1DC,YAA+B,QAAlBC,EAAAF,eAAAA,EAAOG,mBAAW,IAAAD,OAAA,EAAAA,EAAED,YACjCG,SAA4B,QAAlBC,EAAAL,eAAAA,EAAOG,mBAAW,IAAAE,OAAA,EAAAA,EAAED,WAG1BE,EAA4B,SAACN,GAAqB,OAAAA,EAAMO,MAAN,EAkDzCC,EAAAA,EAAAA,MAhDiC,WACxC,IAAAN,EAAgCO,EAAAA,UAAkB,GAAjDC,EAAWR,EAAA,GAAES,EAAcT,EAAA,GAC5BU,EAAgBC,SAA8B,MAC9CC,EAAWD,SAA8B,MACzCE,EAAaC,SAAOC,EAAAA,YAEpBZ,EAA4Ba,cAAYnB,GAAtCE,EAAWI,EAAAJ,YAAEG,EAAQC,EAAAD,SACvBe,EAAsBD,cAAYZ,GAEhCc,EAAMC,qBAEdC,EAAAA,iBAAgB,oBAEZV,aAAA,EAAAA,EAAeW,WACfT,aAAQ,EAARA,EAAUS,WACS,QAAnBrB,EAAAY,aAAQ,EAARA,EAAUS,eAAS,IAAArB,OAAA,EAAAA,EAAAsB,sBAAcnB,EAAAO,aAAA,EAAAA,EAAeW,8BAASC,aAAc,GAEvEb,GAAe,EAEnB,GAAG,CAACC,EAAeE,IAEnB,IAAMW,EAAgBC,EAAAA,SACpB,WAAM,OAAAC,EAAgBA,iBAAC,CAAER,oBAAmBA,EAAET,YAAWA,GAAG,GAC5D,CAACS,EAAqBT,IAGlBkB,EAAoBF,WACxB,WAAM,OAAAG,EAAAA,eAAe,CAAEV,oBAAmBA,EAAElB,YAAWA,EAAEG,SAAQA,EAAEgB,KAAI,GACvE,CAACD,EAAqBlB,EAAaG,EAAUgB,IAU/C,OACEU,EAAAA,QAACC,cAAAhB,EAAW,CAAAiB,IAAKpB,EAAeqB,UAAU,uDACxCH,UAAKC,cAAA,MAAA,CAAAE,UAAWR,EAAeO,IAAKlB,GARP,WAA3Bc,EAAkBM,KACbJ,EAAAA,QAAAC,cAACI,EAAkBA,mBAAC,CAAAC,KAAMR,EAAkBS,UAE9CT,EAAkBS,SAQvBP,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,+HAGrB"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../../utils/streaming/streamingUtils.js"),r=require("../../lib/phone/call.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var a=require("../../lib/phone/conversation.js"),l=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../Island.js");var s=require("../Button.js"),o=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var u=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var c=require("./Timer.js"),d=require("./Number.js"),p=require("./DisplayName.js"),m=require("./Avatar.js"),f=require("./Actions.js"),g=require("../Hangup.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 v=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var x=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),E=require("../StreamingImage/index.js"),j=require("../VideoStreamingSkeleton/index.js"),w=require("../VideoStreamingEmptyState/index.js"),h=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),b=require("../../node_modules/react-redux/es/hooks/useSelector.js");function q(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var N=q(e);function y(e,t){return!e&&!t}var _=e.memo((function(e){var t=e.children;return N.default.createElement("div",{className:"pi-grid pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2"},t)}));_.displayName="Details";var T=e.memo((function(){var q,T=v.useTranslation().t,A=h.useDispatch(),k=b.useSelector((function(e){return e.currentCall})),S=k.incoming,C=k.accepted,I=k.outgoing,F=k.startTime,P=k.paused,M=k.number,O=k.isRecording,U=k.username,B=k.streamingSourceNumber,L=b.useSelector((function(e){return e.island})),V=L.isOpen,W=L.isFromStreaming,z=b.useSelector((function(e){return e.webrtc})).remoteAudioStream,D=b.useSelector((function(e){return e.listen})),H=D.isListen,R=D.isIntrude,G=D.isListenExtension,J=D.isIntrudeExtension,K=b.useSelector((function(e){return e.alerts})).data,Q=b.useSelector((function(e){return e.currentUser})),X=b.useSelector((function(e){return e.users})).extensions,Y=b.useSelector((function(e){return e.streaming})),Z=Y.videoSources,$=Y.sourceImages,ee=e.useMemo((function(){return Object.values(K).filter((function(e){return e.active}))}),[K]),te=e.useMemo((function(){return ee.length>0?ee[ee.length-1]:null}),[ee]),ie=e.useMemo((function(){return W&&B&&!C}),[W,B,C]),ne=e.useMemo((function(){if(!B||!Z)return{canUnlock:!1,tooltipText:""};var e=Object.values(Z).find((function(e){return(null==e?void 0:e.extension)===B})),t=Boolean((null==e?void 0:e.cmdOpen)&&""!==(null==e?void 0:e.cmdOpen.trim()));return{canUnlock:t,tooltipText:t&&e?"".concat(T("VideoStreaming.Open"),": ").concat(null==e?void 0:e.description):""}}),[B,Z,T]),re=e.useMemo((function(){return U&&"undefined"!==U?U:a.resolveUsernameByNumber(M,X)}),[U,M,X]),ae=e.useMemo((function(){return""!==re}),[re]),le=e.useCallback((function(){var e;return N.default.createElement("div",{className:"pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate"},N.default.createElement(t.FontAwesomeIcon,{size:"sm",icon:x.faOfficePhone,className:"pi-mr-1"}),N.default.createElement("span",{className:"pi-max-w-16 pi-truncate"},(null===(e=null==Q?void 0:Q.default_device)||void 0===e?void 0:e.description)||T("Common.Physical phone")))}),[null===(q=null==Q?void 0:Q.default_device)||void 0===q?void 0:q.description,T]),se=e.useCallback((function(e){var n=V?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",r=V?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",a=V?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",l="red"===e?"pi-bg-red-400":"pi-bg-green-400",s="red"===e?"pi-text-red-500":"pi-text-green-500";return N.default.createElement("div",{className:"".concat(n," pi-flex pi-justify-center pi-items-center")},N.default.createElement("div",{className:"".concat(r," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},N.default.createElement("span",{className:"".concat(a," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(l," pi-opacity-75")}),N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(s),icon:i.faCircle})))}),[V]),oe=e.useMemo((function(){var e="pi-grid pi-items-center";return V&&(e="pi-grid pi-items-start",C?e+=" pi-grid-rows-[72px_1fr]":S?e+=" pi-grid-cols-[256px_114px]":I&&(e+=" pi-grid-cols-[1fr_84px]")),ie?"pi-flex pi-flex-col":e}),[V,C,S,I,ie]),ue=e.useMemo((function(){return"pi-grid ".concat(V&&!C&&I?"pi-grid-cols-[48px_1fr]":V&&!C&&S?"pi-grid-cols-[48px_1fr_1px]":V&&C?"pi-grid-cols-[48px_164px_48px]":V||C?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(V?"5":"3"," pi-items-").concat(V?"start":"center"," pi-justify-center pi-w-full")}),[V,C,S,I]),ce=e.useMemo((function(){return ie?"pi-grid-cols-3":y(I,C)?"pi-grid-cols-2":C?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"}),[ie,I,C]),de=e.useCallback((function(){var e=V?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover";return H?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):R?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):""!==M&&ae?N.default.createElement(m.default,null):S&&!ae?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft}):!C||I||ae?I&&!ae?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi-rotate-[135deg]"),icon:i.faArrowLeft}):null:N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft})}),[V,H,R,M,ae,S,I,C]),pe=e.useCallback((function(){return V?R?N.default.createElement(_,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},T("Common.Intrude"),J?" - ".concat(J):""),C?l.isPhysical()?le():N.default.createElement(c.default,{startTime:F,isNotAlwaysWhite:!0}):J?"".concat(J):""):H?N.default.createElement(_,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},T("Common.Listen"),G?" - ".concat(G):""),C?l.isPhysical()?le():N.default.createElement(c.default,{startTime:F,isNotAlwaysWhite:!0}):G?"".concat(G):""):N.default.createElement(_,null,N.default.createElement(p.default,null),C?l.isPhysical()?le():N.default.createElement(c.default,{startTime:F,isNotAlwaysWhite:!0}):N.default.createElement(d.default,null)):null}),[V,R,H,C,F,J,G,T,le]),me=e.useCallback((function(){return C&&O?se("red"):C&&z&&!l.isPhysical()?N.default.createElement(o.AudioBars,{audioStream:z,paused:P,size:V?"large":"small"}):C&&l.isPhysical()?se("green"):null}),[C,O,z,V,P,se]),fe=e.useCallback((function(){if(!Z||0===Object.keys(Z).length||!B)return N.default.createElement(j.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(Z).find((function(e){return e.extension===B}));return e&&($[e.id]||e.image)?N.default.createElement(E.default,null):N.default.createElement(w.default,{className:"pi-w-full pi-h-40 pi-mt-4"})}),[B,Z,$]);if(null!==te)return null;return N.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},N.default.createElement("div",{className:oe},ie?N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between"},N.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},de(),N.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2"},N.default.createElement(p.default,null),N.default.createElement(d.default,null))),N.default.createElement("div",{className:"pi-flex pi-gap-2"},N.default.createElement(g.default,{description:T("Tooltip.Hangup")}),!I&&N.default.createElement(s.Button,{onClick:function(){return r.answerIncomingCall(),void setTimeout((function(){A.island.setIslandView("streamingAnswer")}),200)},variant:"green","data-tooltip-id":"tooltip-answer","data-tooltip-content":T("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faPhone})),(null==ne?void 0:ne.canUnlock)&&N.default.createElement(s.Button,{variant:"default",onClick:n.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==ne?void 0:ne.tooltipText},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),fe()):N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:ue},de(),pe(),!V&&!C&&N.default.createElement(p.default,null),!V&&C&&N.default.createElement(c.default,{startTime:F,isNotAlwaysWhite:!0}),me()),V&&N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"".concat(H||R?"":"pi-grid pi-gap-y-5")},C&&N.default.createElement(f.default,null),N.default.createElement("div",{className:"pi-grid ".concat(ce," pi-gap-3.5")},N.default.createElement(g.default,{description:T("Tooltip.Hangup and transfer")}),y(I,C)&&N.default.createElement(s.Button,{onClick:r.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":T("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:i.faPhone}))))))),N.default.createElement(u.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),N.default.createElement(u.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),N.default.createElement(u.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}))}));exports.default=T;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../../utils/streaming/streamingUtils.js"),a=require("../../lib/phone/call.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var r=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../Island.js");var l=require("../Button.js"),s=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var o=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var u=require("./Timer.js"),c=require("./Number.js"),d=require("./DisplayName.js"),p=require("./Avatar.js"),m=require("./Actions.js"),f=require("../Hangup.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 g=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var v=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),x=require("../StreamingImage/index.js"),E=require("../VideoStreamingSkeleton/index.js"),j=require("../VideoStreamingEmptyState/index.js"),w=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),h=require("../../node_modules/react-redux/es/hooks/useSelector.js");function b(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var q=b(e);function N(e,t){return!e&&!t}var y=e.memo((function(e){var t=e.children;return q.default.createElement("div",{className:"pi-grid pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2"},t)}));y.displayName="Details";var _=e.memo((function(){var b,_=g.useTranslation().t,T=w.useDispatch(),A=h.useSelector((function(e){return e.currentCall})),k=A.incoming,C=A.accepted,S=A.outgoing,I=A.startTime,F=A.paused,P=A.number,O=A.isRecording,M=A.username,U=A.streamingSourceNumber,B=h.useSelector((function(e){return e.island})),L=B.isOpen,V=B.isFromStreaming,W=h.useSelector((function(e){return e.webrtc})).remoteAudioStream,z=h.useSelector((function(e){return e.listen})),D=z.isListen,H=z.isIntrude,R=z.isListenExtension,G=z.isIntrudeExtension,J=h.useSelector((function(e){return e.alerts})).data,K=h.useSelector((function(e){return e.currentUser})),Q=h.useSelector((function(e){return e.streaming})),X=Q.videoSources,Y=Q.sourceImages,Z=e.useMemo((function(){return Object.values(J).filter((function(e){return e.active}))}),[J]),$=e.useMemo((function(){return Z.length>0?Z[Z.length-1]:null}),[Z]),ee=e.useMemo((function(){return V&&U&&!C}),[V,U,C]),te=e.useMemo((function(){if(!U||!X)return{canUnlock:!1,tooltipText:""};var e=Object.values(X).find((function(e){return(null==e?void 0:e.extension)===U})),t=Boolean((null==e?void 0:e.cmdOpen)&&""!==(null==e?void 0:e.cmdOpen.trim()));return{canUnlock:t,tooltipText:t&&e?"".concat(_("VideoStreaming.Open"),": ").concat(null==e?void 0:e.description):""}}),[U,X,_]),ie=e.useMemo((function(){return""!==M&&"undefined"!==M}),[M]),ne=e.useCallback((function(){var e;return q.default.createElement("div",{className:"pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate"},q.default.createElement(t.FontAwesomeIcon,{size:"sm",icon:v.faOfficePhone,className:"pi-mr-1"}),q.default.createElement("span",{className:"pi-max-w-16 pi-truncate"},(null===(e=null==K?void 0:K.default_device)||void 0===e?void 0:e.description)||_("Common.Physical phone")))}),[null===(b=null==K?void 0:K.default_device)||void 0===b?void 0:b.description,_]),ae=e.useCallback((function(e){var n=L?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",a=L?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",r=L?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",l="red"===e?"pi-bg-red-400":"pi-bg-green-400",s="red"===e?"pi-text-red-500":"pi-text-green-500";return q.default.createElement("div",{className:"".concat(n," pi-flex pi-justify-center pi-items-center")},q.default.createElement("div",{className:"".concat(a," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},q.default.createElement("span",{className:"".concat(r," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(l," pi-opacity-75")}),q.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(s),icon:i.faCircle})))}),[L]),re=e.useMemo((function(){var e="pi-grid pi-items-center";return L&&(e="pi-grid pi-items-start",C?e+=" pi-grid-rows-[72px_1fr]":k?e+=" pi-grid-cols-[256px_114px]":S&&(e+=" pi-grid-cols-[1fr_84px]")),ee?"pi-flex pi-flex-col":e}),[L,C,k,S,ee]),le=e.useMemo((function(){return"pi-grid ".concat(L&&!C&&S?"pi-grid-cols-[48px_1fr]":L&&!C&&k?"pi-grid-cols-[48px_1fr_1px]":L&&C?"pi-grid-cols-[48px_164px_48px]":L||C?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(L?"5":"3"," pi-items-").concat(L?"start":"center"," pi-justify-center pi-w-full")}),[L,C,k,S]),se=e.useMemo((function(){return ee?"pi-grid-cols-3":N(S,C)?"pi-grid-cols-2":C?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"}),[ee,S,C]),oe=e.useCallback((function(){var e=L?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover";return D?q.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):H?q.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):""!==P&&ie?q.default.createElement(p.default,null):k&&!ie?q.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft}):!C||S||ie?S&&!ie?q.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi-rotate-[135deg]"),icon:i.faArrowLeft}):null:q.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft})}),[L,D,H,P,ie,k,S,C]),ue=e.useCallback((function(){return L?H?q.default.createElement(y,null,q.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},_("Common.Intrude"),G?" - ".concat(G):""),C?r.isPhysical()?ne():q.default.createElement(u.default,{startTime:I,isNotAlwaysWhite:!0}):G?"".concat(G):""):D?q.default.createElement(y,null,q.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},_("Common.Listen"),R?" - ".concat(R):""),C?r.isPhysical()?ne():q.default.createElement(u.default,{startTime:I,isNotAlwaysWhite:!0}):R?"".concat(R):""):q.default.createElement(y,null,q.default.createElement(d.default,null),C?r.isPhysical()?ne():q.default.createElement(u.default,{startTime:I,isNotAlwaysWhite:!0}):q.default.createElement(c.default,null)):null}),[L,H,D,C,I,G,R,_,ne]),ce=e.useCallback((function(){return C&&O?ae("red"):C&&W&&!r.isPhysical()?q.default.createElement(s.AudioBars,{audioStream:W,paused:F,size:L?"large":"small"}):C&&r.isPhysical()?ae("green"):null}),[C,O,W,L,F,ae]),de=e.useCallback((function(){if(!X||0===Object.keys(X).length||!U)return q.default.createElement(E.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(X).find((function(e){return e.extension===U}));return e&&(Y[e.id]||e.image)?q.default.createElement(x.default,null):q.default.createElement(j.default,{className:"pi-w-full pi-h-40 pi-mt-4"})}),[U,X,Y]);if(null!==$)return null;return q.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},q.default.createElement("div",{className:re},ee?q.default.createElement(q.default.Fragment,null,q.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between"},q.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},oe(),q.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2"},q.default.createElement(d.default,null),q.default.createElement(c.default,null))),q.default.createElement("div",{className:"pi-flex pi-gap-2"},q.default.createElement(f.default,{description:_("Tooltip.Hangup")}),!S&&q.default.createElement(l.Button,{onClick:function(){return a.answerIncomingCall(),void setTimeout((function(){T.island.setIslandView("streamingAnswer")}),200)},variant:"green","data-tooltip-id":"tooltip-answer","data-tooltip-content":_("Tooltip.Answer")||""},q.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faPhone})),(null==te?void 0:te.canUnlock)&&q.default.createElement(l.Button,{variant:"default",onClick:n.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==te?void 0:te.tooltipText},q.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),de()):q.default.createElement(q.default.Fragment,null,q.default.createElement("div",{className:le},oe(),ue(),!L&&!C&&q.default.createElement(d.default,null),!L&&C&&q.default.createElement(u.default,{startTime:I,isNotAlwaysWhite:!0}),ce()),L&&q.default.createElement(q.default.Fragment,null,q.default.createElement("div",{className:"".concat(D||H?"":"pi-grid pi-gap-y-5")},C&&q.default.createElement(m.default,null),q.default.createElement("div",{className:"pi-grid ".concat(se," pi-gap-3.5")},q.default.createElement(f.default,{description:_("Tooltip.Hangup and transfer")}),N(S,C)&&q.default.createElement(l.Button,{onClick:a.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":_("Tooltip.Answer")||""},q.default.createElement(t.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:i.faPhone}))))))),q.default.createElement(o.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),q.default.createElement(o.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),q.default.createElement(o.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}))}));exports.default=_;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faArrowLeft,\n faCircle,\n faUnlock,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { handleStreamingUnlock } from '../../utils'\nimport { useDispatch } from 'react-redux'\nimport { resolveUsernameByNumber } from '../../lib/phone/conversation'\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(({ children }: { children: React.ReactNode }) => (\n <div className='pi-grid pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2'>{children}</div>\n))\nDetails.displayName = 'Details'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n isRecording,\n username,\n streamingSourceNumber,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { videoSources, sourceImages } = useSelector((state: RootState) => state.streaming)\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // Check if unlock button should be shown and get tooltip text\n const unlockData = useMemo(() => {\n if (!streamingSourceNumber || !videoSources) return { canUnlock: false, tooltipText: '' }\n\n const source = Object.values(videoSources).find(\n (source) => source?.extension === streamingSourceNumber,\n )\n\n const canUnlock = Boolean(source?.cmdOpen && source?.cmdOpen.trim() !== '')\n const tooltipText = canUnlock && source ? `${t('VideoStreaming.Open')}: ${source?.description}` : ''\n\n return { canUnlock, tooltipText }\n }, [streamingSourceNumber, videoSources, t])\n\n const resolvedCallUsername = useMemo(() => {\n if (username && username !== 'undefined') {\n return username\n }\n\n return resolveUsernameByNumber(number, extensions)\n }, [username, number, extensions])\n\n const hasResolvedCallIdentity = useMemo(() => resolvedCallUsername !== '', [resolvedCallUsername])\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${isOpen ? 'start' : 'center'\n } pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n if (number !== '' && hasResolvedCallIdentity) {\n return <Avatar />\n }\n\n if (incoming && !hasResolvedCallIdentity) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (accepted && !outgoing && !hasResolvedCallIdentity) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (outgoing && !hasResolvedCallIdentity) {\n return (\n <FontAwesomeIcon className={`${iconSizeClass} pi-rotate-[135deg]`} icon={faArrowLeft} />\n )\n }\n\n return null\n }, [isOpen, isListen, isIntrude, number, hasResolvedCallIdentity, incoming, outgoing, accepted])\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n return (\n <Details>\n <DisplayName />\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : (\n <Number />\n )}\n </Details>\n )\n }, [\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n const renderStreamingContent = useCallback(() => {\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return <VideoStreamingSkeleton className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // Find the streaming source\n const source = Object.values(videoSources).find(\n (source) => source.extension === streamingSourceNumber,\n )\n\n // If source doesn't exist, show empty state\n if (!source) {\n return <VideoStreamingEmptyState className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return <VideoStreamingEmptyState className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // If we have an image, show StreamingImage component\n return <StreamingImage />\n }, [streamingSourceNumber, videoSources, sourceImages])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button - only show if cmdOpen is valid */}\n {unlockData?.canUnlock && (\n <Button\n variant='default'\n onClick={handleStreamingUnlock}\n data-tooltip-id='tooltip-unlock'\n data-tooltip-content={unlockData?.tooltipText}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faUnlock} />\n </Button>\n )}\n </div>\n </div>\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-unlock' place='left' />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps { }\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","React","className","displayName","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","username","streamingSourceNumber","_b","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","extensions","users","_c","streaming","videoSources","sourceImages","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","unlockData","canUnlock","tooltipText","source","find","extension","Boolean","cmdOpen","trim","concat","description","resolvedCallUsername","resolveUsernameByNumber","hasResolvedCallIdentity","renderLandlinePhoneDiv","useCallback","createElement","FontAwesomeIcon","size","icon","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","faArrowLeft","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","renderAudioIndicator","AudioBars","audioStream","renderStreamingContent","keys","VideoStreamingSkeleton","id","image","StreamingImage","VideoStreamingEmptyState","Fragment","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","handleStreamingUnlock","faUnlock","Actions","CustomThemedTooltip","place"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faArrowLeft,\n faCircle,\n faUnlock,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { handleStreamingUnlock } from '../../utils'\nimport { useDispatch } from 'react-redux'\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(({ children }: { children: React.ReactNode }) => (\n <div className='pi-grid pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2'>{children}</div>\n))\nDetails.displayName = 'Details'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n isRecording,\n username,\n streamingSourceNumber,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { videoSources, sourceImages } = useSelector((state: RootState) => state.streaming)\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // Check if unlock button should be shown and get tooltip text\n const unlockData = useMemo(() => {\n if (!streamingSourceNumber || !videoSources) return { canUnlock: false, tooltipText: '' }\n\n const source = Object.values(videoSources).find(\n (source) => source?.extension === streamingSourceNumber,\n )\n\n const canUnlock = Boolean(source?.cmdOpen && source?.cmdOpen.trim() !== '')\n const tooltipText = canUnlock && source ? `${t('VideoStreaming.Open')}: ${source?.description}` : ''\n\n return { canUnlock, tooltipText }\n }, [streamingSourceNumber, videoSources, t])\n\n const hasValidUsername = useMemo(() => username !== '' && username !== 'undefined', [username])\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${isOpen ? 'start' : 'center'\n } pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n if (number !== '' && hasValidUsername) {\n return <Avatar />\n }\n\n if (incoming && !hasValidUsername) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (accepted && !outgoing && !hasValidUsername) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (outgoing && !hasValidUsername) {\n return (\n <FontAwesomeIcon className={`${iconSizeClass} pi-rotate-[135deg]`} icon={faArrowLeft} />\n )\n }\n\n return null\n }, [isOpen, isListen, isIntrude, number, hasValidUsername, incoming, outgoing, accepted])\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n return (\n <Details>\n <DisplayName />\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : (\n <Number />\n )}\n </Details>\n )\n }, [\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n const renderStreamingContent = useCallback(() => {\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return <VideoStreamingSkeleton className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // Find the streaming source\n const source = Object.values(videoSources).find(\n (source) => source.extension === streamingSourceNumber,\n )\n\n // If source doesn't exist, show empty state\n if (!source) {\n return <VideoStreamingEmptyState className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return <VideoStreamingEmptyState className=\"pi-w-full pi-h-40 pi-mt-4\" />\n }\n\n // If we have an image, show StreamingImage component\n return <StreamingImage />\n }, [streamingSourceNumber, videoSources, sourceImages])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button - only show if cmdOpen is valid */}\n {unlockData?.canUnlock && (\n <Button\n variant='default'\n onClick={handleStreamingUnlock}\n data-tooltip-id='tooltip-unlock'\n data-tooltip-content={unlockData?.tooltipText}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faUnlock} />\n </Button>\n )}\n </div>\n </div>\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-unlock' place='left' />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps { }\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","React","className","displayName","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","username","streamingSourceNumber","_b","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","_c","streaming","videoSources","sourceImages","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","unlockData","canUnlock","tooltipText","source","find","extension","Boolean","cmdOpen","trim","concat","description","hasValidUsername","renderLandlinePhoneDiv","useCallback","createElement","FontAwesomeIcon","size","icon","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","faArrowLeft","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","renderAudioIndicator","AudioBars","audioStream","renderStreamingContent","keys","VideoStreamingSkeleton","id","image","StreamingImage","VideoStreamingEmptyState","Fragment","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","handleStreamingUnlock","faUnlock","Actions","CustomThemedTooltip","place"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),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 t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../GenericAvatar.js"),a=require("../CustomThemedTooltip.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js"),i=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=o(e);exports.OperatorBusyView=function(){var o=s.useSelector((function(e){return e.island})).operatorBusy,c=s.useSelector((function(e){return e.avatars})).avatars,m=s.useSelector((function(e){return e.users})).extensions,f=t.useTranslation().t,p=i.useDispatch(),v=s.useSelector((function(e){return e.conference})),b=v.isActive,x=v.conferenceStartedFrom,y=s.useSelector((function(e){return e.currentUser})).username,j=e.useCallback((function(){p.player.stopAudioPlayer(),p.island.resetOperatorBusyCompletely(),b&&x===y?p.island.setIslandView("waitingConference"):p.island.setIslandView(null)}),[p,b,x,y]),N=e.useMemo((function(){if((null==o?void 0:o.calledNumber)&&m){var e=Object.values(m).find((function(e){return e.exten===(null==o?void 0:o.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[m,null==o?void 0:o.calledNumber]),q=e.useMemo((function(){return N&&c&&c[N]?c[N]:null}),[c,N]),h=e.useMemo((function(){return null!==N}),[N]),_=e.useMemo((function(){if(m&&(null==o?void 0:o.calledNumber)&&""!==(null==o?void 0:o.calledNumber)){var e=Object.values(m).find((function(e){return(null==e?void 0:e.exten)===(null==o?void 0:o.calledNumber)}));return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==o?void 0:o.calledNumber}return"-"}),[null==o?void 0:o.calledNumber,m]),w=e.useMemo((function(){return f(h?"Call.User busy":"Call.Number busy")}),[f,h]);return e.useEffect((function(){return function(){p.player.stopAudioPlayer()}}),[p]),d.default.createElement(d.default.Fragment,null,d.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},d.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},d.default.createElement(n.GenericAvatar,{avatarUrl:q,size:"open",showPulseEffect:!1}),d.default.createElement("div",{className:"pi-flex pi-flex-col"},d.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},_),d.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},w))),d.default.createElement(r.Button,{variant:"default",onClick:j,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":f("Tooltip.Close")||"Close"},d.default.createElement(l.FontAwesomeIcon,{icon:u.faXmark,className:"pi-w-5 pi-h-5"}))),d.default.createElement(a.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.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 t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../GenericAvatar.js"),i=require("../CustomThemedTooltip.js"),o=require("../../node_modules/react-redux/es/hooks/useSelector.js"),a=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=s(e);exports.OperatorBusyView=function(){var s=o.useSelector((function(e){return e.island})),d=s.operatorBusy,m=s.previousView,f=o.useSelector((function(e){return e.avatars})).avatars,p=o.useSelector((function(e){return e.users})).extensions,v=t.useTranslation().t,b=a.useDispatch(),x=o.useSelector((function(e){return e.conference})),y=x.isActive,j=x.conferenceStartedFrom,N=o.useSelector((function(e){return e.currentUser})).username,q=o.useSelector((function(e){return e.currentCall})),w=q.accepted,h=q.incoming,_=q.outgoing,E=e.useCallback((function(){return y&&j===N?"waitingConference":w||h||_?m||"call":null}),[w,j,h,y,_,m,N]),C=e.useCallback((function(){b.player.stopAudioPlayer(),b.island.resetOperatorBusyCompletely(),b.island.setIslandView(E())}),[b,E]),g=e.useMemo((function(){if((null==d?void 0:d.calledNumber)&&p){var e=Object.values(p).find((function(e){return e.exten===(null==d?void 0:d.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[p,null==d?void 0:d.calledNumber]),k=e.useMemo((function(){return g&&f&&f[g]?f[g]:null}),[f,g]),T=e.useMemo((function(){return null!==g}),[g]),S=e.useMemo((function(){if(p&&(null==d?void 0:d.calledNumber)&&""!==(null==d?void 0:d.calledNumber)){var e=Object.values(p).find((function(e){return(null==e?void 0:e.exten)===(null==d?void 0:d.calledNumber)}));return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==d?void 0:d.calledNumber}return"-"}),[null==d?void 0:d.calledNumber,p]),A=e.useMemo((function(){return v(T?"Call.User busy":"Call.Number busy")}),[v,T]);return e.useEffect((function(){return function(){b.player.stopAudioPlayer()}}),[b]),e.useEffect((function(){var e=window.setTimeout((function(){C()}),4e3);return function(){window.clearTimeout(e)}}),[C]),c.default.createElement(c.default.Fragment,null,c.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},c.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},c.default.createElement(n.GenericAvatar,{avatarUrl:k,size:"open",showPulseEffect:!1}),c.default.createElement("div",{className:"pi-flex pi-flex-col"},c.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},S),c.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},A))),c.default.createElement(r.Button,{variant:"default",onClick:C,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":v("Tooltip.Close")||"Close"},c.default.createElement(l.FontAwesomeIcon,{icon:u.faXmark,className:"pi-w-5 pi-h-5"}))),c.default.createElement(i.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n\n // Check if conference is active and user is the owner\n if (isActive && conferenceStartedFrom === username) {\n // Go back to waiting conference instead of closing\n dispatch.island.setIslandView('waitingConference')\n } else {\n // Reset island view if no active conference\n dispatch.island.setIslandView(null)\n }\n }, [dispatch, isActive, conferenceStartedFrom, username])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["operatorBusy","useSelector","state","island","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_a","conference","isActive","conferenceStartedFrom","username","currentUser","handleClose","useCallback","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"4nCAa2D,WACjD,IAAAA,EAAiBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,uBACzDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBACpDC,EAAeJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,oBACvDC,EAAMC,qBACRC,EAAWC,EAAAA,cACXC,EAAsCV,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMU,UAAU,IAAtFC,aAAUC,0BACVC,EAAad,eAAY,SAACC,GAAqB,OAAAA,EAAMc,wBAEvDC,EAAcC,EAAAA,aAAY,WAE9BT,EAASU,OAAOC,kBAEhBX,EAASN,OAAOkB,8BAGZR,GAAYC,IAA0BC,EAExCN,EAASN,OAAOmB,cAAc,qBAG9Bb,EAASN,OAAOmB,cAAc,KAEjC,GAAE,CAACb,EAAUI,EAAUC,EAAuBC,IAGzCQ,EAAmBC,EAAAA,SAAQ,WAE/B,IAAIxB,aAAY,EAAZA,EAAcyB,eAAgBpB,EAAY,CAE5C,IAAMqB,EAAYC,OAAOC,OAAOvB,GAAYwB,MAC1C,SAACC,GAAQ,OAAAA,EAAIC,SAAU/B,aAAY,EAAZA,EAAcyB,aAA5B,IAGX,OAAOC,EAAYA,aAAA,EAAAA,EAAWX,SAAW,IAC1C,CACD,OAAO,IACR,GAAE,CAACV,EAAYL,aAAY,EAAZA,EAAcyB,eAGxBO,EAAYR,EAAAA,SAAQ,WAExB,OAAID,GAAoBnB,GAAWA,EAAQmB,GAClCnB,EAAQmB,GAEV,IACT,GAAG,CAACnB,EAASmB,IAGPU,EAAaT,EAAAA,SAAQ,WACzB,OAA4B,OAArBD,CACT,GAAG,CAACA,IAGEW,EAAcV,EAAAA,SAAQ,WAC1B,GAAInB,IAAcL,aAAA,EAAAA,EAAcyB,eAA+C,MAA/BzB,aAAY,EAAZA,EAAcyB,cAAqB,CAEjF,IAAMC,EAAYC,OAAOC,OAAOvB,GAAYwB,MAC1C,SAACC,GAAQ,OAAAA,eAAAA,EAAKC,UAAU/B,aAAA,EAAAA,EAAcyB,aAAY,IAIpD,OAAIC,IAAaA,aAAA,EAAAA,EAAWS,OAA4B,MAApBT,aAAS,EAATA,EAAWS,MACtCT,eAAAA,EAAWS,KAIbnC,eAAAA,EAAcyB,YACtB,CAED,MAAO,GACR,GAAE,CAACzB,aAAY,EAAZA,EAAcyB,aAAcpB,IAE1B+B,EAAaZ,EAAAA,SAAQ,WAEzB,OACSjB,EADL0B,EACO,iBAEF,mBACX,GAAG,CAAC1B,EAAG0B,IASP,OANAI,EAAAA,WAAU,WACR,OAAO,WACL5B,EAASU,OAAOC,iBAClB,CACF,GAAG,CAACX,IAGF6B,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wDAEbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wCAEbH,UAAAC,cAACG,EAAaA,cAAA,CAACV,UAAWA,EAAWW,KAAK,OAAOC,iBAAiB,IAGlEN,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,uBACbH,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,oFACZP,GAEHI,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,qFACZL,KAMPE,EAAC,QAAAC,cAAAM,EAAMA,QACLC,QAAQ,UACRC,QAAS9B,EACTwB,UAAU,2BACM,0BAAyB,uBACnBlC,EAAE,kBAAoB,SAE5C+B,UAACC,cAAAS,EAAAA,gBAAgB,CAAAC,KAAMC,EAAAA,QAAST,UAAU,oBAG9CH,EAAAA,QAAAC,cAACY,sBAAoB,CAAAV,UAAU,UAAUW,GAAG,0BAA0BC,MAAM,SAGlF"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy, previousView } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const { accepted, incoming, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const getNextViewOnClose = useCallback(() => {\n if (isActive && conferenceStartedFrom === username) {\n return 'waitingConference'\n }\n\n if (accepted || incoming || outgoing) {\n return previousView || 'call'\n }\n\n return null\n }, [accepted, conferenceStartedFrom, incoming, isActive, outgoing, previousView, username])\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n dispatch.island.setIslandView(getNextViewOnClose())\n }, [dispatch, getNextViewOnClose])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => {\n handleClose()\n }, 4000)\n\n return () => {\n window.clearTimeout(timeoutId)\n }\n }, [handleClose])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["_a","useSelector","state","island","operatorBusy","previousView","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_b","conference","isActive","conferenceStartedFrom","username","currentUser","_c","currentCall","accepted","incoming","outgoing","getNextViewOnClose","useCallback","handleClose","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","timeoutId","window","setTimeout","clearTimeout","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),i=require("../lib/phone/conversation.js"),o=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),v=require("../utils/genericFunctions/isEmpty.js"),m=require("../utils/streaming/getStreamingSourceId.js"),f=require("../events/SocketEvents.js"),g=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),S=require("../utils/streaming/isFromStreaming.js"),b=require("../lib/phone/trunk.js"),k=require("../node_modules/react-redux/es/hooks/useDispatch.js");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=y(n);exports.Socket=function(y){var C=y.hostName,_=y.username,T=y.authToken,N=y.reload,U=y.reloadedCallback,D=y.children,j=y.uaType,I=k.useDispatch(),q=n.useRef(),x=n.useRef(),E=n.useRef(!1),O=n.useRef(0);s.useEventListener("phone-island-start-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("start_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}})),s.useEventListener("phone-island-stop-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("stop_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&S.isFromStreaming(e.counterpartNum)){I.island.setIsFromStreaming(!0),I.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=m.getStreamingSourceId(e.counterpartNum);n&&o.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},k=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,v=l.store.getState().users.extensions,m=function(){return i.resolveDisplayName({conv:t,extensions:v,fallbackDisplayName:l.store.getState().currentCall.displayName,fallbackNumber:"".concat((null==t?void 0:t.counterpartNum)||"")||l.store.getState().island.operatorBusy.calledNumber||""})},f=function(){return i.resolveUsernameByNumber("".concat((null==t?void 0:t.counterpartNum)||"")||l.store.getState().currentCall.number,v)},S=l.store.getState().island.view;if(Object.keys(t).length>0){if(function(e){var n,t=l.store.getState(),r=t.currentCall,i=t.currentUser,o=r.accepted,c=r.acceptedWebRTC,s=r.conferencing,a=r.conversationId,u=r.displayName,d=r.incoming,p=r.incomingWebRTC,v=r.number,m=r.outgoing,f=r.outgoingWebRTC,g=r.ownerExtension,h=r.transferSwitching,S=r.transferring;if(!(o||c||d||p||m||f||""!==a)||S||h||s)return!1;if(""===a&&(""===v||""===u||"Incoming call"===u||"Outgoing call"===u))return!1;if(a&&e.id===a)return!1;var b=g||(null===(n=i.default_device)||void 0===n?void 0:n.exten)||"",k=""!==b&&e.owner===b,y=""!==v&&"".concat(e.counterpartNum)===v;return!k||!y}(t))return;if(n.status){var k=l.store.getState().currentUser.default_device,y=l.store.getState().currentUser,w=y.endpoints,C=y.username,_=l.store.getState().currentCall;_.incoming,_.outgoing;var T=function(){if(!v||!C)return!1;var e=Object.values(v).filter((function(e){return(null==e?void 0:e.username)===C}));return null==e?void 0:e.some((function(e){var n=null==w?void 0:w.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":s(t),("mobile"===j&&T()||"desktop"===j&&("webrtc"===(null==k?void 0:k.type)||void 0===(null==k?void 0:k.type)&&!T()||!T()&&"physical"===(null==k?void 0:k.type)))&&(I.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:m(),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:f(),ownerExtension:t.owner}),l.store.dispatch.island.setIslandView("call")),E.current||(E.current=!0,o.getCurrentUserInfo().then((function(n){n&&(I.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?I.paramUrl.setOpenParamUrlType(n.settings.open_param_url):I.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){E.current=!1}),100)})));var N=l.store.getState().paramUrl.openParamUrlType,U=l.store.getState().island.urlOpened;if("ringing"===N&&!U){var D=b.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(D),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:m(),owner:t.owner,uniqueId:t.uniqueId,linkedId:t.linkedId,throughQueue:t.throughQueue,throughTrunk:D,direction:t.direction,connected:t.connected})}break;case"busy":if(s(t),"mobile"===j&&T()||"desktop"===j&&("webrtc"===(null==k?void 0:k.type)||void 0===(null==k?void 0:k.type)&&!T()||!T()&&"physical"===(null==k?void 0:k.type))){if(t&&t.connected)I.currentCall.updateCurrentCall({conversationId:t.id,displayName:m(),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:f(),chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),I.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),I.currentCall.addTransferCalls({type:"transferred",displayName:m(),number:"".concat(t.counterpartNum),startTime:"".concat(g.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){I.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){I.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===S&&c&&I.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)I.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var q=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&q&&(I.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),I.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&I.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&I.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:m(),number:"".concat(null==t?void 0:t.counterpartNum),username:f()})}break;case"onhold":var x=t.counterpartName,O=t.counterpartNum,F=t.startTime;c&&O&&x&&"<unknown>"!==x&&(I.currentCall.addTransferCalls({type:"destination",displayName:m(),number:O,startTime:"".concat(g.getTimestampInSeconds())}),I.currentCall.updateCurrentCall({displayName:m(),number:O,startTime:"".concat(F/1e3),conversationId:t.id}),I.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(I.player.stopAudioPlayer(),I.currentCall.reset(),I.physicalRecorder.setRecordingTempVariable(!1),I.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(_)&&(n.path="/api/ws"),x.current=t.io("https://"+C,n),I.websocket.update({socket:x.current}),x.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(x.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),x.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),q.current&&(clearInterval(q.current),q.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),x.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),x.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),x.current.io.on("reconnect",(function(e){O.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(x.current.id,")"))})),x.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),x.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),x.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),x.current.on("connect",(function(){console.debug("Socket on: "+C+" is connected!"),x.current.emit("login",{accessKeyId:"".concat(_),token:T,uaType:j})})),x.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),q.current&&clearInterval(q.current),q.current=setInterval((function(){x.current.volatile.emit("ping",u.withTimeout((function(){O.current=0,setTimeout((function(){I.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){O.current++,console.debug("Socket ping timeout (".concat(O.current,"/").concat(3,"), connected: ").concat(x.current.connected)),setTimeout((function(){var e,n,t=x.current.connected&&O.current>=3;if(!x.current.connected||t){var r=l.store.getState().webrtc.sipcall,i=l.store.getState().currentCall,o=i.accepted,c=i.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((o||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:o,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),x.current.disconnect()),I.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),x.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),f.dispatchMainPresence(n)})),x.current.on("extenHangup",(function(e){var n,t,r=l.store.getState().currentUser,i=r.endpoints,o=r.username,s=l.store.getState().conference,u=s.isActive,d=s.conferenceStartedFrom,p=l.store.getState().island,v=p.view,m=p.previewCallFromMobileOrNethlink,f=((null==i?void 0:i.extension)||[]).find((function(n){return n.id===e.callerNum})),g=null==f?void 0:f.type,h=l.store.getState().currentUser.conversations,S=void 0,b=!1;if(e.callerNum&&h[e.callerNum]){var k=h[e.callerNum],y=Object.keys(k);if(y.length>0){for(var w=null,C=0,_=y;C<_.length;C++){var T=_[C],N=null==k?void 0:k[T];if(N)if(w){var U=!!w.connected,D=!!N.connected;if(!D||U){var j=null!==(n=w.startTime)&&void 0!==n?n:0,I=null!==(t=N.startTime)&&void 0!==t?t:0;D===U&&I>j&&(w=N)}else w=N}else w=N}S=null==w?void 0:w.linkedId,b=(null==w?void 0:w.connected)||!1}}if(S&&b&&a.eventDispatch("phone-island-summary-call-check",{linkedid:S}),"normal_clearing"===e.cause&&("physical"===g||"mobile"===g)||"normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)&&m||"user_busy"===(null==e?void 0:e.cause)||"not_defined"===(null==e?void 0:e.cause)||"call_rejected"===(null==e?void 0:e.cause)||"interworking"===(null==e?void 0:e.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),u&&d!==o&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==e?void 0:e.cause)&&u&&d===o?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==e.cause&&"user_busy"!==(null==e?void 0:e.cause)&&"not_defined"!==(null==e?void 0:e.cause)&&"call_rejected"!==(null==e?void 0:e.cause)||"webrtc"!==g&&"nethlink"!==g||!u||d===o||l.store.dispatch.conference.resetConference(),("normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)||"call_rejected"===(null==e?void 0:e.cause))&&u&&d===o){var q=l.store.getState().conference,x=q.usersList,E=q.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0;O||F?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()}if("interworking"===(null==e?void 0:e.cause)&&u&&d===o&&"waitingConference"!==v&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==e?void 0:e.cause)){var P=l.store.getState().currentUser,A=P.endpoints,R=P.username,V=((null==A?void 0:A.extension)||[]).map((function(e){return e.id})),M=l.store.getState().currentCall,L=M.incoming;M.outgoing;var B=l.store.getState().conference,Q=B.isActive,W=B.conferenceStartedFrom;L&&V.includes(e.callerNum)||(l.store.dispatch.island.setOperatorBusyActive({callerNumber:e.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),Q&&W===R&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))}if("subscriber_absent"===(null==e?void 0:e.cause)){var H=l.store.getState().conference,z=H.isActive,J=H.conferenceStartedFrom,K=l.store.getState().currentUser.username;if(z&&J===K){var G=l.store.getState().conference;x=G.usersList,E=G.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0,O||F?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),E&&E[e.callerNum]&&l.store.dispatch.conference.removePendingUser(e.callerNum)):l.store.dispatch.conference.resetConference()}}})),x.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,i=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),o=null==i?void 0:i.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&o&&("mobile"===o||"physical"===o)||"physical"===(null==t?void 0:t.type)&&o&&"physical"!==o)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:o}))})),x.current.on("extenUpdate",(function(e){var n,t;I.users.updateExtension(e);var r=l.store.getState().users.extensions,i={},o=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;i[s]||(i[s]=[]),i[s].push(a)}var u=i[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===_&&!v.isEmpty(d)&&(null==d?void 0:d.owner)){var m=null===(t=null===(n=null==o?void 0:o.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));m&&"mobile"===m.type&&(p=!0)}if(f.dispatchExtensions(e),v.isEmpty(d)){var g=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!v.isEmpty(t)}));g||f.dispatchConversations(e)}else p||f.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===_&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===_&&(k(e,d),I.currentUser.updateConversations(e))})),x.current.on("queueUpdate",(function(e){f.dispatchQueueUpdate(e)})),x.current.on("queueMemberUpdate",(function(e){f.dispatchQueueMemberUpdate(e)})),x.current.on("takeOver",(function(){f.dispatchAlreadyLogin()})),x.current.on("serverReloaded",(function(){f.dispatchServerReload()})),x.current.on("parkingUpdate",(function(e){f.dispatchParkingUpdate(e)})),x.current.on("actionNethLink",(function(e,n){f.dispatchUrlCall(e,n)})),x.current.on("satellite/summary",(function(e){(null==e?void 0:e.uniqueid)&&a.eventDispatch("phone-island-summary-ready",{linkedid:null==e?void 0:e.uniqueid})})),x.current.on("message",(function(e){switch(e.message){case"screenSharingStart":I.island.toggleSideViewVisible(!1),I.island.toggleTranscriptionViewVisible(!1),I.island.setIslandView("video"),I.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":I.island.toggleSideViewVisible(!1),I.island.toggleTranscriptionViewVisible(!1),I.island.setIslandView("video"),I.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),x.current.on("updateDefaultDevice",(function(n){f.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var i=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==i.length){var o=i[0],c=r.extension.find((function(e){return e.id===o.exten}));c&&(o=e.__assign(e.__assign({},o),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(o),d.checkMediaPermissions()}}})),x.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,i=l.store.getState().conference.usersList,o=e.__assign({},r);i&&Object.keys(o).forEach((function(n){i[n]&&(o[n]=e.__assign(e.__assign({},o[n]),{muted:i[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(o),l.store.dispatch.conference.updateConferenceId(t)}})),x.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),x.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),x.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),x.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var i=l.store.getState().currentCall.streamingSourceNumber;m.getStreamingSourceId(i),I.streaming.updateSourceImage({source:t,image:r})}}})),x.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(q.current),x.current.close()}}),[C,_,T,j,I]),n.useEffect((function(){var e;if(N){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),q.current&&(clearInterval(q.current),q.current=null),setTimeout((function(){x.current.disconnect(),x.current.connect(),U()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),U())}}),[N]),w.default.createElement(w.default.Fragment,null,D)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),i=require("../lib/phone/conversation.js"),o=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),v=require("../utils/genericFunctions/isEmpty.js"),m=require("../utils/streaming/getStreamingSourceId.js"),f=require("../events/SocketEvents.js"),g=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),S=require("../utils/streaming/isFromStreaming.js"),k=require("../lib/phone/trunk.js"),b=require("../node_modules/react-redux/es/hooks/useDispatch.js");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=y(n);exports.Socket=function(y){var C=y.hostName,_=y.username,N=y.authToken,T=y.reload,D=y.reloadedCallback,U=y.children,j=y.uaType,q=b.useDispatch(),I=n.useRef(),x=n.useRef(),E=n.useRef(!1),O=n.useRef(0);s.useEventListener("phone-island-start-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("start_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}})),s.useEventListener("phone-island-stop-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("stop_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&S.isFromStreaming(e.counterpartNum)){q.island.setIsFromStreaming(!0),q.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=m.getStreamingSourceId(e.counterpartNum);n&&o.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},b=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,v=l.store.getState().island.view;if(Object.keys(t).length>0){if(n.status){var m=l.store.getState().users.extensions,f=l.store.getState().currentUser.default_device,S=l.store.getState().currentUser,b=S.endpoints,y=S.username,w=l.store.getState().currentCall;w.incoming,w.outgoing;var C=function(){if(!m||!y)return!1;var e=Object.values(m).filter((function(e){return(null==e?void 0:e.username)===y}));return null==e?void 0:e.some((function(e){var n=null==b?void 0:b.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":if(function(e){var n=l.store.getState().currentCall,t=n.accepted,r=n.ownerExtension;return t&&!!r&&!!e&&r!==e}(t.owner))break;s(t),("mobile"===j&&C()||"desktop"===j&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!C()||!C()&&"physical"===(null==f?void 0:f.type)))&&(q.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",ownerExtension:t.owner}),l.store.dispatch.island.setIslandView("call")),E.current||(E.current=!0,o.getCurrentUserInfo().then((function(n){n&&(q.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?q.paramUrl.setOpenParamUrlType(n.settings.open_param_url):q.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){E.current=!1}),100)})));var _=l.store.getState().paramUrl.openParamUrlType,N=l.store.getState().island.urlOpened;if("ringing"===_&&!N){var T=k.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(T),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:i.getDisplayName(t),owner:t.owner,uniqueId:t.uniqueId,linkedId:t.linkedId,throughQueue:t.throughQueue,throughTrunk:T,direction:t.direction,connected:t.connected})}break;case"busy":if(s(t),"mobile"===j&&C()||"desktop"===j&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!C()||!C()&&"physical"===(null==f?void 0:f.type))){if(t&&t.connected)q.currentCall.updateCurrentCall({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),q.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),q.currentCall.addTransferCalls({type:"transferred",displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),startTime:"".concat(g.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){q.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){q.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===v&&c&&q.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)q.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var D=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&D&&(q.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),q.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&q.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&q.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:i.getDisplayName(t),number:"".concat(null==t?void 0:t.counterpartNum),username:"".concat(m&&m[null==t?void 0:t.counterpartNum]&&m[null==t?void 0:t.counterpartNum].username)||""})}break;case"onhold":var U=t.counterpartName,I=t.counterpartNum,x=t.startTime;c&&I&&U&&"<unknown>"!==U&&(q.currentCall.addTransferCalls({type:"destination",displayName:i.getDisplayName(t),number:I,startTime:"".concat(g.getTimestampInSeconds())}),q.currentCall.updateCurrentCall({displayName:i.getDisplayName(t),number:I,startTime:"".concat(x/1e3),conversationId:t.id}),q.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(q.player.stopAudioPlayer(),q.currentCall.reset(),q.physicalRecorder.setRecordingTempVariable(!1),q.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(_)&&(n.path="/api/ws"),x.current=t.io("https://"+C,n),q.websocket.update({socket:x.current}),x.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(x.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),x.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),I.current&&(clearInterval(I.current),I.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),x.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),x.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),x.current.io.on("reconnect",(function(e){O.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(x.current.id,")"))})),x.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),x.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),x.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),x.current.on("connect",(function(){console.debug("Socket on: "+C+" is connected!"),x.current.emit("login",{accessKeyId:"".concat(_),token:N,uaType:j})})),x.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),I.current&&clearInterval(I.current),I.current=setInterval((function(){x.current.volatile.emit("ping",u.withTimeout((function(){O.current=0,setTimeout((function(){q.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){O.current++,console.debug("Socket ping timeout (".concat(O.current,"/").concat(3,"), connected: ").concat(x.current.connected)),setTimeout((function(){var e,n,t=x.current.connected&&O.current>=3;if(!x.current.connected||t){var r=l.store.getState().webrtc.sipcall,i=l.store.getState().currentCall,o=i.accepted,c=i.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((o||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:o,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),x.current.disconnect()),q.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),x.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),f.dispatchMainPresence(n)})),x.current.on("extenHangup",(function(e){var n,t,r=l.store.getState().currentUser,i=r.endpoints,o=r.username,s=l.store.getState().conference,u=s.isActive,d=s.conferenceStartedFrom,p=l.store.getState().island,v=p.view,m=p.previewCallFromMobileOrNethlink,f=((null==i?void 0:i.extension)||[]).find((function(n){return n.id===e.callerNum})),g=null==f?void 0:f.type,h=l.store.getState().currentUser.conversations,S=void 0,k=!1;if(e.callerNum&&h[e.callerNum]){var b=h[e.callerNum],y=Object.keys(b);if(y.length>0){for(var w=null,C=0,_=y;C<_.length;C++){var N=_[C],T=null==b?void 0:b[N];if(T)if(w){var D=!!w.connected,U=!!T.connected;if(!U||D){var j=null!==(n=w.startTime)&&void 0!==n?n:0,q=null!==(t=T.startTime)&&void 0!==t?t:0;U===D&&q>j&&(w=T)}else w=T}else w=T}S=null==w?void 0:w.linkedId,k=(null==w?void 0:w.connected)||!1}}if(S&&k&&a.eventDispatch("phone-island-summary-call-check",{linkedid:S}),"normal_clearing"===e.cause&&("physical"===g||"mobile"===g)||"normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)&&m||"user_busy"===(null==e?void 0:e.cause)||"not_defined"===(null==e?void 0:e.cause)||"call_rejected"===(null==e?void 0:e.cause)||"interworking"===(null==e?void 0:e.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),u&&d!==o&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==e?void 0:e.cause)&&u&&d===o?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==e.cause&&"user_busy"!==(null==e?void 0:e.cause)&&"not_defined"!==(null==e?void 0:e.cause)&&"call_rejected"!==(null==e?void 0:e.cause)||"webrtc"!==g&&"nethlink"!==g||!u||d===o||l.store.dispatch.conference.resetConference(),("normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)||"call_rejected"===(null==e?void 0:e.cause))&&u&&d===o){var I=l.store.getState().conference,x=I.usersList,E=I.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0;O||F?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()}if("interworking"===(null==e?void 0:e.cause)&&u&&d===o&&"waitingConference"!==v&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==e?void 0:e.cause)){var P=l.store.getState().currentUser,A=P.endpoints,V=P.username,R=((null==A?void 0:A.extension)||[]).map((function(e){return e.id})),M=l.store.getState().currentCall,L=M.incoming,B=M.accepted,Q=M.transferring,H=l.store.getState().conference,z=H.isActive,J=H.conferenceStartedFrom;!(L&&e.callerNum&&R.includes(e.callerNum))&&(!B||z||Q)&&(l.store.dispatch.island.setOperatorBusyActive({callerNumber:e.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),z&&J===V&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))}if("subscriber_absent"===(null==e?void 0:e.cause)){var K=l.store.getState().conference,W=K.isActive,G=K.conferenceStartedFrom,X=l.store.getState().currentUser.username;if(W&&G===X){var Y=l.store.getState().conference;x=Y.usersList,E=Y.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0,O||F?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),E&&E[e.callerNum]&&l.store.dispatch.conference.removePendingUser(e.callerNum)):l.store.dispatch.conference.resetConference()}}})),x.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,i=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),o=null==i?void 0:i.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&o&&("mobile"===o||"physical"===o)||"physical"===(null==t?void 0:t.type)&&o&&"physical"!==o)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:o}))})),x.current.on("extenUpdate",(function(e){var n,t;q.users.updateExtension(e);var r=l.store.getState().users.extensions,i={},o=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;i[s]||(i[s]=[]),i[s].push(a)}var u=i[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===_&&!v.isEmpty(d)&&(null==d?void 0:d.owner)){var m=null===(t=null===(n=null==o?void 0:o.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));m&&"mobile"===m.type&&(p=!0)}if(f.dispatchExtensions(e),v.isEmpty(d)){var g=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!v.isEmpty(t)}));g||f.dispatchConversations(e)}else p||f.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===_&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===_&&(b(e,d),q.currentUser.updateConversations(e))})),x.current.on("queueUpdate",(function(e){f.dispatchQueueUpdate(e)})),x.current.on("queueMemberUpdate",(function(e){f.dispatchQueueMemberUpdate(e)})),x.current.on("takeOver",(function(){f.dispatchAlreadyLogin()})),x.current.on("serverReloaded",(function(){f.dispatchServerReload()})),x.current.on("parkingUpdate",(function(e){f.dispatchParkingUpdate(e)})),x.current.on("actionNethLink",(function(e,n){f.dispatchUrlCall(e,n)})),x.current.on("satellite/summary",(function(e){(null==e?void 0:e.uniqueid)&&a.eventDispatch("phone-island-summary-ready",{linkedid:null==e?void 0:e.uniqueid})})),x.current.on("message",(function(e){switch(e.message){case"screenSharingStart":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),x.current.on("updateDefaultDevice",(function(n){f.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var i=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==i.length){var o=i[0],c=r.extension.find((function(e){return e.id===o.exten}));c&&(o=e.__assign(e.__assign({},o),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(o),d.checkMediaPermissions()}}})),x.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,i=l.store.getState().conference.usersList,o=e.__assign({},r);i&&Object.keys(o).forEach((function(n){i[n]&&(o[n]=e.__assign(e.__assign({},o[n]),{muted:i[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(o),l.store.dispatch.conference.updateConferenceId(t)}})),x.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),x.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),x.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),x.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var i=l.store.getState().currentCall.streamingSourceNumber;m.getStreamingSourceId(i),q.streaming.updateSourceImage({source:t,image:r})}}})),x.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(I.current),x.current.close()}}),[C,_,N,j,q]),n.useEffect((function(){var e;if(T){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),I.current&&(clearInterval(I.current),I.current=null),setTimeout((function(){x.current.disconnect(),x.current.connect(),D()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),D())}}),[T]),w.default.createElement(w.default.Fragment,null,U)};
2
2
  //# sourceMappingURL=Socket.js.map