@nethesis/phone-island 0.7.60 → 0.7.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AlertView/Alert.js +1 -1
- package/dist/components/AlertView/Alert.js.map +1 -1
- package/dist/components/AlertView/index.js +1 -1
- package/dist/components/AlertView/index.js.map +1 -1
- package/dist/components/AudioBars.js +1 -1
- package/dist/components/AudioBars.js.map +1 -1
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/CallView/Actions.js +1 -1
- package/dist/components/CallView/Actions.js.map +1 -1
- package/dist/components/CallView/Avatar.js +1 -1
- package/dist/components/CallView/Avatar.js.map +1 -1
- package/dist/components/CallView/BackCall.js +1 -1
- package/dist/components/CallView/BackCall.js.map +1 -1
- package/dist/components/CallView/DisplayName.js +1 -1
- package/dist/components/CallView/DisplayName.js.map +1 -1
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/KeypadView/Actions.js +1 -1
- package/dist/components/KeypadView/Actions.js.map +1 -1
- package/dist/components/KeypadView/index.js +1 -1
- package/dist/components/KeypadView/index.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/models/currentCall.d.ts +1 -1
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/models/player.d.ts +21 -2
- package/dist/models/player.js +1 -1
- package/dist/models/player.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../utils/genericFunctions/classNames.js"),a=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../utils/genericFunctions/classNames.js"),a=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=i(e),n={base:"pi-border-4 pi-rounded-2xl pi-p-6 pi-flex pi-gap-5 pi-items-center",red:"pi-border-red-600",orange:"pi-border-orange-600",green:"pi-border-green-600"};exports.default=function(e){var i=e.color,l=e.message;return s.default.createElement("div",{className:t.classNames(n.base,n[i])},s.default.createElement("div",{className:"pi-w-12 pi-h-12 pi-rounded-xl pi-bg-gray-300 pi-shrink-0 pi-flex pi-justify-center pi-items-center"},"green"===i?s.default.createElement(a.FontAwesomeIcon,{icon:r.faCircleCheck,size:"xl",className:"pi-text-black"}):"orange"===i?s.default.createElement(a.FontAwesomeIcon,{icon:r.faTriangleExclamation,size:"xl",className:"pi-text-black"}):s.default.createElement(a.FontAwesomeIcon,{icon:r.faCircleXmark,size:"xl",className:"pi-text-black"})),s.default.createElement("div",{className:"pi-text-base pi-font-bold"},l))};
|
|
2
2
|
//# sourceMappingURL=Alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Alert.js","sources":["../../../src/components/AlertView/Alert.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { classNames } from '../../utils/'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faTriangleExclamation,\n faCircleCheck,\n faCircleXmark,\n} from '@nethesis/nethesis-solid-svg-icons'\n\nconst classes = {\n base: 'border-4 rounded-2xl p-6 flex gap-5 items-center',\n red: 'border-red-600',\n orange: 'border-orange-600',\n green: 'border-green-600',\n}\n\nconst Alert: FC<AlertProps> = ({ color, message }) => {\n return (\n <div className={classNames(classes.base, classes[color])}>\n <div className='w-12 h-12 rounded-xl bg-gray-300 shrink-0 flex justify-center items-center'>\n {color === 'green' ? (\n <FontAwesomeIcon icon={faCircleCheck} size='xl' className='text-black' />\n ) : color === 'orange' ? (\n <FontAwesomeIcon icon={faTriangleExclamation} size='xl' className='text-black' />\n ) : (\n <FontAwesomeIcon icon={faCircleXmark} size='xl' className='text-black' />\n )}\n </div>\n <div className='text-base font-bold'>{message}</div>\n </div>\n )\n}\n\nexport default Alert\n\ninterface AlertProps {\n type: 'alert' | 'feedback'\n color: 'red' | 'orange' | 'green'\n message: string\n}\n"],"names":["classes","base","red","orange","green","_a","color","message","React","createElement","className","classNames","FontAwesomeIcon","icon","faCircleCheck","size","faTriangleExclamation","faCircleXmark"],"mappings":"iYAYMA,EAAU,CACdC,KAAM,
|
|
1
|
+
{"version":3,"file":"Alert.js","sources":["../../../src/components/AlertView/Alert.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { classNames } from '../../utils/'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faTriangleExclamation,\n faCircleCheck,\n faCircleXmark,\n} from '@nethesis/nethesis-solid-svg-icons'\n\nconst classes = {\n base: 'pi-border-4 pi-rounded-2xl pi-p-6 pi-flex pi-gap-5 pi-items-center',\n red: 'pi-border-red-600',\n orange: 'pi-border-orange-600',\n green: 'pi-border-green-600',\n}\n\nconst Alert: FC<AlertProps> = ({ color, message }) => {\n return (\n <div className={classNames(classes.base, classes[color])}>\n <div className='pi-w-12 pi-h-12 pi-rounded-xl pi-bg-gray-300 pi-shrink-0 pi-flex pi-justify-center pi-items-center'>\n {color === 'green' ? (\n <FontAwesomeIcon icon={faCircleCheck} size='xl' className='pi-text-black' />\n ) : color === 'orange' ? (\n <FontAwesomeIcon icon={faTriangleExclamation} size='xl' className='pi-text-black' />\n ) : (\n <FontAwesomeIcon icon={faCircleXmark} size='xl' className='pi-text-black' />\n )}\n </div>\n <div className='pi-text-base pi-font-bold'>{message}</div>\n </div>\n )\n}\n\nexport default Alert\n\ninterface AlertProps {\n type: 'alert' | 'feedback'\n color: 'red' | 'orange' | 'green'\n message: string\n}\n"],"names":["classes","base","red","orange","green","_a","color","message","React","createElement","className","classNames","FontAwesomeIcon","icon","faCircleCheck","size","faTriangleExclamation","faCircleXmark"],"mappings":"iYAYMA,EAAU,CACdC,KAAM,qEACNC,IAAK,oBACLC,OAAQ,uBACRC,MAAO,uCAGqB,SAACC,OAAEC,EAAKD,EAAAC,MAAEC,EAAOF,EAAAE,QAC7C,OACEC,UAAAC,cAAA,MAAA,CAAKC,UAAWC,aAAWX,EAAQC,KAAMD,EAAQM,KAC/CE,UAAAC,cAAA,MAAA,CAAKC,UAAU,sGACF,UAAVJ,EACCE,UAAAC,cAACG,EAAAA,gBAAe,CAACC,KAAMC,EAAaA,cAAEC,KAAK,KAAKL,UAAU,kBAC9C,WAAVJ,EACFE,EAAA,QAAAC,cAACG,EAAAA,gBAAe,CAACC,KAAMG,EAAqBA,sBAAED,KAAK,KAAKL,UAAU,kBAElEF,EAAAA,sBAACI,EAAeA,gBAAA,CAACC,KAAMI,gBAAeF,KAAK,KAAKL,UAAU,mBAG9DF,EAAK,QAAAC,cAAA,MAAA,CAAAC,UAAU,6BAA6BH,GAGlD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("./Alert.js");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=a(e);exports.default=function(){var e=t.useSelector((function(e){return e.alerts}));return u.default.createElement("div",{className:"flex flex-col gap-4 mb-6 overflow-y-auto",style:{maxHeight:"6.5rem"}},Object.values(e.data).map((function(e,t){return e.active&&u.default.createElement(r.default,{key:t,type:"alert",color:e.success?"green":e.break?"red":"orange",message:e.message})})))};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("./Alert.js");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=a(e);exports.default=function(){var e=t.useSelector((function(e){return e.alerts}));return u.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-4 pi-mb-6 pi-overflow-y-auto",style:{maxHeight:"6.5rem"}},Object.values(e.data).map((function(e,t){return e.active&&u.default.createElement(r.default,{key:t,type:"alert",color:e.success?"green":e.break?"red":"orange",message:e.message})})))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/AlertView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport Alert from './Alert'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\n/**\n * Shows user alerts\n */\nconst AlertView: FC = () => {\n const alerts = useSelector((state: RootState) => state.alerts)\n\n return (\n <div className='flex flex-col gap-4 mb-6 overflow-y-auto' style={{\n maxHeight: '6.5rem'\n }}>\n {/* Show alerts */}\n {Object.values(alerts.data).map(\n (alert, index) =>\n alert.active && (\n <Alert\n key={index}\n type='alert'\n color={alert.success ? 'green' : alert.break ? 'red' : 'orange'}\n message={alert.message}\n />\n ),\n )}\n </div>\n )\n}\n\nexport default AlertView\n"],"names":["alerts","useSelector","state","React","createElement","className","style","maxHeight","Object","values","data","map","alert","index","active","Alert","key","type","color","success","break","message"],"mappings":"oVAWsB,WACpB,IAAMA,EAASC,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMF,MAAN,IAEjD,OACEG,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/AlertView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport Alert from './Alert'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\n/**\n * Shows user alerts\n */\nconst AlertView: FC = () => {\n const alerts = useSelector((state: RootState) => state.alerts)\n\n return (\n <div className='pi-flex pi-flex-col pi-gap-4 pi-mb-6 pi-overflow-y-auto' style={{\n maxHeight: '6.5rem'\n }}>\n {/* Show alerts */}\n {Object.values(alerts.data).map(\n (alert, index) =>\n alert.active && (\n <Alert\n key={index}\n type='alert'\n color={alert.success ? 'green' : alert.break ? 'red' : 'orange'}\n message={alert.message}\n />\n ),\n )}\n </div>\n )\n}\n\nexport default AlertView\n"],"names":["alerts","useSelector","state","React","createElement","className","style","maxHeight","Object","values","data","map","alert","index","active","Alert","key","type","color","success","break","message"],"mappings":"oVAWsB,WACpB,IAAMA,EAASC,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMF,MAAN,IAEjD,OACEG,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,0DAA0DC,MAAO,CAC9EC,UAAW,WAGVC,OAAOC,OAAOT,EAAOU,MAAMC,KAC1B,SAACC,EAAOC,GACN,OAAAD,EAAME,QACJX,EAAC,QAAAC,cAAAW,EAAAA,SACCC,IAAKH,EACLI,KAAK,QACLC,MAAON,EAAMO,QAAU,QAAUP,EAAMQ,MAAQ,MAAQ,SACvDC,QAAST,EAAMS,SAElB,IAIX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),r={0:4,1:3,2:2,3:1,4:1,5:2,6:3,7:4},
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e),r={0:4,1:3,2:2,3:1,4:1,5:2,6:3,7:4},i={0:2,1:1,2:1,3:2},u=n.default.memo((function(t){var u=t.audioStream,a=t.size,c=void 0===a?"large":a,o=e.useRef(null),f=e.useRef(null),l=e.useRef(null),s="large"===c?r:i;function d(e){u&&function(e){var t=new(window.AudioContext||window.webkitAudioContext),n=t.createAnalyser();t.createMediaStreamSource(e).connect(n),n.smoothingTimeConstant=.8,n.fftSize=32;var r=function(){var e;if(!l.current){var t=new Uint8Array(n.frequencyBinCount);n.getByteFrequencyData(t);var i=Object.values(t),u=null===(e=o.current)||void 0===e?void 0:e.children;if(u&&(null==u?void 0:u.length)>0){for(var a=0;a<Object.keys(s).length;++a){var c=i[s[a]]/255,d=u&&u[a]&&u[a].style;d&&c>0&&(d.height="".concat(100*c,"%"))}var m=requestAnimationFrame(r);m&&(f.current=m)}}},i=requestAnimationFrame(r);i&&(f.current=i)}(u),l.current=!1,e&&e()}function m(e){f.current&&cancelAnimationFrame(f.current),l.current=!0,e&&e()}return e.useEffect((function(){m((function(){d()}))}),[c]),e.useEffect((function(){m((function(){d()}))}),[u]),e.useEffect((function(){return function(){m()}}),[]),n.default.createElement("div",{className:"".concat("small"===c?"pi-h-6 pi-w-6":"pi-h-12 pi-w-12"," pi-flex pi-justify-center pi-items-center")},n.default.createElement("div",{className:"".concat("small"===c?"pi-h-6":"pi-h-8"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden"),ref:o},u&&Object.keys(s).map((function(e){return n.default.createElement("span",{key:e,className:"pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm"})}))))}));exports.AudioBars=u;
|
|
2
2
|
//# sourceMappingURL=AudioBars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioBars.js","sources":["../../src/components/AudioBars.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useEffect, useRef } from 'react'\n\n// Swapping values around for a better visual effect\nconst LARGE_MAP = {\n 0: 4,\n 1: 3,\n 2: 2,\n 3: 1,\n 4: 1,\n 5: 2,\n 6: 3,\n 7: 4,\n}\n\nconst SMALL_MAP = {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n}\n\ninterface AudioBarsProps {\n audioStream: MediaStream | null\n size?: 'large' | 'small'\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream The audio stream to analyse\n *\n */\n\nexport const AudioBars = React.memo<AudioBarsProps>(({ audioStream, size = 'large' }) => {\n // The container element ref\n const containerElement = useRef<HTMLDivElement | null>(null)\n\n // The variable that stops\n // const [pause, setPause] = useState<boolean>(false)\n\n const animationRequest = useRef<any>(null)\n const stopped = useRef<any>(null)\n\n // Initialize DATA_MAP depending on size\n const dataMap: { [key: number]: number } = size === 'large' ? LARGE_MAP : SMALL_MAP\n\n const connectStream = (audioStream: MediaStream) => {\n // Initialize and audio context\n // @ts-ignore\n const audioContext = new (window.AudioContext || window.webkitAudioContext)()\n\n // Create and audio contest analyser\n const analyser = audioContext.createAnalyser()\n const source = audioContext.createMediaStreamSource(audioStream)\n\n // Connect the analyser to the audio source\n source.connect(analyser)\n\n // Set smooth constant\n analyser.smoothingTimeConstant = 0.8\n\n // The fftzize to be applied on the stream\n analyser.fftSize = 32\n\n // The function that renders the frames\n const renderFrame = () => {\n // Return if was stopped and not\n if (stopped.current) {\n return\n }\n // Find the frequency\n const frequencyData = new Uint8Array(analyser.frequencyBinCount)\n analyser.getByteFrequencyData(frequencyData)\n const values = Object.values(frequencyData)\n\n // Select the bars array\n const bars = containerElement.current?.children\n if (bars && bars?.length > 0) {\n // Change styles to every bar\n for (let i = 0; i < Object.keys(dataMap).length; ++i) {\n const value = values[dataMap[i]] / 255\n // @ts-ignore\n const barStyles = bars && bars[i] && bars[i].style\n if (barStyles && value > 0) {\n // Set height to every bar\n barStyles.height = `${100 * value}%`\n }\n }\n const requestId: number = requestAnimationFrame(renderFrame)\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n }\n\n // Render the frames using requestAnimationFrame API\n const requestId: number = requestAnimationFrame(renderFrame)\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n\n // The function that startAnimations\n function startAnimation(callback?: () => void) {\n if (audioStream) {\n // Initialize audio bars\n connectStream(audioStream)\n }\n stopped.current = false\n // Execute the callback\n callback && callback()\n }\n\n // The function that stopAnimations\n function stopAnimation(callback?: () => void) {\n if (animationRequest.current) {\n // Initialize audio bars\n cancelAnimationFrame(animationRequest.current)\n }\n stopped.current = true\n // Execute the callback\n callback && callback()\n }\n\n // Handle size change\n useEffect(() => {\n stopAnimation(() => {\n startAnimation()\n })\n }, [size])\n\n // Handle audio stream\n useEffect(() => {\n stopAnimation(() => {\n startAnimation()\n })\n }, [audioStream])\n\n // Cleanup animation\n useEffect(() => {\n return () => {\n stopAnimation()\n }\n }, [])\n\n return (\n <div\n className={`${size === 'small' ? 'h-6 w-6' : 'h-12 w-12'} flex justify-center items-center`}\n >\n {/* The bars container */}\n <div\n className={`${\n size === 'small' ? 'h-6' : 'h-8'\n } w-fit flex justify-center items-center gap-1 overflow-hidden`}\n ref={containerElement}\n >\n {/* Every single bar */}\n {audioStream &&\n Object.keys(dataMap).map((key) => (\n <span key={key} className='bg-emerald-600 w-0.5 rounded-sm'></span>\n ))}\n </div>\n </div>\n )\n})\n"],"names":["LARGE_MAP","SMALL_MAP","AudioBars","React","memo","_a","audioStream","_b","size","containerElement","useRef","animationRequest","stopped","dataMap","startAnimation","callback","audioContext","window","AudioContext","webkitAudioContext","analyser","createAnalyser","createMediaStreamSource","connect","smoothingTimeConstant","fftSize","renderFrame","current","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","values","Object","bars","children","length","i","keys","value","barStyles","style","height","concat","requestId_1","requestAnimationFrame","requestId","connectStream","stopAnimation","cancelAnimationFrame","useEffect","createElement","className","ref","map","key"],"mappings":"8KAMMA,EAAY,CAChB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAGCC,EAAY,CAChB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAeQC,EAAYC,EAAK,QAACC,MAAqB,SAACC,GAAE,IAAAC,gBAAaC,EAAAF,EAAAG,KAAAA,OAAI,IAAAD,EAAG,QAAOA,EAE1EE,EAAmBC,SAA8B,MAKjDC,EAAmBD,SAAY,MAC/BE,EAAUF,SAAY,MAGtBG,EAA8C,UAATL,EAAmBR,EAAYC,EA2D1E,SAASa,EAAeC,GAClBT,GA1DgB,SAACA,GAGrB,IAAMU,EAAe,IAAKC,OAAOC,cAAgBD,OAAOE,oBAGlDC,EAAWJ,EAAaK,iBACfL,EAAaM,wBAAwBhB,GAG7CiB,QAAQH,GAGfA,EAASI,sBAAwB,GAGjCJ,EAASK,QAAU,GAGnB,IAAMC,EAAc,iBAElB,IAAId,EAAQe,QAAZ,CAIA,IAAMC,EAAgB,IAAIC,WAAWT,EAASU,mBAC9CV,EAASW,qBAAqBH,GAC9B,IAAMI,EAASC,OAAOD,OAAOJ,GAGvBM,EAA+B,QAAxB7B,EAAAI,EAAiBkB,eAAO,IAAAtB,OAAA,EAAAA,EAAE8B,SACvC,GAAID,IAAQA,aAAA,EAAAA,EAAME,QAAS,EAAG,CAE5B,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,OAAOK,KAAKzB,GAASuB,SAAUC,EAAG,CACpD,IAAME,EAAQP,EAAOnB,EAAQwB,IAAM,IAE7BG,EAAYN,GAAQA,EAAKG,IAAMH,EAAKG,GAAGI,MACzCD,GAAaD,EAAQ,IAEvBC,EAAUE,OAAS,GAAAC,OAAG,IAAMJ,OAE/B,CACD,IAAMK,EAAoBC,sBAAsBnB,GAC5CkB,IACFjC,EAAiBgB,QAAUiB,EAE9B,CAvBA,CAwBH,EAGME,EAAoBD,sBAAsBnB,GAC5CoB,IACFnC,EAAiBgB,QAAUmB,EAE/B,CAMIC,CAAczC,GAEhBM,EAAQe,SAAU,EAElBZ,GAAYA,GACb,CAGD,SAASiC,EAAcjC,GACjBJ,EAAiBgB,SAEnBsB,qBAAqBtC,EAAiBgB,SAExCf,EAAQe,SAAU,EAElBZ,GAAYA,GACb,CAuBD,OApBAmC,EAAAA,WAAU,WACRF,GAAc,WACZlC,GACF,GACF,GAAG,CAACN,IAGJ0C,EAAAA,WAAU,WACRF,GAAc,WACZlC,GACF,GACF,GAAG,CAACR,IAGJ4C,EAAAA,WAAU,WACR,OAAO,WACLF,GACF,CACD,GAAE,IAGD7C,EACE,QAAAgD,cAAA,MAAA,CAAAC,UAAW,GAAAT,OAAY,UAATnC,EAAmB,
|
|
1
|
+
{"version":3,"file":"AudioBars.js","sources":["../../src/components/AudioBars.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useEffect, useRef } from 'react'\n\n// Swapping values around for a better visual effect\nconst LARGE_MAP = {\n 0: 4,\n 1: 3,\n 2: 2,\n 3: 1,\n 4: 1,\n 5: 2,\n 6: 3,\n 7: 4,\n}\n\nconst SMALL_MAP = {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n}\n\ninterface AudioBarsProps {\n audioStream: MediaStream | null\n size?: 'large' | 'small'\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream The audio stream to analyse\n *\n */\n\nexport const AudioBars = React.memo<AudioBarsProps>(({ audioStream, size = 'large' }) => {\n // The container element ref\n const containerElement = useRef<HTMLDivElement | null>(null)\n\n // The variable that stops\n // const [pause, setPause] = useState<boolean>(false)\n\n const animationRequest = useRef<any>(null)\n const stopped = useRef<any>(null)\n\n // Initialize DATA_MAP depending on size\n const dataMap: { [key: number]: number } = size === 'large' ? LARGE_MAP : SMALL_MAP\n\n const connectStream = (audioStream: MediaStream) => {\n // Initialize and audio context\n // @ts-ignore\n const audioContext = new (window.AudioContext || window.webkitAudioContext)()\n\n // Create and audio contest analyser\n const analyser = audioContext.createAnalyser()\n const source = audioContext.createMediaStreamSource(audioStream)\n\n // Connect the analyser to the audio source\n source.connect(analyser)\n\n // Set smooth constant\n analyser.smoothingTimeConstant = 0.8\n\n // The fftzize to be applied on the stream\n analyser.fftSize = 32\n\n // The function that renders the frames\n const renderFrame = () => {\n // Return if was stopped and not\n if (stopped.current) {\n return\n }\n // Find the frequency\n const frequencyData = new Uint8Array(analyser.frequencyBinCount)\n analyser.getByteFrequencyData(frequencyData)\n const values = Object.values(frequencyData)\n\n // Select the bars array\n const bars = containerElement.current?.children\n if (bars && bars?.length > 0) {\n // Change styles to every bar\n for (let i = 0; i < Object.keys(dataMap).length; ++i) {\n const value = values[dataMap[i]] / 255\n // @ts-ignore\n const barStyles = bars && bars[i] && bars[i].style\n if (barStyles && value > 0) {\n // Set height to every bar\n barStyles.height = `${100 * value}%`\n }\n }\n const requestId: number = requestAnimationFrame(renderFrame)\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n }\n\n // Render the frames using requestAnimationFrame API\n const requestId: number = requestAnimationFrame(renderFrame)\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n\n // The function that startAnimations\n function startAnimation(callback?: () => void) {\n if (audioStream) {\n // Initialize audio bars\n connectStream(audioStream)\n }\n stopped.current = false\n // Execute the callback\n callback && callback()\n }\n\n // The function that stopAnimations\n function stopAnimation(callback?: () => void) {\n if (animationRequest.current) {\n // Initialize audio bars\n cancelAnimationFrame(animationRequest.current)\n }\n stopped.current = true\n // Execute the callback\n callback && callback()\n }\n\n // Handle size change\n useEffect(() => {\n stopAnimation(() => {\n startAnimation()\n })\n }, [size])\n\n // Handle audio stream\n useEffect(() => {\n stopAnimation(() => {\n startAnimation()\n })\n }, [audioStream])\n\n // Cleanup animation\n useEffect(() => {\n return () => {\n stopAnimation()\n }\n }, [])\n\n return (\n <div\n className={`${size === 'small' ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'} pi-flex pi-justify-center pi-items-center`}\n >\n {/* The bars container */}\n <div\n className={`${\n size === 'small' ? 'pi-h-6' : 'pi-h-8'\n } pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n ref={containerElement}\n >\n {/* Every single bar */}\n {audioStream &&\n Object.keys(dataMap).map((key) => (\n <span key={key} className='pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm'></span>\n ))}\n </div>\n </div>\n )\n})\n"],"names":["LARGE_MAP","SMALL_MAP","AudioBars","React","memo","_a","audioStream","_b","size","containerElement","useRef","animationRequest","stopped","dataMap","startAnimation","callback","audioContext","window","AudioContext","webkitAudioContext","analyser","createAnalyser","createMediaStreamSource","connect","smoothingTimeConstant","fftSize","renderFrame","current","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","values","Object","bars","children","length","i","keys","value","barStyles","style","height","concat","requestId_1","requestAnimationFrame","requestId","connectStream","stopAnimation","cancelAnimationFrame","useEffect","createElement","className","ref","map","key"],"mappings":"8KAMMA,EAAY,CAChB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAGCC,EAAY,CAChB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAeQC,EAAYC,EAAK,QAACC,MAAqB,SAACC,GAAE,IAAAC,gBAAaC,EAAAF,EAAAG,KAAAA,OAAI,IAAAD,EAAG,QAAOA,EAE1EE,EAAmBC,SAA8B,MAKjDC,EAAmBD,SAAY,MAC/BE,EAAUF,SAAY,MAGtBG,EAA8C,UAATL,EAAmBR,EAAYC,EA2D1E,SAASa,EAAeC,GAClBT,GA1DgB,SAACA,GAGrB,IAAMU,EAAe,IAAKC,OAAOC,cAAgBD,OAAOE,oBAGlDC,EAAWJ,EAAaK,iBACfL,EAAaM,wBAAwBhB,GAG7CiB,QAAQH,GAGfA,EAASI,sBAAwB,GAGjCJ,EAASK,QAAU,GAGnB,IAAMC,EAAc,iBAElB,IAAId,EAAQe,QAAZ,CAIA,IAAMC,EAAgB,IAAIC,WAAWT,EAASU,mBAC9CV,EAASW,qBAAqBH,GAC9B,IAAMI,EAASC,OAAOD,OAAOJ,GAGvBM,EAA+B,QAAxB7B,EAAAI,EAAiBkB,eAAO,IAAAtB,OAAA,EAAAA,EAAE8B,SACvC,GAAID,IAAQA,aAAA,EAAAA,EAAME,QAAS,EAAG,CAE5B,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,OAAOK,KAAKzB,GAASuB,SAAUC,EAAG,CACpD,IAAME,EAAQP,EAAOnB,EAAQwB,IAAM,IAE7BG,EAAYN,GAAQA,EAAKG,IAAMH,EAAKG,GAAGI,MACzCD,GAAaD,EAAQ,IAEvBC,EAAUE,OAAS,GAAAC,OAAG,IAAMJ,OAE/B,CACD,IAAMK,EAAoBC,sBAAsBnB,GAC5CkB,IACFjC,EAAiBgB,QAAUiB,EAE9B,CAvBA,CAwBH,EAGME,EAAoBD,sBAAsBnB,GAC5CoB,IACFnC,EAAiBgB,QAAUmB,EAE/B,CAMIC,CAAczC,GAEhBM,EAAQe,SAAU,EAElBZ,GAAYA,GACb,CAGD,SAASiC,EAAcjC,GACjBJ,EAAiBgB,SAEnBsB,qBAAqBtC,EAAiBgB,SAExCf,EAAQe,SAAU,EAElBZ,GAAYA,GACb,CAuBD,OApBAmC,EAAAA,WAAU,WACRF,GAAc,WACZlC,GACF,GACF,GAAG,CAACN,IAGJ0C,EAAAA,WAAU,WACRF,GAAc,WACZlC,GACF,GACF,GAAG,CAACR,IAGJ4C,EAAAA,WAAU,WACR,OAAO,WACLF,GACF,CACD,GAAE,IAGD7C,EACE,QAAAgD,cAAA,MAAA,CAAAC,UAAW,GAAAT,OAAY,UAATnC,EAAmB,gBAAkB,kBAA6D,+CAGhHL,EACE,QAAAgD,cAAA,MAAA,CAAAC,UAAW,GACTT,OAAS,UAATnC,EAAmB,SAAW,SACiD,mFACjF6C,IAAK5C,GAGJH,GACC2B,OAAOK,KAAKzB,GAASyC,KAAI,SAACC,GAAQ,OAChCpD,UAAAgD,cAAA,OAAA,CAAMI,IAAKA,EAAKH,UAAU,4CAC3B,KAIX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),r=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),r=require("react"),i=require("../utils/genericFunctions/classNames.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=a(r);exports.Button=function(r){var a=r.children,n=r.variant,o=r.active,s=void 0!==o&&o,p=r.className,c=void 0===p?"":p,u=e.__rest(r,["children","variant","active","className"]),g={base:"pi-flex pi-font-sans pi-font-light pi-content-center pi-items-center pi-justify-center pi-tracking-wide pi-duration-200 pi-transform pi-outline-none focus:pi-ring-2 focus:pi-z-20 focus:pi-ring-offset-2 disabled:pi-opacity-75 pi-text-white pi-border pi-border-transparent focus:pi-ring-offset-black pi-rounded-full pi-text-sm pi-leading-4 pi-h-12 pi-w-12 pi-col-start-auto pi-transition-color pi-shrink-0",variant:{red:"pi-bg-red-600 hover:pi-bg-red-700 focus:pi-ring-red-500",green:"pi-bg-green-600 hover:pi-bg-green-700 focus:pi-ring-green-500",default:"hover:pi-bg-gray-500 focus:pi-ring-gray-500",neutral:"pi-bg-transparent hover:pi-bg-gray-500 hover:pi-border-gray-500 pi-border pi-border-gray-700 focus:pi-ring-0",transparent:"pi-bg-transparent hover:pi-bg-gray-500 focus:pi-ring-gray-500"},background:{base:{default:"pi-bg-gray-700"},active:{default:"pi-bg-gray-500"}}};return t.default.createElement(t.default.Fragment,null,t.default.createElement("button",e.__assign({"data-stop-propagation":!0,className:i.classNames(s&&g.background.active[n]?g.background.active[n]:g.background.base[n]&&g.background.base[n],g.base,n&&g.variant[n],c&&c)},u),a))};
|
|
2
2
|
//# sourceMappingURL=Button.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC, ReactNode, ComponentPropsWithRef } from 'react'\nimport { classNames } from '../utils'\n\ninterface ButtonProps extends ComponentPropsWithRef<'button'> {\n children: ReactNode\n variant: 'red' | 'green' | 'default' | 'neutral' | 'transparent'\n active?: boolean\n}\n\nexport const Button: FC<ButtonProps> = ({
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../src/components/Button.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC, ReactNode, ComponentPropsWithRef } from 'react'\nimport { classNames } from '../utils'\n\ninterface ButtonProps extends ComponentPropsWithRef<'button'> {\n children: ReactNode\n variant: 'red' | 'green' | 'default' | 'neutral' | 'transparent'\n active?: boolean\n}\n\nexport const Button: FC<ButtonProps> = ({\n children,\n variant,\n active = false,\n className = '',\n ...props\n}) => {\n const classes = {\n base: 'pi-flex pi-font-sans pi-font-light pi-content-center pi-items-center pi-justify-center pi-tracking-wide pi-duration-200 pi-transform pi-outline-none focus:pi-ring-2 focus:pi-z-20 focus:pi-ring-offset-2 disabled:pi-opacity-75 pi-text-white pi-border pi-border-transparent focus:pi-ring-offset-black pi-rounded-full pi-text-sm pi-leading-4 pi-h-12 pi-w-12 pi-col-start-auto pi-transition-color pi-shrink-0',\n variant: {\n red: 'pi-bg-red-600 hover:pi-bg-red-700 focus:pi-ring-red-500',\n green: 'pi-bg-green-600 hover:pi-bg-green-700 focus:pi-ring-green-500',\n default: 'hover:pi-bg-gray-500 focus:pi-ring-gray-500',\n neutral:\n 'pi-bg-transparent hover:pi-bg-gray-500 hover:pi-border-gray-500 pi-border pi-border-gray-700 focus:pi-ring-0',\n transparent: 'pi-bg-transparent hover:pi-bg-gray-500 focus:pi-ring-gray-500',\n },\n background: {\n base: {\n default: 'pi-bg-gray-700',\n },\n active: {\n default: 'pi-bg-gray-500',\n },\n },\n }\n\n return (\n <>\n <button\n data-stop-propagation={true}\n className={classNames(\n active && classes.background.active[variant]\n ? classes.background.active[variant]\n : classes.background.base[variant] && classes.background.base[variant],\n classes.base,\n variant && classes.variant[variant],\n className && className,\n )}\n {...props}\n >\n {children}\n </button>\n </>\n )\n}\n"],"names":["_a","children","variant","_b","active","_c","className","props","__rest","classes","base","red","green","default","neutral","transparent","background","React","createElement","Fragment","__assign","classNames"],"mappings":"kSAYuC,SAACA,GACtC,IAAAC,aACAC,YACAC,EAAAH,EAAAI,OAAAA,OAAS,IAAAD,KACTE,EAAAL,EAAAM,UAAAA,OAAY,IAAAD,EAAA,KACTE,EALmCC,EAAAA,OAAAR,EAAA,CAAA,WAAA,UAAA,SAAA,cAOhCS,EAAU,CACdC,KAAM,sZACNR,QAAS,CACPS,IAAK,0DACLC,MAAO,gEACPC,QAAS,8CACTC,QACE,+GACFC,YAAa,iEAEfC,WAAY,CACVN,KAAM,CACJG,QAAS,kBAEXT,OAAQ,CACNS,QAAS,oBAKf,OACEI,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAAA,SAAAE,EAAAA,SAAA,CAAA,yBACyB,EACvBd,UAAWe,EAAAA,WACTjB,GAAUK,EAAQO,WAAWZ,OAAOF,GAChCO,EAAQO,WAAWZ,OAAOF,GAC1BO,EAAQO,WAAWN,KAAKR,IAAYO,EAAQO,WAAWN,KAAKR,GAChEO,EAAQC,KACRR,GAAWO,EAAQP,QAAQA,GAC3BI,GAAaA,IAEXC,GAEHN,GAIT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../node_modules/@nethesis/nethesis-light-svg-icons/index.mjs.js"),r=require("../../lib/phone/call.js"),n=require("../../static/icons/PhoneKeypadLight.js"),s=require("../../static/icons/PhoneKeypadSolid.js");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../store/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 a=require("../Button.js");require("../AudioBars.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../node_modules/@nethesis/nethesis-light-svg-icons/index.mjs.js"),r=require("../../lib/phone/call.js"),n=require("../../static/icons/PhoneKeypadLight.js"),s=require("../../static/icons/PhoneKeypadSolid.js");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../store/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 a=require("../Button.js");require("../AudioBars.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),l=require("../../node_modules/react-redux/es/hooks/useSelector.js"),o=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=c(e);exports.default=function(){var e=l.useSelector((function(e){return e.currentCall})),c=e.paused,f=e.muted,m=l.useSelector((function(e){return e.island})).view,p=o.useDispatch();return d.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},d.default.createElement(a.Button,{variant:"default",active:!!c,onClick:function(){return c?r.unpauseCurrentCall():r.pauseCurrentCall()}},c?d.default.createElement(i.FontAwesomeIcon,{size:"xl",icon:u.faPlay}):d.default.createElement(i.FontAwesomeIcon,{size:"xl",icon:t.faPause})),d.default.createElement(a.Button,{variant:"default",active:!!f,onClick:function(){return f?r.unmuteCurrentCall():r.muteCurrentCall()}},f?d.default.createElement(i.FontAwesomeIcon,{size:"xl",icon:u.faMicrophoneSlash}):d.default.createElement(i.FontAwesomeIcon,{size:"xl",icon:t.faMicrophone})),d.default.createElement(a.Button,{variant:"default"},d.default.createElement(i.FontAwesomeIcon,{size:"xl",icon:t.faRightLeft})),d.default.createElement(a.Button,{variant:"default",onClick:function(){p.island.setIslandView("keypad"!==m?"keypad":"call")}},"keypad"===m?d.default.createElement(s.default,null):d.default.createElement(n.default,null)))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport {\n faPause as faPauseRegular,\n faMicrophone as faMicrophoneRegular,\n faRightLeft as faRightLeftRegualar,\n} from '@nethesis/nethesis-light-svg-icons'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n} from '../../lib/phone/call'\nimport PhoneKeypadLight from '../../static/icons/PhoneKeypadLight'\nimport PhoneKeypadSolid from '../../static/icons/PhoneKeypadSolid'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMicrophoneSlash, faPlay } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n\n // Get isOpen and view from island store\n const { view } = useSelector((state: RootState) => state.island)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n }\n\n return (\n <div className='grid grid-cols-4 auto-cols-max gap-y-5 justify-items-center place-items-center justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPauseRegular} />\n )}\n </Button>\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophoneRegular} />\n )}\n </Button>\n <Button variant='default'>\n <FontAwesomeIcon size='xl' icon={faRightLeftRegualar} />\n </Button>\n <Button variant='default' onClick={openKeypad}>\n {view === 'keypad' ? <PhoneKeypadSolid /> : <PhoneKeypadLight />}\n </Button>\n </div>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","view","island","dispatch","useDispatch","React","createElement","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","FontAwesomeIcon","size","icon","faPlay","faPauseRegular","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophoneRegular","faRightLeftRegualar","faRightLeft","setIslandView","PhoneKeypadSolid","PhoneKeypadLight"],"mappings":"ykCAuBoB,WAEZ,IAAAA,EAAoBC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,WAAW,IAArEC,WAAQC,UAGRC,EAASL,eAAY,SAACC,GAAqB,OAAAA,EAAMK,eAEnDC,EAAWC,EAAAA,cAMjB,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport {\n faPause as faPauseRegular,\n faMicrophone as faMicrophoneRegular,\n faRightLeft as faRightLeftRegualar,\n} from '@nethesis/nethesis-light-svg-icons'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n} from '../../lib/phone/call'\nimport PhoneKeypadLight from '../../static/icons/PhoneKeypadLight'\nimport PhoneKeypadSolid from '../../static/icons/PhoneKeypadSolid'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faMicrophoneSlash, faPlay } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\n\nconst Actions: FC = () => {\n // Get multiple values from currentCall store\n const { paused, muted } = useSelector((state: RootState) => state.currentCall)\n\n // Get isOpen and view from island store\n const { view } = useSelector((state: RootState) => state.island)\n\n const dispatch = useDispatch<Dispatch>()\n\n function openKeypad() {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n }\n\n return (\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <Button\n variant='default'\n active={paused ? true : false}\n onClick={() => (paused ? unpauseCurrentCall() : pauseCurrentCall())}\n >\n {paused ? (\n <FontAwesomeIcon size='xl' icon={faPlay} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faPauseRegular} />\n )}\n </Button>\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n >\n {muted ? (\n <FontAwesomeIcon size='xl' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon size='xl' icon={faMicrophoneRegular} />\n )}\n </Button>\n <Button variant='default'>\n <FontAwesomeIcon size='xl' icon={faRightLeftRegualar} />\n </Button>\n <Button variant='default' onClick={openKeypad}>\n {view === 'keypad' ? <PhoneKeypadSolid /> : <PhoneKeypadLight />}\n </Button>\n </div>\n )\n}\n\nexport default Actions\n"],"names":["_a","useSelector","state","currentCall","paused","muted","view","island","dispatch","useDispatch","React","createElement","className","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","FontAwesomeIcon","size","icon","faPlay","faPauseRegular","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophoneRegular","faRightLeftRegualar","faRightLeft","setIslandView","PhoneKeypadSolid","PhoneKeypadLight"],"mappings":"ykCAuBoB,WAEZ,IAAAA,EAAoBC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,WAAW,IAArEC,WAAQC,UAGRC,EAASL,eAAY,SAACC,GAAqB,OAAAA,EAAMK,eAEnDC,EAAWC,EAAAA,cAMjB,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,sHACbF,EAAA,QAAAC,cAACE,SAAM,CACLC,QAAQ,UACRC,SAAQX,EACRY,QAAS,WAAM,OAACZ,EAASa,EAAAA,qBAAuBC,EAAAA,qBAE/Cd,EACCM,EAAA,QAAAC,cAACQ,kBAAe,CAACC,KAAK,KAAKC,KAAMC,EAAAA,SAEjCZ,EAAA,QAAAC,cAACQ,EAAeA,gBAAC,CAAAC,KAAK,KAAKC,KAAME,EAAAA,WAGrCb,EAAA,QAAAC,cAACE,SAAM,CACLC,QAAQ,UACRC,SAAQV,EACRW,QAAS,WAAM,OAACX,EAAQmB,EAAAA,oBAAsBC,EAAAA,oBAE7CpB,EACCK,EAAA,QAAAC,cAACQ,kBAAe,CAACC,KAAK,KAAKC,KAAMK,EAAAA,oBAEjChB,EAAA,QAAAC,cAACQ,EAAeA,gBAAC,CAAAC,KAAK,KAAKC,KAAMM,EAAAA,gBAGrCjB,EAAAA,QAAAC,cAACE,EAAAA,OAAM,CAACC,QAAQ,WACdJ,UAACC,cAAAQ,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMO,EAAmBC,eAEtDnB,UAAAC,cAACE,EAAAA,OAAM,CAACC,QAAQ,UAAUE,QA/B9B,WACER,EAASD,OAAOuB,cAAuB,WAATxB,EAAoB,SAAW,OAC9D,GA8Be,WAATA,EAAoBI,EAAAA,QAACC,cAAAoB,UAAmB,MAAGrB,EAAAA,QAACC,cAAAqB,EAAgB,QAAG,OAIxE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../../styles/Island.styles.js");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var t=require("../../_virtual/framer-motion.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../../styles/Island.styles.js");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var t=require("../../_virtual/framer-motion.js"),i=require("../../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=a(e),n=t.framerMotion.exports.motion(r.StyledAvatar),s={open:{width:"48px",height:"48px",borderRadius:"12px"},closed:{width:"24px",height:"24px",borderRadius:"6px"}};exports.default=function(){var e=i.useSelector((function(e){return e.currentCall})).username,r=i.useSelector((function(e){return e.avatars})).avatars,a=i.useSelector((function(e){return e.island})).isOpen,u=i.useSelector((function(e){return e.currentCall})),d=u.incoming,l=u.outgoing,p=u.accepted;return o.default.createElement(t.framerMotion.exports.motion.div,{className:"pi-relative",animate:a?"open":"closed",variants:s},(d||l&&!p)&&o.default.createElement(t.framerMotion.exports.motion.div,{style:{animation:"ping 2s cubic-bezier(0, 0, 0.2, 1) infinite",borderRadius:"4px"},animate:a?"open":"closed",variants:s,className:"pi-rounded-xl pi-bg-white pi-absolute pi-opacity-60 -pi-z-10 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12"}),o.default.createElement(n,{className:"pi-z-10 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm",style:{backgroundImage:"url(".concat(r&&r[e]&&r[e],")"),backgroundRepeat:"no-repeat",backgroundSize:"contain"},animate:a?"open":"closed",variants:s}))};
|
|
2
2
|
//# sourceMappingURL=Avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { StyledAvatar } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst AvatarMotion = motion(StyledAvatar)\n\nconst iconVariants = {\n open: {\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n },\n closed: {\n width: '24px',\n height: '24px',\n borderRadius: '6px',\n },\n}\n\nconst Avatar: FC = () => {\n // Get multiple values from currentCall store\n const { username } = useSelector((state: RootState) => state.currentCall)\n\n // Get avatars from avatars store\n const { avatars } = useSelector((state: RootState) => state.avatars)\n\n // Get isOpen from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Get multiple values from currentCall store\n const { incoming, outgoing, accepted } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <motion.div className='relative' animate={isOpen ? 'open' : 'closed'} variants={iconVariants}>\n {(incoming || (outgoing && !accepted)) && (\n // The background pulse effect\n <motion.div\n style={{\n animation: 'ping 2s cubic-bezier(0, 0, 0.2, 1) infinite',\n borderRadius: '4px',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n className={`rounded-xl bg-white absolute opacity-60 -z-10 top-0 left-0 animate-ping h-12 w-12`}\n ></motion.div>\n )}\n <AvatarMotion\n className='z-10 h-12 w-12 bg-gray-300 rounded-sm'\n style={{\n backgroundImage: `url(${avatars && avatars[username] && avatars[username]})`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n />\n </motion.div>\n )\n}\n\nexport default Avatar\n"],"names":["AvatarMotion","motion","StyledAvatar","iconVariants","open","width","height","borderRadius","closed","username","useSelector","state","currentCall","avatars","isOpen","island","_a","incoming","outgoing","accepted","React","createElement","div","className","animate","variants","style","animation","backgroundImage","concat","backgroundRepeat","backgroundSize"],"mappings":"scASMA,EAAeC,EAAAA,aAAAA,QAAAA,OAAOC,EAAAA,cAEtBC,EAAe,CACnBC,KAAM,CACJC,MAAO,OACPC,OAAQ,OACRC,aAAc,QAEhBC,OAAQ,CACNH,MAAO,OACPC,OAAQ,OACRC,aAAc,wBAIC,WAET,IAAAE,EAAaC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,wBAGrDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBAGpDC,EAAWJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,iBAGrDC,EAAmCN,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAAzEK,EAAQD,EAAAC,SAAEC,EAAQF,EAAAE,SAAEC,EAAQH,EAAAG,SAEpC,OACEC,EAAC,QAAAC,cAAApB,8BAAOqB,KAAIC,UAAU,
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { StyledAvatar } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst AvatarMotion = motion(StyledAvatar)\n\nconst iconVariants = {\n open: {\n width: '48px',\n height: '48px',\n borderRadius: '12px',\n },\n closed: {\n width: '24px',\n height: '24px',\n borderRadius: '6px',\n },\n}\n\nconst Avatar: FC = () => {\n // Get multiple values from currentCall store\n const { username } = useSelector((state: RootState) => state.currentCall)\n\n // Get avatars from avatars store\n const { avatars } = useSelector((state: RootState) => state.avatars)\n\n // Get isOpen from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Get multiple values from currentCall store\n const { incoming, outgoing, accepted } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <motion.div className='pi-relative' animate={isOpen ? 'open' : 'closed'} variants={iconVariants}>\n {(incoming || (outgoing && !accepted)) && (\n // The background pulse effect\n <motion.div\n style={{\n animation: 'ping 2s cubic-bezier(0, 0, 0.2, 1) infinite',\n borderRadius: '4px',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n className={`pi-rounded-xl pi-bg-white pi-absolute pi-opacity-60 -pi-z-10 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12`}\n ></motion.div>\n )}\n <AvatarMotion\n className='pi-z-10 pi-h-12 pi-w-12 pi-bg-gray-300 pi-rounded-sm'\n style={{\n backgroundImage: `url(${avatars && avatars[username] && avatars[username]})`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n />\n </motion.div>\n )\n}\n\nexport default Avatar\n"],"names":["AvatarMotion","motion","StyledAvatar","iconVariants","open","width","height","borderRadius","closed","username","useSelector","state","currentCall","avatars","isOpen","island","_a","incoming","outgoing","accepted","React","createElement","div","className","animate","variants","style","animation","backgroundImage","concat","backgroundRepeat","backgroundSize"],"mappings":"scASMA,EAAeC,EAAAA,aAAAA,QAAAA,OAAOC,EAAAA,cAEtBC,EAAe,CACnBC,KAAM,CACJC,MAAO,OACPC,OAAQ,OACRC,aAAc,QAEhBC,OAAQ,CACNH,MAAO,OACPC,OAAQ,OACRC,aAAc,wBAIC,WAET,IAAAE,EAAaC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,wBAGrDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBAGpDC,EAAWJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,iBAGrDC,EAAmCN,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAAzEK,EAAQD,EAAAC,SAAEC,EAAQF,EAAAE,SAAEC,EAAQH,EAAAG,SAEpC,OACEC,EAAC,QAAAC,cAAApB,8BAAOqB,KAAIC,UAAU,cAAcC,QAASV,EAAS,OAAS,SAAUW,SAAUtB,IAC/Ec,GAAaC,IAAaC,IAE1BC,EAAAA,QAAAC,cAACpB,EAAAA,aAAAA,QAAAA,OAAOqB,IAAG,CACTI,MAAO,CACLC,UAAW,8CACXpB,aAAc,OAEhBiB,QAASV,EAAS,OAAS,SAC3BW,SAAUtB,EACVoB,UAAW,oHAGfH,EAAA,QAAAC,cAACrB,EACC,CAAAuB,UAAU,uDACVG,MAAO,CACLE,gBAAiB,OAAAC,OAAOhB,GAAWA,EAAQJ,IAAaI,EAAQJ,GAAY,KAC5EqB,iBAAkB,YAClBC,eAAgB,WAElBP,QAASV,EAAS,OAAS,SAC3BW,SAAUtB,IAIlB"}
|
|
@@ -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("./Timer.js");require("../../node_modules/framer-motion/dist/cjs/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Timer.js");require("../../node_modules/framer-motion/dist/cjs/index.js");var i=require("../../_virtual/index2.js"),r=require("../../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=a(e);exports.default=function(e){var a=e.isVisible,n=r.useSelector((function(e){return e.currentCall})).displayName;return s.default.createElement(i.__exports.AnimatePresence,null,a&&s.default.createElement(i.__exports.motion.div,{className:"pi-absolute pi-w-full pi-bg-gray-500 pi-flex pi-justify-between pi-text-white -pi-mt-10 -pi-z-10 pi-font-sans pi-px-6 pi-pt-3",style:{borderTopLeftRadius:"20px",borderTopRightRadius:"20px",height:"60px"},initial:{y:60},animate:{y:0},exit:{y:60,transitionEnd:{display:"none"}},transition:{duration:.3}},s.default.createElement("div",{className:"pi-font-bold"},n),s.default.createElement("div",{className:""},s.default.createElement(t.default,{size:"small"}))))};
|
|
2
2
|
//# sourceMappingURL=BackCall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackCall.js","sources":["../../../src/components/CallView/BackCall.tsx"],"sourcesContent":["// Copyright (C) 2022 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 Timer from './Timer'\nimport { motion, AnimatePresence } from 'framer-motion/dist/cjs'\n\nconst BackCall: FC<BackCallTypes> = ({ isVisible }) => {\n const { displayName } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className='absolute w-full bg-gray-500 flex justify-between text-white -mt-10 -z-10 font-sans px-6 pt-3'\n style={{ borderTopLeftRadius: '20px', borderTopRightRadius: '20px', height: '60px' }}\n initial={{ y: 60 }}\n animate={{ y: 0 }}\n exit={{\n y: 60,\n transitionEnd: {\n display: 'none',\n },\n }}\n transition={{ duration: 0.3 }}\n >\n <div className='font-bold'>{displayName}</div>\n <div className=''>\n <Timer size='small' />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default BackCall\n\ninterface BackCallTypes {\n isVisible: boolean\n}\n"],"names":["_a","isVisible","displayName","useSelector","state","currentCall","React","AnimatePresence","__exports","createElement","motion","div","className","style","borderTopLeftRadius","borderTopRightRadius","height","initial","y","animate","exit","transitionEnd","display","transition","duration","Timer","size"],"mappings":"4bASoC,SAACA,GAAE,IAAAC,EAASD,EAAAC,UACtCC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BAEhE,OACEC,wBAACC,EAAeC,UAAAD,gBAAA,KACbN,GACCK,EAAC,QAAAG,cAAAC,EAAAA,UAAAA,OAAOC,KACNC,UAAU
|
|
1
|
+
{"version":3,"file":"BackCall.js","sources":["../../../src/components/CallView/BackCall.tsx"],"sourcesContent":["// Copyright (C) 2022 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 Timer from './Timer'\nimport { motion, AnimatePresence } from 'framer-motion/dist/cjs'\n\nconst BackCall: FC<BackCallTypes> = ({ isVisible }) => {\n const { displayName } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className='pi-absolute pi-w-full pi-bg-gray-500 pi-flex pi-justify-between pi-text-white -pi-mt-10 -pi-z-10 pi-font-sans pi-px-6 pi-pt-3'\n style={{ borderTopLeftRadius: '20px', borderTopRightRadius: '20px', height: '60px' }}\n initial={{ y: 60 }}\n animate={{ y: 0 }}\n exit={{\n y: 60,\n transitionEnd: {\n display: 'none',\n },\n }}\n transition={{ duration: 0.3 }}\n >\n <div className='pi-font-bold'>{displayName}</div>\n <div className=''>\n <Timer size='small' />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default BackCall\n\ninterface BackCallTypes {\n isVisible: boolean\n}\n"],"names":["_a","isVisible","displayName","useSelector","state","currentCall","React","AnimatePresence","__exports","createElement","motion","div","className","style","borderTopLeftRadius","borderTopRightRadius","height","initial","y","animate","exit","transitionEnd","display","transition","duration","Timer","size"],"mappings":"4bASoC,SAACA,GAAE,IAAAC,EAASD,EAAAC,UACtCC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BAEhE,OACEC,wBAACC,EAAeC,UAAAD,gBAAA,KACbN,GACCK,EAAC,QAAAG,cAAAC,EAAAA,UAAAA,OAAOC,KACNC,UAAU,gIACVC,MAAO,CAAEC,oBAAqB,OAAQC,qBAAsB,OAAQC,OAAQ,QAC5EC,QAAS,CAAEC,EAAG,IACdC,QAAS,CAAED,EAAG,GACdE,KAAM,CACJF,EAAG,GACHG,cAAe,CACbC,QAAS,SAGbC,WAAY,CAAEC,SAAU,KAExBlB,EAAA,QAAAG,cAAA,MAAA,CAAKG,UAAU,gBAAgBV,GAC/BI,EAAAA,QAAKG,cAAA,MAAA,CAAAG,UAAU,IACbN,UAACG,cAAAgB,EAAAA,QAAM,CAAAC,KAAK,YAMxB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../../styles/Island.styles.js");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var t=require("../../_virtual/framer-motion.js"),n=require("../../node_modules/react-redux/es/hooks/useSelector.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("../../styles/Island.styles.js");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var t=require("../../_virtual/framer-motion.js"),n=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(){var u=e.useState(!1),a=u[0],o=u[1],s=e.useRef(null),l=e.useRef(null),c=t.framerMotion.exports.motion(r.StyledName),d=n.useSelector((function(e){return e.currentCall})).displayName;return e.useLayoutEffect((function(){s.current&&l.current&&l.current.clientWidth-s.current.clientWidth>5&&o(!0)})),i.default.createElement(c,{ref:s,className:"pi-whitespace-nowrap pi-overflow-hidden"},i.default.createElement("div",{className:"pi-w-fit pi-relative pi-inline-block ".concat(a&&"animate-animated-text"),ref:l},d&&"<unknown>"===d?"PBX":d&&d))};
|
|
2
2
|
//# sourceMappingURL=DisplayName.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useLayoutEffect, type FC } from 'react'\nimport { StyledName } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\n\nconst DisplayName: FC<DisplayNameProps> = () => {\n const [animateText, setAnimateText] = useState<boolean>(false)\n const nameContainer = useRef<null | HTMLDivElement>(null)\n const nameText = useRef<null | HTMLDivElement>(null)\n const NameMotion = motion(StyledName)\n\n // Get the displayName of the currentCall store\n const { displayName } = useSelector((state: RootState) => state.currentCall)\n\n useLayoutEffect(() => {\n if (\n nameContainer.current &&\n nameText.current &&\n nameText.current.clientWidth - nameContainer.current.clientWidth > 5\n ) {\n setAnimateText(true)\n }\n })\n\n return (\n <NameMotion ref={nameContainer} className='whitespace-nowrap overflow-hidden'>\n <div\n className={`w-fit relative inline-block ${animateText && 'animate-animated-text'}`}\n ref={nameText}\n >\n {displayName && displayName === '<unknown>' ? 'PBX' : displayName && displayName}\n </div>\n </NameMotion>\n )\n}\n\nexport default DisplayName\n\nexport interface DisplayNameProps {}\n"],"names":["_a","useState","animateText","setAnimateText","nameContainer","useRef","nameText","NameMotion","motion","StyledName","displayName","useSelector","state","currentCall","useLayoutEffect","current","clientWidth","React","createElement","ref","className","concat"],"mappings":"sdAS0C,WAClC,IAAAA,EAAgCC,EAAAA,UAAkB,GAAjDC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAC5BI,EAAgBC,SAA8B,MAC9CC,EAAWD,SAA8B,MACzCE,EAAaC,8BAAOC,EAAAA,YAGlBC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BAYhE,OAVAC,EAAAA,iBAAgB,WAEZV,EAAcW,SACdT,EAASS,SACTT,EAASS,QAAQC,YAAcZ,EAAcW,QAAQC,YAAc,GAEnEb,GAAe,EAEnB,IAGEc,EAAAA,QAACC,cAAAX,EAAW,CAAAY,IAAKf,EAAegB,UAAU,
|
|
1
|
+
{"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useLayoutEffect, type FC } from 'react'\nimport { StyledName } from '../../styles/Island.styles'\nimport { motion } from 'framer-motion/dist/framer-motion'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\n\nconst DisplayName: FC<DisplayNameProps> = () => {\n const [animateText, setAnimateText] = useState<boolean>(false)\n const nameContainer = useRef<null | HTMLDivElement>(null)\n const nameText = useRef<null | HTMLDivElement>(null)\n const NameMotion = motion(StyledName)\n\n // Get the displayName of the currentCall store\n const { displayName } = useSelector((state: RootState) => state.currentCall)\n\n useLayoutEffect(() => {\n if (\n nameContainer.current &&\n nameText.current &&\n nameText.current.clientWidth - nameContainer.current.clientWidth > 5\n ) {\n setAnimateText(true)\n }\n })\n\n return (\n <NameMotion ref={nameContainer} className='pi-whitespace-nowrap pi-overflow-hidden'>\n <div\n className={`pi-w-fit pi-relative pi-inline-block ${animateText && 'animate-animated-text'}`}\n ref={nameText}\n >\n {displayName && displayName === '<unknown>' ? 'PBX' : displayName && displayName}\n </div>\n </NameMotion>\n )\n}\n\nexport default DisplayName\n\nexport interface DisplayNameProps {}\n"],"names":["_a","useState","animateText","setAnimateText","nameContainer","useRef","nameText","NameMotion","motion","StyledName","displayName","useSelector","state","currentCall","useLayoutEffect","current","clientWidth","React","createElement","ref","className","concat"],"mappings":"sdAS0C,WAClC,IAAAA,EAAgCC,EAAAA,UAAkB,GAAjDC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAC5BI,EAAgBC,SAA8B,MAC9CC,EAAWD,SAA8B,MACzCE,EAAaC,8BAAOC,EAAAA,YAGlBC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BAYhE,OAVAC,EAAAA,iBAAgB,WAEZV,EAAcW,SACdT,EAASS,SACTT,EAASS,QAAQC,YAAcZ,EAAcW,QAAQC,YAAc,GAEnEb,GAAe,EAEnB,IAGEc,EAAAA,QAACC,cAAAX,EAAW,CAAAY,IAAKf,EAAegB,UAAU,4CACxCH,UAAAC,cAAA,MAAA,CACEE,UAAW,wCAAwCC,OAAAnB,GAAe,yBAClEiB,IAAKb,GAEJI,GAA+B,cAAhBA,EAA8B,MAAQA,GAAeA,GAI7E"}
|
|
@@ -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 r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),l=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),n=require("../../lib/phone/call.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../store/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 a=require("../Button.js"),
|
|
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 r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),l=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),n=require("../../lib/phone/call.js");require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../store/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 a=require("../Button.js"),i=require("../AudioBars.js"),u=require("./Timer.js"),s=require("./Number.js"),o=require("./DisplayName.js"),d=require("./Avatar.js"),c=require("./Actions.js"),m=require("../../node_modules/react-redux/es/hooks/useSelector.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var p=f(e);function j(e,t){return!e&&!t}exports.default=function(){var e=m.useSelector((function(e){return e.currentCall})),f=e.incoming,g=e.accepted,q=e.outgoing,E=m.useSelector((function(e){return e.island})).isOpen,v=m.useSelector((function(e){return e.webrtc})).remoteAudioStream;return p.default.createElement(t.StyledCallView,{incoming:f,accepted:g,outgoing:q,isOpen:E},p.default.createElement(t.StyledTopContent,{isOpen:E,incoming:f,accepted:g,outgoing:q},p.default.createElement(d.default,null),E&&p.default.createElement(t.StyledDetails,null,p.default.createElement(o.default,null),g?p.default.createElement(u.default,null):p.default.createElement(s.default,null)),!E&&!g&&p.default.createElement(o.default,null),!E&&g&&p.default.createElement(u.default,null),g&&v&&p.default.createElement(i.AudioBars,{audioStream:v,size:E?"large":"small"})),E&&p.default.createElement("div",{className:"pi-grid pi-gap-y-5"},g&&p.default.createElement(c.default,null),p.default.createElement("div",{className:"pi-grid ".concat(j(q,g)?"pi-grid-cols-2":g?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"," pi-gap-3.5")},p.default.createElement(a.Button,{onClick:n.hangupCurrentCall,variant:"red"},p.default.createElement(r.FontAwesomeIcon,{className:"pi-rotate-135 pi-w-6 pi-h-6",icon:l.faPhone})),j(q,g)&&p.default.createElement(a.Button,{onClick:n.answerIncomingCall,variant:"green"},p.default.createElement(r.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:l.faPhone})))))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { StyledDetails, StyledCallView, StyledTopContent } from '../../styles/Island.styles'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\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 store\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n // Get isOpen and view from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Retrieve the audio stream from the webrtc store\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n\n return (\n <StyledCallView incoming={incoming} accepted={accepted} outgoing={outgoing} isOpen={isOpen}>\n <StyledTopContent isOpen={isOpen} incoming={incoming} accepted={accepted} outgoing={outgoing}>\n <Avatar />\n {isOpen && (\n <StyledDetails>\n <DisplayName />\n {/* The timer when expanded */}\n {accepted ? <Timer /> : <Number />}\n </StyledDetails>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer />}\n {accepted && remoteAudioStream && (\n <AudioBars audioStream={remoteAudioStream} size={isOpen ? 'large' : 'small'} />\n )}\n </StyledTopContent>\n {isOpen && (\n <div className='grid gap-y-5'>\n {accepted && <Actions />}\n <div\n className={`grid ${\n isAnswerVisible(outgoing, accepted)\n ? 'grid-cols-2'\n : accepted\n ? 'grid-cols-1 justify-items-center'\n : 'grid-cols-1 justify-items-end'\n } gap-3.5`}\n >\n {/* The button to hangup the currentCall */}\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='rotate-135 w-6 h-6' icon={faPhone} />\n </Button>\n {/* The button to answer the incoming call */}\n {isAnswerVisible(outgoing, accepted) && (\n <Button onClick={answerIncomingCall} variant='green'>\n <FontAwesomeIcon className='w-6 h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n )}\n </StyledCallView>\n )\n}\n\nexport default CallView\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","_a","useSelector","state","currentCall","incoming","isOpen","island","remoteAudioStream","webrtc","React","createElement","StyledCallView","StyledTopContent","Avatar","StyledDetails","DisplayName","Timer","Number","AudioBars","audioStream","size","className","Actions","concat","Button","onClick","hangupCurrentCall","variant","FontAwesomeIcon","icon","faPhone","answerIncomingCall"],"mappings":"4+BAkBA,SAASA,EAAgBC,EAAmBC,GAC1C,OAAQD,IAAaC,CACvB,iBAKoC,WAE5B,IAAAC,EAAmCC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAAzEC,EAAQJ,EAAAI,SAAEL,EAAQC,EAAAD,SAAED,EAAQE,EAAAF,SAE5BO,EAAWJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,iBAGnDC,EAAsBN,eAAY,SAACC,GAAqB,OAAAA,EAAMM,4BAEtE,OACEC,UAACC,cAAAC,EAAcA,gBAACP,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,EAAUO,OAAQA,GAClFI,EAAAA,QAAAC,cAACE,mBAAiB,CAAAP,OAAQA,EAAQD,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,GAClFW,UAAAC,cAACG,EAAM,QAAG,MACTR,GACCI,EAAA,QAAAC,cAACI,EAAAA,cAAa,KACZL,UAAAC,cAACK,EAAW,QAAG,MAEdhB,EAAWU,EAAA,QAAAC,cAACM,EAAAA,QAAK,MAAMP,EAAA,QAAAC,cAACO,EAAAA,QAAM,QAIjCZ,IAAWN,GAAYU,EAAA,QAAAC,cAACK,EAAW,QAAG,OAEtCV,GAAUN,GAAYU,EAAAA,QAAAC,cAACM,EAAAA,QAAQ,MAChCjB,GAAYQ,GACXE,EAAAA,QAAAC,cAACQ,EAASA,UAAC,CAAAC,YAAaZ,EAAmBa,KAAMf,EAAS,QAAU,WAGvEA,GACCI,EAAK,QAAAC,cAAA,MAAA,CAAAW,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { StyledDetails, StyledCallView, StyledTopContent } from '../../styles/Island.styles'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { hangupCurrentCall, answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\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 store\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n // Get isOpen and view from island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n // Retrieve the audio stream from the webrtc store\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n\n return (\n <StyledCallView incoming={incoming} accepted={accepted} outgoing={outgoing} isOpen={isOpen}>\n <StyledTopContent isOpen={isOpen} incoming={incoming} accepted={accepted} outgoing={outgoing}>\n <Avatar />\n {isOpen && (\n <StyledDetails>\n <DisplayName />\n {/* The timer when expanded */}\n {accepted ? <Timer /> : <Number />}\n </StyledDetails>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer />}\n {accepted && remoteAudioStream && (\n <AudioBars audioStream={remoteAudioStream} size={isOpen ? 'large' : 'small'} />\n )}\n </StyledTopContent>\n {isOpen && (\n <div className='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 <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n {/* The button to answer the incoming call */}\n {isAnswerVisible(outgoing, accepted) && (\n <Button onClick={answerIncomingCall} variant='green'>\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n )}\n </StyledCallView>\n )\n}\n\nexport default CallView\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","_a","useSelector","state","currentCall","incoming","isOpen","island","remoteAudioStream","webrtc","React","createElement","StyledCallView","StyledTopContent","Avatar","StyledDetails","DisplayName","Timer","Number","AudioBars","audioStream","size","className","Actions","concat","Button","onClick","hangupCurrentCall","variant","FontAwesomeIcon","icon","faPhone","answerIncomingCall"],"mappings":"4+BAkBA,SAASA,EAAgBC,EAAmBC,GAC1C,OAAQD,IAAaC,CACvB,iBAKoC,WAE5B,IAAAC,EAAmCC,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMC,eAAzEC,EAAQJ,EAAAI,SAAEL,EAAQC,EAAAD,SAAED,EAAQE,EAAAF,SAE5BO,EAAWJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,iBAGnDC,EAAsBN,eAAY,SAACC,GAAqB,OAAAA,EAAMM,4BAEtE,OACEC,UAACC,cAAAC,EAAcA,gBAACP,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,EAAUO,OAAQA,GAClFI,EAAAA,QAAAC,cAACE,mBAAiB,CAAAP,OAAQA,EAAQD,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,GAClFW,UAAAC,cAACG,EAAM,QAAG,MACTR,GACCI,EAAA,QAAAC,cAACI,EAAAA,cAAa,KACZL,UAAAC,cAACK,EAAW,QAAG,MAEdhB,EAAWU,EAAA,QAAAC,cAACM,EAAAA,QAAK,MAAMP,EAAA,QAAAC,cAACO,EAAAA,QAAM,QAIjCZ,IAAWN,GAAYU,EAAA,QAAAC,cAACK,EAAW,QAAG,OAEtCV,GAAUN,GAAYU,EAAAA,QAAAC,cAACM,EAAAA,QAAQ,MAChCjB,GAAYQ,GACXE,EAAAA,QAAAC,cAACQ,EAASA,UAAC,CAAAC,YAAaZ,EAAmBa,KAAMf,EAAS,QAAU,WAGvEA,GACCI,EAAK,QAAAC,cAAA,MAAA,CAAAW,UAAU,sBACZtB,GAAYU,EAAC,QAAAC,cAAAY,EAAAA,QAAU,MACxBb,UACEC,cAAA,MAAA,CAAAW,UAAW,WACTE,OAAA1B,EAAgBC,EAAUC,GACtB,iBACAA,EACA,yCACA,sCACO,gBAGbU,EAAC,QAAAC,cAAAc,UAAOC,QAASC,EAAiBA,kBAAEC,QAAQ,OAC1ClB,UAACC,cAAAkB,EAAAA,gBAAgB,CAAAP,UAAU,8BAA8BQ,KAAMC,EAAOA,WAGvEjC,EAAgBC,EAAUC,IACzBU,UAAAC,cAACc,EAAMA,OAAA,CAACC,QAASM,qBAAoBJ,QAAQ,SAC3ClB,EAAAA,QAAAC,cAACkB,kBAAgB,CAAAP,UAAU,gBAAgBQ,KAAMC,EAAAA,aAQjE"}
|
|
@@ -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("../utils/customHooks/useIsomorphicLayoutEffect.js"),n=require("../utils/customHooks/useLocalStorage.js"),a=require("../utils/customHooks/useLongPress.js"),l=require("../utils/genericFunctions/styleTransformValues.js");require("../node_modules/framer-motion/dist/framer-motion.js");var
|
|
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("../utils/customHooks/useIsomorphicLayoutEffect.js"),n=require("../utils/customHooks/useLocalStorage.js"),a=require("../utils/customHooks/useLongPress.js"),l=require("../utils/genericFunctions/styleTransformValues.js");require("../node_modules/framer-motion/dist/framer-motion.js");var i=require("./CallView/index.js"),u=require("./KeypadView/index.js"),o=require("../lib/island/island.js"),s=require("./AlertGuard.js"),d=require("./CallView/BackCall.js"),c=require("./ViewsTransition.js"),f=require("../_virtual/framer-motion.js"),p=require("../node_modules/react-redux/es/hooks/useSelector.js"),m=require("../node_modules/react-redux/es/hooks/useDispatch.js");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var x=y(t),v=function(y){var v=y.showAlways,w=p.useSelector((function(e){return e.currentCall})),g=w.incoming,E=w.accepted,h=w.outgoing,V=p.useSelector((function(e){return e.island})),j=V.isOpen,q=V.startPosition,k=V.view,P=p.useSelector((function(e){return e.alerts.status})).activeAlertsCount,A=p.useSelector((function(e){return e.animations})).variants,S=p.useSelector((function(e){return e.player})).audioPlayerLoop,b=f.framerMotion.exports.useDragControls(),_=n.useLocalStorage("phone-island",null),C=_[0],I=_[1],D=t.useRef(null),L=t.useRef(null),R=t.useState(C&&C.position?C.position:null),M=R[0],N=R[1],T=t.useState(!1),W=T[0],F=T[1],H=m.useDispatch();var O=a.useLongPress((function(){}),(function(){H.island.toggleIsOpen()}),W,(function(){return F(!1)}),{shouldPreventDefault:!0,delay:250}),G=t.useRef(null),z=t.useRef(null),B=t.useRef(null),K=t.useRef(null),J=t.useRef(null);r.useIsomorphicLayoutEffect((function(){H.player.updatePlayer({audioPlayer:G.current,localAudio:z.current,localVideo:K.current,remoteVideo:J.current,remoteAudio:B.current})}),[]),t.useEffect((function(){(g||h)&&H.island.setIslandView("call")}),[g,h]);var Q=t.useState(""),U=Q[0],X=Q[1];return t.useEffect((function(){setTimeout((function(){X(k)}),200)}),[k]),x.default.createElement("div",{ref:L,className:"pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center phone-island-container pi-z-1000"},(g||h||E||v||P>0)&&x.default.createElement(x.default.Fragment,null,x.default.createElement(f.framerMotion.exports.motion.div,e.__assign({drag:!0,onPointerDown:function(e){b.start(e)},onDragStart:function(){F(!0)},dragTransition:{power:0},initial:{x:(null==M?void 0:M.x)||q.x,y:(null==M?void 0:M.y)||q.y},dragControls:b,dragConstraints:L,onDragEnd:function(){var e=l.styleTransformValues(D.current),t=e.x,r=e.y;t=o.xPosition(Math.round(t),D.current,L.current),r=o.yPosition(Math.round(r),D.current,L.current),I({position:{x:t,y:r}}),N({x:t,y:r})},ref:D},O,{className:"pi-absolute"}),x.default.createElement(d.default,{isVisible:"keypad"===k}),x.default.createElement(f.framerMotion.exports.motion.div,{className:"pi-font-sans pi-pointer-events-auto pi-overflow-hidden pi-bg-black pi-text-xs pi-cursor-pointer pi-text-white",animate:"call"===k?j&&(g||h)&&!E?P>0?A.callView.expandedIncomingWithAlerts:A.callView.expandedIncoming:j&&E?P>0?A.callView.expandedAcceptedWithAlerts:A.callView.expandedAccepted:P>0?A.expandedWithAlerts:A.callView.collapsed:"keypad"===k?j&&P>0?A.keypadView.expandedWithAlerts:j&&0===P?A.keypadView.expanded:j?"":A.keypadView.collapsed:""},x.default.createElement(s.AlertGuard,null,"call"===U?x.default.createElement(c.default,{forView:"call"},x.default.createElement(i.default,null)):"keypad"===U?x.default.createElement(c.default,{forView:"keypad"},x.default.createElement(u.default,null)):x.default.createElement(x.default.Fragment,null))))),x.default.createElement("div",{className:"pi-hidden"},x.default.createElement("audio",{loop:S,ref:G}),x.default.createElement("audio",{muted:!0,ref:z}),x.default.createElement("audio",{autoPlay:!0,ref:B}),x.default.createElement("video",{muted:!0,autoPlay:!0,ref:K}),x.default.createElement("video",{autoPlay:!0,ref:J})))};v.displayName="Island",exports.Island=v;
|
|
2
2
|
//# sourceMappingURL=Island.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport {\n useLongPress,\n useIsomorphicLayoutEffect,\n useLocalStorage,\n styleTransformValues,\n} from '../utils'\nimport { motion, useDragControls } from 'framer-motion/dist/framer-motion'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport { xPosition, yPosition } from '../lib/island/island'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport ViewsTransition from './ViewsTransition'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n *\n */\nexport const Island: FC<IslandProps> = ({ showAlways }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n // Get isOpen from island store\n const { isOpen, startPosition, view } = useSelector((state: RootState) => state.island)\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n // Get variants from animations store\n const { variants } = useSelector((state: RootState) => state.animations)\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n\n // Initialize Island drag controls\n const controls = useDragControls()\n\n // Initialize Island storage\n const [phoneIslandStorage, setPhoneIslandStorage] =\n useLocalStorage<PhoneIslandStorageTypes | null>('phone-island', null)\n\n // The Island reference\n const islandRef = useRef<any>(null)\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize position or get from storage\n const [position, setPosition] = useState<PositionTypes | null>(\n phoneIslandStorage && phoneIslandStorage.position ? phoneIslandStorage.position : null,\n )\n\n // Initialize the moved property\n const [moved, setMoved] = useState<boolean>(false)\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Handles the drag started event\n function handleStartDrag(event) {\n controls.start(event)\n }\n // Handles log press event\n const handleLongPress = () => {}\n\n // Handle Island click\n const handleIslandClick = () => {\n dispatch.island.toggleIsOpen()\n }\n\n // Handles drag end event\n const handleDragEnd = () => {\n // Get initial transform values\n let { x, y }: any = styleTransformValues(islandRef.current)\n // Round position\n x = xPosition(Math.round(x), islandRef.current, islandContainerRef.current)\n y = yPosition(Math.round(y), islandRef.current, islandContainerRef.current)\n // Save the new position to localstorage\n setPhoneIslandStorage({\n position: {\n x,\n y,\n },\n })\n // Set position to variable\n setPosition({\n x,\n y,\n })\n }\n\n // Handles drag started event\n function handleDragStarted() {\n setMoved(true)\n }\n\n // Initialize the longPressEvent object\n const longPressEvent = useLongPress(\n handleLongPress,\n handleIslandClick,\n moved,\n () => setMoved(false),\n {\n shouldPreventDefault: true,\n delay: 250,\n },\n )\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const remoteVideo = useRef<HTMLVideoElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer.current,\n localAudio: localAudio.current,\n localVideo: localVideo.current,\n remoteVideo: remoteVideo.current,\n remoteAudio: remoteAudio.current,\n })\n }, [])\n\n // Handle and apply view switch logic\n useEffect(() => {\n if (incoming || outgoing) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n return (\n <div\n ref={islandContainerRef}\n className='absolute min-w-full min-h-full left-0 top-0 overflow-hidden pointer-events-none flex items-center justify-center content-center phone-island-container z-1000'\n >\n {(incoming || outgoing || accepted || showAlways || activeAlertsCount > 0) && (\n <>\n <motion.div\n drag\n onPointerDown={handleStartDrag}\n onDragStart={handleDragStarted}\n dragTransition={{\n power: 0,\n }}\n initial={{\n x: position?.x || startPosition.x,\n y: position?.y || startPosition.y,\n }}\n dragControls={controls}\n dragConstraints={islandContainerRef}\n onDragEnd={handleDragEnd}\n ref={islandRef}\n {...longPressEvent}\n className='absolute'\n >\n {/* Add background call visibility logic */}\n <BackCall isVisible={view === 'keypad'} />\n <motion.div\n className='font-sans pointer-events-auto overflow-hidden bg-black text-xs cursor-pointer text-white'\n animate={\n view === 'call'\n ? isOpen && (incoming || outgoing) && !accepted\n ? // The call is incoming or outgoing\n activeAlertsCount > 0\n ? variants.callView.expandedIncomingWithAlerts\n : variants.callView.expandedIncoming\n : isOpen && accepted\n ? // The call is accepted and the island is expanded\n activeAlertsCount > 0\n ? variants.callView.expandedAcceptedWithAlerts\n : variants.callView.expandedAccepted\n : activeAlertsCount > 0\n ? variants.expandedWithAlerts\n : variants.callView.collapsed\n : view === 'keypad'\n ? isOpen && activeAlertsCount > 0\n ? variants.keypadView.expandedWithAlerts\n : isOpen && activeAlertsCount === 0\n ? variants.keypadView.expanded\n : !isOpen\n ? variants.keypadView.collapsed\n : ''\n : ''\n }\n >\n {/* The views logic */}\n <AlertGuard>\n {currentView === 'call' ? (\n <ViewsTransition forView='call'>\n <CallView />\n </ViewsTransition>\n ) : currentView === 'keypad' ? (\n <ViewsTransition forView='keypad'>\n <KeyboardView />\n </ViewsTransition>\n ) : (\n <></>\n )}\n </AlertGuard>\n </motion.div>\n </motion.div>\n </>\n )}\n <div className='hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n <video muted={true} autoPlay ref={localVideo}></video>\n <video autoPlay ref={remoteVideo}></video>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n}\n\ninterface PositionTypes {\n x: number\n y: number\n}\n\ninterface PhoneIslandStorageTypes {\n position: PositionTypes\n}\n"],"names":["Island","_a","showAlways","_b","useSelector","state","currentCall","incoming","accepted","outgoing","_c","island","isOpen","startPosition","view","activeAlertsCount","alerts","status","variants","animations","audioPlayerLoop","player","controls","useDragControls","_d","useLocalStorage","phoneIslandStorage","setPhoneIslandStorage","islandRef","useRef","islandContainerRef","_e","useState","position","setPosition","_f","moved","setMoved","dispatch","useDispatch","longPressEvent","useLongPress","toggleIsOpen","shouldPreventDefault","delay","audioPlayer","localAudio","remoteAudio","localVideo","remoteVideo","useIsomorphicLayoutEffect","updatePlayer","current","useEffect","setIslandView","_g","currentView","setCurrentView","setTimeout","React","ref","className","createElement","Fragment","motion","div","__assign","drag","onPointerDown","event","start","onDragStart","dragTransition","power","initial","x","y","dragControls","dragConstraints","onDragEnd","styleTransformValues","xPosition","Math","round","yPosition","BackCall","isVisible","animate","callView","expandedIncomingWithAlerts","expandedIncoming","expandedAcceptedWithAlerts","expandedAccepted","expandedWithAlerts","collapsed","keypadView","expanded","AlertGuard","ViewsTransition","forView","CallView","KeyboardView","loop","muted","autoPlay","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Island.js","sources":["../../src/components/Island.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useRef, useEffect, type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport {\n useLongPress,\n useIsomorphicLayoutEffect,\n useLocalStorage,\n styleTransformValues,\n} from '../utils'\nimport { motion, useDragControls } from 'framer-motion/dist/framer-motion'\nimport CallView from './CallView'\nimport KeyboardView from './KeypadView'\nimport { xPosition, yPosition } from '../lib/island/island'\nimport { AlertGuard } from './AlertGuard'\nimport BackCall from './CallView/BackCall'\nimport ViewsTransition from './ViewsTransition'\n\n/**\n * Provides the Island logic\n *\n * @param showAlways Sets the Island ever visible\n *\n */\nexport const Island: FC<IslandProps> = ({ showAlways }) => {\n // Get the currentCall info\n const { incoming, accepted, outgoing } = useSelector((state: RootState) => state.currentCall)\n // Get isOpen from island store\n const { isOpen, startPosition, view } = useSelector((state: RootState) => state.island)\n // Get activeAlertsCount from island store\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n // Get variants from animations store\n const { variants } = useSelector((state: RootState) => state.animations)\n // Get audioPlayerLoop value from player store\n const { audioPlayerLoop } = useSelector((state: RootState) => state.player)\n\n // Initialize Island drag controls\n const controls = useDragControls()\n\n // Initialize Island storage\n const [phoneIslandStorage, setPhoneIslandStorage] =\n useLocalStorage<PhoneIslandStorageTypes | null>('phone-island', null)\n\n // The Island reference\n const islandRef = useRef<any>(null)\n // The Container reference\n const islandContainerRef = useRef<any>(null)\n\n // Initialize position or get from storage\n const [position, setPosition] = useState<PositionTypes | null>(\n phoneIslandStorage && phoneIslandStorage.position ? phoneIslandStorage.position : null,\n )\n\n // Initialize the moved property\n const [moved, setMoved] = useState<boolean>(false)\n // Initialize useDispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Handles the drag started event\n function handleStartDrag(event) {\n controls.start(event)\n }\n // Handles log press event\n const handleLongPress = () => {}\n\n // Handle Island click\n const handleIslandClick = () => {\n dispatch.island.toggleIsOpen()\n }\n\n // Handles drag end event\n const handleDragEnd = () => {\n // Get initial transform values\n let { x, y }: any = styleTransformValues(islandRef.current)\n // Round position\n x = xPosition(Math.round(x), islandRef.current, islandContainerRef.current)\n y = yPosition(Math.round(y), islandRef.current, islandContainerRef.current)\n // Save the new position to localstorage\n setPhoneIslandStorage({\n position: {\n x,\n y,\n },\n })\n // Set position to variable\n setPosition({\n x,\n y,\n })\n }\n\n // Handles drag started event\n function handleDragStarted() {\n setMoved(true)\n }\n\n // Initialize the longPressEvent object\n const longPressEvent = useLongPress(\n handleLongPress,\n handleIslandClick,\n moved,\n () => setMoved(false),\n {\n shouldPreventDefault: true,\n delay: 250,\n },\n )\n\n const audioPlayer = useRef<HTMLAudioElement>(null)\n const localAudio = useRef<HTMLAudioElement>(null)\n const remoteAudio = useRef<HTMLAudioElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const remoteVideo = useRef<HTMLVideoElement>(null)\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n audioPlayer: audioPlayer.current,\n localAudio: localAudio.current,\n localVideo: localVideo.current,\n remoteVideo: remoteVideo.current,\n remoteAudio: remoteAudio.current,\n })\n }, [])\n\n // Handle and apply view switch logic\n useEffect(() => {\n if (incoming || outgoing) {\n dispatch.island.setIslandView('call')\n }\n }, [incoming, outgoing])\n\n const [currentView, setCurrentView] = useState<any>('')\n\n useEffect(() => {\n setTimeout(() => {\n setCurrentView(view)\n }, 200)\n }, [view])\n\n return (\n <div\n ref={islandContainerRef}\n className='pi-absolute pi-min-w-full pi-min-h-full pi-left-0 pi-top-0 pi-overflow-hidden pi-pointer-events-none pi-flex pi-items-center pi-justify-center pi-content-center phone-island-container pi-z-1000'\n >\n {(incoming || outgoing || accepted || showAlways || activeAlertsCount > 0) && (\n <>\n <motion.div\n drag\n onPointerDown={handleStartDrag}\n onDragStart={handleDragStarted}\n dragTransition={{\n power: 0,\n }}\n initial={{\n x: position?.x || startPosition.x,\n y: position?.y || startPosition.y,\n }}\n dragControls={controls}\n dragConstraints={islandContainerRef}\n onDragEnd={handleDragEnd}\n ref={islandRef}\n {...longPressEvent}\n className='pi-absolute'\n >\n {/* Add background call visibility logic */}\n <BackCall isVisible={view === 'keypad'} />\n <motion.div\n className='pi-font-sans pi-pointer-events-auto pi-overflow-hidden pi-bg-black pi-text-xs pi-cursor-pointer pi-text-white'\n animate={\n view === 'call'\n ? isOpen && (incoming || outgoing) && !accepted\n ? // The call is incoming or outgoing\n activeAlertsCount > 0\n ? variants.callView.expandedIncomingWithAlerts\n : variants.callView.expandedIncoming\n : isOpen && accepted\n ? // The call is accepted and the island is expanded\n activeAlertsCount > 0\n ? variants.callView.expandedAcceptedWithAlerts\n : variants.callView.expandedAccepted\n : activeAlertsCount > 0\n ? variants.expandedWithAlerts\n : variants.callView.collapsed\n : view === 'keypad'\n ? isOpen && activeAlertsCount > 0\n ? variants.keypadView.expandedWithAlerts\n : isOpen && activeAlertsCount === 0\n ? variants.keypadView.expanded\n : !isOpen\n ? variants.keypadView.collapsed\n : ''\n : ''\n }\n >\n {/* The views logic */}\n <AlertGuard>\n {currentView === 'call' ? (\n <ViewsTransition forView='call'>\n <CallView />\n </ViewsTransition>\n ) : currentView === 'keypad' ? (\n <ViewsTransition forView='keypad'>\n <KeyboardView />\n </ViewsTransition>\n ) : (\n <></>\n )}\n </AlertGuard>\n </motion.div>\n </motion.div>\n </>\n )}\n <div className='pi-hidden'>\n <audio loop={audioPlayerLoop} ref={audioPlayer}></audio>\n <audio muted={true} ref={localAudio}></audio>\n <audio autoPlay ref={remoteAudio}></audio>\n <video muted={true} autoPlay ref={localVideo}></video>\n <video autoPlay ref={remoteVideo}></video>\n </div>\n </div>\n )\n}\n\nIsland.displayName = 'Island'\n\ninterface IslandProps {\n showAlways?: boolean\n}\n\ninterface PositionTypes {\n x: number\n y: number\n}\n\ninterface PhoneIslandStorageTypes {\n position: PositionTypes\n}\n"],"names":["Island","_a","showAlways","_b","useSelector","state","currentCall","incoming","accepted","outgoing","_c","island","isOpen","startPosition","view","activeAlertsCount","alerts","status","variants","animations","audioPlayerLoop","player","controls","useDragControls","_d","useLocalStorage","phoneIslandStorage","setPhoneIslandStorage","islandRef","useRef","islandContainerRef","_e","useState","position","setPosition","_f","moved","setMoved","dispatch","useDispatch","longPressEvent","useLongPress","toggleIsOpen","shouldPreventDefault","delay","audioPlayer","localAudio","remoteAudio","localVideo","remoteVideo","useIsomorphicLayoutEffect","updatePlayer","current","useEffect","setIslandView","_g","currentView","setCurrentView","setTimeout","React","ref","className","createElement","Fragment","motion","div","__assign","drag","onPointerDown","event","start","onDragStart","dragTransition","power","initial","x","y","dragControls","dragConstraints","onDragEnd","styleTransformValues","xPosition","Math","round","yPosition","BackCall","isVisible","animate","callView","expandedIncomingWithAlerts","expandedIncoming","expandedAcceptedWithAlerts","expandedAccepted","expandedWithAlerts","collapsed","keypadView","expanded","AlertGuard","ViewsTransition","forView","CallView","KeyboardView","loop","muted","autoPlay","displayName"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../store/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../Island.js");var r=require("../Button.js");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("../AudioBars.js"),require("../../node_modules/@fortawesome/react-fontawesome/index.es.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../store/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../Island.js");var r=require("../Button.js");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("../AudioBars.js"),require("../../node_modules/@fortawesome/react-fontawesome/index.es.js");var i=t(e),u=Array.from(Array(9).keys()),a=["*","0","#"];exports.default=function(e){var t=e.keyCallback;return i.default.createElement("div",{className:"pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-6 pi-justify-items-center pi-place-items-center pi-justify-center pi-px-3"},u.map((function(e){return i.default.createElement(r.Button,{key:e+1,onClick:function(){return t(e+1)},variant:"default",className:"pi-text-2xl"},e+1)})),a.map((function(e){return i.default.createElement(r.Button,{key:e+1,onClick:function(){return t(e)},variant:"default",className:"pi-text-2xl"},e)})))};
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/KeypadView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { Button } from '..'\n\nconst keys = Array.from(Array(9).keys())\n\nconst bottomKeys = ['*', '0', '#']\n\nconst Actions: FC<ActionsTypes> = ({ keyCallback }) => {\n return (\n <div className='grid grid-cols-3 auto-cols-max gap-y-6 justify-items-center place-items-center justify-center px-3'>\n {keys.map((key) => (\n <Button\n key={key + 1}\n onClick={() => keyCallback(key + 1)}\n variant='default'\n className={'text-2xl'}\n >\n {key + 1}\n </Button>\n ))}\n {bottomKeys.map((bottomKey) => (\n <Button\n key={bottomKey + 1}\n onClick={() => keyCallback(bottomKey)}\n variant='default'\n className={'text-2xl'}\n >\n {bottomKey}\n </Button>\n ))}\n </div>\n )\n}\n\nexport default Actions\n\ninterface ActionsTypes {\n keyCallback: any\n}\n"],"names":["keys","Array","from","bottomKeys","_a","keyCallback","React","createElement","className","map","key","Button","onClick","variant","bottomKey"],"mappings":"8nBAMMA,EAAOC,MAAMC,KAAKD,MAAM,GAAGD,QAE3BG,EAAa,CAAC,IAAK,IAAK,qBAEI,SAACC,GAAE,IAAAC,EAAWD,EAAAC,YAC9C,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/KeypadView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { Button } from '..'\n\nconst keys = Array.from(Array(9).keys())\n\nconst bottomKeys = ['*', '0', '#']\n\nconst Actions: FC<ActionsTypes> = ({ keyCallback }) => {\n return (\n <div className='pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-6 pi-justify-items-center pi-place-items-center pi-justify-center pi-px-3'>\n {keys.map((key) => (\n <Button\n key={key + 1}\n onClick={() => keyCallback(key + 1)}\n variant='default'\n className={'pi-text-2xl'}\n >\n {key + 1}\n </Button>\n ))}\n {bottomKeys.map((bottomKey) => (\n <Button\n key={bottomKey + 1}\n onClick={() => keyCallback(bottomKey)}\n variant='default'\n className={'pi-text-2xl'}\n >\n {bottomKey}\n </Button>\n ))}\n </div>\n )\n}\n\nexport default Actions\n\ninterface ActionsTypes {\n keyCallback: any\n}\n"],"names":["keys","Array","from","bottomKeys","_a","keyCallback","React","createElement","className","map","key","Button","onClick","variant","bottomKey"],"mappings":"8nBAMMA,EAAOC,MAAMC,KAAKD,MAAM,GAAGD,QAE3BG,EAAa,CAAC,IAAK,IAAK,qBAEI,SAACC,GAAE,IAAAC,EAAWD,EAAAC,YAC9C,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,8HACZR,EAAKS,KAAI,SAACC,GAAQ,OACjBJ,EAAC,QAAAC,cAAAI,EAAAA,QACCD,IAAKA,EAAM,EACXE,QAAS,WAAM,OAAAP,EAAYK,EAAM,EAAE,EACnCG,QAAQ,UACRL,UAAW,eAEVE,EAAM,EAPQ,IAUlBP,EAAWM,KAAI,SAACK,GAAc,OAC7BR,EAAC,QAAAC,cAAAI,EAAAA,QACCD,IAAKI,EAAY,EACjBF,QAAS,WAAM,OAAAP,EAAYS,IAC3BD,QAAQ,UACRL,UAAW,eAEVM,EAEJ,IAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var n=require("../../node_modules/@nethesis/nethesis-light-svg-icons/index.mjs.js"),r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),a=require("./Actions.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var n=require("../../node_modules/@nethesis/nethesis-light-svg-icons/index.mjs.js"),r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),a=require("./Actions.js"),i=require("../../lib/phone/call.js"),s=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),u=require("../../static/dtmf/index.js"),l=require("../../lib/webrtc/messages.js"),o=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),c=require("../../node_modules/react-redux/es/hooks/useSelector.js");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=d(e),p=["0","1","2","3","4","5","6","7","8","9","*","#"];exports.default=function(){var d=o.useDispatch(),m=c.useSelector((function(e){return e.currentCall})).keypadValue,x=c.useSelector((function(e){return e.island})).isOpen,v=e.useRef(m);function y(e){d.currentCall.updateKeypadValue("".concat(v.current).concat(e)),v.current="".concat(v.current).concat(e),function(e){"*"===e&&(e="star"),"#"===e&&(e="pound"),d.player.updateAndPlayAudioPlayer({src:u.default["dtmf_".concat(e)]})}(e),l.sendDTMF(e)}return e.useEffect((function(){function e(e){p.includes(e.key)&&y(e.key)}return window.addEventListener("keydown",e),function(){return window.removeEventListener("keydown",e)}}),[]),f.default.createElement(f.default.Fragment,null,x?f.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-7"},f.default.createElement("div",{className:"pi-flex pi-gap-4"},f.default.createElement(t.Button,{variant:"transparent",onClick:function(){d.island.setIslandView("call")}},f.default.createElement(r.FontAwesomeIcon,{size:"xl",icon:n.faArrowLeft})),f.default.createElement("input",{type:"text",readOnly:!0,value:m,autoFocus:!0,className:"pi-w-full pi-rounded-xl pi-bg-black pi-border pi-border-gray-300 pi-text-white pi-font-sans pi-font-light pi-text-xl pi-text-center pi-px-2"})),f.default.createElement(a.default,{keyCallback:y}),f.default.createElement("div",{className:"pi-flex pi-justify-center"},f.default.createElement(t.Button,{onClick:i.hangupCurrentCall,variant:"red"},f.default.createElement(r.FontAwesomeIcon,{className:"pi-rotate-135 pi-w-6 pi-h-6",icon:s.faPhone})))):f.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Keypad"))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { faArrowLeft } from '@nethesis/nethesis-light-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport Actions from './Actions'\nimport { hangupCurrentCall } from '../../lib/phone/call'\nimport { faPhone } from '@nethesis/nethesis-solid-svg-icons'\nimport dtmfAudios from '../../static/dtmf'\nimport { sendDTMF } from '../../lib/webrtc/messages'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function backToCallView() {\n dispatch.island.setIslandView('call')\n }\n\n function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n dispatch.player.updateAndPlayAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n }\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n sendDTMF(key)\n }\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n return (\n <>\n {isOpen ? (\n <div className='flex flex-col gap-7'>\n <div className='flex gap-4'>\n <Button variant='transparent' onClick={backToCallView}>\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n type='text'\n readOnly\n value={keypadValue}\n autoFocus\n className='w-full rounded-xl bg-black border border-gray-300 text-white font-sans font-light text-xl text-center px-2'\n />\n </div>\n <Actions keyCallback={sendKey} />\n <div className='flex justify-center'>\n {/* The button to hangup the currentCall */}\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='rotate-135 w-6 h-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n ) : (\n <div className='font-medium text-base'>Keypad</div>\n )}\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","player","updateAndPlayAudioPlayer","src","dtmfAudios","playDtmfAudio","sendDTMF","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","React","createElement","Fragment","className","Button","variant","onClick","setIslandView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","value","autoFocus","Actions","keyCallback","hangupCurrentCall","faPhone"],"mappings":"swBAeMA,EAAY,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qBAElC,WACtC,IAAMC,EAAWC,EAAAA,cACTC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BACxDC,EAAWH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,iBACrDC,EAAiBC,SAA2BP,GAYlD,SAASQ,EAAQC,GACfX,EAASK,YAAYO,kBAAkB,GAAAC,OAAGL,EAAeM,SAAOD,OAAGF,IACnEH,EAAeM,QAAU,GAAGD,OAAAL,EAAeM,SAAOD,OAAGF,GARvD,SAAuBA,GACT,MAARA,IAAaA,EAAM,QACX,MAARA,IAAaA,EAAM,SACvBX,EAASe,OAAOC,yBAAyB,CAAEC,IAAKC,EAAAA,QAAW,eAAQP,KACpE,CAKCQ,CAAcR,GACdS,EAAQA,SAACT,EACV,CAYD,OAVAU,EAAAA,WAAU,WACR,SAASC,EAAsBC,GACzBxB,EAAUyB,SAASD,EAAMZ,MAC3BD,EAAQa,EAAMZ,IAEjB,CAED,OADAc,OAAOC,iBAAiB,UAAWJ,GAC5B,WAAM,OAAAG,OAAOE,oBAAoB,UAAWL,GACpD,GAAE,IAGDM,UACGC,cAAAD,EAAA,QAAAE,SAAA,KAAAxB,EACCsB,EAAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { faArrowLeft } from '@nethesis/nethesis-light-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport Actions from './Actions'\nimport { hangupCurrentCall } from '../../lib/phone/call'\nimport { faPhone } from '@nethesis/nethesis-solid-svg-icons'\nimport dtmfAudios from '../../static/dtmf'\nimport { sendDTMF } from '../../lib/webrtc/messages'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function backToCallView() {\n dispatch.island.setIslandView('call')\n }\n\n function playDtmfAudio(key: string) {\n if (key === '*') key = 'star'\n if (key === '#') key = 'pound'\n dispatch.player.updateAndPlayAudioPlayer({ src: dtmfAudios[`dtmf_${key}`] })\n }\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n sendDTMF(key)\n }\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n return (\n <>\n {isOpen ? (\n <div className='pi-flex pi-flex-col pi-gap-7'>\n <div className='pi-flex pi-gap-4'>\n <Button variant='transparent' onClick={backToCallView}>\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n type='text'\n readOnly\n value={keypadValue}\n autoFocus\n className='pi-w-full pi-rounded-xl pi-bg-black pi-border pi-border-gray-300 pi-text-white pi-font-sans pi-font-light pi-text-xl pi-text-center pi-px-2'\n />\n </div>\n <Actions keyCallback={sendKey} />\n <div className='pi-flex pi-justify-center'>\n {/* The button to hangup the currentCall */}\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n ) : (\n <div className='pi-font-medium pi-text-base'>Keypad</div>\n )}\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","player","updateAndPlayAudioPlayer","src","dtmfAudios","playDtmfAudio","sendDTMF","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","React","createElement","Fragment","className","Button","variant","onClick","setIslandView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","value","autoFocus","Actions","keyCallback","hangupCurrentCall","faPhone"],"mappings":"swBAeMA,EAAY,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qBAElC,WACtC,IAAMC,EAAWC,EAAAA,cACTC,EAAgBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,2BACxDC,EAAWH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,iBACrDC,EAAiBC,SAA2BP,GAYlD,SAASQ,EAAQC,GACfX,EAASK,YAAYO,kBAAkB,GAAAC,OAAGL,EAAeM,SAAOD,OAAGF,IACnEH,EAAeM,QAAU,GAAGD,OAAAL,EAAeM,SAAOD,OAAGF,GARvD,SAAuBA,GACT,MAARA,IAAaA,EAAM,QACX,MAARA,IAAaA,EAAM,SACvBX,EAASe,OAAOC,yBAAyB,CAAEC,IAAKC,EAAAA,QAAW,eAAQP,KACpE,CAKCQ,CAAcR,GACdS,EAAQA,SAACT,EACV,CAYD,OAVAU,EAAAA,WAAU,WACR,SAASC,EAAsBC,GACzBxB,EAAUyB,SAASD,EAAMZ,MAC3BD,EAAQa,EAAMZ,IAEjB,CAED,OADAc,OAAOC,iBAAiB,UAAWJ,GAC5B,WAAM,OAAAG,OAAOE,oBAAoB,UAAWL,GACpD,GAAE,IAGDM,UACGC,cAAAD,EAAA,QAAAE,SAAA,KAAAxB,EACCsB,EAAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,gCACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oBACbH,EAAC,QAAAC,cAAAG,UAAOC,QAAQ,cAAcC,QAhCxC,WACElC,EAASO,OAAO4B,cAAc,OAC/B,GA+BWP,UAACC,cAAAO,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMC,EAAWA,eAE9CX,EAAA,QAAAC,cAAA,QAAA,CACEW,KAAK,OACLC,YACAC,MAAOxC,EACPyC,WACA,EAAAZ,UAAU,iJAGdH,EAAAA,QAAAC,cAACe,EAAAA,QAAO,CAACC,YAAanC,IACtBkB,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,6BAEbH,EAAC,QAAAC,cAAAG,UAAOE,QAASY,EAAiBA,kBAAEb,QAAQ,OAC1CL,UAACC,cAAAO,EAAAA,gBAAgB,CAAAL,UAAU,8BAA8BO,KAAMS,EAAOA,aAK5EnB,UAAKC,cAAA,MAAA,CAAAE,UAAU,+BAA0C,UAIjE"}
|
|
@@ -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 n=require("../node_modules/socket.io-client/build/esm/index.js"),t=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var o=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var r=require("../events/SocketEvents.js"),u=require("../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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 a=s(e);exports.Socket=function(s){var i=s.hostName,d=s.username,l=s.authToken,m=s.children,p=u.useDispatch(),f=e.useRef(),g=e.useRef();return e.useEffect((function(){return g.current=n.io(i,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),g.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(g.current.id))})),g.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e))})),g.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),g.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),g.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(g.current.id,")"))})),g.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),g.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),g.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),f.current=setInterval((function(){var e=Date.now();g.current.volatile.emit("ping",c.withTimeout((function(){p.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){p.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),2e3))}),5e3),g.current.on("connect",(function(){console.log("Socket on: "+i+" is connected!"),g.current.emit("login",{accessKeyId:"".concat(d),token:l,uaType:"desktop"})})),g.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),g.current.on("userMainPresenceUpdate",(function(e){r.dispatchMainPresence(e)})),g.current.on("extenUpdate",(function(e){p.users.updateExtension(e),r.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===d&&function(e,n){if(Object.keys(n).length>0){var c=e.status;if(c){var r=o.store.getState().users.extensions;switch(c){case"ringing":p.currentCall.checkIncomingUpdateAndPlay({displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(r&&r[n.counterpartNum]&&r[n.counterpartNum].username)||""});break;case"busy":n&&n.connected?p.currentCall.updateCurrentCall({accepted:!0,incoming:!1,outgoing:!1,displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(r&&r[n.counterpartNum]&&r[n.counterpartNum].username)||""}):n&&!n.connected&&"out"===n.direction&&p.currentCall.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var n=require("../node_modules/socket.io-client/build/esm/index.js"),t=require("../lib/phone/conversation.js"),c=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var o=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var r=require("../events/SocketEvents.js"),u=require("../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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 a=s(e);exports.Socket=function(s){var i=s.hostName,d=s.username,l=s.authToken,m=s.children,p=u.useDispatch(),f=e.useRef(),g=e.useRef();return e.useEffect((function(){return g.current=n.io(i,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),g.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(g.current.id))})),g.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e))})),g.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),g.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),g.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(g.current.id,")"))})),g.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),g.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),g.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),f.current=setInterval((function(){var e=Date.now();g.current.volatile.emit("ping",c.withTimeout((function(){p.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){p.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),2e3))}),5e3),g.current.on("connect",(function(){console.log("Socket on: "+i+" is connected!"),g.current.emit("login",{accessKeyId:"".concat(d),token:l,uaType:"desktop"})})),g.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),g.current.on("userMainPresenceUpdate",(function(e){r.dispatchMainPresence(e)})),g.current.on("extenUpdate",(function(e){p.users.updateExtension(e),r.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===d&&function(e,n){if(Object.keys(n).length>0){var c=e.status;if(c){var r=o.store.getState().users.extensions;switch(c){case"ringing":p.currentCall.checkIncomingUpdateAndPlay({displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(r&&r[n.counterpartNum]&&r[n.counterpartNum].username)||""});break;case"busy":n&&n.connected?p.currentCall.updateCurrentCall({accepted:!0,incoming:!1,outgoing:!1,displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(r&&r[n.counterpartNum]&&r[n.counterpartNum].username)||""}):n&&!n.connected&&"out"===n.direction&&p.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(r&&r[n.counterpartNum]&&r[n.counterpartNum].username)||""})}}}}(e,n)})),g.current.on("queueUpdate",(function(e){r.dispatchQueueUpdate(e)})),g.current.on("queueMemberUpdate",(function(e){r.dispatchQueueMemberUpdate(e)})),function(){clearInterval(f.current),g.current.close()}}),[]),a.default.createElement(a.default.Fragment,null,m)};
|
|
2
2
|
//# sourceMappingURL=Socket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 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 } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationsTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n} from '../types'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n\nexport const Socket: FC<SocketProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\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: any, conv: ConversationsTypes) => {\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n const status: string = res.status\n if (status) {\n const { extensions } = store.getState().users\n switch (status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdateAndPlay({\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username: `${extensions && extensions[conv.counterpartNum] && extensions[conv.counterpartNum].username}` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Set current call accepted\n dispatch.currentCall.updateCurrentCall({\n accepted: true,\n incoming: false,\n outgoing: false,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username: `${extensions && extensions[conv.counterpartNum] && extensions[conv.counterpartNum].username}` || '',\n })\n }\n // Handle outgoing call\n else if (conv && !conv.connected && conv.direction === 'out') {\n // Update the current outgoing conversation\n dispatch.currentCall.checkOutgoingUpdateAndPlay({\n outgoingSocket: true,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n username: `${extensions && extensions[conv.counterpartNum] && extensions[conv.counterpartNum].username}` || '',\n })\n }\n default:\n break\n }\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(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 })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\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 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 // 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 console.debug('Socket is unreachable!')\n },\n 2000,\n ),\n )\n }, 5000)\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res) => {\n // Pass data to dispatchMainPresence\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 // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv: ConversationsTypes = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n }\n })\n\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\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 return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","dispatchMainPresence","users","updateExtension","dispatchConversations","conv","conversations","Object","keys","length","status_1","status","extensions","store","getState","currentCall","checkIncomingUpdateAndPlay","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","accepted","incoming","outgoing","startTime","direction","checkOutgoingUpdateAndPlay","outgoingSocket","handleCurrentUserEvents","dispatchQueueUpdate","dispatchQueueMemberUpdate","clearInterval","close","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Socket.js","sources":["../../src/components/Socket.tsx"],"sourcesContent":["// Copyright (C) 2022 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 } from 'react-redux'\nimport { Dispatch } from '../store'\nimport { io } from 'socket.io-client'\nimport { getDisplayName } from '../lib/phone/conversation'\nimport {\n dispatchMainPresence,\n dispatchConversations,\n dispatchQueueUpdate,\n dispatchQueueMemberUpdate,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationsTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n} from '../types'\n\ninterface SocketProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n\nexport const Socket: FC<SocketProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const connectionCheckInterval = useRef<any>()\n const socket = useRef<any>()\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: any, conv: ConversationsTypes) => {\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n const status: string = res.status\n if (status) {\n const { extensions } = store.getState().users\n switch (status) {\n case 'ringing':\n // The name and the number are updated here not in webrtc\n dispatch.currentCall.checkIncomingUpdateAndPlay({\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 })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Set current call accepted\n dispatch.currentCall.updateCurrentCall({\n accepted: true,\n incoming: false,\n outgoing: false,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n startTime: `${conv.startTime / 1000}`,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n }\n // Handle outgoing call\n else 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 default:\n break\n }\n }\n }\n }\n\n /**\n * Initialize socket connection and listeners\n */\n const initSocketConnection = () => {\n socket.current = io(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 })\n socket.current.on('disconnect', (reason) => {\n console.log(`Socket disconnect - reason: ${reason}`)\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 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 // 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 console.debug('Socket is unreachable!')\n },\n 2000,\n ),\n )\n }, 5000)\n\n // Handle connection message\n socket.current.on('connect', () => {\n console.log('Socket on: ' + hostName + ' is connected!')\n socket.current.emit('login', {\n accessKeyId: `${username}`,\n token: authToken,\n uaType: 'desktop',\n })\n })\n\n // Handle authentication success message\n socket.current.on('authe_ok', () => {\n console.log('Socket authentication success!')\n })\n\n socket.current.on('userMainPresenceUpdate', (res) => {\n // Pass data to dispatchMainPresence\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 // Dispatch conversations event\n dispatchConversations(res)\n // Initialize conversation\n const conv: ConversationsTypes = res.conversations[Object.keys(res.conversations)[0]] || {}\n // Handle only the events of the user\n if (res.username === username) {\n handleCurrentUserEvents(res, conv)\n }\n })\n\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\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 return <>{children}</>\n}\n"],"names":["_a","hostName","username","authToken","children","dispatch","useDispatch","connectionCheckInterval","useRef","socket","useEffect","current","io","upgrade","transports","reconnection","reconnectionDelay","on","console","debug","concat","id","reason","log","err","attempt","setInterval","start","Date","now","volatile","emit","withTimeout","alerts","removeAlert","latency","setAlert","accessKeyId","token","uaType","res","dispatchMainPresence","users","updateExtension","dispatchConversations","conv","conversations","Object","keys","length","status_1","status","extensions","store","getState","currentCall","checkIncomingUpdateAndPlay","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","accepted","incoming","outgoing","startTime","direction","checkOutgoingUpdate","outgoingSocket","handleCurrentUserEvents","dispatchQueueUpdate","dispatchQueueMemberUpdate","clearInterval","close","React","createElement","Fragment"],"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/webrtc-adapter/src/js/adapter_core.js"),r=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),n=require("../store/index.js"),o=require("../lib/devices/devices.js"),s=require("../lib/phone/call.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/webrtc-adapter/src/js/adapter_core.js"),r=require("../lib/webrtc/janus.js"),a=require("../lib/webrtc/messages.js"),n=require("../store/index.js"),o=require("../lib/devices/devices.js"),s=require("../lib/phone/call.js"),i=require("../lib/webrtc/connection.js"),c=require("../static/outgoing_ringtone.js"),l=require("../node_modules/react-redux/es/hooks/useDispatch.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=u(e),g=r.default;exports.WebRTC=function(r){var u=r.hostName,p=r.sipExten,b=r.sipSecret,f=r.children,m=l.useDispatch(),w=e.useRef(null);return e.useEffect((function(){o.checkMediaPermissions()}),[]),e.useEffect((function(){var e;return g.init({debug:"all",dependencies:g.useDefaultDependencies({adapter:t.default}),callback:function(){var e=new g({server:"https://".concat(u,"/janus"),success:function(){e.attach&&e.attach({plugin:"janus.plugin.sip",opaqueId:"sebastian_"+(new Date).getTime(),success:function(e){e&&(m.webrtc.updateWebRTC({sipcall:e}),a.register(p,b),e&&g.log&&g.log("SIP plugin attached! ("+e.getPlugin()+", id = )"))},error:function(e){g.error&&(g.error(" -- Error attaching plugin..."),g.error(e))},consentDialog:function(e){g.log&&g.log("janus consentDialog (on: ".concat(e,")"))},webrtcState:function(e){g.log&&g.log("Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},iceState:function(e){n.store.getState().webrtc.sipcall&&g.log&&g.log('ICE state of PeerConnection of handle has changed to "'.concat(e,'"'))},mediaState:function(e,t){g.log&&g.log("Janus "+(t?"started":"stopped")+" receiving our "+e)},slowLink:function(e,t){e?g.warn&&g.warn("SLOW link: several missing packets from janus (".concat(t,")")):g.warn&&g.warn("SLOW link: janus is not receiving all your packets (".concat(t,")"))},onmessage:function(e,t){var r=n.store.getState().webrtc.sipcall;g.debug&&(g.debug(" ::: Got a message :::"),g.debug(JSON.stringify(e)));var o=e.error;if(null==o||null==o){var i=e.result;if(null!=i&&void 0!==i.event&&null!==i.event)switch(i.event){case"registration_failed":g.error&&g.error("Registration failed: "+i.code+" "+i.reason);break;case"unregistered":g.log&&g.log("Successfully un-registered as "+i.username+"!");break;case"registered":g.log&&g.log("Successfully registered as "+i.username+"!"),n.store.getState().webrtc.registered||n.store.dispatch.webrtc.updateWebRTC({registered:!0}),m.webrtc.updateLastActivity((new Date).getTime());break;case"registering":g.log&&g.log("janus registering");break;case"calling":m.currentCall.checkOutgoingUpdate({outgoingWebRTC:!0}),m.webrtc.updateLastActivity((new Date).getTime());break;case"ringing":n.store.getState().player.audioPlayerPlaying||m.player.updateAndPlayAudioPlayer({src:c.default,loop:!0}),m.webrtc.updateLastActivity((new Date).getTime());break;case"progress":g.log&&g.log("There's early media from "+i.username+", wairing for the call!"),null!=t&&a.handleRemote(t),m.webrtc.updateLastActivity((new Date).getTime());break;case"incomingcall":m.webrtc.updateWebRTC({jsepGlobal:t}),m.currentCall.checkIncomingUpdateAndPlay({incomingWebRTC:!0}),g.log&&g.log("Incoming call from "+i.username+"!"),m.webrtc.updateLastActivity((new Date).getTime());break;case"accepted":g.log&&g.log(i.username+" accepted the call!"),t&&a.handleRemote(t),m.currentCall.checkAcceptedUpdate({acceptedWebRTC:!0}),n.store.dispatch.player.stopAudioPlayer(),m.webrtc.updateLastActivity((new Date).getTime());break;case"hangup":s.hangupCurrentCall(),r.hangup(),g.log&&g.log("Call hung up ("+i.code+" "+i.reason+")!"),n.store.dispatch.player.stopAudioPlayer(),m.webrtc.updateLastActivity((new Date).getTime())}}else n.store.getState().webrtc.registered?(r&&r.hangup(),n.store.dispatch.player.stopAudioPlayer()):g.log&&g.log("User is not registered")},onlocalstream:function(e){g.debug&&(g.debug(" ::: Got a local stream :::"),g.debug(e))},onremotestream:function(e){g.debug&&g.debug(" ::: Got a remote stream :::"),n.store.dispatch.player.stopAudioPlayer();var t=n.store.getState().player.remoteAudio,r=n.store.getState().player.remoteVideo,a=e.getAudioTracks(),o=e.getVideoTracks();if(g.attachMediaStream){if(a&&a.length>0){var s=new MediaStream(a);g.attachMediaStream(t,s),n.store.dispatch.webrtc.updateRemoteAudioStream(s)}else console.warn("No audio tracks on remote stream");if(o&&o.length>0){var i=new MediaStream(o);g.attachMediaStream(r,i)}else console.warn("No video tracks on remote stream")}},oncleanup:function(){g.log&&g.log(" ::: janus Got a cleanup notification :::")},detached:function(){g.warn&&g.warn("SIP plugin handle detached from the plugin itself")}})},error:function(e){g.log&&g.log("error",e),m.alerts.setAlert("webrtc_down")},destroyed:function(){m.webrtc.updateWebRTC({destroyed:!0}),m.alerts.setAlert("webrtc_down")}})}}),e=n.store.getState().webrtc.CHECK_INTERVAL_TIME,w.current||(w.current=setInterval((function(){return i.webrtcCheck((function(){a.register(p,b)}))}),e)),function(){a.unregister(),clearInterval(w.current)}}),[]),d.default.createElement(d.default.Fragment,null,f)};
|
|
2
2
|
//# sourceMappingURL=WebRTC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useState, useRef } 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 { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n}\n\nconst Janus: JanusTypes = JanusLib\n\nexport const WebRTC: FC<WebRTCProps> = ({ hostName, sipExten, sipSecret, children }) => {\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n useEffect(() => {\n const setupDeps = () =>\n Janus.useDefaultDependencies({\n adapter,\n })\n\n function initWebRTC() {\n Janus.init({\n debug: 'all',\n dependencies: setupDeps(),\n callback: function () {\n const janusInstance = new Janus({\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)\n if (pluginHandle) {\n if (Janus.log)\n Janus.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (Janus.error) {\n Janus.error(' -- Error attaching plugin...')\n Janus.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (Janus.log) Janus.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (Janus.log)\n Janus.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.log)\n Janus.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (Janus.log)\n Janus.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (Janus.warn)\n Janus.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (Janus.warn)\n Janus.warn(`SLOW link: janus is not receiving all your packets (${count})`)\n }\n },\n onmessage: function (msg, jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (Janus.debug) {\n Janus.debug(' ::: Got a message :::')\n Janus.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.log) Janus.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 }\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\n var event = result['event']\n\n //switch event\n switch (event) {\n case 'registration_failed':\n if (Janus.error)\n Janus.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (Janus.log)\n Janus.log('Successfully un-registered as ' + result['username'] + '!')\n // registered = false\n break\n\n case 'registered':\n if (Janus.log)\n Janus.log('Successfully registered as ' + result['username'] + '!')\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (Janus.log) Janus.log('janus registering')\n break\n\n case 'calling':\n // Number and display name are updated inside socket\n dispatch.currentCall.checkOutgoingUpdateAndPlay({\n outgoingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Waiting for the peer to answer...')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdateAndPlay({\n incomingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Incoming call from ' + result['username'] + '!')\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'progress':\n if (Janus.log)\n Janus.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (Janus.log) Janus.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\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 hangupCurrentCall()\n sipcall.hangup()\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.log)\n Janus.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\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 // stopScreenSharingI()\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (Janus.debug) {\n Janus.debug(' ::: Got a local stream :::')\n Janus.debug(stream)\n }\n // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (Janus.debug) {\n Janus.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.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n Janus.attachMediaStream(remoteAudioElement, 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 Janus.attachMediaStream(remoteVideoElement, videoStream)\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (Janus.log) Janus.log(' ::: janus Got a cleanup notification :::')\n },\n detached: function () {\n if (Janus.warn) Janus.warn('SIP plugin handle detached from the plugin itself')\n },\n })\n }\n },\n error: (err: any) => {\n if (Janus.log) Janus.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 }\n\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)\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 return <>{children}</>\n}\n"],"names":["Janus","JanusLib","_a","hostName","sipExten","sipSecret","children","dispatch","useDispatch","janusCheckInterval","useRef","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","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","registered","updateLastActivity","currentCall","checkOutgoingUpdateAndPlay","outgoingWebRTC","jsepGlobal","checkIncomingUpdateAndPlay","incomingWebRTC","handleRemote","checkAcceptedUpdate","acceptedWebRTC","player","stopAudioPlayer","hangupCurrentCall","hangup","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateRemoteAudioStream","console","videoStream","oncleanup","detached","err","alerts","setAlert","destroyed","current","setInterval","webrtcCheck","unregister","clearInterval","React","createElement","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WebRTC.js","sources":["../../src/components/WebRTC.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useEffect, useState, useRef } 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, type RootState } from '../store'\nimport { checkMediaPermissions } from '../lib/devices/devices'\nimport { hangupCurrentCall } from '../lib/phone/call'\nimport { webrtcCheck } from '../lib/webrtc/connection'\nimport outgoingRingtone from '../static/outgoing_ringtone'\n\ninterface WebRTCProps {\n children: ReactNode\n sipExten: string\n sipSecret: string\n hostName: string\n}\n\nconst Janus: JanusTypes = JanusLib\n\nexport const WebRTC: FC<WebRTCProps> = ({ hostName, sipExten, sipSecret, children }) => {\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize janus check interval id\n const janusCheckInterval = useRef<any>(null)\n\n // check audio and video permissions\n useEffect(() => {\n checkMediaPermissions()\n }, [])\n\n useEffect(() => {\n const setupDeps = () =>\n Janus.useDefaultDependencies({\n adapter,\n })\n\n function initWebRTC() {\n Janus.init({\n debug: 'all',\n dependencies: setupDeps(),\n callback: function () {\n const janusInstance = new Janus({\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)\n if (pluginHandle) {\n if (Janus.log)\n Janus.log(\n 'SIP plugin attached! (' + pluginHandle.getPlugin() + ', id = ' + ')',\n )\n }\n }\n },\n error: function (error) {\n if (Janus.error) {\n Janus.error(' -- Error attaching plugin...')\n Janus.error(error)\n }\n // reject()\n },\n consentDialog: function (on) {\n if (Janus.log) Janus.log(`janus consentDialog (on: ${on})`)\n },\n webrtcState: function (on) {\n if (Janus.log)\n Janus.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.log)\n Janus.log(\n `ICE state of PeerConnection of handle has changed to \"${newState}\"`,\n )\n }\n },\n mediaState: function (medium, on) {\n if (Janus.log)\n Janus.log(\n 'Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium,\n )\n },\n slowLink: function (uplink, count) {\n if (uplink) {\n if (Janus.warn)\n Janus.warn(`SLOW link: several missing packets from janus (${count})`)\n } else {\n if (Janus.warn)\n Janus.warn(`SLOW link: janus is not receiving all your packets (${count})`)\n }\n },\n onmessage: function (msg, jsep) {\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n\n if (Janus.debug) {\n Janus.debug(' ::: Got a message :::')\n Janus.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.log) Janus.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\n var event = result['event']\n\n //switch event\n switch (event) {\n case 'registration_failed':\n if (Janus.error)\n Janus.error(\n 'Registration failed: ' + result['code'] + ' ' + result['reason'],\n )\n break\n\n case 'unregistered':\n if (Janus.log)\n Janus.log('Successfully un-registered as ' + result['username'] + '!')\n // registered = false\n break\n\n case 'registered':\n if (Janus.log)\n Janus.log('Successfully registered as ' + result['username'] + '!')\n if (!store.getState().webrtc.registered) {\n store.dispatch.webrtc.updateWebRTC({\n registered: true,\n })\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'registering':\n if (Janus.log) Janus.log('janus registering')\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.updateAndPlayAudioPlayer({\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.log)\n Janus.log(\n \"There's early media from \" +\n result['username'] +\n ', wairing for the call!',\n )\n if (jsep !== null && jsep !== undefined) {\n handleRemote(jsep)\n }\n // Update webrtc lastActivity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'incomingcall':\n dispatch.webrtc.updateWebRTC({ jsepGlobal: jsep })\n\n // Number and display name are updated inside socket\n dispatch.currentCall.checkIncomingUpdateAndPlay({\n incomingWebRTC: true,\n })\n\n if (Janus.log) Janus.log('Incoming call from ' + result['username'] + '!')\n // Update the webrtc last activity time\n dispatch.webrtc.updateLastActivity(new Date().getTime())\n break\n\n case 'accepted':\n if (Janus.log) Janus.log(result['username'] + ' accepted the call!')\n if (jsep) {\n handleRemote(jsep)\n }\n // Set current call accepted\n dispatch.currentCall.checkAcceptedUpdate({\n acceptedWebRTC: true,\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 hangupCurrentCall()\n sipcall.hangup()\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.log)\n Janus.log(\n 'Call hung up (' + result['code'] + ' ' + result['reason'] + ')!',\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 // stopScreenSharingI()\n break\n\n default:\n break\n }\n }\n },\n onlocalstream: function (stream) {\n // const localVideoElement = store.getState().player.localVideo\n if (Janus.debug) {\n Janus.debug(' ::: Got a local stream :::')\n Janus.debug(stream)\n }\n // if (Janus.attachMediaStream) Janus.attachMediaStream(localVideoElement, stream)\n /* IS VIDEO ENABLED ? */\n // var videoTracks = stream.getVideoTracks()\n /* */\n },\n onremotestream: function (stream: MediaStream) {\n if (Janus.debug) {\n Janus.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.attachMediaStream) {\n // Initialize the new media stream for remote audio\n if (audioTracks && audioTracks.length > 0) {\n const audioStream: MediaStream = new MediaStream(audioTracks)\n Janus.attachMediaStream(remoteAudioElement, 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 Janus.attachMediaStream(remoteVideoElement, videoStream)\n } else {\n console.warn('No video tracks on remote stream')\n }\n }\n },\n oncleanup: function () {\n if (Janus.log) Janus.log(' ::: janus Got a cleanup notification :::')\n },\n detached: function () {\n if (Janus.warn) Janus.warn('SIP plugin handle detached from the plugin itself')\n },\n })\n }\n },\n error: (err: any) => {\n if (Janus.log) Janus.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 }\n\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)\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 return <>{children}</>\n}\n"],"names":["Janus","JanusLib","_a","hostName","sipExten","sipSecret","children","dispatch","useDispatch","janusCheckInterval","useRef","useEffect","checkMediaPermissions","CHECK_INTERVAL_TIME","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","registered","updateLastActivity","currentCall","checkOutgoingUpdate","outgoingWebRTC","player","audioPlayerPlaying","updateAndPlayAudioPlayer","src","outgoingRingtone","loop","handleRemote","jsepGlobal","checkIncomingUpdateAndPlay","incomingWebRTC","checkAcceptedUpdate","acceptedWebRTC","stopAudioPlayer","hangupCurrentCall","hangup","onlocalstream","stream","onremotestream","remoteAudioElement","remoteAudio","remoteVideoElement","remoteVideo","audioTracks","getAudioTracks","videoTracks","getVideoTracks","attachMediaStream","length","audioStream","MediaStream","updateRemoteAudioStream","console","videoStream","oncleanup","detached","err","alerts","setAlert","destroyed","current","setInterval","webrtcCheck","unregister","clearInterval","React","createElement","Fragment"],"mappings":"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"}
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,: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-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:rgba(59,130,246,.5);--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: }::-webkit-backdrop{--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-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:rgba(59,130,246,.5);--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: }::backdrop{--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-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:rgba(59,130,246,.5);--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: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.absolute{position:absolute}.relative{position:relative}.left-0{left:0}.top-0{top:0}.z-1000{z-index:1000}.-z-10{z-index:-10}.z-10{z-index:10}.col-start-auto{grid-column-start:auto}.mb-6{margin-bottom:1.5rem}.-mt-10{margin-top:-2.5rem}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-6{height:1.5rem}.h-12{height:3rem}.h-8{height:2rem}.min-h-full{min-height:100%}.w-6{width:1.5rem}.w-12{width:3rem}.w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.w-0\.5{width:.125rem}.w-0{width:0}.w-full{width:100%}.min-w-full{min-width:100%}.shrink-0{flex-shrink:0}.rotate-135{--tw-rotate:135deg}.rotate-135,.transform{-webkit-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));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))}@-webkit-keyframes ping{75%,to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}@keyframes ping{75%,to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@-webkit-keyframes move{0%,25%{left:0;-webkit-transform:translateX(0);transform:translateX(0)}75%,to{left:100%;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes move{0%,25%{left:0;-webkit-transform:translateX(0);transform:translateX(0)}75%,to{left:100%;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.animate-animated-text{-webkit-animation:move 3s linear 0s infinite alternate;animation:move 3s linear 0s infinite alternate}.cursor-pointer{cursor:pointer}.auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.place-items-center{place-items:center}.content-center{align-content:center}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.gap-1{gap:.25rem}.gap-5{gap:1.25rem}.gap-4{gap:1rem}.gap-3\.5{gap:.875rem}.gap-3{gap:.75rem}.gap-7{gap:1.75rem}.gap-y-5{row-gap:1.25rem}.gap-y-6{row-gap:1.5rem}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.rounded-sm{border-radius:.125rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-2xl{border-radius:1rem}.rounded-xl{border-radius:.75rem}.rounded{border-radius:.25rem}.border{border-width:1px}.border-4{border-width:4px}.border-transparent{border-color:transparent}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-transparent{background-color:initial}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.p-6{padding:1.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.pt-3{padding-top:.75rem}.text-center{text-align:center}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-base{font-size:1rem;line-height:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-light{font-weight:300}.font-medium{font-weight:500}.font-bold{font-weight:700}.leading-4{line-height:1rem}.tracking-wide{letter-spacing:.025em}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.opacity-60{opacity:.6}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{-webkit-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,-webkit-transform,-webkit-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-transform,-webkit-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.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)}.duration-200{transition-duration:.2s}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity))}.hover\:bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.hover\:bg-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.focus\:z-20:focus{z-index:20}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\: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\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\: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\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.focus\:ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity))}.focus\:ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.focus\:ring-sky-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-black:focus{--tw-ring-offset-color:#000}.focus\:ring-offset-white:focus{--tw-ring-offset-color:#fff}.disabled\:opacity-75:disabled{opacity:.75}
|
|
1
|
+
*,: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-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:rgba(59,130,246,.5);--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: }::-webkit-backdrop{--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-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:rgba(59,130,246,.5);--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: }::backdrop{--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-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:rgba(59,130,246,.5);--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: }.pi-pointer-events-none{pointer-events:none}.pi-pointer-events-auto{pointer-events:auto}.pi-absolute{position:absolute}.pi-relative{position:relative}.pi-left-0{left:0}.pi-top-0{top:0}.pi-z-1000{z-index:1000}.-pi-z-10{z-index:-10}.pi-z-10{z-index:10}.pi-col-start-auto{grid-column-start:auto}.pi-mb-6{margin-bottom:1.5rem}.-pi-mt-10{margin-top:-2.5rem}.pi-inline-block{display:inline-block}.pi-flex{display:flex}.pi-grid{display:grid}.pi-hidden{display:none}.pi-h-6{height:1.5rem}.pi-h-12{height:3rem}.pi-h-8{height:2rem}.pi-min-h-full{min-height:100%}.pi-w-6{width:1.5rem}.pi-w-12{width:3rem}.pi-w-fit{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.pi-w-0\.5{width:.125rem}.pi-w-0{width:0}.pi-w-full{width:100%}.pi-min-w-full{min-width:100%}.pi-shrink-0{flex-shrink:0}.pi-rotate-135{--tw-rotate:135deg}.pi-rotate-135,.pi-transform{-webkit-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));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))}@-webkit-keyframes pi-ping{75%,to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}@keyframes pi-ping{75%,to{opacity:0;-webkit-transform:scale(2);transform:scale(2)}}.pi-animate-ping{-webkit-animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite;animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite}.pi-cursor-pointer{cursor:pointer}.pi-auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.pi-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.pi-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.pi-grid-cols-3{grid-template-columns:repeat(3,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-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-5{gap:1.25rem}.pi-gap-4{gap:1rem}.pi-gap-3\.5{gap:.875rem}.pi-gap-3{gap:.75rem}.pi-gap-7{gap:1.75rem}.pi-gap-y-5{row-gap:1.25rem}.pi-gap-y-6{row-gap:1.5rem}.pi-overflow-hidden{overflow:hidden}.pi-overflow-y-auto{overflow-y:auto}.pi-whitespace-nowrap{white-space:nowrap}.pi-rounded-sm{border-radius:.125rem}.pi-rounded-full{border-radius:9999px}.pi-rounded-md{border-radius:.375rem}.pi-rounded-2xl{border-radius:1rem}.pi-rounded-xl{border-radius:.75rem}.pi-border{border-width:1px}.pi-border-4{border-width:4px}.pi-border-transparent{border-color:transparent}.pi-border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}.pi-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity))}.pi-border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity))}.pi-border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity))}.pi-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.pi-bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity))}.pi-bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.pi-bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.pi-bg-transparent{background-color:initial}.pi-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.pi-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity))}.pi-bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.pi-bg-sky-600{--tw-bg-opacity:1;background-color:rgb(2 132 199/var(--tw-bg-opacity))}.pi-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.pi-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.pi-p-6{padding:1.5rem}.pi-px-3{padding-left:.75rem;padding-right:.75rem}.pi-py-2{padding-bottom:.5rem;padding-top:.5rem}.pi-px-6{padding-left:1.5rem;padding-right:1.5rem}.pi-px-2{padding-left:.5rem;padding-right:.5rem}.pi-pt-3{padding-top:.75rem}.pi-text-center{text-align:center}.pi-font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.pi-text-sm{font-size:.875rem;line-height:1.25rem}.pi-text-xs{font-size:.75rem;line-height:1rem}.pi-text-base{font-size:1rem;line-height:1.5rem}.pi-text-2xl{font-size:1.5rem;line-height:2rem}.pi-text-xl{font-size:1.25rem;line-height:1.75rem}.pi-font-light{font-weight:300}.pi-font-medium{font-weight:500}.pi-font-bold{font-weight:700}.pi-leading-4{line-height:1rem}.pi-tracking-wide{letter-spacing:.025em}.pi-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.pi-text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity))}.pi-opacity-60{opacity:.6}.pi-outline-none{outline:2px solid transparent;outline-offset:2px}.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-duration-200{transition-duration:.2s}.hover\:pi-border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity))}.hover\:pi-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:pi-bg-green-700:hover{--tw-bg-opacity:1;background-color:rgb(21 128 61/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-sky-700:hover{--tw-bg-opacity:1;background-color:rgb(3 105 161/var(--tw-bg-opacity))}.focus\:pi-z-20:focus{z-index:20}.focus\:pi-outline-none:focus{outline:2px solid transparent;outline-offset:2px}.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-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-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-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/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-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity))}.focus\:pi-ring-sky-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(14 165 233/var(--tw-ring-opacity))}.focus\:pi-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:pi-ring-offset-black:focus{--tw-ring-offset-color:#000}.focus\:pi-ring-offset-white:focus{--tw-ring-offset-color:#fff}.disabled\:pi-opacity-75:disabled{opacity:.75}
|
|
@@ -22,7 +22,7 @@ export declare const currentCall: {
|
|
|
22
22
|
} & {
|
|
23
23
|
effects: (dispatch: import("@rematch/core").RematchDispatch<RootModel>) => {
|
|
24
24
|
checkIncomingUpdateAndPlay: (this: import("@rematch/core").ModelEffectThisTyped, payload: CurrentCallTypes, rootState: import("@rematch/core").RematchRootState<RootModel, Record<string, never>>) => void;
|
|
25
|
-
|
|
25
|
+
checkOutgoingUpdate: (this: import("@rematch/core").ModelEffectThisTyped, payload: CurrentCallTypes, rootState: import("@rematch/core").RematchRootState<RootModel, Record<string, never>>) => void;
|
|
26
26
|
checkAcceptedUpdate: (this: import("@rematch/core").ModelEffectThisTyped, payload: CurrentCallTypes, rootState: import("@rematch/core").RematchRootState<RootModel, Record<string, never>>) => void;
|
|
27
27
|
};
|
|
28
28
|
} & {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../node_modules/@rematch/core/dist/core.esm.js"),r=require("../static/incoming_ringtone.js"),n=require("../
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("../node_modules/@rematch/core/dist/core.esm.js"),r=require("../static/incoming_ringtone.js"),n=require("../events/CallEvents.js");require("react");var c={displayName:"",username:"",number:"",incomingSocket:!1,incomingWebRTC:!1,incoming:!1,acceptedSocket:!1,acceptedWebRTC:!1,accepted:!1,outgoingSocket:!1,outgoingWebRTC:!1,outgoing:!1,startTime:"",muted:!1,paused:!1,keypadValue:""},i=t.createModel()({state:c,reducers:{updateCurrentCall:function(t,r){return e.__assign(e.__assign({},t),r)},updateKeypadValue:function(t,r){return e.__assign(e.__assign({},t),{keypadValue:r})},reset:function(){return c}},effects:function(t){return{checkIncomingUpdateAndPlay:function(n,c){var i,a;("webrtc"===(null===(i=c.currentUser.default_device)||void 0===i?void 0:i.type)&&n.incomingWebRTC||"physical"===(null===(a=c.currentUser.default_device)||void 0===a?void 0:a.type)&&n.incomingSocket)&&(n.incoming=!0,t.player.updateAndPlayAudioPlayer({src:r.default,loop:!0})),t.currentCall.updateCurrentCall(e.__assign({},n))},checkOutgoingUpdate:function(r,c){var i,a;("webrtc"===(null===(i=c.currentUser.default_device)||void 0===i?void 0:i.type)&&r.outgoingWebRTC||"physical"===(null===(a=c.currentUser.default_device)||void 0===a?void 0:a.type)&&r.outgoingSocket)&&(r.outgoing=!0,n.dispatchOutgoingCallStarted(r.displayName,r.number)),t.currentCall.updateCurrentCall(e.__assign({},r))},checkAcceptedUpdate:function(r,n){var c,i;("webrtc"===(null===(c=n.currentUser.default_device)||void 0===c?void 0:c.type)&&r.acceptedWebRTC||"physical"===(null===(i=n.currentUser.default_device)||void 0===i?void 0:i.type)&&r.acceptedSocket)&&(r.accepted=!0),t.currentCall.updateCurrentCall(e.__assign({},r))}}}});exports.currentCall=i;
|
|
2
2
|
//# sourceMappingURL=currentCall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentCall.js","sources":["../../src/models/currentCall.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport
|
|
1
|
+
{"version":3,"file":"currentCall.js","sources":["../../src/models/currentCall.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport incomingRingtone from '../static/incoming_ringtone'\nimport { dispatchOutgoingCallStarted } from '../events/index'\n\nconst defaultState = {\n displayName: '',\n username: '',\n number: '',\n incomingSocket: false,\n incomingWebRTC: false,\n incoming: false,\n acceptedSocket: false,\n acceptedWebRTC: false,\n accepted: false,\n outgoingSocket: false,\n outgoingWebRTC: false,\n outgoing: false,\n startTime: '',\n muted: false,\n paused: false,\n keypadValue: '',\n}\n\nexport const currentCall = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updateCurrentCall: (state, payload: CurrentCallTypes) => {\n return {\n ...state,\n ...payload,\n }\n },\n updateKeypadValue: (state, payload: string) => {\n return {\n ...state,\n keypadValue: payload,\n }\n },\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n checkIncomingUpdateAndPlay: (payload: CurrentCallTypes, rootState) => {\n // Check call type and incoming confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.incomingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.incomingSocket)\n ) {\n payload.incoming = true\n\n // Update local player and play the audio\n dispatch.player.updateAndPlayAudioPlayer({ src: incomingRingtone, loop: true })\n }\n // Update the current call values and set incoming\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkOutgoingUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and outgoing confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.outgoingWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.outgoingSocket)\n ) {\n payload.outgoing = true\n // Dispatch an event for outgoing call\n dispatchOutgoingCallStarted(payload.displayName, payload.number)\n }\n // Update the current call values and set outgoing\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n checkAcceptedUpdate: (payload: CurrentCallTypes, rootState) => {\n // Check call type and accepted confirmation source\n if (\n (rootState.currentUser.default_device?.type === 'webrtc' && payload.acceptedWebRTC) ||\n (rootState.currentUser.default_device?.type === 'physical' && payload.acceptedSocket)\n ) {\n payload.accepted = true\n // TODO - dispatch accepted event\n }\n // Update the current call values\n dispatch.currentCall.updateCurrentCall({\n ...payload,\n })\n },\n }),\n})\n\nexport interface CurrentCallTypes {\n displayName?: string\n username?: string\n number?: string\n incomingSocket?: boolean\n incomingWebRTC?: boolean\n incoming?: boolean\n acceptedSocket?: boolean\n acceptedWebRTC?: boolean\n accepted?: boolean\n outgoingSocket?: boolean\n outgoingWebRTC?: boolean\n outgoing?: boolean\n startTime?: string\n muted?: boolean\n paused?: boolean\n}\n"],"names":["defaultState","displayName","username","number","incomingSocket","incomingWebRTC","incoming","acceptedSocket","acceptedWebRTC","accepted","outgoingSocket","outgoingWebRTC","outgoing","startTime","muted","paused","keypadValue","currentCall","createModel","state","reducers","updateCurrentCall","payload","__assign","updateKeypadValue","reset","effects","dispatch","checkIncomingUpdateAndPlay","rootState","_a","currentUser","default_device","type","_b","player","updateAndPlayAudioPlayer","src","incomingRingtone","loop","checkOutgoingUpdate","dispatchOutgoingCallStarted","checkAcceptedUpdate"],"mappings":"sRAQA,IAAMA,EAAe,CACnBC,YAAa,GACbC,SAAU,GACVC,OAAQ,GACRC,gBAAgB,EAChBC,gBAAgB,EAChBC,UAAU,EACVC,gBAAgB,EAChBC,gBAAgB,EAChBC,UAAU,EACVC,gBAAgB,EAChBC,gBAAgB,EAChBC,UAAU,EACVC,UAAW,GACXC,OAAO,EACPC,QAAQ,EACRC,YAAa,IAGFC,EAAcC,EAAWA,aAAXA,CAAyB,CAClDC,MAAOnB,EACPoB,SAAU,CACRC,kBAAmB,SAACF,EAAOG,GACzB,OACKC,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,GACAG,EAEN,EACDE,kBAAmB,SAACL,EAAOG,GACzB,OAAAC,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRH,YAAaM,GAEhB,EACDG,MAAO,WACL,OAAOzB,CACR,GAEH0B,QAAS,SAACC,GAAa,MAAC,CACtBC,2BAA4B,SAACN,EAA2BO,YAGJ,YAAT,QAAtCC,EAAAD,EAAUE,YAAYC,sBAAgB,IAAAF,OAAA,EAAAA,EAAAG,OAAqBX,EAAQjB,gBACpB,cAAX,QAApC6B,EAAAL,EAAUE,YAAYC,sBAAc,IAAAE,OAAA,EAAAA,EAAED,OAAuBX,EAAQlB,kBAEtEkB,EAAQhB,UAAW,EAGnBqB,EAASQ,OAAOC,yBAAyB,CAAEC,IAAKC,EAAAA,QAAkBC,MAAM,KAG1EZ,EAASV,YAAYI,kBAChBE,EAAAA,SAAA,CAAA,EAAAD,GAEN,EACDkB,oBAAqB,SAAClB,EAA2BO,YAGG,YAAT,QAAtCC,EAAAD,EAAUE,YAAYC,sBAAgB,IAAAF,OAAA,EAAAA,EAAAG,OAAqBX,EAAQX,gBACpB,cAAX,QAApCuB,EAAAL,EAAUE,YAAYC,sBAAc,IAAAE,OAAA,EAAAA,EAAED,OAAuBX,EAAQZ,kBAEtEY,EAAQV,UAAW,EAEnB6B,EAAAA,4BAA4BnB,EAAQrB,YAAaqB,EAAQnB,SAG3DwB,EAASV,YAAYI,kBAChBE,EAAAA,SAAA,CAAA,EAAAD,GAEN,EACDoB,oBAAqB,SAACpB,EAA2BO,YAGG,YAAT,QAAtCC,EAAAD,EAAUE,YAAYC,sBAAgB,IAAAF,OAAA,EAAAA,EAAAG,OAAqBX,EAAQd,gBACpB,cAAX,QAApC0B,EAAAL,EAAUE,YAAYC,sBAAc,IAAAE,OAAA,EAAAA,EAAED,OAAuBX,EAAQf,kBAEtEe,EAAQb,UAAW,GAIrBkB,EAASV,YAAYI,kBAChBE,EAAAA,SAAA,CAAA,EAAAD,GAEN,EACD"}
|
package/dist/models/player.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare const player: {
|
|
|
13
13
|
reducers: {
|
|
14
14
|
updatePlayer: (state: PlayerTypes, payload: PlayerTypes) => {
|
|
15
15
|
audioPlayer: HTMLAudioElement | null;
|
|
16
|
+
audioPlayerPlaying?: boolean | undefined;
|
|
16
17
|
audioPlayerLoop?: boolean | undefined;
|
|
17
18
|
localAudio: HTMLAudioElement | null;
|
|
18
19
|
remoteAudio: HTMLAudioElement | null;
|
|
@@ -20,11 +21,28 @@ export declare const player: {
|
|
|
20
21
|
remoteVideo: HTMLVideoElement | null;
|
|
21
22
|
};
|
|
22
23
|
updateAudioPlayer: (state: PlayerTypes, payload: UpdateAudioSourceTypes) => PlayerTypes;
|
|
23
|
-
playAudioPlayer: (state: PlayerTypes) =>
|
|
24
|
-
|
|
24
|
+
playAudioPlayer: (state: PlayerTypes) => {
|
|
25
|
+
audioPlayerPlaying: true;
|
|
26
|
+
audioPlayer: HTMLAudioElement | null;
|
|
27
|
+
audioPlayerLoop?: boolean | undefined;
|
|
28
|
+
localAudio: HTMLAudioElement | null;
|
|
29
|
+
remoteAudio: HTMLAudioElement | null;
|
|
30
|
+
localVideo: HTMLVideoElement | null;
|
|
31
|
+
remoteVideo: HTMLVideoElement | null;
|
|
32
|
+
} | undefined;
|
|
33
|
+
stopAudioPlayer: (state: PlayerTypes) => {
|
|
34
|
+
audioPlayerPlaying: false;
|
|
35
|
+
audioPlayer: HTMLAudioElement | null;
|
|
36
|
+
audioPlayerLoop?: boolean | undefined;
|
|
37
|
+
localAudio: HTMLAudioElement | null;
|
|
38
|
+
remoteAudio: HTMLAudioElement | null;
|
|
39
|
+
localVideo: HTMLVideoElement | null;
|
|
40
|
+
remoteVideo: HTMLVideoElement | null;
|
|
41
|
+
} | undefined;
|
|
25
42
|
setAudioPlayerLoop: (state: PlayerTypes, payload: boolean) => {
|
|
26
43
|
audioPlayerLoop: boolean;
|
|
27
44
|
audioPlayer: HTMLAudioElement | null;
|
|
45
|
+
audioPlayerPlaying?: boolean | undefined;
|
|
28
46
|
localAudio: HTMLAudioElement | null;
|
|
29
47
|
remoteAudio: HTMLAudioElement | null;
|
|
30
48
|
localVideo: HTMLVideoElement | null;
|
|
@@ -40,6 +58,7 @@ interface UpdateAudioSourceTypes {
|
|
|
40
58
|
}
|
|
41
59
|
interface PlayerTypes {
|
|
42
60
|
audioPlayer: HTMLAudioElement | null;
|
|
61
|
+
audioPlayerPlaying?: boolean;
|
|
43
62
|
audioPlayerLoop?: boolean;
|
|
44
63
|
localAudio: HTMLAudioElement | null;
|
|
45
64
|
remoteAudio: HTMLAudioElement | null;
|
package/dist/models/player.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),a=require("../node_modules/@rematch/core/dist/core.esm.js"),r=require("../lib/phone/audio.js"),o={audioPlayer:null,audioPlayerPlaying:!1,audioPlayerLoop:!1,localAudio:null,remoteAudio:null,localVideo:null,remoteVideo:null},u=a.createModel()({state:o,reducers:{updatePlayer:function(a,r){return e.__assign(e.__assign({},a),r)},updateAudioPlayer:function(e,a){return e.audioPlayer&&(e.audioPlayer.src="data:audio/ogg;base64, ".concat(a.src)),e},playAudioPlayer:function(a){if(a.audioPlayer)return a.audioPlayer.paused||(a.audioPlayer.pause(),a.audioPlayer.currentTime=0),a.audioPlayer.play(),e.__assign(e.__assign({},a),{audioPlayerPlaying:!0})},stopAudioPlayer:function(a){if(a.audioPlayer)return a.audioPlayer.pause(),a.audioPlayer.currentTime=0,e.__assign(e.__assign({},a),{audioPlayerPlaying:!1})},setAudioPlayerLoop:function(a,r){return e.__assign(e.__assign({},a),{audioPlayerLoop:r})},reset:function(){return o}},effects:function(a){return{updateAndPlayAudioPlayer:function(o){var u=o.src,i=o.loop,l=void 0!==i&&i;return e.__awaiter(void 0,void 0,void 0,(function(){return e.__generator(this,(function(e){switch(e.label){case 0:return a.player.setAudioPlayerLoop(l),[4,r.updateAudioPlayerSource({src:u})];case 1:return e.sent(),a.player.playAudioPlayer(),[2]}}))}))}}}});exports.player=u;
|
|
2
2
|
//# sourceMappingURL=player.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sources":["../../src/models/player.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport { updateAudioPlayerSource } from '../lib/phone/audio'\n\nconst defaultState: PlayerTypes = {\n audioPlayer: null,\n audioPlayerLoop: false,\n localAudio: null,\n remoteAudio: null,\n localVideo: null,\n remoteVideo: null,\n}\n\nexport const player = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updatePlayer: (state, payload: PlayerTypes) => {\n return {\n ...state,\n ...payload,\n }\n },\n updateAudioPlayer: (state, payload: UpdateAudioSourceTypes) => {\n if (state.audioPlayer) {\n state.audioPlayer.src = `data:audio/ogg;base64, ${payload.src}`\n }\n return state\n },\n playAudioPlayer: (state) => {\n if (state.audioPlayer) {\n // Check if is playing\n if (!state.audioPlayer.paused) {\n state.audioPlayer.pause()\n state.audioPlayer.currentTime = 0\n }\n state.audioPlayer.play()\n }\n },\n stopAudioPlayer: (state) => {\n if (state.audioPlayer) {\n state.audioPlayer.pause()\n state.audioPlayer.currentTime = 0\n }\n },\n setAudioPlayerLoop: (state, payload: boolean) => ({\n ...state,\n audioPlayerLoop: payload,\n }),\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n // This function is recommended for playing audio\n updateAndPlayAudioPlayer: async ({ src, loop = false }: { src: string; loop?: boolean }) => {\n dispatch.player.setAudioPlayerLoop(loop)\n // Update the audio source\n await updateAudioPlayerSource({\n src: src,\n })\n // Play the outgoing ringtone when ready\n dispatch.player.playAudioPlayer()\n },\n }),\n})\n\ninterface UpdateAudioSourceTypes {\n src: string\n}\n\ninterface PlayerTypes {\n audioPlayer: HTMLAudioElement | null\n audioPlayerLoop?: boolean\n localAudio: HTMLAudioElement | null\n remoteAudio: HTMLAudioElement | null\n localVideo: HTMLVideoElement | null\n remoteVideo: HTMLVideoElement | null\n}\n"],"names":["defaultState","audioPlayer","audioPlayerLoop","localAudio","remoteAudio","localVideo","remoteVideo","player","createModel","state","reducers","updatePlayer","payload","__assign","updateAudioPlayer","src","playAudioPlayer","paused","pause","currentTime","play","stopAudioPlayer","setAudioPlayerLoop","reset","effects","dispatch","updateAndPlayAudioPlayer","_a","_b","loop","updateAudioPlayerSource","_c","sent"],"mappings":"uNAOMA,EAA4B,CAChCC,YAAa,KACbC,iBAAiB,EACjBC,WAAY,KACZC,YAAa,KACbC,WAAY,KACZC,YAAa,MAGFC,EAASC,EAAWA,aAAXA,CAAyB,CAC7CC,
|
|
1
|
+
{"version":3,"file":"player.js","sources":["../../src/models/player.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { createModel } from '@rematch/core'\nimport type { RootModel } from '.'\nimport { updateAudioPlayerSource } from '../lib/phone/audio'\n\nconst defaultState: PlayerTypes = {\n audioPlayer: null,\n audioPlayerPlaying: false,\n audioPlayerLoop: false,\n localAudio: null,\n remoteAudio: null,\n localVideo: null,\n remoteVideo: null,\n}\n\nexport const player = createModel<RootModel>()({\n state: defaultState,\n reducers: {\n updatePlayer: (state, payload: PlayerTypes) => {\n return {\n ...state,\n ...payload,\n }\n },\n updateAudioPlayer: (state, payload: UpdateAudioSourceTypes) => {\n if (state.audioPlayer) {\n state.audioPlayer.src = `data:audio/ogg;base64, ${payload.src}`\n }\n return state\n },\n playAudioPlayer: (state) => {\n if (state.audioPlayer) {\n // Check if is playing\n if (!state.audioPlayer.paused) {\n state.audioPlayer.pause()\n state.audioPlayer.currentTime = 0\n }\n // Play the audio\n state.audioPlayer.play()\n return {\n ...state,\n audioPlayerPlaying: true,\n }\n }\n },\n stopAudioPlayer: (state) => {\n if (state.audioPlayer) {\n // Pause audio\n state.audioPlayer.pause()\n state.audioPlayer.currentTime = 0\n return {\n ...state,\n audioPlayerPlaying: false,\n }\n }\n },\n setAudioPlayerLoop: (state, payload: boolean) => ({\n ...state,\n audioPlayerLoop: payload,\n }),\n reset: () => {\n return defaultState\n },\n },\n effects: (dispatch) => ({\n // This function is recommended for playing audio\n updateAndPlayAudioPlayer: async ({ src, loop = false }: { src: string; loop?: boolean }) => {\n dispatch.player.setAudioPlayerLoop(loop)\n // Update the audio source\n await updateAudioPlayerSource({\n src: src,\n })\n // Play the outgoing ringtone when ready\n dispatch.player.playAudioPlayer()\n },\n }),\n})\n\ninterface UpdateAudioSourceTypes {\n src: string\n}\n\ninterface PlayerTypes {\n audioPlayer: HTMLAudioElement | null\n audioPlayerPlaying?: boolean\n audioPlayerLoop?: boolean\n localAudio: HTMLAudioElement | null\n remoteAudio: HTMLAudioElement | null\n localVideo: HTMLVideoElement | null\n remoteVideo: HTMLVideoElement | null\n}\n"],"names":["defaultState","audioPlayer","audioPlayerPlaying","audioPlayerLoop","localAudio","remoteAudio","localVideo","remoteVideo","player","createModel","state","reducers","updatePlayer","payload","__assign","updateAudioPlayer","src","playAudioPlayer","paused","pause","currentTime","play","stopAudioPlayer","setAudioPlayerLoop","reset","effects","dispatch","updateAndPlayAudioPlayer","_a","_b","loop","updateAudioPlayerSource","_c","sent"],"mappings":"uNAOMA,EAA4B,CAChCC,YAAa,KACbC,oBAAoB,EACpBC,iBAAiB,EACjBC,WAAY,KACZC,YAAa,KACbC,WAAY,KACZC,YAAa,MAGFC,EAASC,EAAWA,aAAXA,CAAyB,CAC7CC,MAAOV,EACPW,SAAU,CACRC,aAAc,SAACF,EAAOG,GACpB,OACKC,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,GACAG,EAEN,EACDE,kBAAmB,SAACL,EAAOG,GAIzB,OAHIH,EAAMT,cACRS,EAAMT,YAAYe,IAAM,iCAA0BH,EAAQG,MAErDN,CACR,EACDO,gBAAiB,SAACP,GAChB,GAAIA,EAAMT,YAQR,OANKS,EAAMT,YAAYiB,SACrBR,EAAMT,YAAYkB,QAClBT,EAAMT,YAAYmB,YAAc,GAGlCV,EAAMT,YAAYoB,OAClBP,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRR,oBAAoB,GAGzB,EACDoB,gBAAiB,SAACZ,GAChB,GAAIA,EAAMT,YAIR,OAFAS,EAAMT,YAAYkB,QAClBT,EAAMT,YAAYmB,YAAc,EAChCN,EAAAA,SAAAA,EAAAA,SAAA,GACKJ,GAAK,CACRR,oBAAoB,GAGzB,EACDqB,mBAAoB,SAACb,EAAOG,GAAqB,OAC5CC,EAAAA,SAAAA,EAAAA,SAAA,CAAA,EAAAJ,IACHP,gBAAiBU,GACjB,EACFW,MAAO,WACL,OAAOxB,CACR,GAEHyB,QAAS,SAACC,GAAa,MAAC,CAEtBC,yBAA0B,SAAOC,GAAE,IAAAZ,QAAKa,EAAAD,EAAAE,KAAAA,OAAI,IAAAD,GAAQA,oHAGlD,OAFAH,EAASlB,OAAOe,mBAAmBO,GAEnC,CAAA,EAAMC,0BAAwB,CAC5Bf,IAAKA,mBADPgB,EAAAC,OAIAP,EAASlB,OAAOS,4BACjB,EACD"}
|