@nethesis/phone-island 1.0.10 → 1.0.11-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/IslandMotion.js +1 -1
- package/dist/components/IslandMotion.js.map +1 -1
- package/dist/components/RecorderView/Actions.js +1 -1
- package/dist/components/RecorderView/Actions.js.map +1 -1
- package/dist/components/RestAPI.js +1 -1
- package/dist/components/RestAPI.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/events/PlayerEvents.js +1 -1
- package/dist/events/PlayerEvents.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/models/motions.js +1 -1
- package/dist/models/motions.js.map +1 -1
- package/dist/node_modules/react-moment/dist/index.js +11 -1
- package/dist/node_modules/react-moment/dist/index.js.map +1 -1
- package/dist/node_modules/react-redux/es/components/Context.js +1 -1
- package/dist/node_modules/react-redux/es/components/Context.js.map +1 -1
- package/dist/node_modules/react-redux/es/components/Provider.js +1 -1
- package/dist/node_modules/react-redux/es/components/Provider.js.map +1 -1
- package/dist/node_modules/react-redux/es/hooks/useReduxContext.js +1 -1
- package/dist/node_modules/react-redux/es/hooks/useReduxContext.js.map +1 -1
- package/dist/node_modules/react-redux/es/hooks/useSelector.js +1 -1
- package/dist/node_modules/react-redux/es/hooks/useSelector.js.map +1 -1
- package/dist/node_modules/react-redux/es/hooks/useStore.js +1 -1
- package/dist/node_modules/react-redux/es/hooks/useStore.js.map +1 -1
- package/dist/node_modules/react-redux/es/index.js +1 -1
- package/dist/node_modules/react-redux/es/index.js.map +1 -1
- package/dist/node_modules/react-redux/es/utils/Subscription.js +1 -1
- package/dist/node_modules/react-redux/es/utils/Subscription.js.map +1 -1
- package/dist/node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js +1 -1
- package/dist/node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js.map +1 -1
- package/dist/node_modules/react-tooltip/dist/react-tooltip.min.mjs.js +1 -1
- package/dist/node_modules/react-tooltip/dist/react-tooltip.min.mjs.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/adapter_factory.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/adapter_factory.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/chrome/getusermedia.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/chrome/getusermedia.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/common_shim.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/common_shim.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/getusermedia.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/firefox/getusermedia.js.map +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/utils.js +1 -1
- package/dist/node_modules/webrtc-adapter/src/js/utils.js.map +1 -1
- package/dist/package.json.js +1 -1
- package/package.json +2 -2
|
@@ -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"),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 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 r=require("../Button.js"),o=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var s=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"),E=require("../StreamingImage/index.js"),x=require("../VideoStreamingSkeleton/index.js"),w=require("../VideoStreamingEmptyState/index.js"),j=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 N=b(e);function q(e,t){return!e&&!t}var y=e.memo((function(e){var t=e.children;return N.default.createElement("div",{className:"pi-grid pi-min-w-0 pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2"},t)}));y.displayName="Details";var _=e.memo((function(e){var n=e.label,a=e.tooltipContent;return n?N.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary","data-tooltip-id":a?"tooltip-queue":void 0,"data-tooltip-content":a||""},N.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-4 pi-w-4"})):null}));_.displayName="QueueBadge";var T=e.memo((function(){var b,T=g.useTranslation().t,A=j.useDispatch(),k=h.useSelector((function(e){return e.currentCall})),C=k.incoming,S=k.accepted,I=k.outgoing,F=k.startTime,P=k.paused,M=k.number,O=k.isRecording,U=k.username,B=k.streamingSourceNumber,L=k.queueName,V=k.queueNumber,W=k.throughQueue,z=h.useSelector((function(e){return e.island})),D=z.isOpen,H=z.isFromStreaming,Q=h.useSelector((function(e){return e.webrtc})).remoteAudioStream,R=h.useSelector((function(e){return e.listen})),G=R.isListen,J=R.isIntrude,K=R.isListenExtension,X=R.isIntrudeExtension,Y=h.useSelector((function(e){return e.alerts})).data,Z=h.useSelector((function(e){return e.currentUser})),$=h.useSelector((function(e){return e.streaming})),ee=$.videoSources,te=$.sourceImages,ie=e.useMemo((function(){return Object.values(Y).filter((function(e){return e.active}))}),[Y]),ne=e.useMemo((function(){return ie.length>0?ie[ie.length-1]:null}),[ie]),ae=e.useMemo((function(){return H&&B&&!S}),[H,B,S]),le=e.useMemo((function(){if(!B||!ee)return{canUnlock:!1,tooltipText:""};var e=Object.values(ee).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,ee,T]),re=e.useMemo((function(){return""!==U&&"undefined"!==U}),[U]),oe=e.useMemo((function(){return L||V||""}),[L,V]),se=e.useMemo((function(){return W&&oe?"".concat(T("Common.Queue"),": ").concat(oe):""}),[W,oe,T]),ue=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:v.faOfficePhone,className:"pi-mr-1"}),N.default.createElement("span",{className:"pi-max-w-16 pi-truncate"},(null===(e=null==Z?void 0:Z.default_device)||void 0===e?void 0:e.description)||T("Common.Physical phone")))}),[null===(b=null==Z?void 0:Z.default_device)||void 0===b?void 0:b.description,T]),ce=e.useCallback((function(e){var n=D?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",a=D?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",l=D?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",r="red"===e?"pi-bg-red-400":"pi-bg-green-400",o="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(a," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},N.default.createElement("span",{className:"".concat(l," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(r," pi-opacity-75")}),N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(o),icon:i.faCircle})))}),[D]),de=e.useMemo((function(){var e="pi-grid pi-items-center";return D&&(e="pi-grid pi-items-start",S?e+=" pi-grid-rows-[72px_1fr]":C?e+=" pi-grid-cols-[256px_114px]":I&&(e+=" pi-grid-cols-[1fr_84px]")),ae?"pi-flex pi-flex-col":e}),[D,S,C,I,ae]),pe=e.useMemo((function(){return"pi-grid ".concat(D&&!S&&I?"pi-grid-cols-[48px_1fr]":D&&!S&&C?"pi-grid-cols-[48px_1fr_1px]":D&&S?"pi-grid-cols-[48px_164px_48px]":D||S?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(D?"5":"3"," pi-items-").concat(D?"start":"center"," pi-justify-center pi-w-full")}),[D,S,C,I]),me=e.useMemo((function(){return ae?"pi-grid-cols-3":q(I,S)?"pi-grid-cols-2":S?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"}),[ae,I,S]),fe=e.useCallback((function(){var e=D?"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 G?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):J?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):""!==M&&re?N.default.createElement(p.default,null):C&&!re?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft}):!S||I||re?I&&!re?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})}),[D,G,J,M,re,C,I,S]),ge=e.useCallback((function(){return D?J?N.default.createElement(y,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"),X?" - ".concat(X):""),S?l.isPhysical()?ue():N.default.createElement(u.default,{startTime:F,isNotAlwaysWhite:!0}):X?"".concat(X):""):G?N.default.createElement(y,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"),K?" - ".concat(K):""),S?l.isPhysical()?ue():N.default.createElement(u.default,{startTime:F,isNotAlwaysWhite:!0}):K?"".concat(K):""):N.default.createElement(y,null,S&&W&&oe?N.default.createElement("div",{className:"pi-flex pi-min-w-0 pi-items-center pi-gap-2"},N.default.createElement("div",{className:"pi-min-w-0 pi-flex-1"},N.default.createElement(d.default,null)),N.default.createElement(_,{label:oe,tooltipContent:se})):N.default.createElement(d.default,null),S?l.isPhysical()?ue():N.default.createElement(u.default,{startTime:F,isNotAlwaysWhite:!0}):N.default.createElement(c.default,null)):null}),[D,J,G,S,F,X,K,T,ue,S,W,oe,se]),ve=e.useCallback((function(){return S&&O?ce("red"):S&&Q&&!l.isPhysical()?N.default.createElement(o.AudioBars,{audioStream:Q,paused:P,size:D?"large":"small"}):S&&l.isPhysical()?ce("green"):null}),[S,O,Q,D,P,ce]),Ee=e.useCallback((function(){if(!ee||0===Object.keys(ee).length||!B)return N.default.createElement(x.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(ee).find((function(e){return e.extension===B}));return e&&(te[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,ee,te]);if(null!==ne)return null;return N.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},N.default.createElement("div",{className:de},ae?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"},fe(),N.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2"},N.default.createElement(d.default,null),N.default.createElement(c.default,null))),N.default.createElement("div",{className:"pi-flex pi-gap-2"},N.default.createElement(f.default,{description:T("Tooltip.Hangup")}),!I&&N.default.createElement(r.Button,{onClick:function(){return a.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==le?void 0:le.canUnlock)&&N.default.createElement(r.Button,{variant:"default",onClick:n.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==le?void 0:le.tooltipText},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),Ee()):N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:pe},fe(),ge(),!D&&!S&&N.default.createElement(d.default,null),!D&&S&&N.default.createElement(u.default,{startTime:F,isNotAlwaysWhite:!0}),ve()),D&&N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"".concat(G||J?"":"pi-grid pi-gap-y-5")},S&&N.default.createElement(m.default,null),N.default.createElement("div",{className:"pi-grid ".concat(me," pi-gap-3.5")},N.default.createElement(f.default,{description:T("Tooltip.Hangup and transfer")}),q(I,S)&&N.default.createElement(r.Button,{onClick:a.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(s.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-display-name",place:"bottom"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-queue",place:"bottom"}))}));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 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 r=require("../Button.js"),o=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var s=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 x=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),v=require("../StreamingImage/index.js"),E=require("../VideoStreamingSkeleton/index.js"),w=require("../VideoStreamingEmptyState/index.js"),h=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),j=require("../../node_modules/react-redux/es/hooks/useSelector.js");function b(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var N=b(e);function y(e,t){return!e&&!t}var q=e.memo((function(e){var t=e.children,i=e.className,n=void 0===i?"pi-gap-1 pi-grid-rows-2":i;return N.default.createElement("div",{className:"pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ".concat(n)},t)}));q.displayName="Details";var _=e.memo((function(e){var n=e.label,a=e.tooltipContent;return n?N.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary","data-tooltip-id":a?"tooltip-queue":void 0,"data-tooltip-content":a||""},N.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-4 pi-w-4"})):null}));_.displayName="QueueBadge";var T=e.memo((function(e){var n=e.label,a=e.tooltipContent;return n?N.default.createElement("span",{className:"pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark","data-tooltip-id":a?"tooltip-queue":void 0,"data-tooltip-content":a||"","aria-label":a||n},N.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-3 pi-w-3 pi-flex-none"}),N.default.createElement("span",{className:"pi-block pi-max-w-28 pi-truncate"},n)):null}));T.displayName="IncomingQueueBadge";var k=e.memo((function(){var b,k=g.useTranslation().t,A=h.useDispatch(),C=j.useSelector((function(e){return e.currentCall})),S=C.incoming,I=C.accepted,F=C.outgoing,P=C.startTime,M=C.paused,B=C.number,O=C.isRecording,U=C.username,L=C.streamingSourceNumber,V=C.queueName,W=C.queueNumber,D=C.throughQueue,z=j.useSelector((function(e){return e.island})),H=z.isOpen,Q=z.isFromStreaming,R=j.useSelector((function(e){return e.webrtc})).remoteAudioStream,G=j.useSelector((function(e){return e.listen})),J=G.isListen,K=G.isIntrude,X=G.isListenExtension,Y=G.isIntrudeExtension,Z=j.useSelector((function(e){return e.alerts})).data,$=j.useSelector((function(e){return e.currentUser})),ee=j.useSelector((function(e){return e.streaming})),te=ee.videoSources,ie=ee.sourceImages,ne=e.useMemo((function(){return Object.values(Z).filter((function(e){return e.active}))}),[Z]),ae=e.useMemo((function(){return ne.length>0?ne[ne.length-1]:null}),[ne]),le=e.useMemo((function(){return Q&&L&&!I}),[Q,L,I]),re=e.useMemo((function(){if(!L||!te)return{canUnlock:!1,tooltipText:""};var e=Object.values(te).find((function(e){return(null==e?void 0:e.extension)===L})),t=Boolean((null==e?void 0:e.cmdOpen)&&""!==(null==e?void 0:e.cmdOpen.trim()));return{canUnlock:t,tooltipText:t&&e?"".concat(k("VideoStreaming.Open"),": ").concat(null==e?void 0:e.description):""}}),[L,te,k]),oe=e.useMemo((function(){return""!==U&&"undefined"!==U}),[U]),se=e.useMemo((function(){return V||W||""}),[V,W]),ue=e.useMemo((function(){return D&&se?"".concat(k("Common.Queue"),": ").concat(se):""}),[D,se,k]),ce=e.useMemo((function(){return Boolean(S&&!I&&D&&se)}),[I,S,D,se]),de=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==$?void 0:$.default_device)||void 0===e?void 0:e.description)||k("Common.Physical phone")))}),[null===(b=null==$?void 0:$.default_device)||void 0===b?void 0:b.description,k]),pe=e.useCallback((function(e){var n=H?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",a=H?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",l=H?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",r="red"===e?"pi-bg-red-400":"pi-bg-green-400",o="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(a," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},N.default.createElement("span",{className:"".concat(l," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(r," pi-opacity-75")}),N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(o),icon:i.faCircle})))}),[H]),me=e.useMemo((function(){var e="pi-grid pi-items-center";return H&&(e=ce?"pi-grid pi-items-center":"pi-grid pi-items-start",I?e+=" pi-grid-rows-[72px_1fr]":S?e+=" pi-grid-cols-[256px_114px]":F&&(e+=" pi-grid-cols-[1fr_84px]")),le?"pi-flex pi-flex-col":e}),[H,I,S,F,le,ce]),fe=e.useMemo((function(){var e=H&&!ce?"start":"center";return"pi-grid ".concat(H&&!I&&F?"pi-grid-cols-[48px_1fr]":H&&!I&&S?"pi-grid-cols-[48px_1fr_1px]":H&&I?"pi-grid-cols-[48px_164px_48px]":H||I?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(H?"5":"3"," pi-items-").concat(e," pi-justify-center pi-w-full")}),[H,I,S,F,ce]),ge=e.useMemo((function(){return le?"pi-grid-cols-3":y(F,I)?"pi-grid-cols-2":I?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"}),[le,F,I]),xe=e.useCallback((function(){var e=H?"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 J?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):K?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):""!==B&&oe?N.default.createElement(p.default,null):S&&!oe?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft}):!I||F||oe?F&&!oe?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})}),[H,J,K,B,oe,S,F,I]),ve=e.useCallback((function(){return H?K?N.default.createElement(q,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},k("Common.Intrude"),Y?" - ".concat(Y):""),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):Y?"".concat(Y):""):J?N.default.createElement(q,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},k("Common.Listen"),X?" - ".concat(X):""),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):X?"".concat(X):""):ce?N.default.createElement(q,{className:"pi-grid-rows-[20px_24px_24px] pi-gap-0.5"},N.default.createElement(T,{label:se,tooltipContent:ue}),N.default.createElement(d.default,null),N.default.createElement(c.default,null)):N.default.createElement(q,null,I&&D&&se?N.default.createElement("div",{className:"pi-flex pi-min-w-0 pi-items-center pi-gap-2"},N.default.createElement("div",{className:"pi-min-w-0 pi-flex-1"},N.default.createElement(d.default,null)),N.default.createElement(_,{label:se,tooltipContent:ue})):N.default.createElement(d.default,null),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):N.default.createElement(c.default,null)):null}),[H,K,J,I,P,Y,X,k,de,I,D,se,ue,ce]),Ee=e.useCallback((function(){return I&&O?pe("red"):I&&R&&!l.isPhysical()?N.default.createElement(o.AudioBars,{audioStream:R,paused:M,size:H?"large":"small"}):I&&l.isPhysical()?pe("green"):null}),[I,O,R,H,M,pe]),we=e.useCallback((function(){if(!te||0===Object.keys(te).length||!L)return N.default.createElement(E.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(te).find((function(e){return e.extension===L}));return e&&(ie[e.id]||e.image)?N.default.createElement(v.default,null):N.default.createElement(w.default,{className:"pi-w-full pi-h-40 pi-mt-4"})}),[L,te,ie]);if(null!==ae)return null;return N.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},N.default.createElement("div",{className:me},le?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"},xe(),N.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2"},N.default.createElement(d.default,null),N.default.createElement(c.default,null))),N.default.createElement("div",{className:"pi-flex pi-gap-2"},N.default.createElement(f.default,{description:k("Tooltip.Hangup")}),!F&&N.default.createElement(r.Button,{onClick:function(){return a.answerIncomingCall(),void setTimeout((function(){A.island.setIslandView("streamingAnswer")}),200)},variant:"green","data-tooltip-id":"tooltip-answer","data-tooltip-content":k("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faPhone})),(null==re?void 0:re.canUnlock)&&N.default.createElement(r.Button,{variant:"default",onClick:n.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==re?void 0:re.tooltipText},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),we()):N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:fe},xe(),ve(),!H&&!I&&N.default.createElement(d.default,null),!H&&I&&N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}),Ee()),H&&N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"".concat(J||K?"":"pi-grid pi-gap-y-5")},I&&N.default.createElement(m.default,null),N.default.createElement("div",{className:"pi-grid ".concat(ge," pi-gap-3.5")},N.default.createElement(f.default,{description:k("Tooltip.Hangup and transfer")}),y(F,I)&&N.default.createElement(r.Button,{onClick:a.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":k("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:i.faPhone}))))))),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-display-name",place:"bottom"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-queue",place:"bottom"}))}));exports.default=k;
|
|
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 faUsers,\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-min-w-0 pi-self-center pi-gap-1 pi-grid-cols-1 pi-grid-rows-2'>\n {children}\n </div>\n))\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-4 pi-w-4' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\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 queueName,\n queueNumber,\n throughQueue,\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 =\n 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 queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\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-${\n 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 {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\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 accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\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 <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\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","QueueBadge","label","tooltipContent","createElement","undefined","FontAwesomeIcon","icon","faUsers","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","username","streamingSourceNumber","queueName","queueNumber","throughQueue","_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","queueLabel","queueTooltipContent","renderLandlinePhoneDiv","useCallback","size","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 faUsers,\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(\n ({\n children,\n className = 'pi-gap-1 pi-grid-rows-2',\n }: {\n children: React.ReactNode\n className?: string\n }) => (\n <div className={`pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ${className}`}>\n {children}\n </div>\n ),\n)\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-4 pi-w-4' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\n\nconst IncomingQueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n aria-label={tooltipContent || label}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-3 pi-w-3 pi-flex-none' />\n <span className='pi-block pi-max-w-28 pi-truncate'>{label}</span>\n </span>\n )\n },\n)\nIncomingQueueBadge.displayName = 'IncomingQueueBadge'\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 queueName,\n queueNumber,\n throughQueue,\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 =\n 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 queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\n\n const shouldShowIncomingQueueBadge = useMemo(\n () => Boolean(incoming && !accepted && throughQueue && queueLabel),\n [accepted, incoming, throughQueue, queueLabel],\n )\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 = shouldShowIncomingQueueBadge ? 'pi-grid pi-items-center' : '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, shouldShowIncomingQueueBadge])\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 const itemsAlign = isOpen && !shouldShowIncomingQueueBadge ? 'start' : 'center'\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${itemsAlign} pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing, shouldShowIncomingQueueBadge])\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 if (shouldShowIncomingQueueBadge) {\n return (\n <Details className='pi-grid-rows-[20px_24px_24px] pi-gap-0.5'>\n <IncomingQueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n <DisplayName />\n <Number />\n </Details>\n )\n }\n\n return (\n <Details>\n {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\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 accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\n shouldShowIncomingQueueBadge,\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 <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","_b","className","React","createElement","concat","displayName","QueueBadge","label","tooltipContent","undefined","FontAwesomeIcon","icon","faUsers","IncomingQueueBadge","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","username","streamingSourceNumber","queueName","queueNumber","throughQueue","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","description","hasValidUsername","queueLabel","queueTooltipContent","shouldShowIncomingQueueBadge","renderLandlinePhoneDiv","useCallback","size","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","itemsAlign","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":"yiEAmCA,SAASA,EAAgBC,EAAmBC,GAC1C,OAAQD,IAAaC,CACvB,CAEA,IAAMC,EAAUC,EAAAA,MACd,SAACC,GACC,IAAAC,aACAC,EAAAF,EAAAG,UAAAA,OAAS,IAAAD,EAAG,0BAAyBA,EAIjC,OACJE,UAAKC,cAAA,MAAA,CAAAF,UAAW,oDAAAG,OAAoDH,IACjEF,EAFC,IAMRH,EAAQS,YAAc,UAEtB,IAAMC,EAAaT,EAAAA,MACjB,SAACC,OACCS,EAAKT,EAAAS,MACLC,EAAcV,EAAAU,eAKd,OAAKD,EAKHL,EACE,QAAAC,cAAA,OAAA,CAAAF,UAAU,sFAAqF,kBAC9EO,EAAiB,qBAAkBC,EAC9B,uBAAAD,GAAkB,IAExCN,UAAAC,cAACO,EAAAA,gBAAe,CAACC,KAAMC,EAAAA,QAASX,UAAU,mBATrC,IAYX,IAEFK,EAAWD,YAAc,aAEzB,IAAMQ,EAAqBhB,EAAAA,MACzB,SAACC,OACCS,EAAKT,EAAAS,MACLC,EAAcV,EAAAU,eAKd,OAAKD,EAKHL,EAAAA,8BACED,UAAU,6OACO,kBAAAO,EAAiB,qBAAkBC,EAC9B,uBAAAD,GAAkB,GAAE,aAC9BA,GAAkBD,GAE9BL,EAAC,QAAAC,cAAAO,mBAAgBC,KAAMC,UAASX,UAAU,+BAC1CC,EAAM,QAAAC,cAAA,OAAA,CAAAF,UAAU,oCAAoCM,IAX/C,IAcX,IAEFM,EAAmBR,YAAc,qBAKjC,IAwbeR,EAAAA,EAAAA,MAxbqB,iBAC1BiB,EAAMC,qBACRC,EAAWC,EAAAA,cAEXC,EAAcC,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMF,WAAN,IAEpDG,EAYEH,EAZMG,SACR1B,EAWEuB,EAAWvB,SAVbD,EAUEwB,EAVMxB,SACR4B,EASEJ,EAAWI,UARbC,EAQEL,EARIK,OACNC,EAOEN,EAAWM,OANbC,EAMEP,EANSO,YACXC,EAKER,EAAWQ,SAJbC,EAIET,EAJmBS,sBACrBC,EAGEV,EAAWU,UAFbC,EAEEX,EAFSW,YACXC,EACEZ,EAAWY,aAET9B,EAA8BmB,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMW,MAAM,IAA1EC,WAAQC,oBACRC,EAAsBf,eAAY,SAACC,GAAqB,OAAAA,EAAMe,4BAChEC,EAAcjB,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMiB,MAAN,IAC9CC,EAA+DF,WAArDG,EAAqDH,EAAWG,UAArDC,EAA0CJ,EAAzBI,kBAAEC,EAAuBL,qBACzDM,EAAevB,eAAY,SAACC,GAAqB,OAAAA,EAAMuB,eAC/DC,EAAczB,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMwB,WAAN,IAChDC,GAAiC1B,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAM0B,SAAS,IAAhFC,mBAAcC,mBAEhBC,GAAeC,EAAAA,SACnB,WAAM,OAAAC,OAAOC,OAAOV,GAAYW,QAAO,SAACC,GAAe,OAAAA,EAAMC,YAC7D,CAACb,IAGGc,GAAcN,EAAAA,SAClB,WAAM,OAACD,GAAaQ,OAAS,EAAIR,GAAaA,GAAaQ,OAAS,GAAK,IAAK,GAC9E,CAACR,KAGGS,GAA2BR,EAAOA,SACtC,WAAM,OAAAjB,GAAmBN,IAA0BhC,CAAQ,GAC3D,CAACsC,EAAiBN,EAAuBhC,IAIrCgE,GAAaT,EAAAA,SAAQ,WACzB,IAAKvB,IAA0BoB,GAAc,MAAO,CAAEa,WAAW,EAAOC,YAAa,IAErF,IAAMC,EAASX,OAAOC,OAAOL,IAAcgB,MACzC,SAACD,GAAW,OAAAA,aAAM,EAANA,EAAQE,aAAcrC,CAAqB,IAGnDiC,EAAYK,SAAQH,aAAM,EAANA,EAAQI,UAAsC,MAA3BJ,aAAA,EAAAA,EAAQI,QAAQC,SAI7D,MAAO,CAAEP,UAASA,EAAEC,YAFlBD,GAAaE,EAAS,GAAA1D,OAAGU,EAAE,oCAA2BgD,aAAM,EAANA,EAAQM,aAAgB,GAGjF,GAAE,CAACzC,EAAuBoB,GAAcjC,IAEnCuD,GAAmBnB,EAAAA,SAAQ,WAAM,MAAa,KAAbxB,GAAgC,cAAbA,IAA0B,CAACA,IAE/E4C,GAAapB,EAAAA,SAAQ,WAAM,OAAAtB,GAAaC,GAAe,KAAI,CAACD,EAAWC,IAEvE0C,GAAsBrB,EAAAA,SAAQ,WAClC,OAAKpB,GAAiBwC,GAIf,GAAAlE,OAAGU,EAAE,gBAAoB,MAAAV,OAAAkE,IAHvB,EAIV,GAAE,CAACxC,EAAcwC,GAAYxD,IAExB0D,GAA+BtB,EAAAA,SACnC,WAAM,OAAAe,QAAQ5C,IAAa1B,GAAYmC,GAAgBwC,GAAW,GAClE,CAAC3E,EAAU0B,EAAUS,EAAcwC,KAG/BG,GAAyBC,EAAAA,aAC7B,iBAAM,OACJxE,EAAA,QAAAC,cAAA,MAAA,CAAKF,UAAU,wGACbC,UAAAC,cAACO,EAAeA,gBAAA,CAACiE,KAAK,KAAKhE,KAAMiE,EAAaA,cAAE3E,UAAU,YAC1DC,EAAAA,QAAMC,cAAA,OAAA,CAAAF,UAAU,4BACc,QAA3BH,EAAA8C,aAAA,EAAAA,EAAaiC,sBAAc,IAAA/E,OAAA,EAAAA,EAAEsE,cAAetD,EAAE,0BAGpD,GACD,SAAChB,EAAA8C,aAAA,EAAAA,EAAaiC,qCAAgBT,YAAatD,IAGvCgE,GAAkBJ,eACtB,SAACK,GACC,IAAMC,EAAehD,EAA2B,kBAAlB,gBACxBiD,EAAoBjD,EAA2C,SAAlC,gCAC7BkD,EAAwBlD,EAA2B,gBAAlB,gBACjCmD,EAAyB,QAAVJ,EAAkB,gBAAkB,kBACnDK,EAA6B,QAAVL,EAAkB,kBAAoB,oBAE/D,OACE7E,EAAK,QAAAC,cAAA,MAAA,CAAAF,UAAW,GAAAG,OAAG4E,EAAuD,+CACxE9E,UAAAC,cAAA,MAAA,CACEF,UAAW,GAAGG,OAAA6E,EAAiG,oFAE/G/E,EAAAA,QAAAC,cAAA,OAAA,CACEF,UAAW,GAAAG,OAAG8E,EAAmF,gEAAA9E,OAAA+E,sBAEnGjF,EAAAA,QAAAC,cAACO,kBAAe,CACdT,UAAW,qCAA8BmF,GACzCzE,KAAM0E,cAKhB,GACA,CAACrD,IAGGsD,GAAkBpC,EAAAA,SAAQ,WAC9B,IAAIqC,EAAc,0BAclB,OAZIvD,IACFuD,EAAcf,GAA+B,0BAA4B,yBAErE7E,EACF4F,GAAe,2BACNlE,EACTkE,GAAe,8BACN7F,IACT6F,GAAe,6BAIZ7B,GAA2B,sBAAwB6B,CAC5D,GAAG,CAACvD,EAAQrC,EAAU0B,EAAU3B,EAAUgE,GAA0Bc,KAE9DgB,GAAoBtC,EAAAA,SAAQ,WAChC,IAcMuC,EAAazD,IAAWwC,GAA+B,QAAU,SAEvE,MAAO,WAAWpE,OAdd4B,IAAWrC,GAAYD,EACf,0BACDsC,IAAWrC,GAAY0B,EACtB,8BACDW,GAAUrC,EACT,iCACAqC,GAAWrC,EAGX,gCAFA,4BAOwB,YAAAS,OAAA4B,EAAS,IAAM,IAAgB,cAAA5B,OAAAqF,iCACrE,GAAG,CAACzD,EAAQrC,EAAU0B,EAAU3B,EAAU8E,KAEpCkB,GAAiBxC,EAAAA,SAAQ,WAC7B,OAAIQ,GAAiC,iBACjCjE,EAAgBC,EAAUC,GAAkB,iBAC5CA,EAAiB,yCACd,qCACR,GAAE,CAAC+D,GAA0BhE,EAAUC,IAElCgG,GAAmBjB,EAAAA,aAAY,WACnC,IAAMkB,EAAgB5D,EAClB,gEACA,8DAEJ,OAAIM,EACKpC,EAAA,QAAAC,cAACO,kBAAe,CAACT,UAAW2F,EAAejF,KAAMkF,EAAWA,cAGjEtD,EACKrC,EAAA,QAAAC,cAACO,kBAAe,CAACT,UAAW2F,EAAejF,KAAMmF,EAAaA,gBAGxD,KAAXtE,GAAiB6C,GACZnE,UAAAC,cAAC4F,EAAM,QAAA,MAGZ1E,IAAagD,GACRnE,EAAC,QAAAC,cAAAO,kBAAgB,CAAAT,UAAW,GAAAG,OAAGwF,EAAa,kBAAkBjF,KAAMqF,EAAAA,eAGzErG,GAAaD,GAAa2E,GAI1B3E,IAAa2E,GAEbnE,EAAA,QAAAC,cAACO,kBAAe,CAACT,UAAW,GAAAG,OAAGwF,EAAa,uBAAuBjF,KAAMqF,EAAAA,cAItE,KATE9F,EAAC,QAAAC,cAAAO,kBAAgB,CAAAT,UAAW,GAAAG,OAAGwF,EAAa,kBAAkBjF,KAAMqF,EAAAA,aAU/E,GAAG,CAAChE,EAAQM,EAAUC,EAAWf,EAAQ6C,GAAkBhD,EAAU3B,EAAUC,IAEzEsG,GAAgBvB,EAAAA,aAAY,WAChC,OAAK1C,EAEDO,EAEArC,wBAACN,EAAO,KACNM,EAAAA,QAAMC,cAAA,OAAA,CAAAF,UAAU,oFACba,EAAE,kBACF2B,EAAqB,MAAMrC,OAAAqC,GAAuB,IAEpD9C,EACEuG,EAAUA,aAGTzB,KAFAvE,wBAACiG,UAAK,CAAC7E,UAAWA,EAAW8E,kBAAgB,IAI7C3D,EACF,UAAGA,OAQPH,EAEApC,wBAACN,EAAO,KACNM,EAAAA,QAAMC,cAAA,OAAA,CAAAF,UAAU,oFACba,EAAE,iBACF0B,EAAoB,MAAMpC,OAAAoC,GAAsB,IAElD7C,EACEuG,EAAUA,aAGTzB,KAFAvE,wBAACiG,UAAK,CAAC7E,UAAWA,EAAW8E,kBAAgB,IAI7C5D,EACF,UAAGA,OAQPgC,GAEAtE,EAAC,QAAAC,cAAAP,EAAQ,CAAAK,UAAU,4CACjBC,EAAC,QAAAC,cAAAU,GAAmBN,MAAO+D,GAAY9D,eAAgB+D,KACvDrE,UAAAC,cAACkG,EAAW,QAAG,MACfnG,EAAAA,QAAAC,cAACmG,UAAM,OAMXpG,wBAACN,EAAO,KACLD,GAAYmC,GAAgBwC,GAC3BpE,EAAA,QAAAC,cAAA,MAAA,CAAKF,UAAU,+CACbC,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAU,wBACbC,EAAAA,QAACC,cAAAkG,iBAEHnG,EAAAA,QAAAC,cAACG,EAAW,CAAAC,MAAO+D,GAAY9D,eAAgB+D,MAGjDrE,EAAC,QAAAC,cAAAkG,EAAW,cAEb1G,EACEuG,EAAUA,aAGTzB,KAFAvE,EAAC,QAAAC,cAAAgG,WAAM7E,UAAWA,EAAW8E,kBAAmB,IAKlDlG,EAAAA,QAACC,cAAAmG,EAAM,eA3EO,IA+EtB,GAAG,CACDtE,EACAO,EACAD,EACA3C,EACA2B,EACAmB,EACAD,EACA1B,EACA2D,GACA9E,EACAmC,EACAwC,GACAC,GACAC,KAGI+B,GAAuB7B,EAAAA,aAAY,WACvC,OAAI/E,GAAY8B,EACPqD,GAAgB,OAGrBnF,GAAYuC,IAAsBgE,EAAAA,aAElChG,EAAC,QAAAC,cAAAqG,YACC,CAAAC,YAAavE,EACbX,OAAQA,EACRoD,KAAM3C,EAAS,QAAU,UAK3BrC,GAAYuG,EAAAA,aACPpB,GAAgB,SAGlB,IACT,GAAG,CAACnF,EAAU8B,EAAaS,EAAmBF,EAAQT,EAAQuD,KAExD4B,GAAyBhC,EAAAA,aAAY,WAEzC,IAAK3B,IAAqD,IAArCI,OAAOwD,KAAK5D,IAAcU,SAAiB9B,EAC9D,OAAOzB,EAAAA,sBAAC0G,EAAAA,QAAsB,CAAC3G,UAAU,8BAI3C,IAAM6D,EAASX,OAAOC,OAAOL,IAAcgB,MACzC,SAACD,GAAW,OAAAA,EAAOE,YAAcrC,CAAqB,IAIxD,OAAKmC,IAKYd,GAAac,EAAO+C,KAAO/C,EAAOgD,OAQ5C5G,UAAAC,cAAC4G,EAAc,QAAA,MAZb7G,EAAAA,sBAAC8G,EAAAA,QAAwB,CAAC/G,UAAU,6BAa9C,GAAE,CAAC0B,EAAuBoB,GAAcC,KAGzC,GAAoB,OAAhBQ,GACF,OAAO,KAWT,OACEtD,EAAA,QAAAC,cAAA,MAAA,CAAKF,UAAU,iDACbC,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAWqF,IACb5B,GACCxD,UAAAC,cAAAD,EAAA,QAAA+G,SAAA,KACE/G,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAU,8CACbC,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAU,oCACZ0F,KACDzF,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAU,sDACbC,UAAAC,cAACkG,EAAW,QAAG,MACfnG,EAAAA,QAACC,cAAAmG,UAAS,QAIdpG,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAU,oBACbC,EAAC,QAAAC,cAAA+G,WAAO9C,YAAatD,EAAE,qBACrBpB,GACAQ,EAAC,QAAAC,cAAAgH,EAAAA,OACC,CAAAC,QAAS,WAAM,OAzB/BC,EAAAA,0BAEAC,YAAW,WACTtG,EAASe,OAAOwF,cAAc,kBAC/B,GAAE,IAqBqD,EACxCC,QAAQ,QACQ,kBAAA,iBACM,uBAAA1G,EAAE,mBAAqB,IAE7CZ,UAACC,cAAAO,EAAAA,gBAAgB,CAAAT,UAAU,gBAAgBU,KAAM8G,cAIpD9D,cAAU,EAAVA,GAAYC,YACX1D,EAAA,QAAAC,cAACgH,EAAAA,OAAM,CACLK,QAAQ,UACRJ,QAASM,EAAAA,sBAAqB,kBACd,iBAAgB,uBACV/D,cAAU,EAAVA,GAAYE,aAElC3D,UAAAC,cAACO,EAAeA,gBAAA,CAACT,UAAU,gBAAgBU,KAAMgH,EAAQA,cAMhEjB,MAGHxG,EAAA,QAAAC,cAAAD,EAAA,QAAA+G,SAAA,KACE/G,EAAAA,QAAKC,cAAA,MAAA,CAAAF,UAAWuF,IACbG,KACAM,MAECjE,IAAWrC,GAAYO,EAAA,QAAAC,cAACkG,EAAW,QAAG,OACtCrE,GAAUrC,GAAYO,EAAC,QAAAC,cAAAgG,EAAAA,QAAM,CAAA7E,UAAWA,EAAW8E,kBAAmB,IAEvEG,MAGFvE,GACC9B,EAAAA,QAAAC,cAAAD,EAAA,QAAA+G,SAAA,KACE/G,EAAAA,QAAAC,cAAA,MAAA,CAAKF,UAAW,GAAAG,OAAKkC,GAAYC,EAAoC,GAAvB,uBAC3C5C,GAAYO,EAAC,QAAAC,cAAAyH,EAAAA,QAAU,MACxB1H,UAAAC,cAAA,MAAA,CAAKF,UAAW,WAAWG,OAAAsF,GAA2B,gBACpDxF,EAAC,QAAAC,cAAA+G,WAAO9C,YAAatD,EAAE,iCAEtBrB,EAAgBC,EAAUC,IACzBO,EAAA,QAAAC,cAACgH,EAAAA,OAAM,CACLC,QAASC,EAAAA,mBACTG,QAAQ,QACQ,kBAAA,sBACM,uBAAA1G,EAAE,mBAAqB,IAE7CZ,EAAAA,QAAAC,cAACO,EAAAA,gBAAgB,CAAAT,UAAU,gBAAgBU,KAAM8G,EAAOA,gBAU1EvH,EAAC,QAAAC,cAAA0H,uBAAoBhB,GAAG,sBAAsBiB,MAAM,SACpD5H,EAAC,QAAAC,cAAA0H,uBAAoBhB,GAAG,iBAAiBiB,MAAM,SAC/C5H,EAAC,QAAAC,cAAA0H,uBAAoBhB,GAAG,iBAAiBiB,MAAM,SAC/C5H,EAAC,QAAAC,cAAA0H,uBAAoBhB,GAAG,uBAAuBiB,MAAM,WACrD5H,UAAAC,cAAC0H,EAAAA,oBAAmB,CAAChB,GAAG,gBAAgBiB,MAAM,WAGpD"}
|
|
@@ -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 i=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var t=require("../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var i=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var t=require("../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(e),h=function(a){var h=a.children,r=d.useSelector((function(e){return e.currentCall})),s=r.incoming,o=r.outgoing,c=r.accepted,l=r.transferring,g=r.incomingWebRTC,p=r.incomingSocket,u=r.conferencing,w=r.throughQueue,x=r.queueName,f=r.queueNumber,m=d.useSelector((function(e){return e.listen})).isListen,v=d.useSelector((function(e){return e.island})),b=v.view,_=v.isOpen,y=v.actionsExpanded,k=v.sideViewIsVisible,S=v.transcriptionViewIsVisible,A=v.isFromStreaming,j=v.isExtraLarge,q=d.useSelector((function(e){return e.alerts.status})).activeAlertsCount,C=d.useSelector((function(e){return e.motions})),E=C.variants,B=C.border_radius_collapsed,D=C.border_radius_expanded,L=C.border_radius_collapsed_conference,I=C.padding_x_collapsed,V=C.padding_y_collapsed,M=C.padding_expanded,N=C.alert_padding_expanded,O=d.useSelector((function(e){return e.conference})).isActive,Q=e.useMemo((function(){var e={width:0,height:0,padding:M};switch(b){case"call":if(_)if(c&&l&&u)e=y?{width:E.call.expanded.transfer.actionsExpanded.width,height:E.call.expanded.transfer.actionsExpanded.height}:{width:E.call.expanded.transfer.width,height:E.call.expanded.transfer.height};else if(c&&y)e={width:E.call.expanded.accepted.actionsExpanded.width,height:E.call.expanded.accepted.actionsExpanded.height};else if(c&&!m)e={width:E.call.expanded.accepted.width,height:E.call.expanded.accepted.height};else if(c&&m)e={width:E.call.expanded.listening.width,height:E.call.expanded.listening.height};else if(s&&!A){e=s&&!c&&w&&Boolean(x||f)?{width:E.call.expanded.incomingQueue.width,height:E.call.expanded.incomingQueue.height}:{width:E.call.expanded.incoming.width,height:E.call.expanded.incoming.height}}else s&&A?e={width:E.call.expanded.incomingStreaming.width,height:E.call.expanded.incomingStreaming.height}:o&&!A?e={width:E.call.expanded.outgoing.width,height:E.call.expanded.outgoing.height}:o&&A&&(e={width:E.call.expanded.outgoingStreaming.width,height:E.call.expanded.outgoingStreaming.height});else e={width:E.call.collapsed.width,height:E.call.collapsed.height};break;case"keypad":e=_?{width:E.keypad.expanded.width,height:E.keypad.expanded.height}:{width:E.transfer.collapsed.width,height:E.transfer.collapsed.height};break;case"video":e=_?{width:E.video.expanded.width,height:E.video.expanded.height,padding:E.video.expanded.padding}:{width:E.video.collapsed.width,height:E.video.collapsed.height};break;case"transfer":case"player":case"recorder":case"physicalPhoneRecorder":case"settings":case"conference":e=_?{width:E[b].expanded.width,height:E[b].expanded.height}:{width:E[b].collapsed.width,height:E[b].collapsed.height};break;case"switchDevice":e=_?{width:E.switchDevice.expanded.width,height:E.switchDevice.expanded.height}:{width:E.video.collapsed.width,height:E.video.collapsed.height};break;case"waitingConference":e=_?{width:E.waitingConference.expanded.width,height:E.waitingConference.expanded.height}:{width:E.waitingConference.collapsed.width,height:E.waitingConference.collapsed.height};break;case"streamingAnswer":e=_?j?{width:E.streamingAnswer.extraLarge.width,height:E.streamingAnswer.extraLarge.height,padding:E.streamingAnswer.extraLarge.padding}:{width:E.streamingAnswer.expanded.width,height:E.streamingAnswer.expanded.height,padding:E.streamingAnswer.expanded.padding}:{width:E.streamingAnswer.collapsed.width,height:E.streamingAnswer.collapsed.height};break;case"operatorBusy":e=_?{width:E.operatorBusy.expanded.width,height:E.operatorBusy.expanded.height}:{width:E.operatorBusy.collapsed.width,height:E.operatorBusy.collapsed.height}}var i=q>0;return{width:"".concat(0===e.width&&i?E.alerts.width:e.width,"px"),height:"".concat(i&&_?E.alerts.height+(0===e.height?2*N:N):e.height,"px"),borderRadius:"".concat(_?D:O&&"waitingConference"===b?L:B,"px"),padding:_?null!=e.padding?"".concat(e.padding,"px"):"".concat(M,"px"):"".concat(I,"px ").concat(V,"px")}}),[b,_,c,l,y,m,s,o,q,E,B,D,I,V,M,N,g,p,O,A,j,w,x,f]);return e.useEffect((function(){var e={};e.width=null==Q?void 0:Q.width,e.height=null==Q?void 0:Q.height,i.eventDispatch("phone-island-size-change",{sizeInformation:e})}),[Q,b,_,c,l,y,m,s,o,q,E,B,D,I,V,M,N,k,S,p,g,O,j]),n.default.createElement(t.motion.div,{className:"".concat(_?"pi-cursor-grab":"pi-cursor-pointer"," pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow"),animate:Q,transition:{duration:.15,ease:"easeOut"}},h)};exports.IslandMotion=h,exports.default=h;
|
|
2
2
|
//# sourceMappingURL=IslandMotion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useMemo, useEffect } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\nimport { eventDispatch } from '../utils'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const {\n incoming,\n outgoing,\n accepted,\n transferring,\n incomingWebRTC,\n incomingSocket,\n conferencing,\n } = useSelector((state: RootState) => state.currentCall)\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded, sideViewIsVisible,transcriptionViewIsVisible, isFromStreaming, isExtraLarge } = useSelector(\n (state: RootState) => state.island,\n )\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n border_radius_collapsed_conference,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n const motionVariants = useMemo(() => {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n padding: padding_expanded,\n }\n\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring && conferencing) {\n if (actionsExpanded) {\n size = {\n width: variants.call.expanded.transfer.actionsExpanded.width,\n height: variants.call.expanded.transfer.actionsExpanded.height,\n }\n } else {\n size = {\n width: variants.call.expanded.transfer.width,\n height: variants.call.expanded.transfer.height,\n }\n }\n } else if (accepted && actionsExpanded) {\n size = {\n width: variants.call.expanded.accepted.actionsExpanded.width,\n height: variants.call.expanded.accepted.actionsExpanded.height,\n }\n } else if (accepted && !isListen) {\n size = {\n width: variants.call.expanded.accepted.width,\n height: variants.call.expanded.accepted.height,\n }\n } else if (accepted && isListen) {\n size = {\n width: variants.call.expanded.listening.width,\n height: variants.call.expanded.listening.height,\n }\n } else if (incoming && !isFromStreaming) {\n size = {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (incoming && isFromStreaming) {\n size = {\n width: variants.call.expanded.incomingStreaming.width,\n height: variants.call.expanded.incomingStreaming.height,\n }\n } else if (outgoing && !isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n } else if (outgoing && isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoingStreaming.width,\n height: variants.call.expanded.outgoingStreaming.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n\n case 'keypad':\n size = isOpen\n ? {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n : {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n break\n\n case 'video':\n if (isOpen) {\n size = {\n width: variants.video.expanded.width,\n height: variants.video.expanded.height,\n padding: variants.video.expanded.padding,\n }\n } else {\n size = {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n }\n break\n case 'transfer':\n case 'player':\n case 'recorder':\n case 'physicalPhoneRecorder':\n case 'settings':\n case 'conference':\n size = isOpen\n ? {\n width: variants[view].expanded.width,\n height: variants[view].expanded.height,\n }\n : {\n width: variants[view].collapsed.width,\n height: variants[view].collapsed.height,\n }\n break\n\n case 'switchDevice':\n size = isOpen\n ? {\n width: variants.switchDevice.expanded.width,\n height: variants.switchDevice.expanded.height,\n }\n : {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n break\n\n case 'waitingConference':\n size = isOpen\n ? {\n width: variants.waitingConference.expanded.width,\n height: variants.waitingConference.expanded.height,\n }\n : {\n width: variants.waitingConference.collapsed.width,\n height: variants.waitingConference.collapsed.height,\n }\n break\n case 'streamingAnswer':\n size = isOpen\n ? isExtraLarge\n ? {\n width: variants.streamingAnswer.extraLarge.width,\n height: variants.streamingAnswer.extraLarge.height,\n padding: variants.streamingAnswer.extraLarge.padding,\n }\n : {\n width: variants.streamingAnswer.expanded.width,\n height: variants.streamingAnswer.expanded.height,\n padding: variants.streamingAnswer.expanded.padding,\n }\n : {\n width: variants.streamingAnswer.collapsed.width,\n height: variants.streamingAnswer.collapsed.height,\n }\n break\n case 'operatorBusy':\n size = isOpen\n ? {\n width: variants.operatorBusy.expanded.width,\n height: variants.operatorBusy.expanded.height,\n }\n : {\n width: variants.operatorBusy.collapsed.width,\n height: variants.operatorBusy.collapsed.height,\n }\n break\n }\n\n const isAlert: boolean = activeAlertsCount > 0\n\n return {\n width: `${size.width === 0 && isAlert ? variants.alerts.width : size.width}px`,\n height: `${\n // If there is an alert and the island is open put the correct height\n isAlert && isOpen\n ? variants.alerts.height +\n (size.height === 0 ? alert_padding_expanded * 2 : alert_padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen\n ? `${border_radius_expanded}px`\n : isActive && view === 'waitingConference'\n ? `${border_radius_collapsed_conference}px`\n : `${border_radius_collapsed}px`,\n padding: isOpen\n ? size.padding != undefined\n ? `${size.padding}px`\n : `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }, [\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n incomingWebRTC,\n incomingSocket,\n isActive,\n isFromStreaming,\n isExtraLarge\n ])\n\n useEffect(() => {\n let sizeInformation: any = {}\n sizeInformation.width = motionVariants?.width\n sizeInformation.height = motionVariants?.height\n eventDispatch('phone-island-size-change', {\n sizeInformation,\n })\n }, [\n motionVariants,\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n sideViewIsVisible,\n transcriptionViewIsVisible,\n incomingSocket,\n incomingWebRTC,\n isActive,\n isExtraLarge,\n ])\n\n return (\n <motion.div\n className={`${isOpen ? 'pi-cursor-grab' : 'pi-cursor-pointer'\n } pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow`}\n animate={motionVariants}\n transition={{\n duration: 0.15,\n ease: 'easeOut',\n }}\n >\n {children}\n </motion.div>\n )\n}\n\ninterface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n padding?: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","incomingWebRTC","incomingSocket","conferencing","isListen","listen","_c","island","view","isOpen","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","isFromStreaming","isExtraLarge","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","border_radius_collapsed_conference","padding_x_collapsed","padding_y_collapsed","padding_expanded","alert_padding_expanded","isActive","conference","motionVariants","useMemo","size","width","height","padding","call","expanded","transfer","listening","incomingStreaming","outgoingStreaming","collapsed","keypad","video","switchDevice","waitingConference","streamingAnswer","extraLarge","operatorBusy","isAlert","concat","borderRadius","undefined","useEffect","sizeInformation","eventDispatch","React","createElement","motion","div","className","animate","transition","duration","ease"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useMemo, useEffect } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\nimport { eventDispatch } from '../utils'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const {\n incoming,\n outgoing,\n accepted,\n transferring,\n incomingWebRTC,\n incomingSocket,\n conferencing,\n throughQueue,\n queueName,\n queueNumber,\n } = useSelector((state: RootState) => state.currentCall)\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded, sideViewIsVisible,transcriptionViewIsVisible, isFromStreaming, isExtraLarge } = useSelector(\n (state: RootState) => state.island,\n )\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n border_radius_collapsed_conference,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n const motionVariants = useMemo(() => {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n padding: padding_expanded,\n }\n\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring && conferencing) {\n if (actionsExpanded) {\n size = {\n width: variants.call.expanded.transfer.actionsExpanded.width,\n height: variants.call.expanded.transfer.actionsExpanded.height,\n }\n } else {\n size = {\n width: variants.call.expanded.transfer.width,\n height: variants.call.expanded.transfer.height,\n }\n }\n } else if (accepted && actionsExpanded) {\n size = {\n width: variants.call.expanded.accepted.actionsExpanded.width,\n height: variants.call.expanded.accepted.actionsExpanded.height,\n }\n } else if (accepted && !isListen) {\n size = {\n width: variants.call.expanded.accepted.width,\n height: variants.call.expanded.accepted.height,\n }\n } else if (accepted && isListen) {\n size = {\n width: variants.call.expanded.listening.width,\n height: variants.call.expanded.listening.height,\n }\n } else if (incoming && !isFromStreaming) {\n const showIncomingQueueBadge =\n incoming && !accepted && throughQueue && Boolean(queueName || queueNumber)\n size = showIncomingQueueBadge\n ? {\n width: variants.call.expanded.incomingQueue.width,\n height: variants.call.expanded.incomingQueue.height,\n }\n : {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (incoming && isFromStreaming) {\n size = {\n width: variants.call.expanded.incomingStreaming.width,\n height: variants.call.expanded.incomingStreaming.height,\n }\n } else if (outgoing && !isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n } else if (outgoing && isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoingStreaming.width,\n height: variants.call.expanded.outgoingStreaming.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n\n case 'keypad':\n size = isOpen\n ? {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n : {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n break\n\n case 'video':\n if (isOpen) {\n size = {\n width: variants.video.expanded.width,\n height: variants.video.expanded.height,\n padding: variants.video.expanded.padding,\n }\n } else {\n size = {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n }\n break\n case 'transfer':\n case 'player':\n case 'recorder':\n case 'physicalPhoneRecorder':\n case 'settings':\n case 'conference':\n size = isOpen\n ? {\n width: variants[view].expanded.width,\n height: variants[view].expanded.height,\n }\n : {\n width: variants[view].collapsed.width,\n height: variants[view].collapsed.height,\n }\n break\n\n case 'switchDevice':\n size = isOpen\n ? {\n width: variants.switchDevice.expanded.width,\n height: variants.switchDevice.expanded.height,\n }\n : {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n break\n\n case 'waitingConference':\n size = isOpen\n ? {\n width: variants.waitingConference.expanded.width,\n height: variants.waitingConference.expanded.height,\n }\n : {\n width: variants.waitingConference.collapsed.width,\n height: variants.waitingConference.collapsed.height,\n }\n break\n case 'streamingAnswer':\n size = isOpen\n ? isExtraLarge\n ? {\n width: variants.streamingAnswer.extraLarge.width,\n height: variants.streamingAnswer.extraLarge.height,\n padding: variants.streamingAnswer.extraLarge.padding,\n }\n : {\n width: variants.streamingAnswer.expanded.width,\n height: variants.streamingAnswer.expanded.height,\n padding: variants.streamingAnswer.expanded.padding,\n }\n : {\n width: variants.streamingAnswer.collapsed.width,\n height: variants.streamingAnswer.collapsed.height,\n }\n break\n case 'operatorBusy':\n size = isOpen\n ? {\n width: variants.operatorBusy.expanded.width,\n height: variants.operatorBusy.expanded.height,\n }\n : {\n width: variants.operatorBusy.collapsed.width,\n height: variants.operatorBusy.collapsed.height,\n }\n break\n }\n\n const isAlert: boolean = activeAlertsCount > 0\n\n return {\n width: `${size.width === 0 && isAlert ? variants.alerts.width : size.width}px`,\n height: `${\n // If there is an alert and the island is open put the correct height\n isAlert && isOpen\n ? variants.alerts.height +\n (size.height === 0 ? alert_padding_expanded * 2 : alert_padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen\n ? `${border_radius_expanded}px`\n : isActive && view === 'waitingConference'\n ? `${border_radius_collapsed_conference}px`\n : `${border_radius_collapsed}px`,\n padding: isOpen\n ? size.padding != undefined\n ? `${size.padding}px`\n : `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }, [\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n incomingWebRTC,\n incomingSocket,\n isActive,\n isFromStreaming,\n isExtraLarge,\n throughQueue,\n queueName,\n queueNumber,\n ])\n\n useEffect(() => {\n let sizeInformation: any = {}\n sizeInformation.width = motionVariants?.width\n sizeInformation.height = motionVariants?.height\n eventDispatch('phone-island-size-change', {\n sizeInformation,\n })\n }, [\n motionVariants,\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n sideViewIsVisible,\n transcriptionViewIsVisible,\n incomingSocket,\n incomingWebRTC,\n isActive,\n isExtraLarge,\n ])\n\n return (\n <motion.div\n className={`${isOpen ? 'pi-cursor-grab' : 'pi-cursor-pointer'\n } pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow`}\n animate={motionVariants}\n transition={{\n duration: 0.15,\n ease: 'easeOut',\n }}\n >\n {children}\n </motion.div>\n )\n}\n\ninterface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n padding?: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","incomingWebRTC","incomingSocket","conferencing","throughQueue","queueName","queueNumber","isListen","listen","_c","island","view","isOpen","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","isFromStreaming","isExtraLarge","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","border_radius_collapsed_conference","padding_x_collapsed","padding_y_collapsed","padding_expanded","alert_padding_expanded","isActive","conference","motionVariants","useMemo","size","width","height","padding","call","expanded","transfer","listening","Boolean","incomingQueue","incomingStreaming","outgoingStreaming","collapsed","keypad","video","switchDevice","waitingConference","streamingAnswer","extraLarge","operatorBusy","isAlert","concat","borderRadius","undefined","useEffect","sizeInformation","eventDispatch","React","createElement","motion","div","className","animate","transition","duration","ease"],"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"),t=require("react"),r=require("../Button.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../../services/offhour.js");require("../../node_modules/react-redux/es/index.js");var s=require("../../lib/phone/call.js"),a=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../store/index.js");var c=require("../../events/RecorderEvents.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 d=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var u=require("../CustomThemedTooltip.js"),p=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),m=require("../../node_modules/react-redux/es/utils/shallowEqual.js");require("../../node_modules/
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../Button.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../../services/offhour.js");require("../../node_modules/react-redux/es/index.js");var s=require("../../lib/phone/call.js"),a=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../store/index.js");var c=require("../../events/RecorderEvents.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 d=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var u=require("../CustomThemedTooltip.js"),p=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),m=require("../../node_modules/react-redux/es/utils/shallowEqual.js");require("../../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../../node_modules/react-redux/node_modules/react-is/index.js");var f=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),g=require("../../node_modules/react-redux/es/hooks/useSelector.js");function h(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=h(t);exports.Actions=function(){var h=f.useDispatch(),w=g.useSelector((function(e){return{incoming:e.recorder.incoming,waiting:e.recorder.waiting,recording:e.recorder.recording,recorded:e.recorder.recorded,playing:e.recorder.playing}}),m.default),j=w.incoming,x=w.waiting,q=w.recording,E=w.recorded,y=w.playing;function _(){return e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return h.recorder.setRecording(!0),h.recorder.setWaiting(!0),[4,n.startAnnouncementRecording()];case 1:return(t=e.sent()).tempFilename&&h.recorder.setTempFilename(t.tempFilename),h.recorder.setStartTime("".concat(Date.now()/1e3)),l.eventDispatch("phone-island-recording-started",{}),[2]}}))}))}function T(){h.recorder.setWaiting(!0),s.hangupCurrentCall(),h.recorder.setRecorded(!0),l.eventDispatch("phone-island-recording-stopped",{})}function b(){y&&(h.player.pauseAudioPlayer(),h.recorder.setPlaying(!1),h.recorder.setPaused(!0)),c.dispatchRecordingSave(),h.island.setIslandView(null)}a.useEventListener("phone-island-recording-start",(function(e){_()})),a.useEventListener("phone-island-recording-stop",(function(e){T()})),a.useEventListener("phone-island-recording-save",(function(e){b()})),t.useEffect((function(){q||h.recorder.setWaiting(!1)}),[q]),t.useEffect((function(){j&&(s.answerIncomingCall(),h.recorder.setIncoming(!1),h.recorder.setWaiting(!1))}),[j]);var C=d.useTranslation().t;return v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-px-6 pi-py-2 pi-gap-0 pi-w-full pi-mt-auto"},v.default.createElement(r.Button,{variant:"transparent",disabled:!0,className:"pi-w-6 pi-h-6 pi-flex pi-items-center pi-justify-center pi-flex-none"},v.default.createElement(i.FontAwesomeIcon,{icon:o.faDownLeftAndUpRightToCenter,className:"pi-w-6 pi-h-6"})),v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-flex-grow"},q&&v.default.createElement(r.Button,{onClick:T,variant:"default",className:"pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center","data-tooltip-id":"tooltip-stop-recorder-view","data-tooltip-content":C("Tooltip.Stop")||""},x?v.default.createElement(i.FontAwesomeIcon,{icon:o.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):v.default.createElement(i.FontAwesomeIcon,{icon:o.faStop,size:"xl"})),E&&!q&&v.default.createElement(r.Button,{onClick:b,variant:"default",className:"pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center","data-tooltip-id":"tooltip-confirm-record-view","data-tooltip-content":C("Tooltip.Confirm")||""},v.default.createElement(i.FontAwesomeIcon,{icon:o.faFloppyDisk,className:"pi-h-6 pi-w-6"})),!q&&!E&&v.default.createElement(r.Button,{onClick:_,variant:"default",className:"pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center","data-tooltip-id":"tooltip-start-recording-recorder-view","data-tooltip-content":C("Tooltip.Start recording")||""},x?v.default.createElement(i.FontAwesomeIcon,{icon:o.faCircleNotch,className:"fa-spin pi-loader",size:"lg"}):v.default.createElement(i.FontAwesomeIcon,{icon:p.faRecord,className:"pi-h-6 pi-w-6"}))),v.default.createElement("div",{onClick:function(){return h.island.setIslandView("settings")},"data-tooltip-id":"tooltip-settings-view-recorder","data-tooltip-content":C("Tooltip.Go to settings")||"",className:"pi-flex pi-items-center pi-justify-center pi-cursor-pointer pi-text-gray-700 dark:pi-text-gray-200 pi-w-6 pi-h-6 pi-flex-none"},v.default.createElement(i.FontAwesomeIcon,{icon:o.faGear,className:"pi-h-6 pi-w-6"})),v.default.createElement(u.CustomThemedTooltip,{id:"tooltip-start-recording-recorder-view",place:"top"}),v.default.createElement(u.CustomThemedTooltip,{id:"tooltip-stop-recorder-view",place:"top"}),v.default.createElement(u.CustomThemedTooltip,{id:"tooltip-confirm-record-view",place:"top"}),v.default.createElement(u.CustomThemedTooltip,{id:"tooltip-settings-view-recorder",place:"top"}))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/RecorderView/Actions.tsx"],"sourcesContent":["//\n// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n//\n\nimport React, { type FC, useEffect } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faStop,\n faCircleNotch,\n faGear,\n faDownLeftAndUpRightToCenter,\n faFloppyDisk,\n} from '@fortawesome/free-solid-svg-icons'\nimport { startAnnouncementRecording } from '../../services/offhour'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport { dispatchRecordingSave } from '../../events'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { faRecord } from '@nethesis/nethesis-solid-svg-icons'\n\nexport const Actions: FC<{}> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { incoming, waiting, recording, recorded, playing } = useSelector(\n (state: RootState) => ({\n incoming: state.recorder.incoming,\n waiting: state.recorder.waiting,\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n playing: state.recorder.playing,\n }),\n shallowEqual,\n )\n\n async function handleStart() {\n // Update the recorder state\n dispatch.recorder.setRecording(true)\n dispatch.recorder.setWaiting(true)\n // Call the api to start the recording call\n const data: { tempFilename: string } | null = await startAnnouncementRecording()\n // Set the returned temp file name to the store\n if (data.tempFilename) dispatch.recorder.setTempFilename(data.tempFilename)\n // Set the start time of recording\n dispatch.recorder.setStartTime(`${Date.now() / 1000}`)\n eventDispatch('phone-island-recording-started', {})\n }\n useEventListener('phone-island-recording-start', (data: {}) => {\n handleStart()\n })\n\n function handleStop() {\n // Set waiting to true\n dispatch.recorder.setWaiting(true)\n // Call the function to hangup the current call used for recording\n hangupCurrentCall()\n dispatch.recorder.setRecorded(true)\n eventDispatch('phone-island-recording-stopped', {})\n }\n useEventListener('phone-island-recording-stop', (data: {}) => {\n handleStop()\n })\n\n function handleSaveRecording() {\n // check if the audio is playing and pause it\n if (playing) {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n }\n // Dispatch the reconrding save event\n dispatchRecordingSave()\n // Close the Island\n dispatch.island.setIslandView(null)\n }\n useEventListener('phone-island-recording-save', (data: {}) => {\n handleSaveRecording()\n })\n\n useEffect(() => {\n if (!recording) {\n dispatch.recorder.setWaiting(false)\n }\n }, [recording])\n\n useEffect(() => {\n if (incoming) {\n // Answer the incoming call for recording\n answerIncomingCall()\n // Reset incoming to recorder state\n dispatch.recorder.setIncoming(false)\n dispatch.recorder.setWaiting(false)\n }\n }, [incoming])\n\n const { t } = useTranslation()\n\n return (\n <div\n className={`pi-flex pi-items-center pi-justify-between pi-px-6 pi-py-2 pi-gap-0 pi-w-full pi-mt-auto`}\n >\n <Button\n variant='transparent'\n disabled\n className='pi-w-6 pi-h-6 pi-flex pi-items-center pi-justify-center pi-flex-none'\n >\n <FontAwesomeIcon icon={faDownLeftAndUpRightToCenter} className='pi-w-6 pi-h-6' />\n </Button>\n\n <div className='pi-flex pi-items-center pi-justify-center pi-flex-grow'>\n {recording && (\n <Button\n onClick={handleStop}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-stop-recorder-view'\n data-tooltip-content={t('Tooltip.Stop') || ''}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faStop} size='xl' />\n )}\n </Button>\n )}\n {recorded && !recording && (\n <Button\n onClick={handleSaveRecording}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-confirm-record-view'\n data-tooltip-content={t('Tooltip.Confirm') || ''}\n >\n <FontAwesomeIcon icon={faFloppyDisk} className='pi-h-6 pi-w-6' />\n </Button>\n )}\n {!recording && !recorded && (\n <Button\n onClick={handleStart}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-start-recording-recorder-view'\n data-tooltip-content={t('Tooltip.Start recording') || ''}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faRecord} className='pi-h-6 pi-w-6' />\n )}\n </Button>\n )}\n </div>\n\n <div\n onClick={() => dispatch.island.setIslandView('settings')}\n data-tooltip-id='tooltip-settings-view-recorder'\n data-tooltip-content={t('Tooltip.Go to settings') || ''}\n className='pi-flex pi-items-center pi-justify-center pi-cursor-pointer pi-text-gray-700 dark:pi-text-gray-200 pi-w-6 pi-h-6 pi-flex-none'\n >\n <FontAwesomeIcon icon={faGear} className={`pi-h-6 pi-w-6`} />\n </div>\n\n {/* Buttons tooltips */}\n <CustomThemedTooltip id='tooltip-start-recording-recorder-view' place='top' />\n <CustomThemedTooltip id='tooltip-stop-recorder-view' place='top' />\n <CustomThemedTooltip id='tooltip-confirm-record-view' place='top' />\n <CustomThemedTooltip id='tooltip-settings-view-recorder' place='top' />\n </div>\n )\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","incoming","recorder","waiting","recording","recorded","playing","shallowEqual","handleStart","setRecording","setWaiting","startAnnouncementRecording","data","sent","tempFilename","setTempFilename","setStartTime","concat","Date","now","eventDispatch","handleStop","hangupCurrentCall","setRecorded","handleSaveRecording","player","pauseAudioPlayer","setPlaying","setPaused","dispatchRecordingSave","island","setIslandView","useEventListener","useEffect","answerIncomingCall","setIncoming","t","useTranslation","React","createElement","className","Button","variant","disabled","FontAwesomeIcon","icon","faDownLeftAndUpRightToCenter","onClick","faCircleNotch","size","faStop","faFloppyDisk","faRecord","faGear","CustomThemedTooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/RecorderView/Actions.tsx"],"sourcesContent":["//\n// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n//\n\nimport React, { type FC, useEffect } from 'react'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faStop,\n faCircleNotch,\n faGear,\n faDownLeftAndUpRightToCenter,\n faFloppyDisk,\n} from '@fortawesome/free-solid-svg-icons'\nimport { startAnnouncementRecording } from '../../services/offhour'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport { dispatchRecordingSave } from '../../events'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { faRecord } from '@nethesis/nethesis-solid-svg-icons'\n\nexport const Actions: FC<{}> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { incoming, waiting, recording, recorded, playing } = useSelector(\n (state: RootState) => ({\n incoming: state.recorder.incoming,\n waiting: state.recorder.waiting,\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n playing: state.recorder.playing,\n }),\n shallowEqual,\n )\n\n async function handleStart() {\n // Update the recorder state\n dispatch.recorder.setRecording(true)\n dispatch.recorder.setWaiting(true)\n // Call the api to start the recording call\n const data: { tempFilename: string } | null = await startAnnouncementRecording()\n // Set the returned temp file name to the store\n if (data.tempFilename) dispatch.recorder.setTempFilename(data.tempFilename)\n // Set the start time of recording\n dispatch.recorder.setStartTime(`${Date.now() / 1000}`)\n eventDispatch('phone-island-recording-started', {})\n }\n useEventListener('phone-island-recording-start', (data: {}) => {\n handleStart()\n })\n\n function handleStop() {\n // Set waiting to true\n dispatch.recorder.setWaiting(true)\n // Call the function to hangup the current call used for recording\n hangupCurrentCall()\n dispatch.recorder.setRecorded(true)\n eventDispatch('phone-island-recording-stopped', {})\n }\n useEventListener('phone-island-recording-stop', (data: {}) => {\n handleStop()\n })\n\n function handleSaveRecording() {\n // check if the audio is playing and pause it\n if (playing) {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n }\n // Dispatch the reconrding save event\n dispatchRecordingSave()\n // Close the Island\n dispatch.island.setIslandView(null)\n }\n useEventListener('phone-island-recording-save', (data: {}) => {\n handleSaveRecording()\n })\n\n useEffect(() => {\n if (!recording) {\n dispatch.recorder.setWaiting(false)\n }\n }, [recording])\n\n useEffect(() => {\n if (incoming) {\n // Answer the incoming call for recording\n answerIncomingCall()\n // Reset incoming to recorder state\n dispatch.recorder.setIncoming(false)\n dispatch.recorder.setWaiting(false)\n }\n }, [incoming])\n\n const { t } = useTranslation()\n\n return (\n <div\n className={`pi-flex pi-items-center pi-justify-between pi-px-6 pi-py-2 pi-gap-0 pi-w-full pi-mt-auto`}\n >\n <Button\n variant='transparent'\n disabled\n className='pi-w-6 pi-h-6 pi-flex pi-items-center pi-justify-center pi-flex-none'\n >\n <FontAwesomeIcon icon={faDownLeftAndUpRightToCenter} className='pi-w-6 pi-h-6' />\n </Button>\n\n <div className='pi-flex pi-items-center pi-justify-center pi-flex-grow'>\n {recording && (\n <Button\n onClick={handleStop}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-stop-recorder-view'\n data-tooltip-content={t('Tooltip.Stop') || ''}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faStop} size='xl' />\n )}\n </Button>\n )}\n {recorded && !recording && (\n <Button\n onClick={handleSaveRecording}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-confirm-record-view'\n data-tooltip-content={t('Tooltip.Confirm') || ''}\n >\n <FontAwesomeIcon icon={faFloppyDisk} className='pi-h-6 pi-w-6' />\n </Button>\n )}\n {!recording && !recorded && (\n <Button\n onClick={handleStart}\n variant='default'\n className='pi-rounded-full pi-w-14 pi-h-14 pi-flex pi-items-center pi-justify-center'\n data-tooltip-id='tooltip-start-recording-recorder-view'\n data-tooltip-content={t('Tooltip.Start recording') || ''}\n >\n {waiting ? (\n <FontAwesomeIcon icon={faCircleNotch} className='fa-spin pi-loader' size='lg' />\n ) : (\n <FontAwesomeIcon icon={faRecord} className='pi-h-6 pi-w-6' />\n )}\n </Button>\n )}\n </div>\n\n <div\n onClick={() => dispatch.island.setIslandView('settings')}\n data-tooltip-id='tooltip-settings-view-recorder'\n data-tooltip-content={t('Tooltip.Go to settings') || ''}\n className='pi-flex pi-items-center pi-justify-center pi-cursor-pointer pi-text-gray-700 dark:pi-text-gray-200 pi-w-6 pi-h-6 pi-flex-none'\n >\n <FontAwesomeIcon icon={faGear} className={`pi-h-6 pi-w-6`} />\n </div>\n\n {/* Buttons tooltips */}\n <CustomThemedTooltip id='tooltip-start-recording-recorder-view' place='top' />\n <CustomThemedTooltip id='tooltip-stop-recorder-view' place='top' />\n <CustomThemedTooltip id='tooltip-confirm-record-view' place='top' />\n <CustomThemedTooltip id='tooltip-settings-view-recorder' place='top' />\n </div>\n )\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","incoming","recorder","waiting","recording","recorded","playing","shallowEqual","handleStart","setRecording","setWaiting","startAnnouncementRecording","data","sent","tempFilename","setTempFilename","setStartTime","concat","Date","now","eventDispatch","handleStop","hangupCurrentCall","setRecorded","handleSaveRecording","player","pauseAudioPlayer","setPlaying","setPaused","dispatchRecordingSave","island","setIslandView","useEventListener","useEffect","answerIncomingCall","setIncoming","t","useTranslation","React","createElement","className","Button","variant","disabled","FontAwesomeIcon","icon","faDownLeftAndUpRightToCenter","onClick","faCircleNotch","size","faStop","faFloppyDisk","faRecord","faGear","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"),t=require("react"),r=require("../services/user.js"),n=require("../lib/avatars/avatars.js");require("../node_modules/react-redux/es/index.js");var s=require("../services/astproxy.js"),a=require("../lib/user/extensions.js"),o=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../services/user.js"),n=require("../lib/avatars/avatars.js");require("../node_modules/react-redux/es/index.js");var s=require("../services/astproxy.js"),a=require("../lib/user/extensions.js"),o=require("../utils/genericFunctions/eventDispatch.js");require("../store/index.js");var c=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../node_modules/react-redux/node_modules/react-is/index.js");var u=require("../node_modules/react-redux/es/hooks/useDispatch.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=i(t),d="phone_island_api_mode",f=function(e){try{var t=localStorage.getItem("".concat(d,"_").concat(e));if("new"===t||"legacy"===t)return t}catch(e){console.warn("Failed to read API mode from localStorage:",e)}return"unknown"},h=function(e,t){try{localStorage.setItem("".concat(d,"_").concat(e),t)}catch(e){console.warn("Failed to save API mode to localStorage:",e)}};exports.RestAPI=function(i){var d=i.hostName,p=i.username,_=i.authToken,v=i.children,g=u.useDispatch(),m=c.useSelector((function(e){return e.fetchDefaults})).fetchReady;return t.useEffect((function(){if(_&&d&&p){e.__awaiter(void 0,void 0,void 0,(function(){var t,r;return e.__generator(this,(function(e){switch(e.label){case 0:if("unknown"!==(t=f(p)))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,fetch("https://".concat(d,"/api/user/me"),{headers:{Authorization:"Bearer ".concat(_)}})];case 2:if((r=e.sent()).ok)t="new",h(p,"new");else{if(404!==r.status&&401!==r.status)throw new Error("API test failed with status: ".concat(r.status));t="legacy",h(p,"legacy")}return[3,4];case 3:return e.sent(),t="legacy",h(p,"legacy"),[3,4];case 4:return"new"===t?(g.fetchDefaults.updateFetchBaseURL("https://".concat(d,"/api")),g.fetchDefaults.updateFetchHeaders({Authorization:"Bearer ".concat(_)})):(g.fetchDefaults.updateFetchBaseURL("https://".concat(d,"/webrest")),g.fetchDefaults.updateFetchHeaders({Authorization:"".concat(p,":").concat(_)})),g.fetchDefaults.setFetchReady(),[2]}}))}))}}),[_,d,p]),t.useEffect((function(){m&&(function(){e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(n){switch(n.label){case 0:return[4,r.getCurrentUserInfo()];case 1:return(t=n.sent())&&(g.currentUser.updateCurrentUser(t),o.eventDispatch("phone-island-user-informations-update",e.__assign({},t)),g.currentUser.setCurrentUserReady(!0),t.settings&&t.settings.open_param_url?g.paramUrl.setOpenParamUrlType(t.settings.open_param_url):g.paramUrl.setOpenParamUrlType("never"),function(){e.__awaiter(this,void 0,void 0,(function(){var t,r;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,s.getAllExtensions()];case 1:return(t=e.sent())&&(g.users.updateExtensions(t),r=a.getExtensionsList(),Object.values(t).filter((function(e){return r.includes(e.exten)})).forEach((function(e){return g.currentUser.updateConversations(e)}))),[2]}}))}))}()),[2]}}))}))}(),function(){e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,r.getAllUsersEndpoints()];case 1:return(t=e.sent())&&g.users.updateEndpoints(t),[2]}}))}))}(),function(){e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,r.getVideoSources()];case 1:return(t=e.sent())&&g.streaming.updateVideoSources(t),[2]}}))}))}(),function(){e.__awaiter(this,void 0,void 0,(function(){var t,n;return e.__generator(this,(function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,r.getFeatureCodes()];case 1:return(t=e.sent())&&g.currentUser.updateFeatureCodes(t),[3,3];case 2:return n=e.sent(),console.warn("Failed to fetch feature codes:",n),[3,3];case 3:return[2]}}))}))}())}),[m]),t.useLayoutEffect((function(){p&&m&&n.retrieveAvatars(p)}),[m,p]),l.default.createElement(l.default.Fragment,null,m&&v)},exports.getApiMode=function(e){return f(e)},exports.resetApiMode=function(e){try{localStorage.removeItem("".concat(d,"_").concat(e))}catch(e){console.warn("Failed to reset API mode in localStorage:",e)}};
|
|
2
2
|
//# sourceMappingURL=RestAPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestAPI.js","sources":["../../src/components/RestAPI.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, type FC, useEffect, useLayoutEffect } from 'react'\nimport { getCurrentUserInfo, getVideoSources, getFeatureCodes } from '../services/user'\nimport { retrieveAvatars } from '../lib/avatars/avatars'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { getAllExtensions } from '../services/astproxy'\nimport { getAllUsersEndpoints } from '../services/user'\nimport { getExtensionsList } from '../lib/user/extensions'\nimport { eventDispatch } from '../utils'\n\n// Storage key for API mode\nconst API_MODE_STORAGE_KEY = 'phone_island_api_mode'\n\n// Function to get saved API mode from localStorage\nconst getSavedApiMode = (username: string): 'new' | 'legacy' | 'unknown' => {\n try {\n const saved = localStorage.getItem(`${API_MODE_STORAGE_KEY}_${username}`)\n if (saved === 'new' || saved === 'legacy') {\n return saved\n }\n } catch (error) {\n console.warn('Failed to read API mode from localStorage:', error)\n }\n return 'unknown'\n}\n\n// Function to save API mode to localStorage\nconst saveApiMode = (username: string, mode: 'new' | 'legacy') => {\n try {\n localStorage.setItem(`${API_MODE_STORAGE_KEY}_${username}`, mode)\n } catch (error) {\n console.warn('Failed to save API mode to localStorage:', error)\n }\n}\n\n// Export function to get current API mode from localStorage\nexport const getApiMode = (username: string) => getSavedApiMode(username)\n\n// Export function to reset API mode (useful for error recovery)\nexport const resetApiMode = (username: string) => {\n try {\n localStorage.removeItem(`${API_MODE_STORAGE_KEY}_${username}`)\n } catch (error) {\n console.warn('Failed to reset API mode in localStorage:', error)\n }\n}\n\nexport const RestAPI: FC<RestAPIProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const { fetchReady } = useSelector((state: RootState) => state.fetchDefaults)\n\n useEffect(() => {\n if (authToken && hostName && username) {\n const initializeAPI = async () => {\n let currentApiMode = getSavedApiMode(username)\n\n // If mode is unknown or we need to test, probe the API\n if (currentApiMode === 'unknown') {\n // First time or after reset: test new API format\n try {\n const response = await fetch(`https://${hostName}/api/user/me`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n })\n\n if (response.ok) {\n // New API format works\n currentApiMode = 'new'\n saveApiMode(username, 'new')\n } else if (response.status === 404 || response.status === 401) {\n // Fallback to legacy API format\n currentApiMode = 'legacy'\n saveApiMode(username, 'legacy')\n } else {\n throw new Error(`API test failed with status: ${response.status}`)\n }\n } catch (error) {\n // Network error or other issues, fallback to legacy API\n currentApiMode = 'legacy'\n saveApiMode(username, 'legacy')\n }\n }\n\n // Set the appropriate configuration based on the determined mode\n if (currentApiMode === 'new') {\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/api`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `Bearer ${authToken}`,\n })\n } else {\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/webrest`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `${username}:${authToken}`,\n })\n }\n\n dispatch.fetchDefaults.setFetchReady()\n }\n\n initializeAPI()\n }\n }, [authToken, hostName, username])\n\n useEffect(() => {\n // Get all extensions info and set to store\n async function initExtensions() {\n const extensions = await getAllExtensions()\n if (extensions) {\n dispatch.users.updateExtensions(extensions)\n // Update the current user conversations\n const currentUserExtensionsList = getExtensionsList()\n const extensionsData = Object.values(extensions).filter((extension) =>\n currentUserExtensionsList.includes(extension.exten),\n )\n // Update the user conversations to store\n extensionsData.forEach((extension) => dispatch.currentUser.updateConversations(extension))\n }\n }\n // Get users info and set to store\n async function initCurrentUser() {\n const userInfo = await getCurrentUserInfo()\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n eventDispatch('phone-island-user-informations-update', { ...userInfo })\n dispatch.currentUser.setCurrentUserReady(true)\n // Update open param URL type if it exists in paramurl store\n if (userInfo.settings && userInfo.settings.open_param_url) {\n dispatch.paramUrl.setOpenParamUrlType(userInfo.settings.open_param_url)\n } else {\n dispatch.paramUrl.setOpenParamUrlType('never')\n }\n\n // Inizialize all extensions after user initialization\n initExtensions()\n }\n }\n // Get all users and endpoints info and set to store\n async function initUsersEndpoints() {\n const usersEndpoints = await getAllUsersEndpoints()\n if (usersEndpoints) {\n dispatch.users.updateEndpoints(usersEndpoints)\n }\n }\n // Get all streaming source info and set to store\n async function initVideoSources() {\n const videoSources: any = await getVideoSources()\n if (videoSources) {\n dispatch.streaming.updateVideoSources(videoSources)\n }\n }\n // Get feature codes and save to store\n async function initFeatureCodes() {\n try {\n const codes = await getFeatureCodes()\n if (codes) {\n dispatch.currentUser.updateFeatureCodes(codes)\n }\n } catch (error) {\n console.warn('Failed to fetch feature codes:', error)\n }\n }\n // Call the needed APIs on startup\n if (fetchReady) {\n initCurrentUser()\n initUsersEndpoints()\n initVideoSources()\n initFeatureCodes()\n }\n }, [fetchReady])\n\n useLayoutEffect(() => {\n // Initialize avatars request it or get from storage\n if (username && fetchReady) {\n retrieveAvatars(username)\n }\n }, [fetchReady, username])\n\n return <>{fetchReady && children}</>\n}\n\ninterface RestAPIProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n"],"names":["API_MODE_STORAGE_KEY","getSavedApiMode","username","saved","localStorage","getItem","concat","error","console","warn","saveApiMode","mode","setItem","_a","hostName","authToken","children","dispatch","useDispatch","fetchReady","useSelector","state","fetchDefaults","useEffect","__awaiter","currentApiMode","fetch","headers","Authorization","response","sent","ok","status","Error","updateFetchBaseURL","updateFetchHeaders","setFetchReady","getCurrentUserInfo","userInfo","currentUser","updateCurrentUser","eventDispatch","__assign","setCurrentUserReady","settings","open_param_url","paramUrl","setOpenParamUrlType","getAllExtensions","extensions","users","updateExtensions","currentUserExtensionsList_1","getExtensionsList","Object","values","filter","extension","includes","exten","forEach","updateConversations","initExtensions","initCurrentUser","getAllUsersEndpoints","usersEndpoints","updateEndpoints","initUsersEndpoints","getVideoSources","videoSources","streaming","updateVideoSources","initVideoSources","getFeatureCodes","codes","updateFeatureCodes","error_2","initFeatureCodes","useLayoutEffect","retrieveAvatars","React","createElement","Fragment","removeItem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RestAPI.js","sources":["../../src/components/RestAPI.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, type FC, useEffect, useLayoutEffect } from 'react'\nimport { getCurrentUserInfo, getVideoSources, getFeatureCodes } from '../services/user'\nimport { retrieveAvatars } from '../lib/avatars/avatars'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { getAllExtensions } from '../services/astproxy'\nimport { getAllUsersEndpoints } from '../services/user'\nimport { getExtensionsList } from '../lib/user/extensions'\nimport { eventDispatch } from '../utils'\n\n// Storage key for API mode\nconst API_MODE_STORAGE_KEY = 'phone_island_api_mode'\n\n// Function to get saved API mode from localStorage\nconst getSavedApiMode = (username: string): 'new' | 'legacy' | 'unknown' => {\n try {\n const saved = localStorage.getItem(`${API_MODE_STORAGE_KEY}_${username}`)\n if (saved === 'new' || saved === 'legacy') {\n return saved\n }\n } catch (error) {\n console.warn('Failed to read API mode from localStorage:', error)\n }\n return 'unknown'\n}\n\n// Function to save API mode to localStorage\nconst saveApiMode = (username: string, mode: 'new' | 'legacy') => {\n try {\n localStorage.setItem(`${API_MODE_STORAGE_KEY}_${username}`, mode)\n } catch (error) {\n console.warn('Failed to save API mode to localStorage:', error)\n }\n}\n\n// Export function to get current API mode from localStorage\nexport const getApiMode = (username: string) => getSavedApiMode(username)\n\n// Export function to reset API mode (useful for error recovery)\nexport const resetApiMode = (username: string) => {\n try {\n localStorage.removeItem(`${API_MODE_STORAGE_KEY}_${username}`)\n } catch (error) {\n console.warn('Failed to reset API mode in localStorage:', error)\n }\n}\n\nexport const RestAPI: FC<RestAPIProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const { fetchReady } = useSelector((state: RootState) => state.fetchDefaults)\n\n useEffect(() => {\n if (authToken && hostName && username) {\n const initializeAPI = async () => {\n let currentApiMode = getSavedApiMode(username)\n\n // If mode is unknown or we need to test, probe the API\n if (currentApiMode === 'unknown') {\n // First time or after reset: test new API format\n try {\n const response = await fetch(`https://${hostName}/api/user/me`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n })\n\n if (response.ok) {\n // New API format works\n currentApiMode = 'new'\n saveApiMode(username, 'new')\n } else if (response.status === 404 || response.status === 401) {\n // Fallback to legacy API format\n currentApiMode = 'legacy'\n saveApiMode(username, 'legacy')\n } else {\n throw new Error(`API test failed with status: ${response.status}`)\n }\n } catch (error) {\n // Network error or other issues, fallback to legacy API\n currentApiMode = 'legacy'\n saveApiMode(username, 'legacy')\n }\n }\n\n // Set the appropriate configuration based on the determined mode\n if (currentApiMode === 'new') {\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/api`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `Bearer ${authToken}`,\n })\n } else {\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/webrest`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `${username}:${authToken}`,\n })\n }\n\n dispatch.fetchDefaults.setFetchReady()\n }\n\n initializeAPI()\n }\n }, [authToken, hostName, username])\n\n useEffect(() => {\n // Get all extensions info and set to store\n async function initExtensions() {\n const extensions = await getAllExtensions()\n if (extensions) {\n dispatch.users.updateExtensions(extensions)\n // Update the current user conversations\n const currentUserExtensionsList = getExtensionsList()\n const extensionsData = Object.values(extensions).filter((extension) =>\n currentUserExtensionsList.includes(extension.exten),\n )\n // Update the user conversations to store\n extensionsData.forEach((extension) => dispatch.currentUser.updateConversations(extension))\n }\n }\n // Get users info and set to store\n async function initCurrentUser() {\n const userInfo = await getCurrentUserInfo()\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n eventDispatch('phone-island-user-informations-update', { ...userInfo })\n dispatch.currentUser.setCurrentUserReady(true)\n // Update open param URL type if it exists in paramurl store\n if (userInfo.settings && userInfo.settings.open_param_url) {\n dispatch.paramUrl.setOpenParamUrlType(userInfo.settings.open_param_url)\n } else {\n dispatch.paramUrl.setOpenParamUrlType('never')\n }\n\n // Inizialize all extensions after user initialization\n initExtensions()\n }\n }\n // Get all users and endpoints info and set to store\n async function initUsersEndpoints() {\n const usersEndpoints = await getAllUsersEndpoints()\n if (usersEndpoints) {\n dispatch.users.updateEndpoints(usersEndpoints)\n }\n }\n // Get all streaming source info and set to store\n async function initVideoSources() {\n const videoSources: any = await getVideoSources()\n if (videoSources) {\n dispatch.streaming.updateVideoSources(videoSources)\n }\n }\n // Get feature codes and save to store\n async function initFeatureCodes() {\n try {\n const codes = await getFeatureCodes()\n if (codes) {\n dispatch.currentUser.updateFeatureCodes(codes)\n }\n } catch (error) {\n console.warn('Failed to fetch feature codes:', error)\n }\n }\n // Call the needed APIs on startup\n if (fetchReady) {\n initCurrentUser()\n initUsersEndpoints()\n initVideoSources()\n initFeatureCodes()\n }\n }, [fetchReady])\n\n useLayoutEffect(() => {\n // Initialize avatars request it or get from storage\n if (username && fetchReady) {\n retrieveAvatars(username)\n }\n }, [fetchReady, username])\n\n return <>{fetchReady && children}</>\n}\n\ninterface RestAPIProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n"],"names":["API_MODE_STORAGE_KEY","getSavedApiMode","username","saved","localStorage","getItem","concat","error","console","warn","saveApiMode","mode","setItem","_a","hostName","authToken","children","dispatch","useDispatch","fetchReady","useSelector","state","fetchDefaults","useEffect","__awaiter","currentApiMode","fetch","headers","Authorization","response","sent","ok","status","Error","updateFetchBaseURL","updateFetchHeaders","setFetchReady","getCurrentUserInfo","userInfo","currentUser","updateCurrentUser","eventDispatch","__assign","setCurrentUserReady","settings","open_param_url","paramUrl","setOpenParamUrlType","getAllExtensions","extensions","users","updateExtensions","currentUserExtensionsList_1","getExtensionsList","Object","values","filter","extension","includes","exten","forEach","updateConversations","initExtensions","initCurrentUser","getAllUsersEndpoints","usersEndpoints","updateEndpoints","initUsersEndpoints","getVideoSources","videoSources","streaming","updateVideoSources","initVideoSources","getFeatureCodes","codes","updateFeatureCodes","error_2","initFeatureCodes","useLayoutEffect","retrieveAvatars","React","createElement","Fragment","removeItem"],"mappings":"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"}
|