@nethesis/phone-island 0.7.73 → 0.7.75

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.
@@ -10,5 +10,6 @@ interface AudioBarsProps {
10
10
  audioStream?: MediaStream | null;
11
11
  audioElement?: HTMLAudioElement | null;
12
12
  size?: 'large' | 'small';
13
+ paused?: boolean;
13
14
  }
14
15
  export {};
@@ -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 r=require("../store/index.js"),t=require("../node_modules/react-redux/es/hooks/useDispatch.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=n(e),c={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};exports.AudioBars=function(n){var a=n.audioStream,o=void 0===a?null:a,s=n.audioElement,l=void 0===s?null:s,d=n.size,f=e.useRef(null),m=e.useRef(null),p="large"===d?c:i,v=e.useRef(null),y=e.useRef(null),h=e.useRef(null),E=t.useDispatch();function A(){var e,r=requestAnimationFrame(x);(e=r)&&(m.current=e)}function x(){var e;if(y&&y.current){var r=new Uint8Array(y.current.frequencyBinCount);y.current.getByteFrequencyData(r);var t=Object.values(r),n=null===(e=f.current)||void 0===e?void 0:e.children;if(n&&(null==n?void 0:n.length)>0){for(var u=0;u<Object.keys(p).length;++u){var c=t[p[u]]/255,i=n&&n[u]&&n[u].style;i&&c>0&&(i.height="".concat(100*c,"%"))}A()}}}return e.useEffect((function(){var e=r.store.getState().audioBars,t=e.audioElementContext,n=e.audioElementAnalyser,u=e.audioElementSource,c=e.isReady;return l&&c?(v.current=t,y.current=n,h.current=u):(v.current=new AudioContext,y.current=v.current.createAnalyser(),y.current.smoothingTimeConstant=.8,y.current.fftSize=32,o?h.current=v.current.createMediaStreamSource(o):l&&(h.current=v.current.createMediaElementSource(l),E.audioBars.setAudioElementContext(v.current),E.audioBars.setAudioElementAnalyser(y.current),E.audioBars.setAudioElementSource(h.current),E.audioBars.setIsReady(!0))),y.current&&h.current&&h.current.connect(y.current),v.current&&y.current&&y.current.connect(v.current.destination),A(),function(){var e,r;m.current&&cancelAnimationFrame(m.current),null===(e=h.current)||void 0===e||e.disconnect(),null===(r=y.current)||void 0===r||r.disconnect()}}),[]),e.useEffect((function(){m.current&&(cancelAnimationFrame(m.current),A())}),[d]),u.default.createElement("div",{className:"".concat("small"===d?"pi-h-6 pi-w-6":"pi-h-12 pi-w-12"," pi-flex pi-justify-center pi-items-center")},u.default.createElement("div",{className:"".concat("small"===d?"pi-h-6":"pi-h-8"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden"),ref:f},(o||l)&&Object.keys(p).map((function(e){return u.default.createElement("span",{key:e,className:"pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm"})}))))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../store/index.js"),t=require("../node_modules/react-redux/es/hooks/useDispatch.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=n(e),a={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};exports.AudioBars=function(n){var c=n.audioStream,o=void 0===c?null:c,s=n.audioElement,l=void 0===s?null:s,d=n.paused,f=n.size,m=e.useRef(null),p=e.useRef(null),v="large"===f?a:i,y=e.useRef(null),h=e.useRef(null),A=e.useRef(null),E=t.useDispatch();function x(){var e,r=requestAnimationFrame(j);(e=r)&&(p.current=e)}function j(){var e;if(h&&h.current){var r=new Uint8Array(h.current.frequencyBinCount);h.current.getByteFrequencyData(r);var t=Object.values(r),n=null===(e=m.current)||void 0===e?void 0:e.children;if(n&&(null==n?void 0:n.length)>0){for(var u=0;u<Object.keys(v).length;++u){var a=t[v[u]]/255,i=n&&n[u]&&n[u].style;i&&a>0&&(i.height="".concat(100*a,"%"))}x()}}}return e.useEffect((function(){var e=r.store.getState().audioBars,t=e.audioElementContext,n=e.audioElementAnalyser,u=e.audioElementSource,a=e.isReady;return l&&a?(y.current=t,h.current=n,A.current=u):(y.current=new AudioContext,h.current=y.current.createAnalyser(),h.current.smoothingTimeConstant=.8,h.current.fftSize=32,o?A.current=y.current.createMediaStreamSource(o):l&&(A.current=y.current.createMediaElementSource(l),E.audioBars.setAudioElementContext(y.current),E.audioBars.setAudioElementAnalyser(h.current),E.audioBars.setAudioElementSource(A.current),E.audioBars.setIsReady(!0))),h.current&&A.current&&A.current.connect(h.current),x(),function(){var e;p.current&&cancelAnimationFrame(p.current),null===(e=A.current)||void 0===e||e.disconnect()}}),[]),e.useEffect((function(){p.current&&(d?cancelAnimationFrame(p.current):(cancelAnimationFrame(p.current),x()))}),[f,d]),u.default.createElement("div",{className:"".concat("small"===f?"pi-h-6 pi-w-6":"pi-h-12 pi-w-12"," pi-flex pi-justify-center pi-items-center")},u.default.createElement("div",{className:"".concat("small"===f?"pi-h-6":"pi-h-8"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden"),ref:m},(o||l)&&Object.keys(v).map((function(e){return u.default.createElement("span",{key:e,className:"pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm"})}))))};
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, { type FC, useEffect, useRef } from 'react'\nimport { ContextSourceType } from '../models/audioBars'\nimport { useDispatch } from 'react-redux'\nimport { store } from '../store'\nimport { Dispatch } from '../store'\n\nconst large = {\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 = {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream An audio stream to analyse\n * @param audioElement An audio element to analyse\n */\nexport const AudioBars: FC<AudioBarsProps> = ({\n audioStream = null,\n audioElement = null,\n size,\n}) => {\n // Initialize the main elements\n const containerElement = useRef<HTMLDivElement | null>(null)\n const animationRequest = useRef<number | null>(null)\n const barsMap: BarsMapType = size === 'large' ? large : small\n const context = useRef<AudioContext | null>(null)\n const analyser = useRef<AnalyserNode | null>(null)\n const source = useRef<ContextSourceType>(null)\n const dispatch = useDispatch<Dispatch>()\n\n function saveAnimationRequest(requestId: number) {\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n\n function startAnimation() {\n const animationRequestId: number = requestAnimationFrame(animationFrame)\n saveAnimationRequest(animationRequestId)\n }\n\n // The function that renders the frames of animation\n function animationFrame() {\n if (analyser && analyser.current) {\n const frequencyData = new Uint8Array(analyser.current.frequencyBinCount)\n analyser.current.getByteFrequencyData(frequencyData)\n const values = Object.values(frequencyData)\n\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(barsMap).length; ++i) {\n const value = values[barsMap[i]] / 255\n // @ts-ignore\n const barStyles = bars && bars[i] && bars[i].style\n if (barStyles && value > 0) {\n barStyles.height = `${100 * value}%`\n }\n }\n startAnimation()\n }\n }\n }\n\n useEffect(() => {\n const { audioElementContext, audioElementAnalyser, audioElementSource, isReady } =\n store.getState().audioBars\n // Initialize audio context and analyser once\n if (audioElement && isReady) {\n // The source is an audio element\n context.current = audioElementContext\n analyser.current = audioElementAnalyser\n source.current = audioElementSource\n } else {\n // The source is an audio stream\n context.current = new AudioContext()\n analyser.current = context.current.createAnalyser()\n analyser.current.smoothingTimeConstant = 0.8\n analyser.current.fftSize = 32\n // Create the media source stream\n if (audioStream) {\n source.current = context.current.createMediaStreamSource(audioStream)\n } else if (audioElement) {\n source.current = context.current.createMediaElementSource(audioElement)\n // Save the audio elements to stores\n dispatch.audioBars.setAudioElementContext(context.current)\n dispatch.audioBars.setAudioElementAnalyser(analyser.current)\n dispatch.audioBars.setAudioElementSource(source.current)\n dispatch.audioBars.setIsReady(true)\n }\n }\n\n // Connect the audio source to the analyser\n analyser.current && source.current && source.current.connect(analyser.current)\n context.current && analyser.current && analyser.current.connect(context.current.destination)\n startAnimation()\n\n // Cleanup bars animation\n return () => {\n animationRequest.current && cancelAnimationFrame(animationRequest.current)\n source.current?.disconnect()\n analyser.current?.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (animationRequest.current) {\n cancelAnimationFrame(animationRequest.current)\n startAnimation()\n }\n }, [size])\n\n return (\n <div\n className={`${\n size === 'small' ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } 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 || audioElement) &&\n Object.keys(barsMap).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\ninterface AudioBarsProps {\n audioStream?: MediaStream | null\n audioElement?: HTMLAudioElement | null\n size?: 'large' | 'small'\n}\n\ninterface BarsMapType {\n [key: number]: number\n}\n"],"names":["large","small","_a","_b","audioStream","_c","audioElement","size","containerElement","useRef","animationRequest","barsMap","context","analyser","source","dispatch","useDispatch","startAnimation","requestId","animationRequestId","requestAnimationFrame","animationFrame","current","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","values","Object","bars","children","length","i","keys","value","barStyles","style","height","concat","useEffect","store","getState","audioBars","audioElementContext","audioElementAnalyser","audioElementSource","isReady","AudioContext","createAnalyser","smoothingTimeConstant","fftSize","createMediaStreamSource","createMediaElementSource","setAudioElementContext","setAudioElementAnalyser","setAudioElementSource","setIsReady","connect","destination","cancelAnimationFrame","disconnect","React","createElement","className","ref","map","key"],"mappings":"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"}
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, { type FC, useEffect, useRef } from 'react'\nimport { ContextSourceType } from '../models/audioBars'\nimport { useDispatch } from 'react-redux'\nimport { store } from '../store'\nimport { Dispatch } from '../store'\n\nconst large = {\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 = {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream An audio stream to analyse\n * @param audioElement An audio element to analyse\n */\nexport const AudioBars: FC<AudioBarsProps> = ({\n audioStream = null,\n audioElement = null,\n paused,\n size,\n}) => {\n // Initialize the main elements\n const containerElement = useRef<HTMLDivElement | null>(null)\n const animationRequest = useRef<number | null>(null)\n const barsMap: BarsMapType = size === 'large' ? large : small\n const context = useRef<AudioContext | null>(null)\n const analyser = useRef<AnalyserNode | null>(null)\n const source = useRef<ContextSourceType>(null)\n const dispatch = useDispatch<Dispatch>()\n\n function saveAnimationRequest(requestId: number) {\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n\n function startAnimation() {\n const animationRequestId: number = requestAnimationFrame(animationFrame)\n saveAnimationRequest(animationRequestId)\n }\n\n // The function that renders the frames of animation\n function animationFrame() {\n if (analyser && analyser.current) {\n const frequencyData = new Uint8Array(analyser.current.frequencyBinCount)\n analyser.current.getByteFrequencyData(frequencyData)\n const values = Object.values(frequencyData)\n\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(barsMap).length; ++i) {\n const value = values[barsMap[i]] / 255\n // @ts-ignore\n const barStyles = bars && bars[i] && bars[i].style\n if (barStyles && value > 0) {\n barStyles.height = `${100 * value}%`\n }\n }\n startAnimation()\n }\n }\n }\n\n useEffect(() => {\n const { audioElementContext, audioElementAnalyser, audioElementSource, isReady } =\n store.getState().audioBars\n // Initialize audio context and analyser once\n if (audioElement && isReady) {\n // The source is an audio element\n context.current = audioElementContext\n analyser.current = audioElementAnalyser\n source.current = audioElementSource\n } else {\n // The source is an audio stream\n context.current = new AudioContext()\n analyser.current = context.current.createAnalyser()\n analyser.current.smoothingTimeConstant = 0.8\n analyser.current.fftSize = 32\n // Create the media source stream\n if (audioStream) {\n source.current = context.current.createMediaStreamSource(audioStream)\n } else if (audioElement) {\n source.current = context.current.createMediaElementSource(audioElement)\n // Save the audio elements to stores\n dispatch.audioBars.setAudioElementContext(context.current)\n dispatch.audioBars.setAudioElementAnalyser(analyser.current)\n dispatch.audioBars.setAudioElementSource(source.current)\n dispatch.audioBars.setIsReady(true)\n }\n }\n\n // Connect the audio source to the analyser\n analyser.current && source.current && source.current.connect(analyser.current)\n startAnimation()\n\n // Cleanup bars animation\n return () => {\n animationRequest.current && cancelAnimationFrame(animationRequest.current)\n source.current?.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (animationRequest.current) {\n if (!paused) {\n cancelAnimationFrame(animationRequest.current)\n startAnimation()\n } else {\n cancelAnimationFrame(animationRequest.current)\n }\n }\n }, [size, paused])\n\n return (\n <div\n className={`${\n size === 'small' ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } 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 || audioElement) &&\n Object.keys(barsMap).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\ninterface AudioBarsProps {\n audioStream?: MediaStream | null\n audioElement?: HTMLAudioElement | null\n size?: 'large' | 'small'\n paused?: boolean\n}\n\ninterface BarsMapType {\n [key: number]: number\n}\n"],"names":["large","small","_a","_b","audioStream","_c","audioElement","paused","size","containerElement","useRef","animationRequest","barsMap","context","analyser","source","dispatch","useDispatch","startAnimation","requestId","animationRequestId","requestAnimationFrame","animationFrame","current","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","values","Object","bars","children","length","i","keys","value","barStyles","style","height","concat","useEffect","store","getState","audioBars","audioElementContext","audioElementAnalyser","audioElementSource","isReady","AudioContext","createAnalyser","smoothingTimeConstant","fftSize","createMediaStreamSource","createMediaElementSource","setAudioElementContext","setAudioElementAnalyser","setAudioElementSource","setIsReady","connect","cancelAnimationFrame","disconnect","React","createElement","className","ref","map","key"],"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("../../utils/genericFunctions/player.js"),r=require("../../node_modules/react-redux/es/hooks/useSelector.js"),a=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=u(e),o=function(){var u=r.useSelector((function(e){return e.player})),o=u.audioPlayer,i=u.audioPlayerPlaying,s=u.audioPlayerTrackDuration,c=e.useRef(),l=e.useRef(),d=e.useState("00:00"),f=d[0],m=d[1],p=e.useState(),v=p[0],y=p[1],g=a.useDispatch(),x=e.useState(s&&Math.round(s)||0),h=x[0],E=x[1],P=e.useCallback((function(){var e,r=null===(e=null==o?void 0:o.current)||void 0===e?void 0:e.currentTime;r&&m(t.formatTime(Math.round(r))),c.current.value=r,h&&r&&c.current.style.setProperty("--range-progress","".concat(r/h*100,"%")),l.current=requestAnimationFrame(P)}),[o,h,c]);return e.useEffect((function(){i?l.current=requestAnimationFrame(P):cancelAnimationFrame(l.current)}),[i]),e.useEffect((function(){s&&(E(Math.round(s)),y(t.formatTime(s)))}),[s]),e.useEffect((function(){return function(){cancelAnimationFrame(l.current)}}),[]),n.default.createElement(n.default.Fragment,null,n.default.createElement("input",{"data-stop-propagation":!0,ref:c,defaultValue:0,type:"range",step:"1",min:"0",max:h&&h||0,className:"pi-custom-range",onChange:function(){g.player.setAudioPlayerCurrentTime(c.current.value)}}),n.default.createElement("div",{className:"pi-flex pi-justify-between pi-mt-1"},n.default.createElement("div",{className:"pi-font-bold"},f),n.default.createElement("div",{className:"pi-font-bold"},v)))};exports.Progress=o,exports.default=o;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../utils/genericFunctions/player.js"),r=require("../../styles/CustomRange.styles.js"),u=require("../../node_modules/react-redux/es/hooks/useSelector.js"),a=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=n(e),s=function(){var n=u.useSelector((function(e){return e.player})),s=n.audioPlayer,i=n.audioPlayerPlaying,l=n.audioPlayerTrackDuration,c=e.useRef(),d=e.useRef(),f=e.useState("00:00"),m=f[0],p=f[1],y=e.useState(),v=y[0],g=y[1],x=a.useDispatch(),h=e.useState(l&&Math.round(l)||0),j=h[0],q=h[1],E=e.useCallback((function(){var e,r=null===(e=null==s?void 0:s.current)||void 0===e?void 0:e.currentTime;r&&p(t.formatTime(Math.round(r))),c.current.value=r,j&&r&&c.current.style.setProperty("--range-progress","".concat(r/j*100,"%")),d.current=requestAnimationFrame(E)}),[s,j,c]);return e.useEffect((function(){i?d.current=requestAnimationFrame(E):cancelAnimationFrame(d.current)}),[i]),e.useEffect((function(){l&&(q(Math.round(l)),g(t.formatTime(l)))}),[l]),e.useEffect((function(){return function(){cancelAnimationFrame(d.current)}}),[]),o.default.createElement(o.default.Fragment,null,o.default.createElement(r.StyledCustomRange,{"data-stop-propagation":!0,ref:c,defaultValue:0,type:"range",step:"1",min:"0",max:j&&j||0,onChange:function(){x.player.setAudioPlayerCurrentTime(c.current.value)}}),o.default.createElement("div",{className:"pi-flex pi-justify-between pi-mt-1"},o.default.createElement("div",{className:"pi-font-bold"},m),o.default.createElement("div",{className:"pi-font-bold"},v)))};exports.Progress=s,exports.default=s;
2
2
  //# sourceMappingURL=Progress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Progress.js","sources":["../../../src/components/AudioPlayerView/Progress.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect, useRef, useCallback } from 'react'\nimport { useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { formatTime } from '../../utils/genericFunctions/player'\nimport { useDispatch } from 'react-redux'\n\nexport const Progress: FC<ProgressTypes> = () => {\n const { audioPlayer, audioPlayerPlaying, audioPlayerTrackDuration } = useSelector(\n (state: RootState) => state.player,\n )\n const progressBarRef = useRef<any>()\n const progressAnimationRef = useRef<any>()\n const [timeProgress, setTimeProgress] = useState<string>('00:00')\n const [displayDuration, setDisplayDuration] = useState<string>()\n const dispatch = useDispatch<Dispatch>()\n const [trackDuration, setTrackDuration] = useState<number>(\n (audioPlayerTrackDuration && Math.round(audioPlayerTrackDuration)) || 0,\n )\n\n const progressAnimation = useCallback(() => {\n const currentTime = audioPlayer?.current?.currentTime\n currentTime && setTimeProgress(formatTime(Math.round(currentTime)))\n progressBarRef.current.value = currentTime\n trackDuration &&\n currentTime &&\n progressBarRef.current.style.setProperty(\n '--range-progress',\n `${(currentTime / trackDuration) * 100}%`,\n )\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n }, [audioPlayer, trackDuration, progressBarRef])\n\n useEffect(() => {\n if (audioPlayerPlaying) {\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n } else {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [audioPlayerPlaying])\n\n useEffect(() => {\n if (audioPlayerTrackDuration) {\n setTrackDuration(Math.round(audioPlayerTrackDuration))\n setDisplayDuration(formatTime(audioPlayerTrackDuration))\n }\n }, [audioPlayerTrackDuration])\n\n useEffect(() => {\n return () => {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [])\n\n function handleProgressChange() {\n dispatch.player.setAudioPlayerCurrentTime(progressBarRef.current.value)\n }\n\n return (\n <>\n <input\n data-stop-propagation={true}\n ref={progressBarRef}\n defaultValue={0}\n type='range'\n step='1'\n min='0'\n max={(trackDuration && trackDuration) || 0}\n className='pi-custom-range'\n onChange={handleProgressChange}\n />\n <div className='pi-flex pi-justify-between pi-mt-1'>\n <div className='pi-font-bold'>{timeProgress}</div>\n <div className='pi-font-bold'>{displayDuration}</div>\n </div>\n </>\n )\n}\n\nexport default Progress\n\nexport interface ProgressTypes {}\n"],"names":["Progress","_a","useSelector","state","player","audioPlayer","audioPlayerPlaying","audioPlayerTrackDuration","progressBarRef","useRef","progressAnimationRef","_b","useState","timeProgress","setTimeProgress","_c","displayDuration","setDisplayDuration","dispatch","useDispatch","_d","Math","round","trackDuration","setTrackDuration","progressAnimation","useCallback","currentTime","current","formatTime","value","style","setProperty","requestAnimationFrame","useEffect","cancelAnimationFrame","React","createElement","Fragment","ref","defaultValue","type","step","min","max","className","onChange","setAudioPlayerCurrentTime"],"mappings":"oaAMaA,EAA8B,WACnC,IAAAC,EAAgEC,EAAAA,aACpE,SAACC,GAAqB,OAAAA,EAAMC,UADtBC,EAAWJ,EAAAI,YAAEC,EAAkBL,EAAAK,mBAAEC,EAAwBN,EAAAM,yBAG3DC,EAAiBC,EAAAA,SACjBC,EAAuBD,EAAAA,SACvBE,EAAkCC,EAAAA,SAAiB,SAAlDC,EAAYF,EAAA,GAAEG,EAAeH,EAAA,GAC9BI,EAAwCH,aAAvCI,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GACpCG,EAAWC,EAAAA,cACXC,EAAoCR,EAAAA,SACvCL,GAA4Bc,KAAKC,MAAMf,IAA8B,GADjEgB,EAAaH,EAAA,GAAEI,EAAgBJ,EAAA,GAIhCK,EAAoBC,EAAAA,aAAY,iBAC9BC,EAAoC,QAAtB1B,EAAAI,aAAA,EAAAA,EAAauB,eAAS,IAAA3B,OAAA,EAAAA,EAAA0B,YAC1CA,GAAeb,EAAgBe,aAAWR,KAAKC,MAAMK,KACrDnB,EAAeoB,QAAQE,MAAQH,EAC/BJ,GACEI,GACAnB,EAAeoB,QAAQG,MAAMC,YAC3B,mBACA,UAAIL,EAAcJ,EAAiB,IAAG,MAE1Cb,EAAqBkB,QAAUK,sBAAsBR,EACtD,GAAE,CAACpB,EAAakB,EAAef,IA2BhC,OAzBA0B,EAAAA,WAAU,WACJ5B,EACFI,EAAqBkB,QAAUK,sBAAsBR,GAErDU,qBAAqBzB,EAAqBkB,QAE9C,GAAG,CAACtB,IAEJ4B,EAAAA,WAAU,WACJ3B,IACFiB,EAAiBH,KAAKC,MAAMf,IAC5BU,EAAmBY,EAAAA,WAAWtB,IAElC,GAAG,CAACA,IAEJ2B,EAAAA,WAAU,WACR,OAAO,WACLC,qBAAqBzB,EAAqBkB,QAC5C,CACD,GAAE,IAODQ,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAAA,QAAA,CAAA,yBACyB,EACvBE,IAAK/B,EACLgC,aAAc,EACdC,KAAK,QACLC,KAAK,IACLC,IAAI,IACJC,IAAMrB,GAAiBA,GAAkB,EACzCsB,UAAU,kBACVC,SAfN,WACE5B,EAASd,OAAO2C,0BAA0BvC,EAAeoB,QAAQE,MAClE,IAeGM,EAAAA,QAAKC,cAAA,MAAA,CAAAQ,UAAU,sCACbT,EAAA,QAAAC,cAAA,MAAA,CAAKQ,UAAU,gBAAgBhC,GAC/BuB,UAAKC,cAAA,MAAA,CAAAQ,UAAU,gBAAgB7B,IAIvC"}
1
+ {"version":3,"file":"Progress.js","sources":["../../../src/components/AudioPlayerView/Progress.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect, useRef, useCallback } from 'react'\nimport { useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { formatTime } from '../../utils/genericFunctions/player'\nimport { useDispatch } from 'react-redux'\nimport { StyledCustomRange } from '../../styles/CustomRange.styles'\n\nexport const Progress: FC<ProgressTypes> = () => {\n const { audioPlayer, audioPlayerPlaying, audioPlayerTrackDuration } = useSelector(\n (state: RootState) => state.player,\n )\n const progressBarRef = useRef<any>()\n const progressAnimationRef = useRef<any>()\n const [timeProgress, setTimeProgress] = useState<string>('00:00')\n const [displayDuration, setDisplayDuration] = useState<string>()\n const dispatch = useDispatch<Dispatch>()\n const [trackDuration, setTrackDuration] = useState<number>(\n (audioPlayerTrackDuration && Math.round(audioPlayerTrackDuration)) || 0,\n )\n\n const progressAnimation = useCallback(() => {\n const currentTime = audioPlayer?.current?.currentTime\n currentTime && setTimeProgress(formatTime(Math.round(currentTime)))\n progressBarRef.current.value = currentTime\n trackDuration &&\n currentTime &&\n progressBarRef.current.style.setProperty(\n '--range-progress',\n `${(currentTime / trackDuration) * 100}%`,\n )\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n }, [audioPlayer, trackDuration, progressBarRef])\n\n useEffect(() => {\n if (audioPlayerPlaying) {\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n } else {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [audioPlayerPlaying])\n\n useEffect(() => {\n if (audioPlayerTrackDuration) {\n setTrackDuration(Math.round(audioPlayerTrackDuration))\n setDisplayDuration(formatTime(audioPlayerTrackDuration))\n }\n }, [audioPlayerTrackDuration])\n\n useEffect(() => {\n return () => {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [])\n\n function handleProgressChange() {\n dispatch.player.setAudioPlayerCurrentTime(progressBarRef.current.value)\n }\n\n return (\n <>\n <StyledCustomRange\n data-stop-propagation={true}\n ref={progressBarRef}\n defaultValue={0}\n type='range'\n step='1'\n min='0'\n max={(trackDuration && trackDuration) || 0}\n onChange={handleProgressChange}\n />\n <div className='pi-flex pi-justify-between pi-mt-1'>\n <div className='pi-font-bold'>{timeProgress}</div>\n <div className='pi-font-bold'>{displayDuration}</div>\n </div>\n </>\n )\n}\n\nexport default Progress\n\nexport interface ProgressTypes {}\n"],"names":["Progress","_a","useSelector","state","player","audioPlayer","audioPlayerPlaying","audioPlayerTrackDuration","progressBarRef","useRef","progressAnimationRef","_b","useState","timeProgress","setTimeProgress","_c","displayDuration","setDisplayDuration","dispatch","useDispatch","_d","Math","round","trackDuration","setTrackDuration","progressAnimation","useCallback","currentTime","current","formatTime","value","style","setProperty","requestAnimationFrame","useEffect","cancelAnimationFrame","React","createElement","Fragment","StyledCustomRange","ref","defaultValue","type","step","min","max","onChange","setAudioPlayerCurrentTime","className"],"mappings":"odAOaA,EAA8B,WACnC,IAAAC,EAAgEC,EAAAA,aACpE,SAACC,GAAqB,OAAAA,EAAMC,UADtBC,EAAWJ,EAAAI,YAAEC,EAAkBL,EAAAK,mBAAEC,EAAwBN,EAAAM,yBAG3DC,EAAiBC,EAAAA,SACjBC,EAAuBD,EAAAA,SACvBE,EAAkCC,EAAAA,SAAiB,SAAlDC,EAAYF,EAAA,GAAEG,EAAeH,EAAA,GAC9BI,EAAwCH,aAAvCI,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GACpCG,EAAWC,EAAAA,cACXC,EAAoCR,EAAAA,SACvCL,GAA4Bc,KAAKC,MAAMf,IAA8B,GADjEgB,EAAaH,EAAA,GAAEI,EAAgBJ,EAAA,GAIhCK,EAAoBC,EAAAA,aAAY,iBAC9BC,EAAoC,QAAtB1B,EAAAI,aAAA,EAAAA,EAAauB,eAAS,IAAA3B,OAAA,EAAAA,EAAA0B,YAC1CA,GAAeb,EAAgBe,aAAWR,KAAKC,MAAMK,KACrDnB,EAAeoB,QAAQE,MAAQH,EAC/BJ,GACEI,GACAnB,EAAeoB,QAAQG,MAAMC,YAC3B,mBACA,UAAIL,EAAcJ,EAAiB,IAAG,MAE1Cb,EAAqBkB,QAAUK,sBAAsBR,EACtD,GAAE,CAACpB,EAAakB,EAAef,IA2BhC,OAzBA0B,EAAAA,WAAU,WACJ5B,EACFI,EAAqBkB,QAAUK,sBAAsBR,GAErDU,qBAAqBzB,EAAqBkB,QAE9C,GAAG,CAACtB,IAEJ4B,EAAAA,WAAU,WACJ3B,IACFiB,EAAiBH,KAAKC,MAAMf,IAC5BU,EAAmBY,EAAAA,WAAWtB,IAElC,GAAG,CAACA,IAEJ2B,EAAAA,WAAU,WACR,OAAO,WACLC,qBAAqBzB,EAAqBkB,QAC5C,CACD,GAAE,IAODQ,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,oBACwB,CAAA,yBAAA,EACvBC,IAAKhC,EACLiC,aAAc,EACdC,KAAK,QACLC,KAAK,IACLC,IAAI,IACJC,IAAMtB,GAAiBA,GAAkB,EACzCuB,SAdN,WACE5B,EAASd,OAAO2C,0BAA0BvC,EAAeoB,QAAQE,MAClE,IAcGM,EAAAA,QAAKC,cAAA,MAAA,CAAAW,UAAU,sCACbZ,EAAA,QAAAC,cAAA,MAAA,CAAKW,UAAU,gBAAgBnC,GAC/BuB,UAAKC,cAAA,MAAA,CAAAW,UAAU,gBAAgBhC,IAIvC"}
@@ -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"),i=require("../../lib/phone/call.js");require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/mic-check/lib/index.js"),require("../Island.js");var a=require("../Button.js"),n=require("../AudioBars.js");require("../../node_modules/framer-motion/dist/framer-motion.js");var u=require("./Timer.js"),s=require("./Number.js"),d=require("./DisplayName.js"),o=require("./Avatar.js"),c=require("./Actions.js"),m=require("../Hangup.js"),f=require("../../node_modules/react-redux/es/hooks/useSelector.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var j=p(e);function q(e,t){return!e&&!t}exports.default=function(){var e=f.useSelector((function(e){return e.currentCall})),p=e.incoming,g=e.accepted,E=e.outgoing,v=e.startTime,y=f.useSelector((function(e){return e.island})).isOpen,_=f.useSelector((function(e){return e.webrtc})).remoteAudioStream;return j.default.createElement(t.StyledCallView,{incoming:p,accepted:g,outgoing:E,isOpen:y},j.default.createElement(t.StyledTopContent,{isOpen:y,incoming:p,accepted:g,outgoing:E},j.default.createElement(o.default,null),y&&j.default.createElement(t.StyledDetails,null,j.default.createElement(d.default,null),g?j.default.createElement(u.default,{startTime:v}):j.default.createElement(s.default,null)),!y&&!g&&j.default.createElement(d.default,null),!y&&g&&j.default.createElement(u.default,{startTime:v}),g&&_&&j.default.createElement(n.AudioBars,{audioStream:_,size:y?"large":"small"})),y&&j.default.createElement("div",{className:"pi-grid pi-gap-y-5"},g&&j.default.createElement(c.default,null),j.default.createElement("div",{className:"pi-grid ".concat(q(E,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")},j.default.createElement(m.default,null),q(E,g)&&j.default.createElement(a.Button,{onClick:i.answerIncomingCall,variant:"green"},j.default.createElement(r.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:l.faPhone})))))};
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"),a=require("../../lib/phone/call.js");require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/mic-check/lib/index.js"),require("../Island.js");var i=require("../Button.js"),u=require("../AudioBars.js");require("../../node_modules/framer-motion/dist/framer-motion.js");var n=require("./Timer.js"),s=require("./Number.js"),d=require("./DisplayName.js"),o=require("./Avatar.js"),c=require("./Actions.js"),m=require("../Hangup.js"),f=require("../../node_modules/react-redux/es/hooks/useSelector.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var j=p(e);function q(e,t){return!e&&!t}exports.default=function(){var e=f.useSelector((function(e){return e.currentCall})),p=e.incoming,g=e.accepted,E=e.outgoing,v=e.startTime,y=e.paused,_=f.useSelector((function(e){return e.island})).isOpen,b=f.useSelector((function(e){return e.webrtc})).remoteAudioStream;return j.default.createElement(t.StyledCallView,{incoming:p,accepted:g,outgoing:E,isOpen:_},j.default.createElement(t.StyledTopContent,{isOpen:_,incoming:p,accepted:g,outgoing:E},j.default.createElement(o.default,null),_&&j.default.createElement(t.StyledDetails,null,j.default.createElement(d.default,null),g?j.default.createElement(n.default,{startTime:v}):j.default.createElement(s.default,null)),!_&&!g&&j.default.createElement(d.default,null),!_&&g&&j.default.createElement(n.default,{startTime:v}),g&&b&&j.default.createElement(u.AudioBars,{audioStream:b,paused:y,size:_?"large":"small"})),_&&j.default.createElement("div",{className:"pi-grid pi-gap-y-5"},g&&j.default.createElement(c.default,null),j.default.createElement("div",{className:"pi-grid ".concat(q(E,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")},j.default.createElement(m.default,null),q(E,g)&&j.default.createElement(i.Button,{onClick:a.answerIncomingCall,variant:"green"},j.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 { answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\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, startTime } = useSelector(\n (state: RootState) => state.currentCall,\n )\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 startTime={startTime} /> : <Number />}\n </StyledDetails>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer startTime={startTime} />}\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 {/* {incoming || outgoing ? (\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n ) : ( */}\n <Hangup />\n {/* )} */}\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","startTime","isOpen","island","remoteAudioStream","webrtc","React","createElement","StyledCallView","StyledTopContent","Avatar","StyledDetails","DisplayName","Timer","Number","AudioBars","audioStream","size","className","Actions","concat","Hangup","Button","onClick","answerIncomingCall","variant","FontAwesomeIcon","icon","faPhone"],"mappings":"4kCAmBA,SAASA,EAAgBC,EAAmBC,GAC1C,OAAQD,IAAaC,CACvB,iBAKoC,WAE5B,IAAAC,EAA8CC,eAClD,SAACC,GAAqB,OAAAA,EAAMC,eADtBC,EAAQJ,EAAAI,SAAEL,EAAQC,EAAAD,SAAED,EAAQE,EAAAF,SAAEO,EAASL,EAAAK,UAIvCC,EAAWL,eAAY,SAACC,GAAqB,OAAAA,EAAMK,iBAGnDC,EAAsBP,eAAY,SAACC,GAAqB,OAAAA,EAAMO,4BAEtE,OACEC,UAACC,cAAAC,EAAcA,gBAACR,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,EAAUQ,OAAQA,GAClFI,EAAAA,QAAAC,cAACE,mBAAiB,CAAAP,OAAQA,EAAQF,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,GAClFY,UAAAC,cAACG,EAAM,QAAG,MACTR,GACCI,EAAA,QAAAC,cAACI,EAAAA,cAAa,KACZL,UAAAC,cAACK,EAAW,QAAG,MAEdjB,EAAWW,EAAAA,QAACC,cAAAM,EAAK,SAACZ,UAAWA,IAAgBK,wBAACQ,UAAM,QAIvDZ,IAAWP,GAAYW,EAAA,QAAAC,cAACK,EAAW,QAAG,OAEtCV,GAAUP,GAAYW,UAAAC,cAACM,EAAAA,QAAM,CAAAZ,UAAWA,IACzCN,GAAYS,GACXE,EAAAA,QAAAC,cAACQ,EAASA,UAAC,CAAAC,YAAaZ,EAAmBa,KAAMf,EAAS,QAAU,WAGvEA,GACCI,EAAK,QAAAC,cAAA,MAAA,CAAAW,UAAU,sBACZvB,GAAYW,EAAC,QAAAC,cAAAY,EAAAA,QAAU,MACxBb,UACEC,cAAA,MAAA,CAAAW,UAAW,WACTE,OAAA3B,EAAgBC,EAAUC,GACtB,iBACAA,EACA,yCACA,sCACO,gBAQbW,UAAAC,cAACc,EAAM,QAAG,MAGT5B,EAAgBC,EAAUC,IACzBW,UAAAC,cAACe,EAAMA,OAAA,CAACC,QAASC,qBAAoBC,QAAQ,SAC3CnB,EAAAA,QAAAC,cAACmB,kBAAgB,CAAAR,UAAU,gBAAgBS,KAAMC,EAAAA,aAQjE"}
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 { answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\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, startTime, paused } = useSelector(\n (state: RootState) => state.currentCall,\n )\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 startTime={startTime} /> : <Number />}\n </StyledDetails>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer startTime={startTime} />}\n {accepted && remoteAudioStream && (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\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 {/* {incoming || outgoing ? (\n <Button onClick={hangupCurrentCall} variant='red'>\n <FontAwesomeIcon className='pi-rotate-135 pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n ) : ( */}\n <Hangup />\n {/* )} */}\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","startTime","paused","isOpen","island","remoteAudioStream","webrtc","React","createElement","StyledCallView","StyledTopContent","Avatar","StyledDetails","DisplayName","Timer","Number","AudioBars","audioStream","size","className","Actions","concat","Hangup","Button","onClick","answerIncomingCall","variant","FontAwesomeIcon","icon","faPhone"],"mappings":"4kCAmBA,SAASA,EAAgBC,EAAmBC,GAC1C,OAAQD,IAAaC,CACvB,iBAKoC,WAE5B,IAAAC,EAAsDC,EAAAA,aAC1D,SAACC,GAAqB,OAAAA,EAAMC,WAAW,IADjCC,EAAQJ,EAAAI,SAAEL,EAAQC,EAAAD,SAAED,EAAQE,EAAAF,SAAEO,EAASL,EAAAK,UAAEC,EAAMN,EAAAM,OAI/CC,EAAWN,eAAY,SAACC,GAAqB,OAAAA,EAAMM,iBAGnDC,EAAsBR,eAAY,SAACC,GAAqB,OAAAA,EAAMQ,4BAEtE,OACEC,UAACC,cAAAC,EAAcA,gBAACT,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,EAAUS,OAAQA,GAClFI,EAAAA,QAAAC,cAACE,mBAAiB,CAAAP,OAAQA,EAAQH,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,GAClFa,UAAAC,cAACG,EAAM,QAAG,MACTR,GACCI,EAAA,QAAAC,cAACI,EAAAA,cAAa,KACZL,UAAAC,cAACK,EAAW,QAAG,MAEdlB,EAAWY,EAAAA,QAACC,cAAAM,EAAK,SAACb,UAAWA,IAAgBM,wBAACQ,UAAM,QAIvDZ,IAAWR,GAAYY,EAAA,QAAAC,cAACK,EAAW,QAAG,OAEtCV,GAAUR,GAAYY,UAAAC,cAACM,EAAAA,QAAM,CAAAb,UAAWA,IACzCN,GAAYU,GACXE,EAAC,QAAAC,cAAAQ,EAASA,UACR,CAAAC,YAAaZ,EACbH,OAAQA,EACRgB,KAAMf,EAAS,QAAU,WAI9BA,GACCI,EAAK,QAAAC,cAAA,MAAA,CAAAW,UAAU,sBACZxB,GAAYY,EAAC,QAAAC,cAAAY,EAAAA,QAAU,MACxBb,UACEC,cAAA,MAAA,CAAAW,UAAW,WACTE,OAAA5B,EAAgBC,EAAUC,GACtB,iBACAA,EACA,yCACA,sCACO,gBAQbY,UAAAC,cAACc,EAAM,QAAG,MAGT7B,EAAgBC,EAAUC,IACzBY,UAAAC,cAACe,EAAMA,OAAA,CAACC,QAASC,qBAAoBC,QAAQ,SAC3CnB,EAAAA,QAAAC,cAACmB,kBAAgB,CAAAR,UAAU,gBAAgBS,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"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),c=require("../lib/phone/conversation.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var r=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var u=require("../events/SocketEvents.js"),s=require("../node_modules/react-redux/es/hooks/useDispatch.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=a(n);exports.Socket=function(a){var d=a.hostName,l=a.username,m=a.authToken,p=a.children,f=s.useDispatch(),b=n.useRef(),g=n.useRef();return n.useEffect((function(){return g.current=t.io(d,{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")})),b.current=setInterval((function(){var e=Date.now();g.current.volatile.emit("ping",o.withTimeout((function(){f.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){f.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),2e3))}),5e3),g.current.on("connect",(function(){console.log("Socket on: "+d+" is connected!"),g.current.emit("login",{accessKeyId:"".concat(l),token:m,uaType:"desktop"})})),g.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),g.current.on("userMainPresenceUpdate",(function(n){r.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),u.dispatchMainPresence(n)})),g.current.on("extenUpdate",(function(e){f.users.updateExtension(e),u.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===l&&function(e,n){var t=e.status;if(Object.keys(n).length>0&&t){var o=r.store.getState().users.extensions;switch(t){case"ringing":f.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""});break;case"busy":n&&n.connected?f.currentCall.updateCurrentCall({conversationId:n.id,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""}):n&&!n.connected&&"out"===n.direction&&f.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""})}}}(e,n)})),g.current.on("queueUpdate",(function(e){u.dispatchQueueUpdate(e)})),g.current.on("queueMemberUpdate",(function(e){u.dispatchQueueMemberUpdate(e)})),function(){clearInterval(b.current),g.current.close()}}),[]),i.default.createElement(i.default.Fragment,null,p)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),c=require("../lib/phone/conversation.js"),o=require("../utils/genericFunctions/withTimeout.js");require("../node_modules/mic-check/lib/index.js"),require("../lib/webrtc/janus.js");var r=require("../store/index.js");require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var u=require("../events/SocketEvents.js"),a=require("../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=s(n);exports.Socket=function(s){var d=s.hostName,l=s.username,m=s.authToken,p=s.children,f=a.useDispatch(),g=n.useRef(),k=n.useRef();return n.useEffect((function(){return k.current=t.io(d,{upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3}),k.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(k.current.id))})),k.current.on("disconnect",(function(e){console.log("Socket disconnect - reason: ".concat(e))})),k.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),k.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),k.current.io.on("reconnect",(function(e){console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(k.current.id,")"))})),k.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),k.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),k.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),g.current=setInterval((function(){var e=Date.now();k.current.volatile.emit("ping",o.withTimeout((function(){f.alerts.removeAlert("socket_down");var n=Date.now()-e;console.debug("Socket latency: ".concat(n,"ms")),console.debug("Socket is reachable!")}),(function(){f.alerts.setAlert("socket_down"),console.debug("Socket is unreachable!")}),2e3))}),5e3),k.current.on("connect",(function(){console.log("Socket on: "+d+" is connected!"),k.current.emit("login",{accessKeyId:"".concat(l),token:m,uaType:"desktop"})})),k.current.on("authe_ok",(function(){console.log("Socket authentication success!")})),k.current.on("userMainPresenceUpdate",(function(n){r.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),u.dispatchMainPresence(n)})),k.current.on("extenUpdate",(function(e){f.users.updateExtension(e),u.dispatchConversations(e);var n=e.conversations[Object.keys(e.conversations)[0]]||{};e.username===l&&function(e,n){var t=e.status;if(Object.keys(n).length>0&&t){var o=r.store.getState().users.extensions;switch(t){case"ringing":f.currentCall.checkIncomingUpdatePlay({conversationId:n.id,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),incomingSocket:!0,username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""});break;case"busy":n&&n.connected?f.currentCall.updateCurrentCall({conversationId:n.id,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),startTime:"".concat(n.startTime/1e3),username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""}):n&&!n.connected&&"out"===n.direction&&f.currentCall.checkOutgoingUpdate({outgoingSocket:!0,displayName:c.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(o&&o[n.counterpartNum]&&o[n.counterpartNum].username)||""})}}}(e,n)})),k.current.on("queueUpdate",(function(e){u.dispatchQueueUpdate(e)})),k.current.on("queueMemberUpdate",(function(e){u.dispatchQueueMemberUpdate(e)})),k.current.on("takeOver",(function(){u.dispatchAlreadyLogin()})),function(){clearInterval(g.current),k.current.close()}}),[]),i.default.createElement(i.default.Fragment,null,p)};
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 MainPresenceTypes,\n} from '../types'\n// import { userTotallyFree } from '../lib/user/extensions'\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 // Initialize status\n const status: string = res.status\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\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.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\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 } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\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: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // 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","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","status","length","extensions","getState","currentCall","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","direction","checkOutgoingUpdate","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 dispatchAlreadyLogin,\n} from '../events'\nimport { store } from '../store'\nimport { withTimeout } from '../utils'\nimport type {\n ConversationsTypes,\n ExtensionTypes,\n QueuesUpdateTypes,\n QueueUpdateMemberTypes,\n MainPresenceTypes,\n} from '../types'\n// import { userTotallyFree } from '../lib/user/extensions'\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 // Initialize status\n const status: string = res.status\n // Check conversation isn't empty\n if (Object.keys(conv).length > 0) {\n // With conversation\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.checkIncomingUpdatePlay({\n conversationId: conv.id,\n displayName: getDisplayName(conv),\n number: `${conv.counterpartNum}`,\n incomingSocket: true,\n username:\n `${\n extensions &&\n extensions[conv.counterpartNum] &&\n extensions[conv.counterpartNum].username\n }` || '',\n })\n break\n // @ts-ignore\n case 'busy':\n if (conv && conv.connected) {\n // Current call accepted\n dispatch.currentCall.updateCurrentCall({\n conversationId: conv.id,\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 } else {\n // Without conversation for physical phone management\n // if (status) {\n // if (res.status == 'online' && userTotallyFree()) {\n // // Stop ringing sounds\n // dispatch.player.stopAudioPlayer()\n // // Reset current call info\n // dispatch.currentCall.reset()\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: MainPresenceTypes) => {\n // Update endpoints store\n store.dispatch.users.updateEndpointMainPresence({ ...res.mainPresence })\n // Dispatch dispatchMainPresence Event\n dispatchMainPresence(res)\n })\n\n socket.current.on('extenUpdate', (res: ExtensionTypes) => {\n // Update extensions and conversations in users store\n dispatch.users.updateExtension(res)\n // 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 // `queueUpdate` is the socket event when the data of a queue updates\n socket.current.on('queueUpdate', (res: QueuesUpdateTypes) => {\n // Dispatch queueUpdate event\n dispatchQueueUpdate(res)\n })\n\n // `queueMemberUpdate` is the socket event when the data of a queue member changes\n socket.current.on('queueMemberUpdate', (res: QueueUpdateMemberTypes) => {\n // Dispatch queueMemberUpdate event\n dispatchQueueMemberUpdate(res)\n })\n\n // `takeOver` is the socket event when the user does login from another new window\n socket.current.on('takeOver', () => {\n // Dispatch takeOver event\n dispatchAlreadyLogin()\n })\n }\n\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","store","users","updateEndpointMainPresence","__assign","mainPresence","dispatchMainPresence","updateExtension","dispatchConversations","conv","conversations","Object","keys","status","length","extensions","getState","currentCall","checkIncomingUpdatePlay","conversationId","displayName","getDisplayName","number","counterpartNum","incomingSocket","connected","updateCurrentCall","startTime","direction","checkOutgoingUpdate","outgoingSocket","handleCurrentUserEvents","dispatchQueueUpdate","dispatchQueueMemberUpdate","dispatchAlreadyLogin","clearInterval","close","React","createElement","Fragment"],"mappings":"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"}
@@ -23,3 +23,9 @@ export declare function dispatchQueueUpdate(event: QueuesUpdateTypes): void;
23
23
  * @param event The queueMemberUpdate event from socket
24
24
  */
25
25
  export declare function dispatchQueueMemberUpdate(event: QueueUpdateMemberTypes): void;
26
+ /**
27
+ * The dispatch function for the takeOver event
28
+ *
29
+ * @param event The takeOver event from socket
30
+ */
31
+ export declare function dispatchAlreadyLogin(): void;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("react");var e=require("../utils/genericFunctions/eventDispatch.js");exports.dispatchConversations=function(n){var s,t=((s={})[n.username]={conversations:n.conversations},s);e.eventDispatch("phone-island-conversations",t)},exports.dispatchMainPresence=function(n){var s,t=((s={})[n.mainPresence.username]={mainPresence:n.mainPresence.status},s);e.eventDispatch("phone-island-main-presence",t)},exports.dispatchQueueMemberUpdate=function(n){var s,t=((s={})[n.member]=n,s);e.eventDispatch("phone-island-queue-member-update",t)},exports.dispatchQueueUpdate=function(n){var s,t=((s={})[n.queue]=n,s);e.eventDispatch("phone-island-queue-update",t)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("react");var e=require("../utils/genericFunctions/eventDispatch.js");exports.dispatchAlreadyLogin=function(){e.eventDispatch("phone-island-user-already-login",{})},exports.dispatchConversations=function(n){var s,t=((s={})[n.username]={conversations:n.conversations},s);e.eventDispatch("phone-island-conversations",t)},exports.dispatchMainPresence=function(n){var s,t=((s={})[n.mainPresence.username]={mainPresence:n.mainPresence.status},s);e.eventDispatch("phone-island-main-presence",t)},exports.dispatchQueueMemberUpdate=function(n){var s,t=((s={})[n.member]=n,s);e.eventDispatch("phone-island-queue-member-update",t)},exports.dispatchQueueUpdate=function(n){var s,t=((s={})[n.queue]=n,s);e.eventDispatch("phone-island-queue-update",t)};
2
2
  //# sourceMappingURL=SocketEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SocketEvents.js","sources":["../../src/events/SocketEvents.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { eventDispatch } from '../utils'\nimport type {\n MainPresenceTypes,\n MainPresenceEventTypes,\n ExtensionTypes,\n ConversationsEventType,\n QueuesUpdateTypes,\n QueuesEventType,\n QueueUpdateMemberTypes,\n QueuesMemberEventType\n} from '../types'\n\n/**\n * The dispatch function for the userMainPresenceUpdate event\n *\n * @param event The userMainPresenceUpdate event from socket\n */\nexport function dispatchMainPresence(event: MainPresenceTypes) {\n const data: MainPresenceEventTypes = {\n [event.mainPresence.username]: {\n mainPresence: event.mainPresence.status,\n },\n }\n eventDispatch('phone-island-main-presence', data)\n}\n\n/**\n * The dispatch function for the extenUpdate event\n *\n * @param event The extenUpdate event from socket\n */\nexport function dispatchConversations(event: ExtensionTypes) {\n const data: ConversationsEventType = {\n [event.username]: {\n conversations: event.conversations,\n },\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-conversations', data)\n}\n\n/**\n * The dispatch function for the queueUpdate event\n *\n * @param event The queueUpdate event from socket\n */\nexport function dispatchQueueUpdate(event: QueuesUpdateTypes) {\n const data: QueuesEventType = {\n [event.queue]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-update', data)\n}\n\n/**\n * The dispatch function for the queueMemberUpdate event\n *\n * @param event The queueMemberUpdate event from socket\n */\nexport function dispatchQueueMemberUpdate(event: QueueUpdateMemberTypes) {\n const data: QueuesMemberEventType = {\n [event.member]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-member-update', data)\n}\n"],"names":["event","data","_a","username","conversations","eventDispatch","mainPresence","status","member","queue"],"mappings":"+KAkCM,SAAgCA,SAC9BC,IAAIC,EAAA,CAAA,GACPF,EAAMG,UAAW,CAChBC,cAAeJ,EAAMI,kBAIzBC,gBAAc,6BAA8BJ,EAC9C,+BAtBM,SAA+BD,SAC7BC,IAAIC,EAAA,CAAA,GACPF,EAAMM,aAAaH,UAAW,CAC7BG,aAAcN,EAAMM,aAAaC,WAGrCF,gBAAc,6BAA8BJ,EAC9C,oCAmCM,SAAoCD,SAClCC,IAAIC,EAAA,CAAA,GACPF,EAAMQ,QAASR,KAGlBK,gBAAc,mCAAoCJ,EACpD,8BAnBM,SAA8BD,SAC5BC,IAAIC,EAAA,CAAA,GACPF,EAAMS,OAAQT,KAGjBK,gBAAc,4BAA6BJ,EAC7C"}
1
+ {"version":3,"file":"SocketEvents.js","sources":["../../src/events/SocketEvents.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport { eventDispatch } from '../utils'\nimport type {\n MainPresenceTypes,\n MainPresenceEventTypes,\n ExtensionTypes,\n ConversationsEventType,\n QueuesUpdateTypes,\n QueuesEventType,\n QueueUpdateMemberTypes,\n QueuesMemberEventType,\n} from '../types'\n\n/**\n * The dispatch function for the userMainPresenceUpdate event\n *\n * @param event The userMainPresenceUpdate event from socket\n */\nexport function dispatchMainPresence(event: MainPresenceTypes) {\n const data: MainPresenceEventTypes = {\n [event.mainPresence.username]: {\n mainPresence: event.mainPresence.status,\n },\n }\n eventDispatch('phone-island-main-presence', data)\n}\n\n/**\n * The dispatch function for the extenUpdate event\n *\n * @param event The extenUpdate event from socket\n */\nexport function dispatchConversations(event: ExtensionTypes) {\n const data: ConversationsEventType = {\n [event.username]: {\n conversations: event.conversations,\n },\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-conversations', data)\n}\n\n/**\n * The dispatch function for the queueUpdate event\n *\n * @param event The queueUpdate event from socket\n */\nexport function dispatchQueueUpdate(event: QueuesUpdateTypes) {\n const data: QueuesEventType = {\n [event.queue]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-update', data)\n}\n\n/**\n * The dispatch function for the queueMemberUpdate event\n *\n * @param event The queueMemberUpdate event from socket\n */\nexport function dispatchQueueMemberUpdate(event: QueueUpdateMemberTypes) {\n const data: QueuesMemberEventType = {\n [event.member]: event,\n }\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-queue-member-update', data)\n}\n\n/**\n * The dispatch function for the takeOver event\n *\n * @param event The takeOver event from socket\n */\nexport function dispatchAlreadyLogin() {\n // Dispatch the event on window for external handlers\n eventDispatch('phone-island-user-already-login', {})\n}\n"],"names":["eventDispatch","event","data","_a","username","conversations","mainPresence","status","member","queue"],"mappings":"yLA6EEA,gBAAc,kCAAmC,CAAA,EACnD,gCA5CM,SAAgCC,SAC9BC,IAAIC,EAAA,CAAA,GACPF,EAAMG,UAAW,CAChBC,cAAeJ,EAAMI,kBAIzBL,gBAAc,6BAA8BE,EAC9C,+BAtBM,SAA+BD,SAC7BC,IAAIC,EAAA,CAAA,GACPF,EAAMK,aAAaF,UAAW,CAC7BE,aAAcL,EAAMK,aAAaC,WAGrCP,gBAAc,6BAA8BE,EAC9C,oCAmCM,SAAoCD,SAClCC,IAAIC,EAAA,CAAA,GACPF,EAAMO,QAASP,KAGlBD,gBAAc,mCAAoCE,EACpD,8BAnBM,SAA8BD,SAC5BC,IAAIC,EAAA,CAAA,GACPF,EAAMQ,OAAQR,KAGjBD,gBAAc,4BAA6BE,EAC7C"}
@@ -0,0 +1,3 @@
1
+ export declare const StyledCustomRange: import("styled-components").StyledComponent<"input", any, {
2
+ type: "range";
3
+ }, "type">;
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var n,r=require("../node_modules/tslib/tslib.es6.js"),e=require("../node_modules/styled-components/dist/styled-components.browser.esm.js").default.input.attrs({type:"range"})(n||(n=r.__makeTemplateObject(["\n font-size: 1.5rem;\n width: 100%;\n color: white;\n --thumb-height: 0.75rem;\n --track-height: 0.125rem;\n --track-color: #6b7280;\n --clip-edges: 0.125rem;\n\n position: relative;\n background: #fff0;\n overflow: hidden;\n appearance: none;\n\n &:active {\n cursor: grabbing;\n }\n\n &:disabled {\n filter: grayscale(1);\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n /* === WebKit specific styles === */\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n height: var(--thumb-height);\n --thumb-radius: calc((var(--thumb-height) * 0.5) - 0.0625rem);\n --clip-top: calc((var(--thumb-height) - var(--track-height)) * 0.5 - 0.0313rem);\n --clip-bottom: calc(var(--thumb-height) - var(--clip-top));\n --clip-further: calc(100% + 0.0625rem);\n --box-fill: calc(-100vmax - var(--thumb-width, var(--thumb-height))) 0 0 100vmax currentColor;\n\n width: var(--thumb-width, var(--thumb-height));\n background: linear-gradient(currentColor 0 0) scroll no-repeat left center / 50%\n calc(var(--track-height) + 0.0625rem);\n background-color: currentColor;\n box-shadow: var(--box-fill);\n border-radius: var(--thumb-width, var(--thumb-height));\n\n clip-path: polygon(\n 100% -0.0625rem,\n var(--clip-edges) -0.0625rem,\n 0 var(--clip-top),\n -100vmax var(--clip-top),\n -100vmax var(--clip-bottom),\n 0 var(--clip-bottom),\n var(--clip-edges) 100%,\n var(--clip-further) var(--clip-further)\n );\n }\n\n &::-webkit-slider-runnable-track {\n background: linear-gradient(var(--track-color) 0 0) scroll no-repeat center / 100%\n calc(var(--track-height) + 0.0625rem);\n }\n\n &:disabled::-webkit-slider-thumb {\n cursor: not-allowed;\n }\n\n /* === Firefox specific styles === */\n -moz-appearance: none;\n transition: all ease 100ms;\n height: var(--thumb-height);\n\n &::-moz-range-thumb {\n background: currentColor;\n border: 0;\n width: var(--thumb-width, var(--thumb-height));\n border-radius: var(--thumb-width, var(--thumb-height));\n }\n\n &::-moz-range-track {\n width: 100%;\n background: var(--track-color);\n }\n\n &::-moz-range-progress {\n appearance: none;\n background: currentColor;\n transition-delay: 30ms;\n }\n\n &::-moz-range-track,\n &::-moz-range-progress {\n height: calc(var(--track-height) + 0.0625rem);\n border-radius: var(--track-height);\n }\n\n &:disabled::-moz-range-thumb {\n cursor: not-allowed;\n }\n"],["\n font-size: 1.5rem;\n width: 100%;\n color: white;\n --thumb-height: 0.75rem;\n --track-height: 0.125rem;\n --track-color: #6b7280;\n --clip-edges: 0.125rem;\n\n position: relative;\n background: #fff0;\n overflow: hidden;\n appearance: none;\n\n &:active {\n cursor: grabbing;\n }\n\n &:disabled {\n filter: grayscale(1);\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n /* === WebKit specific styles === */\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n height: var(--thumb-height);\n --thumb-radius: calc((var(--thumb-height) * 0.5) - 0.0625rem);\n --clip-top: calc((var(--thumb-height) - var(--track-height)) * 0.5 - 0.0313rem);\n --clip-bottom: calc(var(--thumb-height) - var(--clip-top));\n --clip-further: calc(100% + 0.0625rem);\n --box-fill: calc(-100vmax - var(--thumb-width, var(--thumb-height))) 0 0 100vmax currentColor;\n\n width: var(--thumb-width, var(--thumb-height));\n background: linear-gradient(currentColor 0 0) scroll no-repeat left center / 50%\n calc(var(--track-height) + 0.0625rem);\n background-color: currentColor;\n box-shadow: var(--box-fill);\n border-radius: var(--thumb-width, var(--thumb-height));\n\n clip-path: polygon(\n 100% -0.0625rem,\n var(--clip-edges) -0.0625rem,\n 0 var(--clip-top),\n -100vmax var(--clip-top),\n -100vmax var(--clip-bottom),\n 0 var(--clip-bottom),\n var(--clip-edges) 100%,\n var(--clip-further) var(--clip-further)\n );\n }\n\n &::-webkit-slider-runnable-track {\n background: linear-gradient(var(--track-color) 0 0) scroll no-repeat center / 100%\n calc(var(--track-height) + 0.0625rem);\n }\n\n &:disabled::-webkit-slider-thumb {\n cursor: not-allowed;\n }\n\n /* === Firefox specific styles === */\n -moz-appearance: none;\n transition: all ease 100ms;\n height: var(--thumb-height);\n\n &::-moz-range-thumb {\n background: currentColor;\n border: 0;\n width: var(--thumb-width, var(--thumb-height));\n border-radius: var(--thumb-width, var(--thumb-height));\n }\n\n &::-moz-range-track {\n width: 100%;\n background: var(--track-color);\n }\n\n &::-moz-range-progress {\n appearance: none;\n background: currentColor;\n transition-delay: 30ms;\n }\n\n &::-moz-range-track,\n &::-moz-range-progress {\n height: calc(var(--track-height) + 0.0625rem);\n border-radius: var(--track-height);\n }\n\n &:disabled::-moz-range-thumb {\n cursor: not-allowed;\n }\n"])));exports.StyledCustomRange=e;
2
+ //# sourceMappingURL=CustomRange.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomRange.styles.js","sources":["../../src/styles/CustomRange.styles.ts"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3\n\nimport styled from 'styled-components'\n\nexport const StyledCustomRange = styled.input.attrs({ type: 'range' })`\n font-size: 1.5rem;\n width: 100%;\n color: white;\n --thumb-height: 0.75rem;\n --track-height: 0.125rem;\n --track-color: #6b7280;\n --clip-edges: 0.125rem;\n\n position: relative;\n background: #fff0;\n overflow: hidden;\n appearance: none;\n\n &:active {\n cursor: grabbing;\n }\n\n &:disabled {\n filter: grayscale(1);\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n /* === WebKit specific styles === */\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n height: var(--thumb-height);\n --thumb-radius: calc((var(--thumb-height) * 0.5) - 0.0625rem);\n --clip-top: calc((var(--thumb-height) - var(--track-height)) * 0.5 - 0.0313rem);\n --clip-bottom: calc(var(--thumb-height) - var(--clip-top));\n --clip-further: calc(100% + 0.0625rem);\n --box-fill: calc(-100vmax - var(--thumb-width, var(--thumb-height))) 0 0 100vmax currentColor;\n\n width: var(--thumb-width, var(--thumb-height));\n background: linear-gradient(currentColor 0 0) scroll no-repeat left center / 50%\n calc(var(--track-height) + 0.0625rem);\n background-color: currentColor;\n box-shadow: var(--box-fill);\n border-radius: var(--thumb-width, var(--thumb-height));\n\n clip-path: polygon(\n 100% -0.0625rem,\n var(--clip-edges) -0.0625rem,\n 0 var(--clip-top),\n -100vmax var(--clip-top),\n -100vmax var(--clip-bottom),\n 0 var(--clip-bottom),\n var(--clip-edges) 100%,\n var(--clip-further) var(--clip-further)\n );\n }\n\n &::-webkit-slider-runnable-track {\n background: linear-gradient(var(--track-color) 0 0) scroll no-repeat center / 100%\n calc(var(--track-height) + 0.0625rem);\n }\n\n &:disabled::-webkit-slider-thumb {\n cursor: not-allowed;\n }\n\n /* === Firefox specific styles === */\n -moz-appearance: none;\n transition: all ease 100ms;\n height: var(--thumb-height);\n\n &::-moz-range-thumb {\n background: currentColor;\n border: 0;\n width: var(--thumb-width, var(--thumb-height));\n border-radius: var(--thumb-width, var(--thumb-height));\n }\n\n &::-moz-range-track {\n width: 100%;\n background: var(--track-color);\n }\n\n &::-moz-range-progress {\n appearance: none;\n background: currentColor;\n transition-delay: 30ms;\n }\n\n &::-moz-range-track,\n &::-moz-range-progress {\n height: calc(var(--track-height) + 0.0625rem);\n border-radius: var(--track-height);\n }\n\n &:disabled::-moz-range-thumb {\n cursor: not-allowed;\n }\n`\n"],"names":["StyledCustomRange","input","attrs","type","styled","templateObject_1","__makeTemplateObject"],"mappings":"0HAKaA,qFAA0B,QAACC,MAAMC,MAAM,CAAEC,KAAM,SAA3BC,CAAqCC,IAAAA,EAAAC,EAAAA,qBAAA,CAAA,29EAAA,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nethesis/phone-island",
3
3
  "author": "Nethesis",
4
- "version": "0.7.73",
4
+ "version": "0.7.75",
5
5
  "description": "NethVoice CTI Phone Island",
6
6
  "keywords": [
7
7
  "nethserver",