@nethesis/phone-island 0.8.21 → 0.8.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { type FC } from 'react';
1
+ import { FC } from 'react';
2
2
  declare const Timer: FC<TimerProps>;
3
3
  export default Timer;
4
4
  export interface TimerProps {
@@ -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("../../styles/Island.styles.js"),r=require("../../node_modules/react-moment/dist/index.js"),a=require("../../node_modules/react-redux/es/hooks/useSelector.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=u(e);exports.default=function(u){var n=u.size,s=void 0===n?"large":n,l=u.startTime,o=u.isHome,d=e.useState(0),m=d[0],c=d[1],f=a.useSelector((function(e){return e.island})).isOpen;return e.useEffect((function(){if(l){var e=(new Date).getTime()/1e3-Number(l);e<0&&c(e)}}),[l]),i.default.createElement(i.default.Fragment,null,null!=l&&i.default.createElement(t.StyledTimer,{isOpen:f,size:s},i.default.createElement(r.default,{date:Number(l)+m||(new Date).getTime()/1e3,interval:1e3,format:"h:mm:ss",trim:!1,unix:!0,durationFromNow:!0,className:"".concat(void 0!==o&&o?"pi-text-gray-950 dark:pi-text-gray-50":"pi-text-gray-50 dark:pi-text-gray-50"," pi-font-normal")})))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../styles/Island.styles.js"),r=require("../../node_modules/react-moment/dist/index.js"),a=require("../../node_modules/react-redux/es/hooks/useSelector.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=s(e);exports.default=function(e){var s=e.size,i=void 0===s?"large":s,n=e.startTime,l=e.isHome,d=a.useSelector((function(e){return e.island})).isOpen;return u.default.createElement(u.default.Fragment,null,null!=n&&u.default.createElement(t.StyledTimer,{isOpen:d,size:i},u.default.createElement(r.default,{date:Number(n),interval:1e3,format:"h:mm:ss",trim:!1,unix:!0,durationFromNow:!0,className:"".concat(void 0!==l&&l?"pi-text-gray-950 dark:pi-text-gray-50":"pi-text-gray-50 dark:pi-text-gray-50"," pi-font-normal")})))};
2
2
  //# sourceMappingURL=Timer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Timer.js","sources":["../../../src/components/CallView/Timer.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect, type FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledTimer } from '../../styles/Island.styles'\nimport Moment from 'react-moment'\n\nconst Timer: FC<TimerProps> = ({ size = 'large', startTime, isHome }) => {\n // Set timer negative differences\n const [timerNegativeDifference, setTimerNegativeDifference] = useState<number>(0)\n // Get isOpen from the island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n useEffect(() => {\n if (startTime) {\n const difference = new Date().getTime() / 1000 - Number(startTime)\n if (difference < 0) {\n setTimerNegativeDifference(difference)\n }\n }\n }, [startTime])\n\n return (\n <>\n {startTime != null && (\n <StyledTimer isOpen={isOpen} size={size}>\n <Moment\n date={Number(startTime) + timerNegativeDifference || new Date().getTime() / 1000}\n interval={1000}\n format='h:mm:ss'\n trim={false}\n unix\n durationFromNow\n className={`${\n isHome !== undefined && isHome\n ? 'pi-text-gray-950 dark:pi-text-gray-50'\n : 'pi-text-gray-50 dark:pi-text-gray-50'\n } pi-font-normal`}\n />\n </StyledTimer>\n )}\n </>\n )\n}\n\nexport default Timer\n\nexport interface TimerProps {\n size?: 'small' | 'large'\n startTime: string\n // when the timer is used in the home view or in the pill view\n isHome?: boolean\n}\n"],"names":["_a","_b","size","startTime","isHome","_c","useState","timerNegativeDifference","setTimerNegativeDifference","isOpen","useSelector","state","island","useEffect","difference","Date","getTime","Number","React","createElement","Fragment","StyledTimer","Moment","date","interval","format","trim","unix","durationFromNow","className","concat","undefined"],"mappings":"kaAS8B,SAACA,OAAEC,EAAcD,EAAAE,KAAdA,OAAI,IAAAD,EAAG,QAAOA,EAAEE,EAASH,EAAAG,UAAEC,EAAMJ,EAAAI,OAE1DC,EAAwDC,EAAAA,SAAiB,GAAxEC,EAAuBF,EAAA,GAAEG,EAA0BH,EAAA,GAElDI,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,iBAW3D,OATAC,EAAAA,WAAU,WACR,GAAIV,EAAW,CACb,IAAMW,GAAa,IAAIC,MAAOC,UAAY,IAAOC,OAAOd,GACpDW,EAAa,GACfN,EAA2BM,EAE9B,CACH,GAAG,CAACX,IAGFe,EAAAA,QACGC,cAAAD,EAAAA,QAAAE,SAAA,KAAa,MAAbjB,GACCe,EAAAA,QAAAC,cAACE,EAAAA,YAAW,CAACZ,OAAQA,EAAQP,KAAMA,GACjCgB,EAAAA,QAAAC,cAACG,EAAAA,QACC,CAAAC,KAAMN,OAAOd,GAAaI,IAA2B,IAAIQ,MAAOC,UAAY,IAC5EQ,SAAU,IACVC,OAAO,UACPC,MAAM,EACNC,QACAC,iBAAe,EACfC,UAAW,GAAAC,YACEC,IAAX3B,GAAwBA,EACpB,wCACA,uCACW,sBAM7B"}
1
+ {"version":3,"file":"Timer.js","sources":["../../../src/components/CallView/Timer.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledTimer } from '../../styles/Island.styles'\nimport Moment from 'react-moment'\n\nconst Timer: FC<TimerProps> = ({ size = 'large', startTime, isHome }) => {\n // Get isOpen from the island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n return (\n <>\n {startTime != null && (\n <StyledTimer isOpen={isOpen} size={size}>\n <Moment\n date={Number(startTime)}\n interval={1000}\n format='h:mm:ss'\n trim={false}\n unix\n durationFromNow\n className={`${\n isHome !== undefined && isHome\n ? 'pi-text-gray-950 dark:pi-text-gray-50'\n : 'pi-text-gray-50 dark:pi-text-gray-50'\n } pi-font-normal`}\n />\n </StyledTimer>\n )}\n </>\n )\n}\n\nexport default Timer\n\nexport interface TimerProps {\n size?: 'small' | 'large'\n startTime: string\n // when the timer is used in the home view or in the pill view\n isHome?: boolean\n}\n"],"names":["_a","_b","size","startTime","isHome","isOpen","useSelector","state","island","React","createElement","Fragment","StyledTimer","Moment","date","Number","interval","format","trim","unix","durationFromNow","className","concat","undefined"],"mappings":"kaAS8B,SAACA,OAAEC,EAAcD,EAAAE,KAAdA,OAAI,IAAAD,EAAG,QAAOA,EAAEE,EAASH,EAAAG,UAAEC,EAAMJ,EAAAI,OAExDC,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,iBAE3D,OACEC,EAAAA,QACGC,cAAAD,EAAAA,QAAAE,SAAA,KAAa,MAAbR,GACCM,EAAAA,QAAAC,cAACE,EAAAA,YAAW,CAACP,OAAQA,EAAQH,KAAMA,GACjCO,EAAAA,QAAAC,cAACG,UAAM,CACLC,KAAMC,OAAOZ,GACba,SAAU,IACVC,OAAO,UACPC,MAAM,EACNC,QACAC,iBAAe,EACfC,UAAW,GACTC,YAAWC,IAAXnB,GAAwBA,EACpB,wCACA,uCACW,sBAM7B"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../styles/Island.styles.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),l=require("../../lib/phone/call.js");require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/mic-check/lib/index.js"),require("../Island.js");var r=require("../Button.js"),a=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var o=require("./Timer.js"),s=require("./Number.js"),u=require("./DisplayName.js"),d=require("./Avatar.js"),c=require("./Actions.js"),p=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 m=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var f=require("../../node_modules/react-tooltip/dist/react-tooltip.min.mjs.js"),v=require("../../node_modules/react-redux/es/hooks/useSelector.js");function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var E=g(e);function j(e,t){return!e&&!t}exports.default=function(){var e=v.useSelector((function(e){return e.currentCall})),g=e.incoming,w=e.accepted,b=e.outgoing,h=e.startTime,q=e.paused,x=e.number,y=e.isRecording,_=v.useSelector((function(e){return e.currentCall})),I=v.useSelector((function(e){return e.island})).isOpen,N=v.useSelector((function(e){return e.webrtc})).remoteAudioStream,A=v.useSelector((function(e){return e.listen})),S=v.useSelector((function(e){return e.listen})),T=S.isListen,z=S.isIntrude,L=m.useTranslation().t;return E.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},E.default.createElement(t.StyledCallView,{incoming:g,accepted:w,outgoing:b,isOpen:I},E.default.createElement(t.StyledTopContent,{isOpen:I,incoming:g,accepted:w,outgoing:b},(null==A?void 0:A.isListen)?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"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"),icon:n.faEarListen}):(null==A?void 0:A.isIntrude)?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"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"),icon:n.faHandPointUp}):""!==x&&""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username)?E.default.createElement(d.default,null):(!g||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username))&&(!w||b||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username))?!b||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username)?b&&w&&(""===(null==_?void 0:_.username)||"undefined"===(null==_?void 0:_.username))?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]"),icon:n.faArrowLeft}):E.default.createElement(E.default.Fragment,null):E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]"),icon:n.faArrowLeft}):E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45"),icon:n.faArrowLeft}),I?(null==A?void 0:A.isIntrude)?E.default.createElement(t.StyledDetails,null,E.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"}," ",L("Common.Intrude"),(null==A?void 0:A.isIntrudeExtension)?" - ".concat(null==A?void 0:A.isIntrudeExtension):""),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):(null==A?void 0:A.isIntrudeExtension)?"".concat(null==A?void 0:A.isIntrudeExtension):""):(null==A?void 0:A.isListen)?E.default.createElement(t.StyledDetails,null,E.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"}," ",L("Common.Listen"),(null==A?void 0:A.isListenExtension)?" - ".concat(null==A?void 0:A.isListenExtension):""),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):(null==A?void 0:A.isListenExtension)?"".concat(null==A?void 0:A.isListenExtension):""," "):E.default.createElement(t.StyledDetails,null,E.default.createElement(u.default,null),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):E.default.createElement(s.default,null)):null,!I&&!w&&E.default.createElement(u.default,null),!I&&w&&E.default.createElement(o.default,{startTime:h,isHome:!0}),w&&y?E.default.createElement(E.default.Fragment,null,E.default.createElement("div",{className:"".concat(I?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6"," pi-flex pi-justify-center pi-items-center")},E.default.createElement("div",{className:"".concat(I?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},E.default.createElement("span",{className:"".concat(I?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6"," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full pi-bg-red-400 pi-opacity-75 ")}),E.default.createElement(i.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 pi-text-red-500",icon:n.faCircle})))):w&&N?E.default.createElement(E.default.Fragment,null,E.default.createElement(a.AudioBars,{audioStream:N,paused:q,size:I?"large":"small"})):E.default.createElement(E.default.Fragment,null)),I&&E.default.createElement("div",{className:"".concat(T||z?"":"pi-grid pi-gap-y-5"," ")},w&&E.default.createElement(c.default,null),E.default.createElement("div",{className:"pi-grid ".concat(j(b,w)?"pi-grid-cols-2":w?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"," pi-gap-3.5")},E.default.createElement(p.default,{description:L("Tooltip.Hangup and transfer")}),j(b,w)&&E.default.createElement(r.Button,{onClick:l.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":L("Tooltip.Answer")||""},E.default.createElement(i.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:n.faPhone}))))),E.default.createElement(f.Tooltip,{className:"pi-z-20",id:"tooltip-answer-left",place:"left"}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../styles/Island.styles.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),l=require("../../lib/phone/call.js");require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/mic-check/lib/index.js"),require("../Island.js");var r=require("../Button.js"),a=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var o=require("./Timer.js"),s=require("./Number.js"),u=require("./DisplayName.js"),d=require("./Avatar.js"),c=require("./Actions.js"),p=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 m=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var f=require("../../node_modules/react-tooltip/dist/react-tooltip.min.mjs.js"),v=require("../../node_modules/react-redux/es/hooks/useSelector.js");function g(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var E=g(e);function j(e,t){return!e&&!t}exports.default=function(){var e=v.useSelector((function(e){return e.currentCall})),g=e.incoming,w=e.accepted,b=e.outgoing,h=e.startTime,q=e.paused,x=e.number,y=e.isRecording,_=v.useSelector((function(e){return e.currentCall})),I=v.useSelector((function(e){return e.island})).isOpen,N=v.useSelector((function(e){return e.webrtc})).remoteAudioStream,A=v.useSelector((function(e){return e.listen})),S=v.useSelector((function(e){return e.listen})),T=S.isListen,z=S.isIntrude,F=v.useSelector((function(e){return e.alerts})).data,L=m.useTranslation().t,C=Object.values(F).filter((function(e){return e.active})),H=C.length>0?C[C.length-1]:null;return E.default.createElement(E.default.Fragment,null,null!==H?null:E.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},E.default.createElement(t.StyledCallView,{incoming:g,accepted:w,outgoing:b,isOpen:I},E.default.createElement(t.StyledTopContent,{isOpen:I,incoming:g,accepted:w,outgoing:b},(null==A?void 0:A.isListen)?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"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"),icon:n.faEarListen}):(null==A?void 0:A.isIntrude)?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"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"),icon:n.faHandPointUp}):""!==x&&""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username)?E.default.createElement(d.default,null):(!g||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username))&&(!w||b||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username))?!b||""!==(null==_?void 0:_.username)&&"undefined"!==(null==_?void 0:_.username)?b&&w&&(""===(null==_?void 0:_.username)||"undefined"===(null==_?void 0:_.username))?E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]"),icon:n.faArrowLeft}):E.default.createElement(E.default.Fragment,null):E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]"),icon:n.faArrowLeft}):E.default.createElement(i.FontAwesomeIcon,{className:"".concat(I?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45"),icon:n.faArrowLeft}),I?(null==A?void 0:A.isIntrude)?E.default.createElement(t.StyledDetails,null,E.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"}," ",L("Common.Intrude"),(null==A?void 0:A.isIntrudeExtension)?" - ".concat(null==A?void 0:A.isIntrudeExtension):""),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):(null==A?void 0:A.isIntrudeExtension)?"".concat(null==A?void 0:A.isIntrudeExtension):""):(null==A?void 0:A.isListen)?E.default.createElement(t.StyledDetails,null,E.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"}," ",L("Common.Listen"),(null==A?void 0:A.isListenExtension)?" - ".concat(null==A?void 0:A.isListenExtension):""),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):(null==A?void 0:A.isListenExtension)?"".concat(null==A?void 0:A.isListenExtension):""," "):E.default.createElement(t.StyledDetails,null,E.default.createElement(u.default,null),w?E.default.createElement(o.default,{startTime:h,isHome:!0}):E.default.createElement(s.default,null)):null,!I&&!w&&E.default.createElement(u.default,null),!I&&w&&E.default.createElement(o.default,{startTime:h,isHome:!0}),w&&y?E.default.createElement(E.default.Fragment,null,E.default.createElement("div",{className:"".concat(I?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6"," pi-flex pi-justify-center pi-items-center")},E.default.createElement("div",{className:"".concat(I?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},E.default.createElement("span",{className:"".concat(I?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6"," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full pi-bg-red-400 pi-opacity-75 ")}),E.default.createElement(i.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 pi-text-red-500",icon:n.faCircle})))):w&&N?E.default.createElement(E.default.Fragment,null,E.default.createElement(a.AudioBars,{audioStream:N,paused:q,size:I?"large":"small"})):E.default.createElement(E.default.Fragment,null)),I&&E.default.createElement("div",{className:"".concat(T||z?"":"pi-grid pi-gap-y-5"," ")},w&&E.default.createElement(c.default,null),E.default.createElement("div",{className:"pi-grid ".concat(j(b,w)?"pi-grid-cols-2":w?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"," pi-gap-3.5")},E.default.createElement(p.default,{description:L("Tooltip.Hangup and transfer")}),j(b,w)&&E.default.createElement(r.Button,{onClick:l.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":L("Tooltip.Answer")||""},E.default.createElement(i.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:n.faPhone}))))),E.default.createElement(f.Tooltip,{className:"pi-z-20",id:"tooltip-answer-left",place:"left"})))};
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 } from 'react'\nimport { StyledDetails, StyledCallView, StyledTopContent } from '../../styles/Island.styles'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faArrowLeft,\n faCircle,\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 { Tooltip } from 'react-tooltip'\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n // Get multiple values from currentCall state\n const { incoming, accepted, outgoing, startTime, paused, number, isRecording } = useSelector(\n (state: RootState) => state.currentCall,\n )\n\n const currentCallDetails: any = useSelector((state: RootState) => state.currentCall)\n // Get isOpen and view from island state\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Retrieve the audio stream from the webrtc state\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude } = useSelector((state: RootState) => state.listen)\n\n const { t } = useTranslation()\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <StyledCallView incoming={incoming} accepted={accepted} outgoing={outgoing} isOpen={isOpen}>\n <StyledTopContent\n isOpen={isOpen}\n incoming={incoming}\n accepted={accepted}\n outgoing={outgoing}\n >\n {intrudeListenStatus?.isListen ? (\n <FontAwesomeIcon\n className={`${\n 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 icon={faEarListen}\n />\n ) : intrudeListenStatus?.isIntrude ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n 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 icon={faHandPointUp}\n />\n ) : number !== '' &&\n currentCallDetails?.username !== '' &&\n currentCallDetails?.username !== 'undefined' ? (\n <Avatar />\n ) : incoming &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45'\n }`}\n icon={faArrowLeft}\n />\n ) : accepted &&\n !outgoing &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45'\n }`}\n icon={faArrowLeft}\n />\n ) : outgoing &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n // set a loading avatar when the call is not attached to a user\n <FontAwesomeIcon\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n }`}\n icon={faArrowLeft}\n />\n ) : outgoing &&\n accepted &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n // set a loading avatar when the call is not attached to a user\n <FontAwesomeIcon\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n }`}\n icon={faArrowLeft}\n />\n ) : (\n <></>\n )}\n {isOpen ? (\n intrudeListenStatus?.isIntrude ? (\n <StyledDetails>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {' '}\n {t('Common.Intrude')}\n {intrudeListenStatus?.isIntrudeExtension\n ? ` - ${intrudeListenStatus?.isIntrudeExtension}`\n : ''}\n </span>\n {accepted ? (\n <Timer startTime={startTime} isHome />\n ) : intrudeListenStatus?.isIntrudeExtension ? (\n `${intrudeListenStatus?.isIntrudeExtension}`\n ) : (\n ''\n )}\n </StyledDetails>\n ) : intrudeListenStatus?.isListen ? (\n <StyledDetails>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {' '}\n {t('Common.Listen')}\n {intrudeListenStatus?.isListenExtension\n ? ` - ${intrudeListenStatus?.isListenExtension}`\n : ''}\n </span>\n {accepted ? (\n <Timer startTime={startTime} isHome />\n ) : intrudeListenStatus?.isListenExtension ? (\n `${intrudeListenStatus?.isListenExtension}`\n ) : (\n ''\n )}{' '}\n </StyledDetails>\n ) : (\n <StyledDetails>\n <DisplayName />\n {accepted ? <Timer startTime={startTime} isHome /> : <Number />}\n </StyledDetails>\n )\n ) : null}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer startTime={startTime} isHome />}\n {accepted && isRecording ? (\n <>\n <div\n className={`${\n !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } pi-flex pi-justify-center pi-items-center`}\n >\n <div\n className={`${\n !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n } pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${\n !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n } pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full pi-bg-red-400 pi-opacity-75 `}\n ></span>\n <FontAwesomeIcon\n className='pi-w-4 pi-h-6 pi-rotate-45 pi-text-red-500'\n icon={faCircle}\n ></FontAwesomeIcon>\n </div>\n </div>\n </>\n ) : accepted && remoteAudioStream ? (\n <>\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n </>\n ) : (\n <></>\n )}\n </StyledTopContent>\n {isOpen && (\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''} `}>\n {accepted && <Actions />}\n <div\n className={`pi-grid ${\n isAnswerVisible(outgoing, accepted)\n ? 'pi-grid-cols-2'\n : accepted\n ? 'pi-grid-cols-1 pi-justify-items-center'\n : 'pi-grid-cols-1 pi-justify-items-end'\n } pi-gap-3.5`}\n >\n {/* The button to hangup the currentCall */}\n {/* {incoming || outgoing ? (\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n ) : ( */}\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n {/* )} */}\n {/* The button to answer the incoming call */}\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 </StyledCallView>\n <Tooltip className='pi-z-20' id='tooltip-answer-left' place='left' />\n </div>\n )\n}\n\nexport default CallView\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","_a","useSelector","state","currentCall","incoming","startTime","paused","number","isRecording","currentCallDetails","isOpen","island","remoteAudioStream","webrtc","intrudeListenStatus","listen","_b","isListen","isIntrude","t","useTranslation","React","createElement","className","StyledCallView","StyledTopContent","FontAwesomeIcon","icon","faEarListen","faHandPointUp","username","Avatar","faArrowLeft","StyledDetails","isIntrudeExtension","Timer","isHome","concat","isListenExtension","DisplayName","Number","Fragment","faCircle","AudioBars","audioStream","size","Actions","Hangup","description","Button","onClick","answerIncomingCall","variant","faPhone","Tooltip","id","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 } from 'react'\nimport { StyledDetails, StyledCallView, StyledTopContent } from '../../styles/Island.styles'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faArrowLeft,\n faCircle,\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 { Tooltip } from 'react-tooltip'\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n // Get multiple values from currentCall state\n const { incoming, accepted, outgoing, startTime, paused, number, isRecording } = useSelector(\n (state: RootState) => state.currentCall,\n )\n\n const currentCallDetails: any = useSelector((state: RootState) => state.currentCall)\n // Get isOpen and view from island state\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Retrieve the audio stream from the webrtc state\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude } = useSelector((state: RootState) => state.listen)\n const { data } = useSelector((state: RootState) => state.alerts)\n\n const { t } = useTranslation()\n const activeAlerts = Object.values(data).filter((alert: any) => alert.active)\n const latestAlert = activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null\n\n return (\n <>\n {/* Avoid alert message and incoming call message for slow connections */}\n {latestAlert !== null ? null : (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <StyledCallView\n incoming={incoming}\n accepted={accepted}\n outgoing={outgoing}\n isOpen={isOpen}\n >\n <StyledTopContent\n isOpen={isOpen}\n incoming={incoming}\n accepted={accepted}\n outgoing={outgoing}\n >\n {intrudeListenStatus?.isListen ? (\n <FontAwesomeIcon\n className={`${\n 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 icon={faEarListen}\n />\n ) : intrudeListenStatus?.isIntrude ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n 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 icon={faHandPointUp}\n />\n ) : number !== '' &&\n currentCallDetails?.username !== '' &&\n currentCallDetails?.username !== 'undefined' ? (\n <Avatar />\n ) : incoming &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45'\n }`}\n icon={faArrowLeft}\n />\n ) : accepted &&\n !outgoing &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n <FontAwesomeIcon\n // className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi--rotate-45'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi--rotate-45'\n }`}\n icon={faArrowLeft}\n />\n ) : outgoing &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n // set a loading avatar when the call is not attached to a user\n <FontAwesomeIcon\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n }`}\n icon={faArrowLeft}\n />\n ) : outgoing &&\n accepted &&\n (currentCallDetails?.username === '' ||\n currentCallDetails?.username === 'undefined') ? (\n // set a loading avatar when the call is not attached to a user\n <FontAwesomeIcon\n className={`${\n isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover pi-rotate-[135deg]'\n }`}\n icon={faArrowLeft}\n />\n ) : (\n <></>\n )}\n {isOpen ? (\n intrudeListenStatus?.isIntrude ? (\n <StyledDetails>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {' '}\n {t('Common.Intrude')}\n {intrudeListenStatus?.isIntrudeExtension\n ? ` - ${intrudeListenStatus?.isIntrudeExtension}`\n : ''}\n </span>\n {accepted ? (\n <Timer startTime={startTime} isHome />\n ) : intrudeListenStatus?.isIntrudeExtension ? (\n `${intrudeListenStatus?.isIntrudeExtension}`\n ) : (\n ''\n )}\n </StyledDetails>\n ) : intrudeListenStatus?.isListen ? (\n <StyledDetails>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {' '}\n {t('Common.Listen')}\n {intrudeListenStatus?.isListenExtension\n ? ` - ${intrudeListenStatus?.isListenExtension}`\n : ''}\n </span>\n {accepted ? (\n <Timer startTime={startTime} isHome />\n ) : intrudeListenStatus?.isListenExtension ? (\n `${intrudeListenStatus?.isListenExtension}`\n ) : (\n ''\n )}{' '}\n </StyledDetails>\n ) : (\n <StyledDetails>\n <DisplayName />\n {accepted ? <Timer startTime={startTime} isHome /> : <Number />}\n </StyledDetails>\n )\n ) : null}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer startTime={startTime} isHome />}\n {accepted && isRecording ? (\n <>\n <div\n className={`${\n !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } pi-flex pi-justify-center pi-items-center`}\n >\n <div\n className={`${\n !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n } pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${\n !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n } pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full pi-bg-red-400 pi-opacity-75 `}\n ></span>\n <FontAwesomeIcon\n className='pi-w-4 pi-h-6 pi-rotate-45 pi-text-red-500'\n icon={faCircle}\n ></FontAwesomeIcon>\n </div>\n </div>\n </>\n ) : accepted && remoteAudioStream ? (\n <>\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n </>\n ) : (\n <></>\n )}\n </StyledTopContent>\n {isOpen && (\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''} `}>\n {accepted && <Actions />}\n <div\n className={`pi-grid ${\n isAnswerVisible(outgoing, accepted)\n ? 'pi-grid-cols-2'\n : accepted\n ? 'pi-grid-cols-1 pi-justify-items-center'\n : 'pi-grid-cols-1 pi-justify-items-end'\n } pi-gap-3.5`}\n >\n {/* The button to hangup the currentCall */}\n {/* {incoming || outgoing ? (\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n ) : ( */}\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n {/* )} */}\n {/* The button to answer the incoming call */}\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 </StyledCallView>\n <Tooltip className='pi-z-20' id='tooltip-answer-left' place='left' />\n </div>\n )}\n </>\n )\n}\n\nexport default CallView\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","_a","useSelector","state","currentCall","incoming","startTime","paused","number","isRecording","currentCallDetails","isOpen","island","remoteAudioStream","webrtc","intrudeListenStatus","listen","_b","isListen","isIntrude","data","alerts","t","useTranslation","activeAlerts","Object","values","filter","alert","active","latestAlert","length","React","createElement","Fragment","className","StyledCallView","StyledTopContent","FontAwesomeIcon","icon","faEarListen","faHandPointUp","username","Avatar","faArrowLeft","StyledDetails","isIntrudeExtension","Timer","isHome","concat","isListenExtension","DisplayName","Number","faCircle","AudioBars","audioStream","size","Actions","Hangup","description","Button","onClick","answerIncomingCall","variant","faPhone","Tooltip","id","place"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/framer-motion/dist/es/render/dom/motion.mjs.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=i(e),h=function(e){var i=e.children,h=d.useSelector((function(e){return e.currentCall})),r=h.incoming,n=h.outgoing,c=h.accepted,l=h.transferring,o=d.useSelector((function(e){return e.listen})).isListen,s=d.useSelector((function(e){return e.island})),p=s.view,g=s.isOpen,u=s.actionsExpanded,x=d.useSelector((function(e){return e.alerts.status})).activeAlertsCount,w=d.useSelector((function(e){return e.motions})),f=w.variants,y=w.border_radius_collapsed,m=w.border_radius_expanded,v=w.padding_x_collapsed,_=w.padding_y_collapsed,b=w.padding_expanded;var k=function(){var e={width:0,height:0};switch(p){case"call":g?c&&l?e=u?{width:f.call.expanded.transfer.actionsExpanded.width,height:f.call.expanded.transfer.actionsExpanded.height}:{width:f.call.expanded.transfer.width,height:f.call.expanded.transfer.height}:c&&u?e={width:f.call.expanded.accepted.actionsExpanded.width,height:f.call.expanded.accepted.actionsExpanded.height}:c&&!o?e={width:f.call.expanded.accepted.width,height:f.call.expanded.accepted.height}:c&&o?e={width:f.call.expanded.listening.width,height:f.call.expanded.listening.height}:r?e={width:f.call.expanded.incoming.width,height:f.call.expanded.incoming.height}:n&&(e={width:f.call.expanded.outgoing.width,height:f.call.expanded.outgoing.height}):e={width:f.call.collapsed.width,height:f.call.collapsed.height};break;case"keypad":e=g?{width:f.keypad.expanded.width,height:f.keypad.expanded.height}:{width:f.transfer.collapsed.width,height:f.transfer.collapsed.height};break;case"transfer":e=g?{width:f.transfer.expanded.width,height:f.transfer.expanded.height}:{width:f.transfer.collapsed.width,height:f.transfer.collapsed.height};break;case"player":e=g?{width:f.player.expanded.width,height:f.player.expanded.height}:{width:f.player.collapsed.width,height:f.player.collapsed.height};break;case"recorder":e=g?{width:f.recorder.expanded.width,height:f.recorder.expanded.height}:{width:f.recorder.collapsed.width,height:f.recorder.collapsed.height};break;case"physicalPhoneRecorder":e=g?{width:f.physicalPhoneRecorder.expanded.width,height:f.physicalPhoneRecorder.expanded.height}:{width:f.physicalPhoneRecorder.collapsed.width,height:f.physicalPhoneRecorder.collapsed.height}}var t=x>0;return{width:"".concat(0===e.width&&t?f.alerts.width:e.width,"px"),height:"".concat(t&&g?e.height+f.alerts.height+(0===e.height?2*b:b):e.height,"px"),borderRadius:"".concat(g?m:y,"px"),padding:g?"".concat(b,"px"):"".concat(v,"px ").concat(_,"px")}}();return a.default.createElement(t.motion.div,{className:"pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs pi-cursor-pointer dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow",animate:k},i&&i)};exports.IslandMotion=h,exports.default=h;
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/framer-motion/dist/es/render/dom/motion.mjs.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=i(e),r=function(e){var i=e.children,r=d.useSelector((function(e){return e.currentCall})),h=r.incoming,n=r.outgoing,c=r.accepted,l=r.transferring,o=d.useSelector((function(e){return e.listen})).isListen,s=d.useSelector((function(e){return e.island})),p=s.view,g=s.isOpen,u=s.actionsExpanded,x=d.useSelector((function(e){return e.alerts.status})).activeAlertsCount,w=d.useSelector((function(e){return e.motions})),f=w.variants,y=w.border_radius_collapsed,m=w.border_radius_expanded,v=w.padding_x_collapsed,_=w.padding_y_collapsed,b=w.padding_expanded;var k=function(){var e={width:0,height:0};switch(p){case"call":g?c&&l?e=u?{width:f.call.expanded.transfer.actionsExpanded.width,height:f.call.expanded.transfer.actionsExpanded.height}:{width:f.call.expanded.transfer.width,height:f.call.expanded.transfer.height}:c&&u?e={width:f.call.expanded.accepted.actionsExpanded.width,height:f.call.expanded.accepted.actionsExpanded.height}:c&&!o?e={width:f.call.expanded.accepted.width,height:f.call.expanded.accepted.height}:c&&o?e={width:f.call.expanded.listening.width,height:f.call.expanded.listening.height}:h?e={width:f.call.expanded.incoming.width,height:f.call.expanded.incoming.height}:n&&(e={width:f.call.expanded.outgoing.width,height:f.call.expanded.outgoing.height}):e={width:f.call.collapsed.width,height:f.call.collapsed.height};break;case"keypad":e=g?{width:f.keypad.expanded.width,height:f.keypad.expanded.height}:{width:f.transfer.collapsed.width,height:f.transfer.collapsed.height};break;case"transfer":e=g?{width:f.transfer.expanded.width,height:f.transfer.expanded.height}:{width:f.transfer.collapsed.width,height:f.transfer.collapsed.height};break;case"player":e=g?{width:f.player.expanded.width,height:f.player.expanded.height}:{width:f.player.collapsed.width,height:f.player.collapsed.height};break;case"recorder":e=g?{width:f.recorder.expanded.width,height:f.recorder.expanded.height}:{width:f.recorder.collapsed.width,height:f.recorder.collapsed.height};break;case"physicalPhoneRecorder":e=g?{width:f.physicalPhoneRecorder.expanded.width,height:f.physicalPhoneRecorder.expanded.height}:{width:f.physicalPhoneRecorder.collapsed.width,height:f.physicalPhoneRecorder.collapsed.height}}var t=x>0;return{width:"".concat(0===e.width&&t?f.alerts.width:e.width,"px"),height:"".concat(t&&g?f.alerts.height+(0===e.height?2*b:b):e.height,"px"),borderRadius:"".concat(g?m:y,"px"),padding:g?"".concat(b,"px"):"".concat(v,"px ").concat(_,"px")}}();return a.default.createElement(t.motion.div,{className:"pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs pi-cursor-pointer dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow",animate:k},i&&i)};exports.IslandMotion=r,exports.default=r;
2
2
  //# sourceMappingURL=IslandMotion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const { incoming, outgoing, accepted, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded } = useSelector((state: RootState) => state.island)\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n\n function getVariant() {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n }\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring) {\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) {\n size = {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (outgoing) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n case 'keypad':\n if (isOpen) {\n size = {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n } else {\n size = {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n }\n break\n case 'transfer':\n if (isOpen) {\n size = {\n width: variants.transfer.expanded.width,\n height: variants.transfer.expanded.height,\n }\n } else {\n size = {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n }\n break\n case 'player':\n if (isOpen) {\n size = {\n width: variants.player.expanded.width,\n height: variants.player.expanded.height,\n }\n } else {\n size = {\n width: variants.player.collapsed.width,\n height: variants.player.collapsed.height,\n }\n }\n break\n case 'recorder':\n if (isOpen) {\n size = {\n width: variants.recorder.expanded.width,\n height: variants.recorder.expanded.height,\n }\n } else {\n size = {\n width: variants.recorder.collapsed.width,\n height: variants.recorder.collapsed.height,\n }\n }\n break\n case 'physicalPhoneRecorder':\n if (isOpen) {\n size = {\n width: variants.physicalPhoneRecorder.expanded.width,\n height: variants.physicalPhoneRecorder.expanded.height,\n }\n } else {\n size = {\n width: variants.physicalPhoneRecorder.collapsed.width,\n height: variants.physicalPhoneRecorder.collapsed.height,\n }\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 isAlert && isOpen\n ? size.height +\n variants.alerts.height +\n (size.height === 0 ? padding_expanded * 2 : padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen ? `${border_radius_expanded}px` : `${border_radius_collapsed}px`,\n padding: isOpen\n ? `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }\n\n const motionVariants = getVariant()\n\n return (\n <motion.div\n className='pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs pi-cursor-pointer dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow'\n animate={motionVariants}\n >\n {children && children}\n </motion.div>\n )\n}\n\nexport interface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","isListen","listen","_c","island","view","isOpen","actionsExpanded","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","padding_x_collapsed","padding_y_collapsed","padding_expanded","motionVariants","size","width","height","call","expanded","transfer","listening","collapsed","keypad","player","recorder","physicalPhoneRecorder","isAlert","concat","borderRadius","padding","getVariant","React","createElement","motion","div","className","animate"],"mappings":"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"}
1
+ {"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const { incoming, outgoing, accepted, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded } = useSelector((state: RootState) => state.island)\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n\n function getVariant() {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n }\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring) {\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) {\n size = {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (outgoing) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n case 'keypad':\n if (isOpen) {\n size = {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n } else {\n size = {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n }\n break\n case 'transfer':\n if (isOpen) {\n size = {\n width: variants.transfer.expanded.width,\n height: variants.transfer.expanded.height,\n }\n } else {\n size = {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n }\n break\n case 'player':\n if (isOpen) {\n size = {\n width: variants.player.expanded.width,\n height: variants.player.expanded.height,\n }\n } else {\n size = {\n width: variants.player.collapsed.width,\n height: variants.player.collapsed.height,\n }\n }\n break\n case 'recorder':\n if (isOpen) {\n size = {\n width: variants.recorder.expanded.width,\n height: variants.recorder.expanded.height,\n }\n } else {\n size = {\n width: variants.recorder.collapsed.width,\n height: variants.recorder.collapsed.height,\n }\n }\n break\n case 'physicalPhoneRecorder':\n if (isOpen) {\n size = {\n width: variants.physicalPhoneRecorder.expanded.width,\n height: variants.physicalPhoneRecorder.expanded.height,\n }\n } else {\n size = {\n width: variants.physicalPhoneRecorder.collapsed.width,\n height: variants.physicalPhoneRecorder.collapsed.height,\n }\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 + (size.height === 0 ? padding_expanded * 2 : padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen ? `${border_radius_expanded}px` : `${border_radius_collapsed}px`,\n padding: isOpen\n ? `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }\n\n const motionVariants = getVariant()\n\n return (\n <motion.div\n className='pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-text-xs pi-cursor-pointer dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow'\n animate={motionVariants}\n >\n {children && children}\n </motion.div>\n )\n}\n\nexport interface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","isListen","listen","_c","island","view","isOpen","actionsExpanded","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","padding_x_collapsed","padding_y_collapsed","padding_expanded","motionVariants","size","width","height","call","expanded","transfer","listening","collapsed","keypad","player","recorder","physicalPhoneRecorder","isAlert","concat","borderRadius","padding","getVariant","React","createElement","motion","div","className","animate"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../lib/webrtc/janus.js");var s=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js");var a=require("../events/SocketEvents.js"),i=require("../utils/genericFunctions/timestamp.js"),u=require("../lib/user/extensions.js"),d=require("../utils/genericFunctions/isEmpty.js"),l=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/react-redux/es/components/Context.js"),require("../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../node_modules/react-redux/node_modules/react-is/index.js");var p=require("../node_modules/react-redux/es/hooks/useDispatch.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(n);exports.Socket=function(m){var v=m.hostName,h=m.username,g=m.authToken,b=m.reload,k=m.reloadedCallback,y=m.children,_=m.uaType,C=p.useDispatch(),N=n.useRef(),S=n.useRef(),j=l.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t,o=s.store.getState().currentCall,a=o.transferring,d=o.transferSwitching,l=o.transferCalls;if(Object.keys(n).length>0){if(e.status){var p=s.store.getState().users.extensions;switch(e.status){case"ringing":(null==n?void 0:n.counterpartNum)&&(C.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||"",ownerExtension:n.owner}),c.eventDispatch("phone-island-call-ringing",{}));break;case"busy":if(n&&n.connected)C.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),ownerExtension:n.owner,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""}),C.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(i.getTimestampInSeconds())}),"physical"===(null===(t=null==j?void 0:j.default_device)||void 0===t?void 0:t.type)&&function(e){C.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),c.eventDispatch("phone-island-call-answered",{}),s.store.dispatch.player.stopAudioPlayer()}(n);else if(n&&!n.connected){if(a&&!d){var m=l.find((function(e){return e.number===n.counterpartNum}));!n.connected&&m&&(C.currentCall.updateCurrentCall({transferring:!1}),c.eventDispatch("phone-island-call-transfer-failed",{}),C.currentCall.updateTransferSwitching(!1))}"REC"===(null==n?void 0:n.counterpartName)&&C.physicalRecorder.setRecordingTempVariable(!0)}n&&!n.connected&&"out"===n.direction&&C.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""});case"onhold":var f=n.counterpartName,v=n.counterpartNum,h=n.startTime;a&&v&&f&&"<unknown>"!==f&&(C.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:v,startTime:"".concat(i.getTimestampInSeconds())}),C.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:v,startTime:"".concat(h/1e3),conversationId:n.id}),C.island.setIslandView("call"));break;case"busy_ringing":c.eventDispatch("phone-island-call-ringing",{})}}}else"online"==e.status&&u.userTotallyFree()&&(C.player.stopAudioPlayer(),C.currentCall.reset(),C.physicalRecorder.setRecordingTempVariable(!1))};return S.current=t.io("https://"+v,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),S.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(S.current.id)),c.eventDispatch("phone-island-socket-connected",{})})),S.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),e.includes("server disconnect")?c.eventDispatch("phone-island-server-disconnected",{}):c.eventDispatch("phone-island-socket-disconnected",{})})),S.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),S.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),S.current.io.on("reconnect",(function(e){c.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(S.current.id,")"))})),S.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),S.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),S.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),N.current=setInterval((function(){var e=Date.now();S.current.volatile.emit("ping",o.withTimeout((function(){C.alerts.removeAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-close",{});var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){C.alerts.setAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.debug("Socket is unreachable!")}),7e3))}),7e3),S.current.on("connect",(function(){console.debug("Socket on: "+v+" is connected!"),S.current.emit("login",{accessKeyId:"".concat(h),token:g,uaType:_})})),S.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),S.current.on("userMainPresenceUpdate",(function(n){s.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),a.dispatchMainPresence(n)})),S.current.on("extenUpdate",(function(e){C.users.updateExtension(e);var t=s.store.getState().users.extensions,r={};for(var c in t){var o=t[c].username,i=t[c].exten;r[o]||(r[o]=[]),r[o].push(i)}var u=r[e.username],l=e.conversations[Object.keys(e.conversations)[0]]||{};if(a.dispatchExtensions(e),d.isEmpty(l)){var p=null==u?void 0:u.some((function(e){var n,r=null===(n=t[e])||void 0===n?void 0:n.conversations;return!d.isEmpty(r)}));p||a.dispatchConversations(e)}else a.dispatchConversations(e);e.username===h&&(n(e,l),C.currentUser.updateConversations(e))})),S.current.on("queueUpdate",(function(e){a.dispatchQueueUpdate(e)})),S.current.on("queueMemberUpdate",(function(e){a.dispatchQueueMemberUpdate(e)})),S.current.on("takeOver",(function(){a.dispatchAlreadyLogin()})),S.current.on("serverReloaded",(function(){a.dispatchServerReload()})),S.current.on("parkingUpdate",(function(){a.dispatchParkingUpdate()})),function(){clearInterval(N.current),S.current.close()}}),[]),n.useEffect((function(){b&&(console.info("websocket reconnection"),S.current.disconnect(),S.current.connect(),k())}),[b]),f.default.createElement(f.default.Fragment,null,y)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/eventDispatch.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../lib/webrtc/janus.js");var s=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../node_modules/mic-check/lib/index.js");var a=require("../events/SocketEvents.js"),i=require("../utils/genericFunctions/timestamp.js"),u=require("../lib/user/extensions.js"),d=require("../utils/genericFunctions/isEmpty.js"),l=require("../node_modules/react-redux/es/hooks/useSelector.js");require("../node_modules/react-redux/es/components/Context.js"),require("../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js"),require("../node_modules/react-redux/node_modules/react-is/index.js");var p=require("../node_modules/react-redux/es/hooks/useDispatch.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(n);exports.Socket=function(m){var v=m.hostName,h=m.username,g=m.authToken,b=m.reload,k=m.reloadedCallback,y=m.children,_=m.uaType,C=p.useDispatch(),N=n.useRef(),S=n.useRef(),j=l.useSelector((function(e){return e.currentUser}));return n.useEffect((function(){var n=function(e,n){var t,o=s.store.getState().currentCall,a=o.transferring,d=o.transferSwitching,l=o.transferCalls;if(Object.keys(n).length>0){if(e.status){var p=s.store.getState().users.extensions;switch(e.status){case"ringing":C.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||"",ownerExtension:n.owner}),c.eventDispatch("phone-island-call-ringing",{});break;case"busy":if(n&&n.connected)C.currentCall.updateCurrentCall({conversationId:n.id,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),ownerExtension:n.owner,username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""}),C.currentCall.addTransferCalls({type:"transferred",displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(i.getTimestampInSeconds())}),"physical"===(null===(t=null==j?void 0:j.default_device)||void 0===t?void 0:t.type)&&function(e){C.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),c.eventDispatch("phone-island-call-answered",{}),s.store.dispatch.player.stopAudioPlayer()}(n);else if(n&&!n.connected){if(a&&!d){var m=l.find((function(e){return e.number===n.counterpartNum}));!n.connected&&m&&(C.currentCall.updateCurrentCall({transferring:!1}),c.eventDispatch("phone-island-call-transfer-failed",{}),C.currentCall.updateTransferSwitching(!1))}"REC"===(null==n?void 0:n.counterpartName)&&C.physicalRecorder.setRecordingTempVariable(!0)}n&&!n.connected&&"out"===n.direction&&C.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:r.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(p&&p[n.counterpartNum]&&p[n.counterpartNum].username)||""});case"onhold":var f=n.counterpartName,v=n.counterpartNum,h=n.startTime;a&&v&&f&&"<unknown>"!==f&&(C.currentCall.addTransferCalls({type:"destination",displayName:r.getDisplayName(n),number:v,startTime:"".concat(i.getTimestampInSeconds())}),C.currentCall.updateCurrentCall({displayName:r.getDisplayName(n),number:v,startTime:"".concat(h/1e3),conversationId:n.id}),C.island.setIslandView("call"));break;case"busy_ringing":c.eventDispatch("phone-island-call-ringing",{})}}}else"online"==e.status&&u.userTotallyFree()&&(C.player.stopAudioPlayer(),C.currentCall.reset(),C.physicalRecorder.setRecordingTempVariable(!1))};return S.current=t.io("https://"+v,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),S.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(S.current.id)),c.eventDispatch("phone-island-socket-connected",{})})),S.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),e.includes("server disconnect")?c.eventDispatch("phone-island-server-disconnected",{}):c.eventDispatch("phone-island-socket-disconnected",{})})),S.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),S.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),S.current.io.on("reconnect",(function(e){c.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(S.current.id,")"))})),S.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),S.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),S.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),N.current=setInterval((function(){var e=Date.now();S.current.volatile.emit("ping",o.withTimeout((function(){C.alerts.removeAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-close",{});var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){C.alerts.setAlert("socket_down"),c.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.debug("Socket is unreachable!")}),7e3))}),7e3),S.current.on("connect",(function(){console.debug("Socket on: "+v+" is connected!"),S.current.emit("login",{accessKeyId:"".concat(h),token:g,uaType:_})})),S.current.on("authe_ok",(function(){console.debug("Socket authentication success!")})),S.current.on("userMainPresenceUpdate",(function(n){s.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),a.dispatchMainPresence(n)})),S.current.on("extenUpdate",(function(e){C.users.updateExtension(e);var t=s.store.getState().users.extensions,r={};for(var c in t){var o=t[c].username,i=t[c].exten;r[o]||(r[o]=[]),r[o].push(i)}var u=r[e.username],l=e.conversations[Object.keys(e.conversations)[0]]||{};if(a.dispatchExtensions(e),d.isEmpty(l)){var p=null==u?void 0:u.some((function(e){var n,r=null===(n=t[e])||void 0===n?void 0:n.conversations;return!d.isEmpty(r)}));p||a.dispatchConversations(e)}else a.dispatchConversations(e);e.username===h&&(n(e,l),C.currentUser.updateConversations(e))})),S.current.on("queueUpdate",(function(e){a.dispatchQueueUpdate(e)})),S.current.on("queueMemberUpdate",(function(e){a.dispatchQueueMemberUpdate(e)})),S.current.on("takeOver",(function(){a.dispatchAlreadyLogin()})),S.current.on("serverReloaded",(function(){a.dispatchServerReload()})),S.current.on("parkingUpdate",(function(){a.dispatchParkingUpdate()})),function(){clearInterval(N.current),S.current.close()}}),[]),n.useEffect((function(){b&&(console.info("websocket reconnection"),S.current.disconnect(),S.current.connect(),k())}),[b]),f.default.createElement(f.default.Fragment,null,y)};
2
2
  //# sourceMappingURL=Socket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n dispatchExtensions,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // Show phone island only if conversation number is not empty\n if (conv?.counterpartNum) {\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n\n eventDispatch('phone-island-call-ringing', {})\n }\n\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n if (userInformation?.default_device?.type === 'physical') {\n checkDefaultDeviceConversationActive(conv)\n }\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-close', {})\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-open', {})\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","userInformation","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","_b","store","getState","currentCall","transferring","transferSwitching","transferCalls","Object","keys","length","status","extensions","users","counterpartNum","checkIncomingUpdatePlay","conversationId","id","displayName","getDisplayName","number","concat","incomingSocket","ownerExtension","owner","eventDispatch","connected","updateCurrentCall","addTransferCalls","type","startTime","getTimestampInSeconds","default_device","accepted","incoming","direction","undefined","player","stopAudioPlayer","checkDefaultDeviceConversationActive","inTransferCalls","find","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","island","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","deviceMap","key","user","ext","exten","push","associatedExtensions","conversations","dispatchExtensions","isEmpty","hasNonEmptyConversation","some","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n dispatchAlreadyLogin,\n dispatchServerReload,\n dispatchParkingUpdate,\n dispatchExtensions,\n} from '../events'\nimport { store } from '../store'\nimport { eventDispatch, withTimeout } from '../utils'\nimport type {\n ConversationTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\nimport { getTimestampInSeconds } from '../utils/genericFunctions/timestamp'\nimport { userTotallyFree } from '../lib/user/extensions'\nimport { isEmpty } from '../utils/genericFunctions/isEmpty'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n reload: boolean\n reloadedCallback: () => void\n uaType: string\n}\n\nexport const Socket: FC<SocketProps> = ({\n hostName,\n username,\n authToken,\n reload,\n reloadedCallback,\n children,\n uaType,\n}) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\n\n // get user information\n const userInformation = useSelector((state: RootState) => state.currentUser)\n\n const checkDefaultDeviceConversationActive = (conv: any) => {\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n accepted: true,\n incoming: conv.direction === 'in' ? false : undefined,\n })\n eventDispatch('phone-island-call-answered', {})\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n\n const checkDefaultDeviceConversationClosed = (conv: any) => {\n // store.dispatch.player.stopAudioPlayer()\n store.dispatch.currentCall.reset()\n // store.dispatch.listen.reset()\n }\n\n useEffect(() => {\n /**\n * Manages event and data for the currentUser\n *\n * @param res The data from the socket\n * @param conv The conversation data\n */\n const handleCurrentUserEvents = (res: ExtensionTypes, conv: ConversationTypes) => {\n // Handle transferring data\n const { transferring, transferSwitching, transferCalls } = store.getState().currentCall\n\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\n if (res.status) {\n const { extensions } = store.getState().users\n switch (res.status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n ownerExtension: conv.owner,\n })\n\n eventDispatch('phone-island-call-ringing', {})\n\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted and update connected call\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n ownerExtension: conv.owner,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'transferred',\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${getTimestampInSeconds()}`,\n })\n\n if (userInformation?.default_device?.type === 'physical') {\n checkDefaultDeviceConversationActive(conv)\n }\n }\n // Handle not connected calls\n else if (conv && !conv.connected) {\n if (transferring && !transferSwitching) {\n // Handle hangup during transfer\n const inTransferCalls = transferCalls.find(\n (item) => item.number === conv.counterpartNum,\n )\n if (!conv.connected && inTransferCalls) {\n // Update transferring data for the current call\n dispatch.currentCall.updateCurrentCall({\n transferring: false,\n })\n eventDispatch('phone-island-call-transfer-failed', {})\n // Reset transfer switching\n // TODO - It needs to enhance how conversation connections (conv.connected) are updated server side\n // TODO - The transfer end is not handled when the an user hangups or after call switch\n dispatch.currentCall.updateTransferSwitching(false)\n }\n }\n if (conv?.counterpartName === 'REC') {\n dispatch.physicalRecorder.setRecordingTempVariable(true)\n }\n }\n // Handle outgoing call\n if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n case 'onhold':\n // The new conversation during transferring\n const { counterpartName, counterpartNum, startTime } = conv\n if (\n transferring &&\n counterpartNum &&\n counterpartName &&\n counterpartName !== '<unknown>'\n ) {\n // Add call to transfer calls\n dispatch.currentCall.addTransferCalls({\n type: 'destination',\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${getTimestampInSeconds()}`,\n })\n // Set the current call informations\n dispatch.currentCall.updateCurrentCall({\n displayName: getDisplayName(conv),\n number: counterpartNum,\n startTime: `${startTime / 1000}`,\n conversationId: conv.id,\n })\n // Set the view of the island to call\n dispatch.island.setIslandView('call')\n }\n break\n case 'busy_ringing':\n eventDispatch('phone-island-call-ringing', {})\n break\n default:\n break\n }\n }\n } else {\n // Without conversation for physical phone management\n if (res.status == 'online' && userTotallyFree()) {\n // Stop ringing sounds\n dispatch.player.stopAudioPlayer()\n // Reset current call info\n dispatch.currentCall.reset()\n dispatch.physicalRecorder.setRecordingTempVariable(false)\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io('https://' + hostName, {\n upgrade: false,\n transports: ['websocket'],\n reconnection: true,\n reconnectionDelay: 2000,\n })\n\n // Handle socket errors\n socket.current.on('connect', () => {\n console.debug(`Socket connected sid: ${socket.current.id}`)\n eventDispatch('phone-island-socket-connected', {})\n })\n socket.current.on('disconnect', (reason) => {\n console.debug(`Socket disconnect - reason: ${reason}`)\n if (reason.includes('server disconnect')) {\n eventDispatch('phone-island-server-disconnected', {})\n } else {\n eventDispatch('phone-island-socket-disconnected', {})\n }\n })\n socket.current.io.on('error', (err) => {\n console.debug(`Socket error: `, err)\n })\n socket.current.on('connect_error', (err) => {\n console.debug(`Socket connect_error: `, err)\n })\n socket.current.io.on('reconnect', (attempt) => {\n eventDispatch('phone-island-socket-reconnected', {})\n console.debug(`Socket reconnect attemp ${attempt} (sid: ${socket.current.id})`)\n })\n socket.current.io.on('reconnect_attempt', (attempt) => {\n console.debug(`Socket reconnect_attempt ${attempt}`)\n })\n socket.current.io.on('reconnect_error', (err) => {\n console.debug(`Socket reconnect_error: `, err)\n })\n socket.current.io.on('reconnect_failed', () => {\n console.debug(`Socket reconnect_failed`)\n })\n\n // Checks if socket is reachable every 5 seconds\n connectionCheckInterval.current = setInterval(() => {\n const start = Date.now()\n socket.current.volatile.emit(\n 'ping',\n withTimeout(\n () => {\n // Remove socket_down alert\n dispatch.alerts.removeAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-close', {})\n // Calculate and log latency\n const latency = Date.now() - start\n console.debug(`Socket latency: ${latency}ms`)\n console.debug('Socket is reachable!')\n },\n () => {\n // Set socket_down alert\n dispatch.alerts.setAlert('socket_down')\n eventDispatch('phone-island-socket-disconnected-popup-open', {})\n console.debug('Socket is unreachable!')\n },\n 7 * 1000, // Waits for the response 7 seconds\n ),\n )\n }, 7 * 1000) // Executes a new check every 7 seconds\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.debug('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: uaType,\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.debug('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n\n //retrieve all extensions from store\n const { extensions }: any = store.getState().users\n const deviceMap: any = {}\n\n // Create a map of extensions for each user\n for (const key in extensions) {\n const user: any = extensions[key].username\n const ext: any = extensions[key].exten\n\n if (!deviceMap[user]) {\n deviceMap[user] = []\n }\n\n deviceMap[user].push(ext)\n }\n\n const associatedExtensions: any = deviceMap[res.username]\n\n // Initialize conversation\n let conv = res.conversations[Object.keys(res.conversations)[0]] || {}\n\n // Update all extensions and send the dispatch event\n dispatchExtensions(res)\n\n // second step update conversation\n\n // Check if conversation is empty\n if (isEmpty(conv)) {\n // Check if there is at least one conversation not empty\n const hasNonEmptyConversation = associatedExtensions?.some((ext: any) => {\n const extConversations = extensions[ext]?.conversations\n\n if (!isEmpty(extConversations)) {\n // not empty conversation found\n return true\n }\n\n return false\n })\n\n if (!hasNonEmptyConversation) {\n // Conversation is empty and there is no conversation for the user\n dispatchConversations(res)\n }\n } else {\n // Dispatch conversation event\n dispatchConversations(res)\n }\n\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n // Update the conversations of the user\n dispatch.currentUser.updateConversations(res)\n }\n })\n\n // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('serverReloaded', () => {\n // Dispatch serverReload event\n dispatchServerReload()\n })\n\n // `serverReload` is the socket event when server is reloaded\n socket.current.on('parkingUpdate', () => {\n // Dispatch serverReload event\n dispatchParkingUpdate()\n })\n }\n\n initSocketConnection()\n\n // Stop the check socket interval\n // Close the socket connection\n return () => {\n clearInterval(connectionCheckInterval.current)\n socket.current.close()\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload) {\n console.info('websocket reconnection')\n socket.current.disconnect()\n socket.current.connect()\n reloadedCallback()\n }\n }, [reload])\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","reload","reloadedCallback","children","uaType","dispatch","useDispatch","connectionCheckInterval","useRef","socket","userInformation","useSelector","state","currentUser","useEffect","handleCurrentUserEvents","res","conv","_b","store","getState","currentCall","transferring","transferSwitching","transferCalls","Object","keys","length","status","extensions","users","checkIncomingUpdatePlay","conversationId","id","displayName","getDisplayName","number","concat","counterpartNum","incomingSocket","ownerExtension","owner","eventDispatch","connected","updateCurrentCall","addTransferCalls","type","startTime","getTimestampInSeconds","default_device","accepted","incoming","direction","undefined","player","stopAudioPlayer","checkDefaultDeviceConversationActive","inTransferCalls","find","item","updateTransferSwitching","counterpartName","physicalRecorder","setRecordingTempVariable","checkOutgoingUpdate","outgoingSocket","island","setIslandView","userTotallyFree","reset","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","reason","includes","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","deviceMap","key","user","ext","exten","push","associatedExtensions","conversations","dispatchExtensions","isEmpty","hasNonEmptyConversation","some","extConversations","dispatchConversations","updateConversations","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","dispatchServerReload","dispatchParkingUpdate","clearInterval","close","info","disconnect","connect","React","createElement","Fragment"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),n=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),c=require("../store/index.js"),o=require("../lib/devices/devices.js"),i=require("../lib/phone/call.js"),s=require("../lib/webrtc/connection.js"),u=require("../static/outgoing_ringtone.js"),l=require("../utils/customHooks/useEventListener.js"),d=require("../utils/genericFunctions/eventDispatch.js"),g=require("../node_modules/react-redux/es/hooks/useDispatch.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=p(t);exports.WebRTC=function(p){var b=p.hostName,w=p.sipExten,m=p.sipSecret,h=p.children,v=p.sipHost,y=p.sipPort,S=p.reload,k=p.uaType,C=p.reloadedCallback,T=g.useDispatch(),j=t.useRef(null),A=t.useRef(n.default),E=t.useCallback((function(){A.current.init({debug:"all",dependencies:A.current.useDefaultDependencies({adapter:r.default}),callback:function(){var e=new A.current({server:"https://".concat(b,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(T.webrtc.updateWebRTC({sipcall:e}),a.register({sipExten:w,sipSecret:m,sipHost:v,sipPort:y}),e&&A.current.log&&A.current.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){A.current.error&&(A.current.error(" -- Error attaching plugin..."),A.current.error(e))},consentDialog:function(e){A.current.log&&A.current.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){A.current.log&&A.current.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){c.store.getState().webrtc.sipcall&&A.current.log&&A.current.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,t){A.current.log&&A.current.log("Janus "+(t?"started":"stopped")+" receiving our "+e)},slowLink:function(e,t){e?A.current.warn&&A.current.warn("SLOW link: several missing packets from janus (".concat(t,")")):A.current.warn&&A.current.warn("SLOW link: janus is not receiving all your packets (".concat(t,")"))},onmessage:function(e,t){var r=c.store.getState().webrtc.sipcall;A.current.debug&&(A.current.debug(" ::: Got a message :::"),A.current.debug(JSON.stringify(e)));var n=e.error;if(null==n||null==n){var o=e.result;if(null!=o&&void 0!==o.event&&null!==o.event){var s=o.event,l=c.store.getState().recorder.recording;switch(s){case"registration_failed":A.current.error&&A.current.error("Registration failed: "+o.code+" "+o.reason);break;case"unregistered":A.current.log&&A.current.log("Successfully un-registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-unregistered",{});break;case"registered":A.current.log&&A.current.log("Successfully registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-registered",{}),c.store.getState().webrtc.registered||c.store.dispatch.webrtc.updateWebRTC({registered:!0}),T.alerts.removeAlert("webrtc_down"),T.webrtc.updateLastActivity((new Date).getTime());break;case"registering":A.current.log&&A.current.log("janus registering");break;case"calling":T.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),T.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":c.store.getState().player.audioPlayerPlaying||T.player.updateStartAudioPlayer({src:u.default,loop:!0}),T.webrtc.updateLastActivity((new Date).getTime());break;case"progress":A.current.log&&A.current.log("There's early media from "+o.username+", wairing for the call!"),t&&a.handleRemote(t),T.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":var g=c.store.getState().currentUser.default_device;("mobile"===k&&"nethlink"===(null==g?void 0:g.type)||"desktop"===k&&"webrtc"===(null==g?void 0:g.type))&&(T.webrtc.updateWebRTC({jsepGlobal:t}),l?T.recorder.setIncoming(!0):(T.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),A.current.log&&A.current.log("Incoming call from "+o.username+"!")),T.webrtc.updateLastActivity((new Date).getTime()));break;case"accepted":var p=Math.floor(Date.now()/1e3);A.current.log&&A.current.log(o.username+" accepted the call!"),t&&a.handleRemote(t),T.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),T.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1}),T.currentCall.updateStartTime(p.toString()),c.store.dispatch.player.stopAudioPlayer(),T.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":l&&T.recorder.setRecording(!1),i.hangupCurrentCall(),r.hangup(),c.store.dispatch.player.stopAudioPlayer(),A.current.log&&A.current.log("Call hung up ("+o.code+" "+o.reason+")!"),T.webrtc.updateLastActivity((new Date).getTime());break;case"gateway_down":console.warn("THE GATEWAY IS DOWN")}}}else c.store.getState().webrtc.registered?(r&&r.hangup(),c.store.dispatch.player.stopAudioPlayer()):A.current.log&&A.current.log("User is not registered")},onlocalstream:function(e){A.current.debug&&(A.current.debug(" ::: Got a local stream :::"),A.current.debug(e));var t=c.store.getState().player.localVideo,r=e.getAudioTracks(),n=e.getVideoTracks();if(A.current.attachMediaStream){if(r&&r.length>0){var a=new MediaStream(r);c.store.dispatch.webrtc.updateLocalAudioStream(a)}else console.warn("No audio tracks on local stream");if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&A.current.attachMediaStream(t.current,o)}else console.warn("No video tracks on local stream")}},onremotestream:function(e){A.current.debug&&A.current.debug(" ::: Got a remote stream :::"),c.store.dispatch.player.stopAudioPlayer();var t=c.store.getState().player.remoteAudio,r=c.store.getState().player.remoteVideo,n=e.getAudioTracks(),a=e.getVideoTracks();if(A.current.attachMediaStream){if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&A.current.attachMediaStream(t.current,o),c.store.dispatch.webrtc.updateRemoteAudioStream(o)}else console.warn("No audio tracks on remote stream");if(a&&a.length>0){var i=new MediaStream(a);r&&r.current&&A.current.attachMediaStream(r.current,i)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){A.current.log&&A.current.log(" ::: janus Got a cleanup notification :::")},detached:function(){A.current.warn&&A.current.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){A.current.log&&A.current.log("error",e),T.alerts.setAlert("webrtc_down")},destroyed:function(){T.webrtc.updateWebRTC({destroyed:!0}),T.alerts.setAlert("webrtc_down")}})}})}),[A.current]);t.useEffect((function(){o.checkMediaPermissions()}),[]);var D=t.useState(navigator.onLine),_=D[0],L=D[1],R=t.useState(!1),P=R[0],I=R[1];return t.useEffect((function(){var e=function(){return L(!0)},t=function(){return L(!1)};return window.addEventListener("online",e),window.addEventListener("offline",t),function(){window.removeEventListener("online",e),window.removeEventListener("offline",t)}}),[]),t.useEffect((function(){_?(console.log("Internet connection restored."),I(!0)):(console.log("Internet connection lost."),I(!1))}),[_]),t.useEffect((function(){var e;return E(),e=c.store.getState().webrtc.CHECK_INTERVAL_TIME,j.current||(j.current=setInterval((function(){return s.webrtcCheck((function(){a.register({sipExten:w,sipSecret:m,sipHost:v,sipPort:y})}))}),e)),function(){a.unregister(),clearInterval(j.current)}}),[]),t.useEffect((function(){if(S||P){a.unregister();var e=c.store.getState().webrtc.sipcall;e&&e.detach(),A.current.destroy&&A.current.destroy(),setTimeout((function(){E(),C&&C()}),1e4)}}),[S,P]),l.useEventListener("phone-island-attach",(function(e){E(),c.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),d.eventDispatch("phone-island-attached",{})})),l.useEventListener("phone-island-call-transfer",(function(t){var r=null==t?void 0:t.to;T.island.toggleIsOpen(!0),function(t){e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,i.attendedTransfer(t)];case 1:return e.sent()&&(T.currentCall.updateCurrentCall({transferring:!0,paused:!1}),T.player.playRemoteAudio()),[2]}}))}))}(r)})),f.default.createElement(f.default.Fragment,null,h)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),n=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),c=require("../store/index.js"),o=require("../lib/devices/devices.js"),i=require("../lib/phone/call.js"),s=require("../lib/webrtc/connection.js"),u=require("../static/outgoing_ringtone.js"),l=require("../utils/customHooks/useEventListener.js"),d=require("../utils/genericFunctions/eventDispatch.js"),g=require("../node_modules/react-redux/es/hooks/useDispatch.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=p(t);exports.WebRTC=function(p){var b=p.hostName,w=p.sipExten,m=p.sipSecret,h=p.children,v=p.sipHost,y=p.sipPort,S=p.reload,k=p.uaType,C=p.reloadedCallback,T=g.useDispatch(),j=t.useRef(null),A=t.useRef(n.default),E=t.useCallback((function(){A.current.init({debug:"all",dependencies:A.current.useDefaultDependencies({adapter:r.default}),callback:function(){var e=new A.current({server:"https://".concat(b,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(T.webrtc.updateWebRTC({sipcall:e}),a.register({sipExten:w,sipSecret:m,sipHost:v,sipPort:y}),e&&A.current.log&&A.current.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){A.current.error&&(A.current.error(" -- Error attaching plugin..."),A.current.error(e))},consentDialog:function(e){A.current.log&&A.current.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){A.current.log&&A.current.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){c.store.getState().webrtc.sipcall&&A.current.log&&A.current.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,t){A.current.log&&A.current.log("Janus "+(t?"started":"stopped")+" receiving our "+e)},slowLink:function(e,t){e?A.current.warn&&A.current.warn("SLOW link: several missing packets from janus (".concat(t,")")):A.current.warn&&A.current.warn("SLOW link: janus is not receiving all your packets (".concat(t,")"))},onmessage:function(e,t){var r=c.store.getState().webrtc.sipcall;A.current.debug&&(A.current.debug(" ::: Got a message :::"),A.current.debug(JSON.stringify(e)));var n=e.error;if(null==n||null==n){var o=e.result;if(null!=o&&void 0!==o.event&&null!==o.event){var s=o.event,l=c.store.getState().recorder.recording;switch(s){case"registration_failed":A.current.error&&A.current.error("Registration failed: "+o.code+" "+o.reason);break;case"unregistered":A.current.log&&A.current.log("Successfully un-registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-unregistered",{});break;case"registered":A.current.log&&A.current.log("Successfully registered as "+o.username+"!"),d.eventDispatch("phone-island-webrtc-registered",{}),c.store.getState().webrtc.registered||c.store.dispatch.webrtc.updateWebRTC({registered:!0}),T.alerts.removeAlert("webrtc_down"),T.webrtc.updateLastActivity((new Date).getTime());break;case"registering":A.current.log&&A.current.log("janus registering");break;case"calling":T.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),T.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":c.store.getState().player.audioPlayerPlaying||T.player.updateStartAudioPlayer({src:u.default,loop:!0}),T.webrtc.updateLastActivity((new Date).getTime());break;case"progress":A.current.log&&A.current.log("There's early media from "+o.username+", wairing for the call!"),t&&a.handleRemote(t),T.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":var g=c.store.getState().currentUser.default_device;("mobile"===k&&"nethlink"===(null==g?void 0:g.type)||"desktop"===k&&"webrtc"===(null==g?void 0:g.type))&&(T.webrtc.updateWebRTC({jsepGlobal:t}),l?T.recorder.setIncoming(!0):(T.currentCall.checkIncomingUpdatePlay({incomingWebRTC:!0}),A.current.log&&A.current.log("Incoming call from "+o.username+"!")),T.webrtc.updateLastActivity((new Date).getTime()));break;case"accepted":var p=Math.floor(Date.now()/1e3);A.current.log&&A.current.log(o.username+" accepted the call!"),t&&a.handleRemote(t),T.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),T.currentCall.updateCurrentCall({incoming:!1,incomingWebRTC:!1,startTime:null==p?void 0:p.toString()}),c.store.dispatch.player.stopAudioPlayer(),T.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":l&&T.recorder.setRecording(!1),i.hangupCurrentCall(),r.hangup(),c.store.dispatch.player.stopAudioPlayer(),c.store.dispatch.currentCall.reset(),A.current.log&&A.current.log("Call hung up ("+o.code+" "+o.reason+")!"),T.webrtc.updateLastActivity((new Date).getTime());break;case"gateway_down":console.warn("THE GATEWAY IS DOWN")}}}else c.store.getState().webrtc.registered?(r&&r.hangup(),c.store.dispatch.player.stopAudioPlayer()):A.current.log&&A.current.log("User is not registered")},onlocalstream:function(e){A.current.debug&&(A.current.debug(" ::: Got a local stream :::"),A.current.debug(e));var t=c.store.getState().player.localVideo,r=e.getAudioTracks(),n=e.getVideoTracks();if(A.current.attachMediaStream){if(r&&r.length>0){var a=new MediaStream(r);c.store.dispatch.webrtc.updateLocalAudioStream(a)}else console.warn("No audio tracks on local stream");if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&A.current.attachMediaStream(t.current,o)}else console.warn("No video tracks on local stream")}},onremotestream:function(e){A.current.debug&&A.current.debug(" ::: Got a remote stream :::"),c.store.dispatch.player.stopAudioPlayer();var t=c.store.getState().player.remoteAudio,r=c.store.getState().player.remoteVideo,n=e.getAudioTracks(),a=e.getVideoTracks();if(A.current.attachMediaStream){if(n&&n.length>0){var o=new MediaStream(n);t&&t.current&&A.current.attachMediaStream(t.current,o),c.store.dispatch.webrtc.updateRemoteAudioStream(o)}else console.warn("No audio tracks on remote stream");if(a&&a.length>0){var i=new MediaStream(a);r&&r.current&&A.current.attachMediaStream(r.current,i)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){A.current.log&&A.current.log(" ::: janus Got a cleanup notification :::")},detached:function(){A.current.warn&&A.current.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){A.current.log&&A.current.log("error",e),T.alerts.setAlert("webrtc_down")},destroyed:function(){T.webrtc.updateWebRTC({destroyed:!0}),T.alerts.setAlert("webrtc_down")}})}})}),[A.current]);t.useEffect((function(){o.checkMediaPermissions()}),[]);var D=t.useState(navigator.onLine),_=D[0],L=D[1],R=t.useState(!1),P=R[0],I=R[1],q=t.useRef(!1);return t.useEffect((function(){var e=function(){return L(!0)},t=function(){return L(!1)};return window.addEventListener("online",e),window.addEventListener("offline",t),function(){window.removeEventListener("online",e),window.removeEventListener("offline",t)}}),[]),t.useEffect((function(){_?q.current&&(console.log("Internet connection restored."),I(!0),q.current=!1):(console.log("Internet connection lost."),q.current=!0,I(!1))}),[_]),t.useEffect((function(){var e;return E(),e=c.store.getState().webrtc.CHECK_INTERVAL_TIME,j.current||(j.current=setInterval((function(){return s.webrtcCheck((function(){a.register({sipExten:w,sipSecret:m,sipHost:v,sipPort:y})}))}),e)),function(){a.unregister(),clearInterval(j.current)}}),[]),t.useEffect((function(){if(S||P){a.unregister();var e=c.store.getState().webrtc.sipcall;e&&e.detach(),A.current.destroy&&A.current.destroy(),setTimeout((function(){E(),C&&C()}),1e4)}}),[S,P]),l.useEventListener("phone-island-attach",(function(e){E(),c.store.dispatch.currentUser.updateCurrentDefaultDevice(null==e?void 0:e.deviceInformationObject),d.eventDispatch("phone-island-attached",{})})),l.useEventListener("phone-island-call-transfer",(function(t){var r=null==t?void 0:t.to;T.island.toggleIsOpen(!0),function(t){e.__awaiter(this,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return[4,i.attendedTransfer(t)];case 1:return e.sent()&&(T.currentCall.updateCurrentCall({transferring:!0,paused:!1}),T.player.playRemoteAudio()),[2]}}))}))}(r)})),f.default.createElement(f.default.Fragment,null,h)};
2
2
  //# sourceMappingURL=WebRTC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef, useCallback, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { attendedTransfer, hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\nimport { eventDispatch, useEventListener } from '../utils'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n reload: boolean\n uaType: string\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n uaType,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-unregistered', {})\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-registered', {})\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n const { default_device } = store.getState().currentUser\n if (\n (uaType === 'mobile' && default_device?.type === 'nethlink') ||\n (uaType === 'desktop' && default_device?.type === 'webrtc')\n ) {\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n }\n\n break\n\n case 'accepted':\n const acceptedTimestamp = Math.floor(Date.now() / 1000)\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n // Set incoming value to false\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n })\n dispatch.currentCall.updateStartTime(acceptedTimestamp.toString())\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n const [isOnline, setIsOnline] = useState(navigator.onLine)\n const [connectionReturned, setConnectionReturned] = useState(false)\n\n useEffect(() => {\n // Event listeners for online/offline status\n const handleOnline = () => setIsOnline(true)\n const handleOffline = () => setIsOnline(false)\n\n window.addEventListener('online', handleOnline)\n window.addEventListener('offline', handleOffline)\n\n return () => {\n window.removeEventListener('online', handleOnline)\n window.removeEventListener('offline', handleOffline)\n }\n }, [])\n\n useEffect(() => {\n if (!isOnline) {\n console.log('Internet connection lost.')\n setConnectionReturned(false)\n } else {\n console.log('Internet connection restored.')\n setConnectionReturned(true)\n }\n }, [isOnline])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload || connectionReturned) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload, connectionReturned])\n\n useEventListener('phone-island-attach', (data) => {\n initWebRTC()\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-attached', {})\n })\n\n /**\n * Event listner for phone-island-call-transfer event\n */\n useEventListener('phone-island-call-transfer', (data) => {\n const transferNumber = data?.to\n dispatch.island.toggleIsOpen(true)\n handleAttendedTransfer(transferNumber)\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","uaType","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","eventDispatch","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","default_device","currentUser","type","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","acceptedTimestamp","Math","floor","now","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","updateStartTime","toString","stopAudioPlayer","setRecording","hangupCurrentCall","hangup","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","_b","useState","navigator","onLine","isOnline","setIsOnline","_c","connectionReturned","setConnectionReturned","handleOnline","handleOffline","window","addEventListener","removeEventListener","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","useEventListener","data","updateCurrentDefaultDevice","deviceInformationObject","transferNumber","to","island","toggleIsOpen","number","attendedTransfer","sent","transferring","paused","playRemoteAudio","handleAttendedTransfer","React","createElement","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useRef, useCallback, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Dispatch } from '../store'\nimport adapter from 'webrtc-adapter'\nimport JanusLib from '../lib/webrtc/janus.js'\nimport type { JanusTypes } from '../types'\nimport { register, unregister, handleRemote } from '../lib/webrtc/messages'\nimport { store } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { attendedTransfer, hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\nimport { eventDispatch, useEventListener } from '../utils'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n sipHost: string\n sipPort: string\n reload: boolean\n uaType: string\n reloadedCallback?: () => void\n}\n\nexport const WebRTC: FC<WebRTCProps> = ({\n hostName,\n sipExten,\n sipSecret,\n children,\n sipHost,\n sipPort,\n reload,\n uaType,\n reloadedCallback,\n}) => {\n // Initialize store dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // Initialize Janus from Janus library\n const janus = useRef<JanusTypes>(JanusLib)\n\n // Initializes the webrtc connection and handlers\n const initWebRTC = useCallback(() => {\n janus.current.init({\n debug: 'all',\n dependencies: janus.current.useDefaultDependencies({\n adapter,\n }),\n callback: function () {\n const janusInstance = new janus.current({\n server: `https://${hostName}/janus`,\n success: () => {\n if (janusInstance.attach) {\n // Use Janus Sip Plugin\n janusInstance.attach({\n plugin: 'janus.plugin.sip',\n opaqueId: 'sebastian' + '_' + new Date().getTime(),\n success: function (pluginHandle) {\n // Set sipcall to the store\n if (pluginHandle) {\n dispatch.webrtc.updateWebRTC({\n sipcall: pluginHandle,\n })\n // Register the extension to the server\n register({ sipExten, sipSecret, sipHost, sipPort })\n if (pluginHandle) {\n if (janus.current.log)\n janus.current.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (janus.current.error) {\n janus.current.error(' -- Error attaching plugin...')\n janus.current.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (janus.current.log) janus.current.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n iceState: function (newState) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (sipcall) {\n if (janus.current.log)\n janus.current.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (janus.current.log)\n janus.current.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (janus.current.warn)\n janus.current.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (janus.current.warn)\n janus.current.warn(\n `SLOW link: janus is not receiving all your packets (${count})`,\n )\n }\n },\n onmessage: function (msg, jsep) {\n // Get webrtc state\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a message :::')\n janus.current.debug(JSON.stringify(msg))\n }\n\n // Handle errors in message\n var error = msg['error']\n if (error != null && error != undefined) {\n if (!store.getState().webrtc.registered) {\n if (janus.current.log) janus.current.log('User is not registered')\n } else {\n // Reset status\n sipcall && sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n }\n return\n }\n // Manage events\n var result = msg['result']\n if (\n result !== null &&\n result !== undefined &&\n result['event'] !== undefined &&\n result['event'] !== null\n ) {\n // Get event data\n var event = result['event']\n // Get the recording state\n const { recording } = store.getState().recorder\n\n // Manage different types of events\n switch (event) {\n case 'registration_failed':\n if (janus.current.error)\n janus.current.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully un-registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-unregistered', {})\n break\n\n case 'registered':\n if (janus.current.log)\n janus.current.log(\n 'Successfully registered as ' + result['username'] + '!',\n )\n eventDispatch('phone-island-webrtc-registered', {})\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Remove WebRTC connections alert if any\n dispatch.alerts.removeAlert('webrtc_down')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (janus.current.log) {\n janus.current.log('janus registering')\n }\n break\n\n // This event arrive on outgoing call start\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdate({\n outgoingWebRTC: true,\n })\n\n // Update webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 180 code, it means\n // ...that the local outgoing ringtone must be player\n case 'ringing':\n const { audioPlayerPlaying } = store.getState().player\n\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n // Update audio player and start playing\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n // After an outgoing call start on 183 code, it means\n // ...that the outgoing ringtone arrives from the stream\n // ...playing the local outgoing ringtone isn't needed\n case 'progress':\n if (janus.current.log) {\n janus.current.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n const { default_device } = store.getState().currentUser\n if (\n (uaType === 'mobile' && default_device?.type === 'nethlink') ||\n (uaType === 'desktop' && default_device?.type === 'webrtc')\n ) {\n // Update webrtc state\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n // Check if is recording an audio through call\n // ...recording an audio is a request made by the user\n // ...it must be managed differently than an incoming call\n if (recording) {\n // Update the recorder state\n dispatch.recorder.setIncoming(true)\n } else {\n // Manage the incoming message as a webrtc call\n // Update incoming webrtc state, number and display name\n // ...are updated inside socket\n dispatch.currentCall.checkIncomingUpdatePlay({\n incomingWebRTC: true,\n })\n\n if (janus.current.log) {\n janus.current.log('Incoming call from ' + result['username'] + '!')\n }\n }\n\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n }\n\n break\n\n case 'accepted':\n const acceptedTimestamp = Math.floor(Date.now() / 1000)\n if (janus.current.log) {\n janus.current.log(result['username'] + ' accepted the call!')\n }\n // Set the remote description to janus lib\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\n })\n\n // Set incoming value to false and set start time\n dispatch.currentCall.updateCurrentCall({\n incoming: false,\n incomingWebRTC: false,\n startTime: acceptedTimestamp?.toString(),\n })\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'hangup':\n // Manage hangup message during recording\n if (recording) {\n dispatch.recorder.setRecording(false)\n }\n\n hangupCurrentCall()\n sipcall.hangup()\n\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Check the janus doc before enable the following\n // if (\n // result['code'] === 486 &&\n // result['event'] === 'hangup' &&\n // result['reason'] === 'Busy Here'\n // ) {\n // dispatch.player.updateAudioSource({\n // src: busyRingtone,\n // })\n // dispatch.player.playAudio()\n // }\n // Reset current call info\n store.dispatch.currentCall.reset()\n if (janus.current.log)\n janus.current.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\n )\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n // stopScreenSharingI()\n break\n\n case 'gateway_down':\n console.warn('THE GATEWAY IS DOWN')\n\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a local stream :::')\n janus.current.debug(stream)\n }\n\n // Get local video element\n const localVideoElement = store.getState().player.localVideo\n\n // Get audio and video tracks from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for local audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateLocalAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on local stream')\n }\n // Initialize the new media stream for local video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (localVideoElement && localVideoElement.current) {\n janus.current.attachMediaStream(localVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on local stream')\n }\n }\n },\n onremotestream: function (stream: MediaStream) {\n if (janus.current.debug) {\n janus.current.debug(' ::: Got a remote stream :::')\n }\n // Stop the local audio element ringing\n store.dispatch.player.stopAudioPlayer()\n\n // Get remote audio and video elements\n const remoteAudioElement = store.getState().player.remoteAudio\n const remoteVideoElement = store.getState().player.remoteVideo\n\n // Get audio and video from stream\n const audioTracks: MediaStreamTrack[] = stream.getAudioTracks()\n const videoTracks: MediaStreamTrack[] = stream.getVideoTracks()\n\n if (janus.current.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n\n if (remoteAudioElement && remoteAudioElement.current) {\n janus.current.attachMediaStream(remoteAudioElement.current, audioStream)\n }\n // Save the new audio stream to the store\n store.dispatch.webrtc.updateRemoteAudioStream(audioStream)\n } else {\n console.warn('No audio tracks on remote stream')\n }\n // Initialize the new media stream for remote video\n if (videoTracks && videoTracks.length > 0) {\n const videoStream: MediaStream = new MediaStream(videoTracks)\n\n if (remoteVideoElement && remoteVideoElement.current) {\n janus.current.attachMediaStream(remoteVideoElement.current, videoStream)\n }\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (janus.current.log) {\n janus.current.log(' ::: janus Got a cleanup notification :::')\n }\n },\n detached: function () {\n if (janus.current.warn) {\n janus.current.warn('SIP plugin handle detached from the plugin itself')\n }\n },\n })\n }\n },\n error: (err: any) => {\n if (janus.current.log) janus.current.log('error', err)\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n destroyed: () => {\n // Set webrtc destroyed status\n dispatch.webrtc.updateWebRTC({\n destroyed: true,\n })\n // Activate webrtc connection alert\n dispatch.alerts.setAlert('webrtc_down')\n },\n })\n },\n })\n }, [janus.current])\n\n // Check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n const [isOnline, setIsOnline] = useState(navigator.onLine)\n const [connectionReturned, setConnectionReturned] = useState(false)\n const wasOfflineRef = useRef(false)\n\n useEffect(() => {\n // Event listeners for online/offline status\n const handleOnline = () => setIsOnline(true)\n const handleOffline = () => setIsOnline(false)\n\n window.addEventListener('online', handleOnline)\n window.addEventListener('offline', handleOffline)\n\n return () => {\n window.removeEventListener('online', handleOnline)\n window.removeEventListener('offline', handleOffline)\n }\n }, [])\n\n // Reconnection management\n useEffect(() => {\n if (!isOnline) {\n console.log('Internet connection lost.')\n wasOfflineRef.current = true\n setConnectionReturned(false)\n } else if (wasOfflineRef.current) {\n console.log('Internet connection restored.')\n setConnectionReturned(true)\n wasOfflineRef.current = false\n }\n }, [isOnline])\n\n // Manage webrtc connections and events\n useEffect(() => {\n // Initializes the webrtc registration check interval\n function startWebrtcCheck() {\n const { CHECK_INTERVAL_TIME } = store.getState().webrtc\n if (!janusCheckInterval.current) {\n // Initialize the interval that check the webrtc\n janusCheckInterval.current = setInterval(\n () =>\n webrtcCheck(() => {\n // Do the register as callback of webrtc check\n register({ sipExten, sipSecret, sipHost, sipPort })\n }),\n CHECK_INTERVAL_TIME,\n )\n }\n }\n\n // Start webrtc initialization and handlers\n initWebRTC()\n // Start the check of webrtc activity\n startWebrtcCheck()\n\n return () => {\n // Unregister from janus\n unregister()\n // Stop Janus check interval\n clearInterval(janusCheckInterval.current)\n }\n }, [])\n\n // Manage reload events\n useEffect(() => {\n if (reload || connectionReturned) {\n // Unregister the WebRTC extension\n unregister()\n // Detach sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) sipcall.detach()\n // Destroy Janus session\n if (janus.current.destroy) janus.current.destroy()\n // Initialize a new Janus session\n setTimeout(() => {\n initWebRTC()\n // Execute the reloaded callback\n if (reloadedCallback) reloadedCallback()\n }, 10000)\n }\n }, [reload, connectionReturned])\n\n useEventListener('phone-island-attach', (data) => {\n initWebRTC()\n store.dispatch.currentUser.updateCurrentDefaultDevice(data?.deviceInformationObject)\n eventDispatch('phone-island-attached', {})\n })\n\n /**\n * Event listner for phone-island-call-transfer event\n */\n useEventListener('phone-island-call-transfer', (data) => {\n const transferNumber = data?.to\n dispatch.island.toggleIsOpen(true)\n handleAttendedTransfer(transferNumber)\n })\n\n async function handleAttendedTransfer(number: string) {\n // Send attended transfer message\n const transferringMessageSent = await attendedTransfer(number)\n if (transferringMessageSent) {\n // Set transferring and disable pause\n dispatch.currentCall.updateCurrentCall({\n transferring: true,\n paused: false,\n })\n // Play the remote audio element\n dispatch.player.playRemoteAudio()\n }\n }\n\n return <>{children}</>\n}\n"],"names":["_a","hostName","sipExten","sipSecret","children","sipHost","sipPort","reload","uaType","reloadedCallback","dispatch","useDispatch","janusCheckInterval","useRef","janus","JanusLib","initWebRTC","useCallback","current","init","debug","dependencies","useDefaultDependencies","adapter","callback","janusInstance","server","concat","success","attach","plugin","opaqueId","Date","getTime","pluginHandle","webrtc","updateWebRTC","sipcall","register","log","getPlugin","error","consentDialog","on","webrtcState","iceState","newState","store","getState","mediaState","medium","slowLink","uplink","count","warn","onmessage","msg","jsep","JSON","stringify","undefined","result","event","recording","recorder","eventDispatch","registered","alerts","removeAlert","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","handleRemote","default_device","currentUser","type","jsepGlobal","setIncoming","checkIncomingUpdatePlay","incomingWebRTC","acceptedTimestamp","Math","floor","now","checkAcceptedUpdate","acceptedWebRTC","updateCurrentCall","incoming","startTime","toString","stopAudioPlayer","setRecording","hangupCurrentCall","hangup","reset","console","onlocalstream","stream","localVideoElement","localVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateLocalAudioStream","videoStream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","updateRemoteAudioStream","oncleanup","detached","err","setAlert","destroyed","useEffect","checkMediaPermissions","_b","useState","navigator","onLine","isOnline","setIsOnline","_c","connectionReturned","setConnectionReturned","wasOfflineRef","handleOnline","handleOffline","window","addEventListener","removeEventListener","CHECK_INTERVAL_TIME","setInterval","webrtcCheck","unregister","clearInterval","detach","destroy","setTimeout","useEventListener","data","updateCurrentDefaultDevice","deviceInformationObject","transferNumber","to","island","toggleIsOpen","number","attendedTransfer","sent","transferring","paused","playRemoteAudio","handleAttendedTransfer","React","createElement","Fragment"],"mappings":"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"}
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- *,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }@supports (-moz-appearance:none){*{scrollbar-color:auto;scrollbar-width:auto}}.pi-pointer-events-none{pointer-events:none}.pi-pointer-events-auto{pointer-events:auto}.pi-fixed{position:fixed}.pi-absolute{position:absolute}.pi-relative{position:relative}.pi-inset-0{inset:0}.pi-bottom-4{bottom:1rem}.pi-left-0{left:0}.pi-right-0{right:0}.pi-right-4{right:1rem}.pi-right-\[-0\.5rem\]{right:-.5rem}.pi-right-\[1\.5rem\]{right:1.5rem}.pi-right-\[4\.5rem\]{right:4.5rem}.pi-top-0{top:0}.pi-top-\[38\%\]{top:38%}.-pi-z-10{z-index:-10}.pi-z-1000{z-index:1000}.pi-z-20{z-index:20}.pi-z-30{z-index:30}.pi-z-50{z-index:50}.pi-col-span-2{grid-column:span 2/span 2}.pi-col-start-auto{grid-column-start:auto}.pi-mx-auto{margin-left:auto;margin-right:auto}.pi-my-4{margin-bottom:1rem;margin-top:1rem}.-pi-mt-10{margin-top:-2.5rem}.pi-mb-2{margin-bottom:.5rem}.pi-mb-6{margin-bottom:1.5rem}.pi-ml-11{margin-left:2.75rem}.pi-ml-16{margin-left:4rem}.pi-ml-2{margin-left:.5rem}.pi-ml-4{margin-left:1rem}.pi-ml-6{margin-left:1.5rem}.pi-ml-8{margin-left:2rem}.pi-ml-\[-0\.15rem\]{margin-left:-.15rem}.pi-ml-\[-7\.05rem\]{margin-left:-7.05rem}.pi-ml-\[1\.49rem\]{margin-left:1.49rem}.pi-ml-\[1\.4rem\]{margin-left:1.4rem}.pi-ml-\[4\.7rem\]{margin-left:4.7rem}.pi-mr-1{margin-right:.25rem}.pi-mr-2{margin-right:.5rem}.pi-mr-4{margin-right:1rem}.pi-mr-\[0\.27rem\]{margin-right:.27rem}.pi-mr-\[0\.28rem\]{margin-right:.28rem}.pi-mr-\[0\.42rem\]{margin-right:.42rem}.pi-mr-\[0\.4rem\]{margin-right:.4rem}.pi-mr-\[0\.57rem\]{margin-right:.57rem}.pi-mt-1{margin-top:.25rem}.pi-mt-2{margin-top:.5rem}.pi-mt-4{margin-top:1rem}.pi-mt-7{margin-top:1.75rem}.pi-mt-8{margin-top:2rem}.pi-mt-\[-0\.25rem\]{margin-top:-.25rem}.pi-mt-\[-0\.8rem\]{margin-top:-.8rem}.pi-mt-\[-1rem\]{margin-top:-1rem}.pi-mt-\[-5\.5rem\]{margin-top:-5.5rem}.pi-mt-\[-9\.5rem\]{margin-top:-9.5rem}.pi-mt-\[3rem\]{margin-top:3rem}.pi-block{display:block}.pi-inline-block{display:inline-block}.pi-flex{display:flex}.pi-inline-flex{display:inline-flex}.pi-grid{display:grid}.pi-hidden{display:none}.pi-h-1{height:.25rem}.pi-h-10{height:2.5rem}.pi-h-12{height:3rem}.pi-h-3{height:.75rem}.pi-h-4{height:1rem}.pi-h-6{height:1.5rem}.pi-h-8{height:2rem}.pi-h-9{height:2.25rem}.pi-h-fit{height:-moz-fit-content;height:fit-content}.pi-h-full{height:100%}.pi-max-h-\[13\.125rem\]{max-height:13.125rem}.pi-max-h-\[9\.125rem\]{max-height:9.125rem}.pi-min-h-full{min-height:100%}.pi-w-0\.5{width:.125rem}.pi-w-10{width:2.5rem}.pi-w-12{width:3rem}.pi-w-16{width:4rem}.pi-w-2{width:.5rem}.pi-w-3{width:.75rem}.pi-w-4{width:1rem}.pi-w-44{width:11rem}.pi-w-56{width:14rem}.pi-w-6{width:1.5rem}.pi-w-8{width:2rem}.pi-w-9{width:2.25rem}.pi-w-fit{width:-moz-fit-content;width:fit-content}.pi-w-full{width:100%}.pi-min-w-12{min-width:3rem}.pi-min-w-full{min-width:100%}.pi-max-w-40{max-width:10rem}.pi-max-w-lg{max-width:32rem}.pi-flex-none{flex:none}.pi-flex-shrink-0,.pi-shrink-0{flex-shrink:0}.pi-flex-grow-0{flex-grow:0}.pi-origin-top-right{transform-origin:top right}.pi--translate-y-1\/2{--tw-translate-y:-50%}.pi--rotate-45,.pi--translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi--rotate-45{--tw-rotate:-45deg}.pi-rotate-135{--tw-rotate:135deg}.pi-rotate-135,.pi-rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-45{--tw-rotate:45deg}.pi-rotate-90{--tw-rotate:90deg}.pi-rotate-90,.pi-rotate-\[135deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-\[135deg\]{--tw-rotate:135deg}.pi-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pi-ping{75%,to{opacity:0;transform:scale(2)}}.pi-animate-ping{animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite}.pi-cursor-auto{cursor:auto}.pi-cursor-pointer{cursor:pointer}.pi-auto-cols-max{grid-auto-columns:max-content}.pi-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.pi-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.pi-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.pi-flex-col{flex-direction:column}.pi-place-items-center{place-items:center}.pi-content-center{align-content:center}.pi-items-center{align-items:center}.pi-justify-start{justify-content:flex-start}.pi-justify-end{justify-content:flex-end}.pi-justify-center{justify-content:center}.pi-justify-between{justify-content:space-between}.pi-justify-items-end{justify-items:end}.pi-justify-items-center{justify-items:center}.pi-gap-1{gap:.25rem}.pi-gap-2{gap:.5rem}.pi-gap-3\.5{gap:.875rem}.pi-gap-4{gap:1rem}.pi-gap-6{gap:1.5rem}.pi-gap-7{gap:1.75rem}.pi-gap-y-5{row-gap:1.25rem}.pi-gap-y-6{row-gap:1.5rem}.pi-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.pi-overflow-auto{overflow:auto}.pi-overflow-hidden{overflow:hidden}.pi-overflow-y-auto{overflow-y:auto}.pi-overflow-x-hidden{overflow-x:hidden}.pi-truncate{overflow:hidden;white-space:nowrap}.pi-text-ellipsis,.pi-truncate{text-overflow:ellipsis}.pi-whitespace-nowrap{white-space:nowrap}.pi-rounded-3xl{border-radius:1.5rem}.pi-rounded-full{border-radius:9999px}.pi-rounded-lg{border-radius:.5rem}.pi-rounded-md{border-radius:.375rem}.pi-rounded-sm{border-radius:.125rem}.pi-rounded-xl{border-radius:.75rem}.pi-border{border-width:1px}.pi-border-2{border-width:2px}.pi-border-t{border-top-width:1px}.pi-border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.pi-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.pi-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.pi-border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.pi-border-transparent{border-color:#0000}.pi-border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.pi-bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.pi-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.pi-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.pi-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.pi-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.pi-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.pi-bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.pi-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.pi-bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.pi-bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.pi-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.pi-bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.pi-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.pi-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.pi-bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.pi-bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.pi-bg-transparent{background-color:initial}.pi-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.pi-bg-opacity-\[0\.99\]{--tw-bg-opacity:0.99}.pi-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.pi-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.pi-from-gray-100{--tw-gradient-from:#f3f4f6 var(--tw-gradient-from-position);--tw-gradient-to:#f3f4f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-to-gray-50{--tw-gradient-to:#f9fafb var(--tw-gradient-to-position)}.pi-to-gray-500{--tw-gradient-to:#6b7280 var(--tw-gradient-to-position)}.pi-to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.pi-bg-cover{background-size:cover}.pi-p-4{padding:1rem}.pi-p-6{padding:1.5rem}.pi-px-0\.5{padding-left:.125rem;padding-right:.125rem}.pi-px-2{padding-left:.5rem;padding-right:.5rem}.pi-px-3{padding-left:.75rem;padding-right:.75rem}.pi-px-4{padding-left:1rem;padding-right:1rem}.pi-px-6{padding-left:1.5rem;padding-right:1.5rem}.pi-py-1{padding-bottom:.25rem;padding-top:.25rem}.pi-py-2{padding-bottom:.5rem;padding-top:.5rem}.pi-pb-9{padding-bottom:2.25rem}.pi-pr-4{padding-right:1rem}.pi-pt-2{padding-top:.5rem}.pi-pt-3{padding-top:.75rem}.pi-pt-4{padding-top:1rem}.pi-pt-7{padding-top:1.75rem}.pi-pt-9{padding-top:2.25rem}.pi-text-center{text-align:center}.pi-text-2xl{font-size:1.5rem;line-height:2rem}.pi-text-4xl{font-size:2.25rem;line-height:2.5rem}.pi-text-base{font-size:1rem;line-height:1.5rem}.pi-text-lg{font-size:1.125rem;line-height:1.75rem}.pi-text-sm{font-size:.875rem;line-height:1.25rem}.pi-text-xl{font-size:1.25rem;line-height:1.75rem}.pi-text-xs{font-size:.75rem;line-height:1rem}.pi-font-bold{font-weight:700}.pi-font-light{font-weight:300}.pi-font-medium{font-weight:500}.pi-font-normal{font-weight:400}.pi-font-semibold{font-weight:600}.pi-leading-4{line-height:1rem}.pi-leading-5{line-height:1.25rem}.pi-tracking-wide{letter-spacing:.025em}.pi-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.pi-text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.pi-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.pi-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.pi-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.pi-text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.pi-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.pi-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.pi-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.pi-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.pi-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.pi-text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.pi-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.pi-placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgb(31 41 55/var(--tw-placeholder-opacity))}.pi-opacity-60{opacity:.6}.pi-opacity-75{opacity:.75}.pi-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.pi-shadow-lg,.pi-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.pi-outline-none{outline:2px solid #0000;outline-offset:2px}.pi-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pi-ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.pi-ring-opacity-5{--tw-ring-opacity:0.05}.pi-transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-duration-200{transition-duration:.2s}.pi-scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.pi-scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.pi-scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.pi-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.pi-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.pi-scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.pi-scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.pi-scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.pi-scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}@supports (-moz-appearance:none){.pi-scrollbar-thin{scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);scrollbar-width:thin}}.pi-scrollbar-thin::-webkit-scrollbar{display:block;height:8px;width:8px}.pi-scrollbar-track-gray-200{--scrollbar-track:#e5e7eb!important}.pi-scrollbar-thumb-gray-400{--scrollbar-thumb:#9ca3af!important}.pi-scrollbar-track-rounded-full{--scrollbar-track-radius:9999px}.pi-scrollbar-thumb-rounded-full{--scrollbar-thumb-radius:9999px}.hover\:pi-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:pi-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:pi-bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:pi-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:pi-bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:pi-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:pi-text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:pi-text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:pi-text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:pi-shadow-2xl:hover{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:pi-z-20:focus{z-index:20}.focus\:pi-border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.focus\:pi-outline-0:focus{outline-width:0}.focus\:pi-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-0:focus,.focus\:pi-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:pi-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.focus\:pi-ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.focus\:pi-ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.focus\:pi-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:pi-ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:pi-ring-offset-white:focus{--tw-ring-offset-color:#fff}.active\:pi-border-emerald-500:active{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.enabled\:hover\:pi-border-gray-500:hover:enabled{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.enabled\:hover\:pi-bg-gray-200\/70:hover:enabled{background-color:#e5e7ebb3}.enabled\:hover\:pi-bg-gray-500:hover:enabled{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.disabled\:pi-opacity-75:disabled{opacity:.75}.dark\:pi-border-emerald-200:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:pi-border-gray-600:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.dark\:pi-bg-emerald-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.dark\:pi-bg-emerald-600:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.dark\:pi-bg-gray-300:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.dark\:pi-bg-gray-50:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.dark\:pi-bg-gray-700:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:pi-bg-gray-950:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.dark\:pi-bg-green-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.dark\:pi-bg-green-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.dark\:pi-bg-red-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.dark\:pi-bg-rose-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.dark\:pi-bg-opacity-\[0\.99\]:where(.pi-dark,.pi-dark *){--tw-bg-opacity:0.99}.dark\:pi-from-black:where(.pi-dark,.pi-dark *){--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:pi-to-gray-950:where(.pi-dark,.pi-dark *){--tw-gradient-to:#030712 var(--tw-gradient-to-position)}.dark\:pi-text-gray-100:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.dark\:pi-text-gray-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark\:pi-text-gray-50:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.dark\:pi-text-gray-950:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.dark\:pi-text-green-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.dark\:pi-text-green-400:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.dark\:pi-text-red-700:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.dark\:pi-text-rose-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.dark\:pi-text-white:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:pi-placeholder-gray-200:where(.pi-dark,.pi-dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(229 231 235/var(--tw-placeholder-opacity))}.dark\:pi-scrollbar-track-gray-900:where(.pi-dark,.pi-dark *){--scrollbar-track:#111827!important}.dark\:hover\:pi-bg-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-gray-700:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-green-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-red-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.dark\:hover\:pi-text-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.dark\:focus\:pi-border-emerald-200:focus:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:focus\:pi-ring-emerald-300:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.dark\:focus\:pi-ring-gray-500:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.dark\:focus\:pi-ring-offset-black:focus:where(.pi-dark,.pi-dark *){--tw-ring-offset-color:#000}.dark\:active\:pi-border-emerald-200:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:active\:focus\:pi-border-emerald-200:focus:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:enabled\:hover\:pi-bg-gray-600\/30:hover:enabled:where(.pi-dark,.pi-dark *){background-color:#4b55634d}
1
+ *,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }@supports (-moz-appearance:none){*{scrollbar-color:auto;scrollbar-width:auto}}.pi-pointer-events-none{pointer-events:none}.pi-pointer-events-auto{pointer-events:auto}.pi-fixed{position:fixed}.pi-absolute{position:absolute}.pi-relative{position:relative}.pi-inset-0{inset:0}.pi-bottom-4{bottom:1rem}.pi-left-0{left:0}.pi-right-0{right:0}.pi-right-4{right:1rem}.pi-right-\[-0\.5rem\]{right:-.5rem}.pi-right-\[1\.5rem\]{right:1.5rem}.pi-right-\[4\.5rem\]{right:4.5rem}.pi-top-0{top:0}.pi-top-\[38\%\]{top:38%}.-pi-z-10{z-index:-10}.pi-z-1000{z-index:1000}.pi-z-20{z-index:20}.pi-z-30{z-index:30}.pi-z-50{z-index:50}.pi-col-span-2{grid-column:span 2/span 2}.pi-col-start-auto{grid-column-start:auto}.pi-mx-auto{margin-left:auto;margin-right:auto}.pi-my-4{margin-bottom:1rem;margin-top:1rem}.-pi-mt-10{margin-top:-2.5rem}.pi-mb-2{margin-bottom:.5rem}.pi-mb-6{margin-bottom:1.5rem}.pi-ml-11{margin-left:2.75rem}.pi-ml-16{margin-left:4rem}.pi-ml-2{margin-left:.5rem}.pi-ml-4{margin-left:1rem}.pi-ml-6{margin-left:1.5rem}.pi-ml-8{margin-left:2rem}.pi-ml-\[-0\.15rem\]{margin-left:-.15rem}.pi-ml-\[-7\.05rem\]{margin-left:-7.05rem}.pi-ml-\[1\.49rem\]{margin-left:1.49rem}.pi-ml-\[1\.4rem\]{margin-left:1.4rem}.pi-ml-\[4\.7rem\]{margin-left:4.7rem}.pi-mr-1{margin-right:.25rem}.pi-mr-2{margin-right:.5rem}.pi-mr-4{margin-right:1rem}.pi-mr-\[0\.27rem\]{margin-right:.27rem}.pi-mr-\[0\.28rem\]{margin-right:.28rem}.pi-mr-\[0\.42rem\]{margin-right:.42rem}.pi-mr-\[0\.4rem\]{margin-right:.4rem}.pi-mr-\[0\.57rem\]{margin-right:.57rem}.pi-mt-1{margin-top:.25rem}.pi-mt-2{margin-top:.5rem}.pi-mt-4{margin-top:1rem}.pi-mt-7{margin-top:1.75rem}.pi-mt-8{margin-top:2rem}.pi-mt-\[-0\.25rem\]{margin-top:-.25rem}.pi-mt-\[-0\.8rem\]{margin-top:-.8rem}.pi-mt-\[-1rem\]{margin-top:-1rem}.pi-mt-\[-5\.5rem\]{margin-top:-5.5rem}.pi-mt-\[-9\.5rem\]{margin-top:-9.5rem}.pi-mt-\[3rem\]{margin-top:3rem}.pi-block{display:block}.pi-inline-block{display:inline-block}.pi-flex{display:flex}.pi-inline-flex{display:inline-flex}.pi-grid{display:grid}.pi-hidden{display:none}.pi-h-1{height:.25rem}.pi-h-10{height:2.5rem}.pi-h-12{height:3rem}.pi-h-3{height:.75rem}.pi-h-4{height:1rem}.pi-h-6{height:1.5rem}.pi-h-8{height:2rem}.pi-h-9{height:2.25rem}.pi-h-fit{height:-moz-fit-content;height:fit-content}.pi-h-full{height:100%}.pi-max-h-\[13\.125rem\]{max-height:13.125rem}.pi-max-h-\[9\.125rem\]{max-height:9.125rem}.pi-min-h-full{min-height:100%}.pi-w-0\.5{width:.125rem}.pi-w-10{width:2.5rem}.pi-w-12{width:3rem}.pi-w-16{width:4rem}.pi-w-2{width:.5rem}.pi-w-3{width:.75rem}.pi-w-4{width:1rem}.pi-w-44{width:11rem}.pi-w-56{width:14rem}.pi-w-6{width:1.5rem}.pi-w-8{width:2rem}.pi-w-9{width:2.25rem}.pi-w-fit{width:-moz-fit-content;width:fit-content}.pi-w-full{width:100%}.pi-min-w-12{min-width:3rem}.pi-min-w-full{min-width:100%}.pi-max-w-40{max-width:10rem}.pi-max-w-lg{max-width:32rem}.pi-flex-none{flex:none}.pi-flex-shrink-0,.pi-shrink-0{flex-shrink:0}.pi-flex-grow-0{flex-grow:0}.pi-origin-top-right{transform-origin:top right}.pi--translate-y-1\/2{--tw-translate-y:-50%}.pi--rotate-45,.pi--translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi--rotate-45{--tw-rotate:-45deg}.pi-rotate-135{--tw-rotate:135deg}.pi-rotate-135,.pi-rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-45{--tw-rotate:45deg}.pi-rotate-90{--tw-rotate:90deg}.pi-rotate-90,.pi-rotate-\[135deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-\[135deg\]{--tw-rotate:135deg}.pi-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pi-ping{75%,to{opacity:0;transform:scale(2)}}.pi-animate-ping{animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite}.pi-cursor-auto{cursor:auto}.pi-cursor-pointer{cursor:pointer}.pi-auto-cols-max{grid-auto-columns:max-content}.pi-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.pi-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.pi-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.pi-flex-col{flex-direction:column}.pi-place-items-center{place-items:center}.pi-content-center{align-content:center}.pi-items-center{align-items:center}.pi-justify-start{justify-content:flex-start}.pi-justify-end{justify-content:flex-end}.pi-justify-center{justify-content:center}.pi-justify-between{justify-content:space-between}.pi-justify-items-end{justify-items:end}.pi-justify-items-center{justify-items:center}.pi-gap-1{gap:.25rem}.pi-gap-2{gap:.5rem}.pi-gap-3\.5{gap:.875rem}.pi-gap-4{gap:1rem}.pi-gap-5{gap:1.25rem}.pi-gap-6{gap:1.5rem}.pi-gap-7{gap:1.75rem}.pi-gap-y-5{row-gap:1.25rem}.pi-gap-y-6{row-gap:1.5rem}.pi-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.pi-overflow-auto{overflow:auto}.pi-overflow-hidden{overflow:hidden}.pi-overflow-y-auto{overflow-y:auto}.pi-overflow-x-hidden{overflow-x:hidden}.pi-truncate{overflow:hidden;white-space:nowrap}.pi-text-ellipsis,.pi-truncate{text-overflow:ellipsis}.pi-whitespace-nowrap{white-space:nowrap}.pi-rounded-2xl{border-radius:1rem}.pi-rounded-3xl{border-radius:1.5rem}.pi-rounded-full{border-radius:9999px}.pi-rounded-lg{border-radius:.5rem}.pi-rounded-md{border-radius:.375rem}.pi-rounded-sm{border-radius:.125rem}.pi-rounded-xl{border-radius:.75rem}.pi-border{border-width:1px}.pi-border-2{border-width:2px}.pi-border-4{border-width:4px}.pi-border-t{border-top-width:1px}.pi-border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.pi-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.pi-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.pi-border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.pi-border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.pi-border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.pi-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.pi-border-transparent{border-color:#0000}.pi-border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.pi-bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity))}.pi-bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.pi-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.pi-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.pi-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.pi-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.pi-bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity))}.pi-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.pi-bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.pi-bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.pi-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.pi-bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.pi-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity))}.pi-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.pi-bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.pi-bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity))}.pi-bg-transparent{background-color:initial}.pi-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.pi-bg-opacity-\[0\.99\]{--tw-bg-opacity:0.99}.pi-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.pi-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.pi-from-gray-100{--tw-gradient-from:#f3f4f6 var(--tw-gradient-from-position);--tw-gradient-to:#f3f4f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-to-gray-50{--tw-gradient-to:#f9fafb var(--tw-gradient-to-position)}.pi-to-gray-500{--tw-gradient-to:#6b7280 var(--tw-gradient-to-position)}.pi-to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.pi-bg-cover{background-size:cover}.pi-p-4{padding:1rem}.pi-p-6{padding:1.5rem}.pi-px-0\.5{padding-left:.125rem;padding-right:.125rem}.pi-px-2{padding-left:.5rem;padding-right:.5rem}.pi-px-3{padding-left:.75rem;padding-right:.75rem}.pi-px-4{padding-left:1rem;padding-right:1rem}.pi-px-6{padding-left:1.5rem;padding-right:1.5rem}.pi-py-1{padding-bottom:.25rem;padding-top:.25rem}.pi-py-2{padding-bottom:.5rem;padding-top:.5rem}.pi-pb-9{padding-bottom:2.25rem}.pi-pr-4{padding-right:1rem}.pi-pt-2{padding-top:.5rem}.pi-pt-3{padding-top:.75rem}.pi-pt-4{padding-top:1rem}.pi-pt-7{padding-top:1.75rem}.pi-pt-9{padding-top:2.25rem}.pi-text-center{text-align:center}.pi-text-2xl{font-size:1.5rem;line-height:2rem}.pi-text-4xl{font-size:2.25rem;line-height:2.5rem}.pi-text-base{font-size:1rem;line-height:1.5rem}.pi-text-lg{font-size:1.125rem;line-height:1.75rem}.pi-text-sm{font-size:.875rem;line-height:1.25rem}.pi-text-xl{font-size:1.25rem;line-height:1.75rem}.pi-text-xs{font-size:.75rem;line-height:1rem}.pi-font-bold{font-weight:700}.pi-font-light{font-weight:300}.pi-font-medium{font-weight:500}.pi-font-normal{font-weight:400}.pi-font-semibold{font-weight:600}.pi-leading-4{line-height:1rem}.pi-leading-5{line-height:1.25rem}.pi-tracking-wide{letter-spacing:.025em}.pi-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.pi-text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.pi-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.pi-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.pi-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.pi-text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.pi-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.pi-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.pi-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.pi-text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.pi-text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.pi-text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity))}.pi-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.pi-placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgb(31 41 55/var(--tw-placeholder-opacity))}.pi-opacity-60{opacity:.6}.pi-opacity-75{opacity:.75}.pi-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.pi-shadow-lg,.pi-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.pi-outline-none{outline:2px solid #0000;outline-offset:2px}.pi-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pi-ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.pi-ring-opacity-5{--tw-ring-opacity:0.05}.pi-transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-duration-200{transition-duration:.2s}.pi-scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.pi-scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.pi-scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.pi-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.pi-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.pi-scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.pi-scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.pi-scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.pi-scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}@supports (-moz-appearance:none){.pi-scrollbar-thin{scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);scrollbar-width:thin}}.pi-scrollbar-thin::-webkit-scrollbar{display:block;height:8px;width:8px}.pi-scrollbar-track-gray-200{--scrollbar-track:#e5e7eb!important}.pi-scrollbar-thumb-gray-400{--scrollbar-thumb:#9ca3af!important}.pi-scrollbar-track-rounded-full{--scrollbar-track-radius:9999px}.pi-scrollbar-thumb-rounded-full{--scrollbar-thumb-radius:9999px}.hover\:pi-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:pi-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:pi-bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:pi-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.hover\:pi-bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.hover\:pi-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:pi-text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.hover\:pi-text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.hover\:pi-text-red-800:hover{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.hover\:pi-shadow-2xl:hover{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:pi-z-20:focus{z-index:20}.focus\:pi-border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.focus\:pi-outline-0:focus{outline-width:0}.focus\:pi-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-0:focus,.focus\:pi-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:pi-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity))}.focus\:pi-ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity))}.focus\:pi-ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.focus\:pi-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:pi-ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:pi-ring-offset-white:focus{--tw-ring-offset-color:#fff}.active\:pi-border-emerald-500:active{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity))}.enabled\:hover\:pi-border-gray-500:hover:enabled{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.enabled\:hover\:pi-bg-gray-200\/70:hover:enabled{background-color:#e5e7ebb3}.enabled\:hover\:pi-bg-gray-500:hover:enabled{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.disabled\:pi-opacity-75:disabled{opacity:.75}.dark\:pi-border-emerald-200:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:pi-border-gray-600:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity))}.dark\:pi-bg-emerald-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.dark\:pi-bg-emerald-600:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.dark\:pi-bg-gray-300:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.dark\:pi-bg-gray-50:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.dark\:pi-bg-gray-700:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:pi-bg-gray-950:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity))}.dark\:pi-bg-green-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.dark\:pi-bg-green-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity))}.dark\:pi-bg-red-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.dark\:pi-bg-rose-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity))}.dark\:pi-bg-opacity-\[0\.99\]:where(.pi-dark,.pi-dark *){--tw-bg-opacity:0.99}.dark\:pi-from-black:where(.pi-dark,.pi-dark *){--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:pi-to-gray-950:where(.pi-dark,.pi-dark *){--tw-gradient-to:#030712 var(--tw-gradient-to-position)}.dark\:pi-text-gray-100:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.dark\:pi-text-gray-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity))}.dark\:pi-text-gray-50:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.dark\:pi-text-gray-950:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity))}.dark\:pi-text-green-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity))}.dark\:pi-text-green-400:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}.dark\:pi-text-red-700:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.dark\:pi-text-rose-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity))}.dark\:pi-text-white:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.dark\:pi-placeholder-gray-200:where(.pi-dark,.pi-dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(229 231 235/var(--tw-placeholder-opacity))}.dark\:pi-scrollbar-track-gray-900:where(.pi-dark,.pi-dark *){--scrollbar-track:#111827!important}.dark\:hover\:pi-bg-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-gray-700:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-green-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity))}.dark\:hover\:pi-bg-red-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.dark\:hover\:pi-text-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity))}.dark\:focus\:pi-border-emerald-200:focus:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:focus\:pi-ring-emerald-300:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity))}.dark\:focus\:pi-ring-gray-500:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.dark\:focus\:pi-ring-offset-black:focus:where(.pi-dark,.pi-dark *){--tw-ring-offset-color:#000}.dark\:active\:pi-border-emerald-200:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:active\:focus\:pi-border-emerald-200:focus:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity))}.dark\:enabled\:hover\:pi-bg-gray-600\/30:hover:enabled:where(.pi-dark,.pi-dark *){background-color:#4b55634d}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sources":["../../../src/lib/webrtc/messages.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport Janus from './janus'\nimport { store } from '../../store'\nimport adapter from 'webrtc-adapter'\nimport { getSupportedDevices } from '../devices/devices'\nimport { getJSONItem } from '../../utils'\n\nexport function register({\n sipExten,\n sipSecret,\n sipHost,\n sipPort,\n}: {\n sipExten: string\n sipSecret: string\n sipHost: string\n sipPort: string\n}) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { name } = store.getState().currentUser\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'register',\n username: `sip:${sipExten}@${sipHost}`,\n display_name: name || '',\n secret: sipSecret,\n proxy: `sip:${sipHost}:${sipPort}`,\n outbound_proxy: `sip:${sipHost}:${sipPort}`,\n sips: false,\n refresh: false,\n },\n })\n }\n}\n\nexport function answerWebRTC() {\n const { sipcall, jsepGlobal }: { sipcall: any; jsepGlobal: any } = store.getState().webrtc\n if (sipcall && jsepGlobal) {\n // get current input device id from localstorage\n let currentDeviceInputId = getJSONItem('phone-island-audio-input-device').deviceId || null;\n\n sipcall.createAnswer({\n jsep: jsepGlobal,\n media: {\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n deviceId: currentDeviceInputId,\n },\n videoSend: false,\n videoRecv: false,\n },\n success: (jsep) => {\n sipcall.send({\n message: {\n request: 'accept',\n },\n jsep: jsep,\n })\n },\n error: (error) => {\n // @ts-ignore\n Janus.error('WebRTC error:', error)\n sipcall.send({\n message: {\n request: 'decline',\n code: 480,\n },\n })\n },\n })\n }\n}\n\nexport function decline() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'decline',\n },\n })\n }\n}\n\nexport function hangup() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'hangup',\n },\n })\n }\n}\n\nexport function unregister() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'unregister',\n },\n })\n }\n}\n\nexport function detach() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n return sipcall.detach()\n }\n}\n\nexport function handleRemote(jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.handleRemoteJsep({\n jsep: jsep,\n error: function () {\n var hangup = {\n request: 'hangup',\n }\n sipcall.send({\n message: hangup,\n })\n sipcall.hangup()\n },\n })\n }\n}\n\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n\n // get current input device id from localstorage\n let currentDeviceInputId = getJSONItem('phone-island-audio-input-device').deviceId || null\n\n await call(sipURI, {\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n deviceId: currentDeviceInputId,\n },\n audioSend: true,\n audioRecv: true,\n videoSend: false,\n videoRecv: false,\n })\n })\n}\n\nexport function call(sipURI: string, mediaObj: object) {\n return new Promise((resolve, reject) => {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipURI && mediaObj) {\n sipcall.createOffer({\n media: mediaObj,\n success: function (jsep: any) {\n // @ts-ignore\n Janus.debug('Got SDP!')\n // @ts-ignore\n Janus.debug(jsep)\n sipcall.send({\n message: {\n request: 'call',\n uri: sipURI,\n },\n jsep: jsep,\n })\n resolve(true)\n },\n error: function (error) {\n // @ts-ignore\n Janus.error('WebRTC error...', error)\n // @ts-ignore\n Janus.error('WebRTC error call on createOffer: ', error)\n reject(false)\n },\n })\n }\n })\n}\n\n/**\n * Mute current call so the counterpart can't listen the current user\n * @returns The muted status\n */\nexport function muteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Uset the janus library functions to mute call\n sipcall.muteAudio()\n return sipcall.isAudioMuted()\n}\n\n/**\n * Unmute current call so the counterpart can listen the current user\n * @returns The muted status\n */\nexport function unmuteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Use the janus library functions to unmute call\n sipcall.unmuteAudio()\n return !sipcall.isAudioMuted()\n}\n\n/**\n * Pause current call so the counterpart listens the pause ringtone\n * @returns The true if no errors occurs\n */\nexport function pauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'hold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Unpause the current call so the counterpart listens the current user\n * @returns The true if no errors occurs\n */\nexport function unpauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'unhold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Send DTMF messages to Janus\n */\nexport function sendDTMF(key: string) {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (adapter.browserDetails.browser === 'chrome') {\n sipcall.dtmf({\n dtmf: {\n tones: key,\n },\n })\n } else {\n sipcall.send({\n message: {\n request: 'dtmf_info',\n digit: `${key}`,\n },\n })\n }\n}\n"],"names":["call","sipURI","mediaObj","Promise","resolve","reject","sipcall","store","getState","webrtc","createOffer","media","success","jsep","Janus","debug","send","message","request","uri","error","_a","jsepGlobal","currentDeviceInputId","getJSONItem","deviceId","createAnswer","audio","echoCancellation","noiseSuppression","autoGainControl","googEchoCancellation","googAutoGainControl","googNoiseSuppression","googHighpassFilter","googTypingNoiseDetection","googNoiseReduction","volume","videoSend","videoRecv","code","_this","this","getSupportedDevices","__awaiter","log","audioSend","audioRecv","sent","detach","handleRemoteJsep","hangup","muteAudio","isAudioMuted","err","console","sipExten","sipSecret","sipHost","sipPort","name","currentUser","username","concat","display_name","secret","proxy","outbound_proxy","sips","refresh","key","adapter","browserDetails","browser","dtmf","tones","digit","unmuteAudio"],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sources":["../../../src/lib/webrtc/messages.ts"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport Janus from './janus'\nimport { store } from '../../store'\nimport adapter from 'webrtc-adapter'\nimport { getSupportedDevices } from '../devices/devices'\nimport { getJSONItem } from '../../utils'\n\nexport function register({\n sipExten,\n sipSecret,\n sipHost,\n sipPort,\n}: {\n sipExten: string\n sipSecret: string\n sipHost: string\n sipPort: string\n}) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n const { name } = store.getState().currentUser\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'register',\n username: `sip:${sipExten}@${sipHost}`,\n display_name: name || '',\n secret: sipSecret,\n proxy: `sip:${sipHost}:${sipPort}`,\n outbound_proxy: `sip:${sipHost}:${sipPort}`,\n sips: false,\n refresh: false,\n },\n })\n }\n}\n\nexport function answerWebRTC() {\n const { sipcall, jsepGlobal }: { sipcall: any; jsepGlobal: any } = store.getState().webrtc\n if (sipcall && jsepGlobal) {\n // get current input device id from localstorage\n let currentDeviceInputId = getJSONItem('phone-island-audio-input-device').deviceId || null\n\n sipcall.createAnswer({\n jsep: jsepGlobal,\n media: {\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n deviceId: currentDeviceInputId,\n },\n videoSend: false,\n videoRecv: false,\n },\n success: (jsep) => {\n sipcall.send({\n message: {\n request: 'accept',\n },\n jsep: jsep,\n })\n },\n error: (error) => {\n // @ts-ignore\n Janus.error('WebRTC error:', error)\n sipcall.send({\n message: {\n request: 'decline',\n code: 480,\n },\n })\n },\n })\n }\n}\n\nexport function decline() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'decline',\n },\n })\n }\n}\n\nexport function hangup() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'hangup',\n },\n })\n }\n}\n\nexport function unregister() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.send({\n message: {\n request: 'unregister',\n },\n })\n }\n}\n\nexport function detach() {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n return sipcall.detach()\n }\n}\n\nexport function handleRemote(jsep: any) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipcall) {\n sipcall.handleRemoteJsep({\n jsep: jsep,\n error: function () {\n var hangup = {\n request: 'hangup',\n }\n sipcall.send({\n message: hangup,\n })\n sipcall.hangup()\n },\n })\n }\n}\n\nexport function callSipURI(sipURI: string) {\n getSupportedDevices(async () => {\n // @ts-ignore\n Janus.log('This is a SIP call')\n\n // get current input device id from localstorage\n let currentDeviceInputId = getJSONItem('phone-island-audio-input-device').deviceId || null\n\n await call(sipURI, {\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n googEchoCancellation: true,\n googAutoGainControl: true,\n googNoiseSuppression: true,\n googHighpassFilter: true,\n googTypingNoiseDetection: true,\n googNoiseReduction: true,\n volume: 1.0,\n deviceId: currentDeviceInputId,\n },\n audioSend: true,\n audioRecv: true,\n videoSend: false,\n videoRecv: false,\n })\n })\n}\n\nexport function call(sipURI: string, mediaObj: object) {\n return new Promise((resolve, reject) => {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (sipURI && mediaObj) {\n sipcall.createOffer({\n media: mediaObj,\n success: function (jsep: any) {\n // @ts-ignore\n Janus.debug('Got SDP!')\n // @ts-ignore\n Janus.debug(jsep)\n sipcall.send({\n message: {\n request: 'call',\n uri: sipURI,\n },\n jsep: jsep,\n })\n resolve(true)\n },\n error: function (error) {\n // @ts-ignore\n Janus.error('WebRTC error...', error)\n // @ts-ignore\n Janus.error('WebRTC error call on createOffer: ', error)\n reject(false)\n },\n })\n }\n })\n}\n\n/**\n * Mute current call so the counterpart can't listen the current user\n * @returns The muted status\n */\nexport function muteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Uset the janus library functions to mute call\n sipcall.muteAudio()\n return sipcall.isAudioMuted()\n}\n\n/**\n * Unmute current call so the counterpart can listen the current user\n * @returns The muted status\n */\nexport function unmuteWebRTC(): boolean {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Use the janus library functions to unmute call\n sipcall.unmuteAudio()\n return !sipcall.isAudioMuted()\n}\n\n/**\n * Pause current call so the counterpart listens the pause ringtone\n * @returns The true if no errors occurs\n */\nexport function pauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'hold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Unpause the current call so the counterpart listens the current user\n * @returns The true if no errors occurs\n */\nexport function unpauseWebRTC() {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n // Send hold message\n try {\n sipcall.send({\n message: {\n request: 'unhold',\n },\n })\n return true\n } catch (err) {\n console.error(err)\n return false\n }\n}\n\n/**\n * Send DTMF messages to Janus\n */\nexport function sendDTMF(key: string) {\n // Initialize sipcall\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n if (adapter.browserDetails.browser === 'chrome') {\n sipcall.dtmf({\n dtmf: {\n tones: key,\n },\n })\n } else {\n sipcall.send({\n message: {\n request: 'dtmf_info',\n digit: `${key}`,\n },\n })\n }\n}\n"],"names":["call","sipURI","mediaObj","Promise","resolve","reject","sipcall","store","getState","webrtc","createOffer","media","success","jsep","Janus","debug","send","message","request","uri","error","_a","jsepGlobal","currentDeviceInputId","getJSONItem","deviceId","createAnswer","audio","echoCancellation","noiseSuppression","autoGainControl","googEchoCancellation","googAutoGainControl","googNoiseSuppression","googHighpassFilter","googTypingNoiseDetection","googNoiseReduction","volume","videoSend","videoRecv","code","_this","this","getSupportedDevices","__awaiter","log","audioSend","audioRecv","sent","detach","handleRemoteJsep","hangup","muteAudio","isAudioMuted","err","console","sipExten","sipSecret","sipHost","sipPort","name","currentUser","username","concat","display_name","secret","proxy","outbound_proxy","sips","refresh","key","adapter","browserDetails","browser","dtmf","tones","digit","unmuteAudio"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nethesis/phone-island",
3
3
  "author": "Nethesis",
4
- "version": "0.8.21",
4
+ "version": "0.8.23",
5
5
  "description": "NethVoice CTI Phone Island",
6
6
  "keywords": [
7
7
  "nethserver",