@nethesis/phone-island 0.7.53 → 0.7.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +2 -2
- package/dist/App.js +1 -1
- package/dist/App.js.map +1 -1
- package/dist/components/AlertGuard.d.ts +12 -0
- package/dist/components/AlertGuard.js +2 -0
- package/dist/components/AlertGuard.js.map +1 -0
- package/dist/components/AlertView/Alert.d.ts +8 -0
- package/dist/components/AlertView/Alert.js +2 -0
- package/dist/components/AlertView/Alert.js.map +1 -0
- package/dist/components/AlertView/index.d.ts +6 -0
- package/dist/components/AlertView/index.js +2 -0
- package/dist/components/AlertView/index.js.map +1 -0
- package/dist/components/Button.js +1 -1
- package/dist/components/Button.js.map +1 -1
- package/dist/components/CallView/Actions.d.ts +3 -0
- package/dist/components/CallView/Actions.js +2 -0
- package/dist/components/CallView/Actions.js.map +1 -0
- package/dist/components/CallView/Avatar.d.ts +3 -0
- package/dist/components/CallView/Avatar.js +2 -0
- package/dist/components/CallView/Avatar.js.map +1 -0
- package/dist/components/CallView/DisplayName.d.ts +5 -0
- package/dist/components/CallView/DisplayName.js +2 -0
- package/dist/components/CallView/DisplayName.js.map +1 -0
- package/dist/components/CallView/Number.d.ts +3 -0
- package/dist/components/CallView/Number.js +2 -0
- package/dist/components/CallView/Number.js.map +1 -0
- package/dist/components/CallView/Timer.d.ts +3 -0
- package/dist/components/CallView/Timer.js +2 -0
- package/dist/components/CallView/Timer.js.map +1 -0
- package/dist/components/CallView/index.d.ts +8 -0
- package/dist/components/CallView/index.js +2 -0
- package/dist/components/CallView/index.js.map +1 -0
- package/dist/components/Events.js +1 -1
- package/dist/components/Events.js.map +1 -1
- package/dist/components/Island.d.ts +9 -6
- package/dist/components/Island.js +1 -1
- package/dist/components/Island.js.map +1 -1
- package/dist/components/KeypadView/index.d.ts +1 -0
- package/dist/components/KeypadView/index.js +2 -0
- package/dist/components/KeypadView/index.js.map +1 -0
- package/dist/components/RestAPI.js +1 -1
- package/dist/components/RestAPI.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +1 -1
- package/dist/events/CallEvents.js +1 -1
- package/dist/events/CallEvents.js.map +1 -1
- package/dist/events/SocketEvents.d.ts +13 -1
- package/dist/events/SocketEvents.js +1 -1
- package/dist/events/SocketEvents.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/lib/devices/devices.d.ts +1 -1
- package/dist/lib/devices/devices.js +1 -1
- package/dist/lib/devices/devices.js.map +1 -1
- package/dist/lib/island/island.d.ts +8 -0
- package/dist/lib/island/island.js +2 -0
- package/dist/lib/island/island.js.map +1 -0
- package/dist/lib/phone/audio.d.ts +1 -1
- package/dist/lib/phone/audio.js +1 -1
- package/dist/lib/phone/audio.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/phone/conversation.d.ts +2 -8
- package/dist/lib/phone/conversation.js.map +1 -1
- package/dist/lib/storage/local_storage.d.ts +0 -22
- package/dist/lib/storage/local_storage.js +1 -1
- package/dist/lib/storage/local_storage.js.map +1 -1
- package/dist/lib/user/default_device.js +1 -1
- package/dist/lib/user/default_device.js.map +1 -1
- package/dist/lib/user/extensions.d.ts +15 -0
- package/dist/lib/user/extensions.js +2 -0
- package/dist/lib/user/extensions.js.map +1 -0
- package/dist/lib/webrtc/connection.d.ts +6 -0
- package/dist/lib/webrtc/connection.js +2 -0
- package/dist/lib/webrtc/connection.js.map +1 -0
- package/dist/lib/webrtc/extension.d.ts +4 -0
- package/dist/lib/webrtc/extension.js +2 -0
- package/dist/lib/webrtc/extension.js.map +1 -0
- package/dist/lib/webrtc/messages.js +1 -1
- package/dist/lib/webrtc/messages.js.map +1 -1
- package/dist/models/alerts.d.ts +61 -0
- package/dist/models/alerts.js +2 -0
- package/dist/models/alerts.js.map +1 -0
- package/dist/models/animations.d.ts +22 -0
- package/dist/models/animations.js +2 -0
- package/dist/models/animations.js.map +1 -0
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/models/currentUser.d.ts +47 -3
- package/dist/models/currentUser.js +1 -1
- package/dist/models/currentUser.js.map +1 -1
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.js +1 -1
- package/dist/models/index.js.map +1 -1
- package/dist/models/island.d.ts +24 -5
- package/dist/models/island.js +1 -1
- package/dist/models/island.js.map +1 -1
- package/dist/models/player.d.ts +6 -4
- package/dist/models/player.js +1 -1
- package/dist/models/player.js.map +1 -1
- package/dist/models/users.d.ts +7 -1
- package/dist/models/users.js +1 -1
- package/dist/models/users.js.map +1 -1
- package/dist/models/webrtc.d.ts +68 -0
- package/dist/models/webrtc.js +1 -1
- package/dist/models/webrtc.js.map +1 -1
- package/dist/node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js +1 -1
- package/dist/node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js.map +1 -1
- package/dist/styles/Island.styles.d.ts +11 -7
- package/dist/styles/Island.styles.js +1 -1
- package/dist/styles/Island.styles.js.map +1 -1
- package/dist/types/conversation.d.ts +15 -13
- package/dist/types/index.d.ts +1 -0
- package/dist/types/socket.d.ts +45 -0
- package/dist/{lib/webrtc/types.d.ts → types/webrtc.d.ts} +1 -1
- package/dist/utils/customHooks/useCommittedRef.js.map +1 -0
- package/dist/utils/customHooks/useEventCallback.js.map +1 -0
- package/dist/utils/customHooks/useEventListener.js.map +1 -0
- package/dist/utils/customHooks/useIsomorphicLayoutEffect.d.ts +2 -0
- package/dist/utils/customHooks/useIsomorphicLayoutEffect.js.map +1 -0
- package/dist/utils/customHooks/useLocalStorage.js.map +1 -0
- package/dist/utils/customHooks/useLongPress.js.map +1 -0
- package/dist/utils/genericFunctions/classNames.d.ts +7 -0
- package/dist/utils/genericFunctions/classNames.js +2 -0
- package/dist/utils/genericFunctions/classNames.js.map +1 -0
- package/dist/utils/{eventDispatch.d.ts → genericFunctions/eventDispatch.d.ts} +1 -1
- package/dist/utils/{eventDispatch.js → genericFunctions/eventDispatch.js} +1 -1
- package/dist/utils/genericFunctions/eventDispatch.js.map +1 -0
- package/dist/utils/genericFunctions/localStorage.d.ts +19 -0
- package/dist/utils/genericFunctions/localStorage.js +2 -0
- package/dist/utils/genericFunctions/localStorage.js.map +1 -0
- package/dist/utils/{getTranslate.d.ts → genericFunctions/styleTransformValues.d.ts} +1 -1
- package/dist/utils/genericFunctions/styleTransformValues.js +2 -0
- package/dist/utils/genericFunctions/styleTransformValues.js.map +1 -0
- package/dist/utils/genericFunctions/withTimeout.d.ts +8 -0
- package/dist/utils/genericFunctions/withTimeout.js +2 -0
- package/dist/utils/genericFunctions/withTimeout.js.map +1 -0
- package/dist/utils/index.d.ts +11 -9
- package/package.json +1 -1
- package/dist/utils/eventDispatch.js.map +0 -1
- package/dist/utils/getTranslate.js +0 -2
- package/dist/utils/getTranslate.js.map +0 -1
- package/dist/utils/useCommittedRef.js.map +0 -1
- package/dist/utils/useCurrentCallStore.d.ts +0 -6
- package/dist/utils/useCurrentCallStore.js +0 -2
- package/dist/utils/useCurrentCallStore.js.map +0 -1
- package/dist/utils/useCurrentUserStore.d.ts +0 -6
- package/dist/utils/useCurrentUserStore.js +0 -2
- package/dist/utils/useCurrentUserStore.js.map +0 -1
- package/dist/utils/useEventCallback.js.map +0 -1
- package/dist/utils/useEventListener.js.map +0 -1
- package/dist/utils/useIsomorphicLayoutEffect.d.ts +0 -2
- package/dist/utils/useIsomorphicLayoutEffect.js.map +0 -1
- package/dist/utils/useLocalStorage.js.map +0 -1
- package/dist/utils/useLongPress.js.map +0 -1
- package/dist/utils/useWebRTCStore.d.ts +0 -2
- package/dist/utils/useWebRTCStore.js +0 -2
- package/dist/utils/useWebRTCStore.js.map +0 -1
- /package/dist/utils/{useCommittedRef.d.ts → customHooks/useCommittedRef.d.ts} +0 -0
- /package/dist/utils/{useCommittedRef.js → customHooks/useCommittedRef.js} +0 -0
- /package/dist/utils/{useEventCallback.d.ts → customHooks/useEventCallback.d.ts} +0 -0
- /package/dist/utils/{useEventCallback.js → customHooks/useEventCallback.js} +0 -0
- /package/dist/utils/{useEventListener.d.ts → customHooks/useEventListener.d.ts} +0 -0
- /package/dist/utils/{useEventListener.js → customHooks/useEventListener.js} +0 -0
- /package/dist/utils/{useIsomorphicLayoutEffect.js → customHooks/useIsomorphicLayoutEffect.js} +0 -0
- /package/dist/utils/{useLocalStorage.d.ts → customHooks/useLocalStorage.d.ts} +0 -0
- /package/dist/utils/{useLocalStorage.js → customHooks/useLocalStorage.js} +0 -0
- /package/dist/utils/{useLongPress.d.ts → customHooks/useLongPress.d.ts} +0 -0
- /package/dist/utils/{useLongPress.js → customHooks/useLongPress.js} +0 -0
- /package/dist/utils/{useWaitResolution.d.ts → customHooks/useWaitResolution.d.ts} +0 -0
package/dist/App.d.ts
CHANGED
package/dist/App.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),r=require("./components/WebRTC.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./components/Events.js"),s=require("./components/Socket.js"),r=require("./components/WebRTC.js"),o=require("./components/Island.js"),n=require("./components/RestAPI.js");require("./components/AudioBars.js"),require("./node_modules/react-redux/es/index.js"),require("./node_modules/@fortawesome/react-fontawesome/index.es.js");var a=require("./store/index.js"),u=require("./node_modules/js-base64/base64.mjs.js"),d=require("./node_modules/react-redux/es/components/Provider.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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"),require("./node_modules/react-redux/es/components/Context.js");var i=l(e),c=function(e){var l=e.dataConfig,c=e.showAlways,m=void 0!==c&&c,j=u.Base64.atob(l||"").split(":"),f=j[0],p=j[1],q=j[2],x=j[3],h=j[4];return i.default.createElement(i.default.Fragment,null,i.default.createElement(d.default,{store:a.store},i.default.createElement(r.WebRTC,{hostName:f,sipExten:x,sipSecret:h},i.default.createElement(n.RestAPI,{hostName:f,username:p,authToken:q},i.default.createElement(s.Socket,{hostName:f,username:p,authToken:q},i.default.createElement(t.Events,null,i.default.createElement(o.Island,{showAlways:m})))))))};c.displayName="PhoneIsland",exports.PhoneIsland=c;
|
|
2
2
|
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { Events, WebRTC } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport {
|
|
1
|
+
{"version":3,"file":"App.js","sources":["../src/App.tsx"],"sourcesContent":["import React, { type FC } from 'react'\nimport { Events, Socket, WebRTC, Island, RestAPI } from './components'\nimport { Provider } from 'react-redux'\nimport { store } from './store'\nimport { Base64 } from 'js-base64'\n\ninterface PhoneIslandProps {\n dataConfig: string\n showAlways?: boolean\n}\n\nexport const PhoneIsland: FC<PhoneIslandProps> = ({ dataConfig, showAlways = false }) => {\n const CONFIG: string[] = Base64.atob(dataConfig || '').split(':')\n const HOST_NAME: string = CONFIG[0]\n const USERNAME: string = CONFIG[1]\n const AUTH_TOKEN: string = CONFIG[2]\n const SIP_EXTEN: string = CONFIG[3]\n const SIP_SECRET: string = CONFIG[4]\n\n return (\n <>\n <Provider store={store}>\n <WebRTC hostName={HOST_NAME} sipExten={SIP_EXTEN} sipSecret={SIP_SECRET}>\n <RestAPI hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Socket hostName={HOST_NAME} username={USERNAME} authToken={AUTH_TOKEN}>\n <Events>\n <Island showAlways={showAlways} />\n </Events>\n </Socket>\n </RestAPI>\n </WebRTC>\n </Provider>\n </>\n )\n}\n\nPhoneIsland.displayName = 'PhoneIsland'\n"],"names":["PhoneIsland","_a","dataConfig","_b","showAlways","CONFIG","Base64","atob","split","HOST_NAME","USERNAME","AUTH_TOKEN","SIP_EXTEN","SIP_SECRET","React","createElement","Fragment","Provider","store","WebRTC","hostName","sipExten","sipSecret","RestAPI","username","authToken","Socket","Events","Island","displayName"],"mappings":"i3BAWaA,EAAoC,SAACC,GAAE,IAAAC,eAAYC,EAAAF,EAAAG,WAAAA,OAAU,IAAAD,GAAQA,EAC1EE,EAAmBC,EAAMA,OAACC,KAAKL,GAAc,IAAIM,MAAM,KACvDC,EAAoBJ,EAAO,GAC3BK,EAAmBL,EAAO,GAC1BM,EAAqBN,EAAO,GAC5BO,EAAoBP,EAAO,GAC3BQ,EAAqBR,EAAO,GAElC,OACES,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAACE,EAAAA,QAAQ,CAACC,MAAOA,EAAAA,OACfJ,UAAAC,cAACI,EAAMA,OAAA,CAACC,SAAUX,EAAWY,SAAUT,EAAWU,UAAWT,GAC3DC,UAAAC,cAACQ,EAAOA,QAAA,CAACH,SAAUX,EAAWe,SAAUd,EAAUe,UAAWd,GAC3DG,UAAAC,cAACW,EAAMA,OAAA,CAACN,SAAUX,EAAWe,SAAUd,EAAUe,UAAWd,GAC1DG,UAAAC,cAACY,EAAAA,OAAM,KACLb,UAAAC,cAACa,EAAMA,OAAA,CAACxB,WAAYA,SAQpC,EAEAJ,EAAY6B,YAAc"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type FC, type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Manages the logic of alerts as connection errors or permissions
|
|
4
|
+
*
|
|
5
|
+
* @param children
|
|
6
|
+
* @returns
|
|
7
|
+
*/
|
|
8
|
+
export declare const AlertGuard: FC<AlertGuard>;
|
|
9
|
+
interface AlertGuard {
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
@@ -0,0 +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("./AlertView/index.js"),t=require("../node_modules/react-redux/es/hooks/useSelector.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=u(e);exports.AlertGuard=function(e){var u=e.children,l=t.useSelector((function(e){return e.alerts.status})),a=l.activeAlertsCount,c=l.breakActiveAlertsCount;t.useSelector((function(e){return e.island})).isOpen;var o=t.useSelector((function(e){return e.currentCall}));return o.incoming,o.accepted,n.default.createElement(n.default.Fragment,null,a>0&&n.default.createElement(r.default,null),0===c&&u)};
|
|
2
|
+
//# sourceMappingURL=AlertGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AlertGuard.js","sources":["../../src/components/AlertGuard.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useEffect, type FC, type ReactNode } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport AlertView from './AlertView'\n\n/**\n * Manages the logic of alerts as connection errors or permissions\n *\n * @param children\n * @returns\n */\n\nexport const AlertGuard: FC<AlertGuard> = ({ children }) => {\n // Get alert status from alerts store\n const { activeAlertsCount, breakActiveAlertsCount } = useSelector(\n (state: RootState) => state.alerts.status,\n )\n // Get isOpen form island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n // Get currentCall statuses from currentCall store\n const { incoming, accepted } = useSelector((state: RootState) => state.currentCall)\n\n return (\n <>\n {activeAlertsCount > 0 && <AlertView />}\n {breakActiveAlertsCount === 0 && children}\n </>\n )\n}\n\ninterface AlertGuard {\n children: ReactNode\n}\n"],"names":["_a","children","_b","useSelector","state","alerts","status","activeAlertsCount","breakActiveAlertsCount","island","_c","currentCall","React","createElement","Fragment","AlertView"],"mappings":"2VAe0C,SAACA,GAAE,IAAAC,EAAQD,EAAAC,SAE7CC,EAAgDC,EAAAA,aACpD,SAACC,GAAqB,OAAAA,EAAMC,OAAOC,MAAM,IADnCC,EAAiBL,EAAAK,kBAAEC,EAAsBN,EAAAM,uBAI9BL,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMK,MAAM,WAE3D,IAAAC,EAAyBP,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMO,WAAN,IAEjE,6BACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACGP,EAAoB,GAAKK,EAAAA,QAAAC,cAACE,EAAAA,QAAY,MACX,IAA3BP,GAAgCP,EAGvC"}
|
|
@@ -0,0 +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 s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=s(e),l={base:"border-4 rounded-2xl p-6 flex gap-5 items-center",red:"border-red-600",orange:"border-orange-600",green:"border-green-600"};exports.default=function(e){var s=e.color,o=e.message;return n.default.createElement("div",{className:t.classNames(l.base,l[s])},n.default.createElement("div",{className:"w-12 h-12 rounded-xl bg-gray-300 shrink-0 flex justify-center items-center"},"green"===s?n.default.createElement(a.FontAwesomeIcon,{icon:r.faCircleCheck,size:"xl",className:"text-black"}):"orange"===s?n.default.createElement(a.FontAwesomeIcon,{icon:r.faTriangleExclamation,size:"xl",className:"text-black"}):n.default.createElement(a.FontAwesomeIcon,{icon:r.faCircleXmark,size:"xl",className:"text-black"})),n.default.createElement("div",{className:"text-base font-bold"},o))};
|
|
2
|
+
//# sourceMappingURL=Alert.js.map
|
|
@@ -0,0 +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,mDACNC,IAAK,iBACLC,OAAQ,oBACRC,MAAO,oCAGqB,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,8EACF,UAAVJ,EACCE,UAAAC,cAACG,EAAAA,gBAAe,CAACC,KAAMC,EAAaA,cAAEC,KAAK,KAAKL,UAAU,eAC9C,WAAVJ,EACFE,EAAA,QAAAC,cAACG,EAAAA,gBAAe,CAACC,KAAMG,EAAqBA,sBAAED,KAAK,KAAKL,UAAU,eAElEF,EAAAA,sBAACI,EAAeA,gBAAA,CAACC,KAAMI,gBAAeF,KAAK,KAAKL,UAAU,gBAG9DF,EAAK,QAAAC,cAAA,MAAA,CAAAC,UAAU,uBAAuBH,GAG5C"}
|
|
@@ -0,0 +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})})))};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,2CAA2CC,MAAO,CAC/DC,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("../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"),t=require("../utils/genericFunctions/classNames.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=a(r);exports.Button=function(r){var a=r.children,o=r.variant,s=r.active,i=void 0!==s&&s,u=e.__rest(r,["children","variant","active"]),c={base:"flex content-center items-center justify-center font-medium tracking-wide duration-200 transform focus:outline-none focus:ring-2 focus:z-20 focus:ring-offset-2 disabled:opacity-75 text-white border border-transparent focus:ring-offset-black rounded-full text-sm leading-4 h-12 w-12 col-start-auto transition-color",variant:{red:"bg-red-600 hover:bg-red-700 focus:ring-red-500",green:"bg-green-600 hover:bg-green-700 focus:ring-green-500",default:"hover:bg-gray-500 focus:ring-gray-500",neutral:"bg-transparent hover:bg-gray-500 hover:border-gray-500 border border-gray-700 focus:ring-0"},background:{base:{default:"bg-gray-700"},active:{default:"bg-gray-500"}}};return n.default.createElement(n.default.Fragment,null,n.default.createElement("button",e.__assign({"data-stop-propagation":!0,className:t.classNames(i&&c.background.active[o]?c.background.active[o]:c.background.base[o]&&c.background.base[o],c.base,o&&c.variant[o])},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 {
|
|
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'\n active?: boolean\n}\n\nexport const Button: FC<ButtonProps> = ({ children, variant, active = false, ...props }) => {\n const styles = {\n base: 'flex content-center items-center justify-center font-medium tracking-wide duration-200 transform focus:outline-none focus:ring-2 focus:z-20 focus:ring-offset-2 disabled:opacity-75 text-white border border-transparent focus:ring-offset-black rounded-full text-sm leading-4 h-12 w-12 col-start-auto transition-color',\n variant: {\n red: 'bg-red-600 hover:bg-red-700 focus:ring-red-500',\n green: 'bg-green-600 hover:bg-green-700 focus:ring-green-500',\n default: 'hover:bg-gray-500 focus:ring-gray-500',\n neutral:\n 'bg-transparent hover:bg-gray-500 hover:border-gray-500 border border-gray-700 focus:ring-0',\n },\n background: {\n base: {\n default: 'bg-gray-700',\n },\n active: {\n default: 'bg-gray-500',\n },\n },\n }\n\n return (\n <>\n <button\n data-stop-propagation={true}\n className={classNames(\n active && styles.background.active[variant]\n ? styles.background.active[variant]\n : styles.background.base[variant] && styles.background.base[variant],\n styles.base,\n variant && styles.variant[variant],\n )}\n {...props}\n >\n {children}\n </button>\n </>\n )\n}\n"],"names":["_a","children","variant","_b","active","props","__rest","styles","base","red","green","default","neutral","background","React","createElement","Fragment","__assign","className","classNames"],"mappings":"kSAYuC,SAACA,GAAE,IAAAC,EAAQD,EAAAC,SAAEC,EAAOF,EAAAE,QAAEC,EAAcH,EAAAI,OAAdA,OAAM,IAAAD,GAAQA,EAAKE,EAAKC,EAAAA,OAAAN,EAA7C,iCAChCO,EAAS,CACbC,KAAM,4TACNN,QAAS,CACPO,IAAK,iDACLC,MAAO,uDACPC,QAAS,wCACTC,QACE,8FAEJC,WAAY,CACVL,KAAM,CACJG,QAAS,eAEXP,OAAQ,CACNO,QAAS,iBAKf,OACEG,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAAC,cAAA,SAAAE,EAAAA,SAAA,CAAA,yBACyB,EACvBC,UAAWC,EAAAA,WACTf,GAAUG,EAAOM,WAAWT,OAAOF,GAC/BK,EAAOM,WAAWT,OAAOF,GACzBK,EAAOM,WAAWL,KAAKN,IAAYK,EAAOM,WAAWL,KAAKN,GAC9DK,EAAOC,KACPN,GAAWK,EAAOL,QAAQA,KAExBG,GAEHJ,GAIT"}
|
|
@@ -0,0 +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/PhoneKeyboardLight.js"),s=require("../../static/icons/PhoneKeyboardSolid.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 u=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../node_modules/react-redux/es/hooks/useSelector.js"),l=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=i.useSelector((function(e){return e.currentCall})),c=e.paused,f=e.muted,m=i.useSelector((function(e){return e.island})).view,j=l.useDispatch();return d.default.createElement("div",{className:"grid grid-cols-4 auto-cols-max gap-y-5 justify-items-center place-items-center justify-center"},d.default.createElement(a.Button,{variant:"default",active:!!c,onClick:function(){return c?r.unpauseCurrentCall():r.pauseCurrentCall()}},c?d.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:o.faPlay}):d.default.createElement(u.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(u.FontAwesomeIcon,{size:"xl",icon:o.faMicrophoneSlash}):d.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:t.faMicrophone})),d.default.createElement(a.Button,{variant:"default"},d.default.createElement(u.FontAwesomeIcon,{size:"xl",icon:t.faRightLeft})),d.default.createElement(a.Button,{variant:"default",onClick:function(){j.island.setIslandView("keyboard"!==m?"keyboard":"call")}},"keyboard"===m?d.default.createElement(s.default,null):d.default.createElement(n.default,null)))};
|
|
2
|
+
//# sourceMappingURL=Actions.js.map
|
|
@@ -0,0 +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 PhoneKeyboardLight from '../../static/icons/PhoneKeyboardLight'\nimport PhoneKeyboardSolid from '../../static/icons/PhoneKeyboardSolid'\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 openKeyboard() {\n dispatch.island.setIslandView(view !== 'keyboard' ? 'keyboard' : '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={openKeyboard}>\n {view === 'keyboard' ? <PhoneKeyboardSolid /> : <PhoneKeyboardLight />}\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","PhoneKeyboardSolid","PhoneKeyboardLight"],"mappings":"6kCAuBoB,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,iGACbF,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,aAATxB,EAAsB,WAAa,OAClE,GA8Be,aAATA,EAAsBI,EAAAA,QAACC,cAAAoB,UAAqB,MAAGrB,EAAAA,QAACC,cAAAqB,EAAkB,QAAG,OAI9E"}
|
|
@@ -0,0 +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"),a=require("../../node_modules/react-redux/es/hooks/useSelector.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=o(e),i=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=a.useSelector((function(e){return e.currentCall})).username,r=a.useSelector((function(e){return e.avatars})).avatars,o=a.useSelector((function(e){return e.island})).isOpen,u=a.useSelector((function(e){return e.currentCall})),d=u.incoming,l=u.outgoing,c=u.accepted;return n.default.createElement(t.framerMotion.exports.motion.div,{className:"relative",animate:o?"open":"closed",variants:s},(d||l&&!c)&&n.default.createElement(t.framerMotion.exports.motion.div,{style:{animation:"ping 2s cubic-bezier(0, 0, 0.2, 1) infinite",borderRadius:"4px"},animate:o?"open":"closed",variants:s,className:"rounded-xl bg-white absolute opacity-60 -z-10 top-0 left-0 animate-ping h-12 w-12"}),n.default.createElement(i,{className:"z-10 h-12 w-12 bg-gray-300 rounded-sm",style:{backgroundImage:"url(".concat(r&&r[e]&&r[e],")"),backgroundRepeat:"no-repeat",backgroundSize:"contain"},animate:o?"open":"closed",variants:s}))};
|
|
2
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +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,WAAWC,QAASV,EAAS,OAAS,SAAUW,SAAUtB,IAC5Ec,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,sFAGfH,EAAA,QAAAC,cAACrB,EACC,CAAAuB,UAAU,wCACVG,MAAO,CACLE,gBAAiB,OAAAC,OAAOhB,GAAWA,EAAQJ,IAAaI,EAAQJ,GAAY,KAC5EqB,iBAAkB,YAClBC,eAAgB,WAElBP,QAASV,EAAS,OAAS,SAC3BW,SAAUtB,IAIlB"}
|
|
@@ -0,0 +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 a=u(e);exports.default=function(){var u=e.useState(!1),o=u[0],i=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&&i(!0)})),a.default.createElement(c,{ref:s,className:"whitespace-nowrap overflow-hidden"},a.default.createElement("div",{className:"w-fit relative inline-block ".concat(o&&"animate-animated-text"),ref:l},d&&"<unknown>"===d?"PBX":d&&d))};
|
|
2
|
+
//# sourceMappingURL=DisplayName.js.map
|
|
@@ -0,0 +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,sCACxCH,UAAAC,cAAA,MAAA,CACEE,UAAW,+BAA+BC,OAAAnB,GAAe,yBACzDiB,IAAKb,GAEJI,GAA+B,cAAhBA,EAA8B,MAAQA,GAAeA,GAI7E"}
|
|
@@ -0,0 +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("../../styles/Island.styles.js"),t=require("../../node_modules/react-redux/es/hooks/useSelector.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=u(e);exports.default=function(){var e=t.useSelector((function(e){return e.currentCall})).number,u=t.useSelector((function(e){return e.island})).isOpen;return n.default.createElement(r.StyledNumber,{isOpen:u},e&&"<unknown>"!==e&&e)};
|
|
2
|
+
//# sourceMappingURL=Number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Number.js","sources":["../../../src/components/CallView/Number.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 { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledNumber } from '../../styles/Island.styles'\n\nconst Number: FC = () => {\n const { number } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n return <StyledNumber isOpen={isOpen}>{number && number !== '<unknown>' && number}</StyledNumber>\n}\n\nexport default Number\n"],"names":["number","useSelector","state","currentCall","isOpen","island","React","createElement","StyledNumber"],"mappings":"uWAQmB,WACT,IAAAA,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,sBACnDC,EAAWH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,iBAE3D,OAAOC,UAACC,cAAAC,EAAYA,aAAC,CAAAJ,OAAQA,GAASJ,GAAqB,cAAXA,GAA0BA,EAC5E"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../styles/Island.styles.js"),r=require("../../node_modules/react-moment/dist/index.js"),u=require("../../node_modules/react-redux/es/hooks/useSelector.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e);exports.default=function(){var n=e.useState(0),s=n[0],l=n[1],i=u.useSelector((function(e){return e.currentCall})).startTime,o=u.useSelector((function(e){return e.island})).isOpen;return e.useEffect((function(){if(i){var e=(new Date).getTime()/1e3-Number(i);e<0&&l(e)}}),[i]),a.default.createElement(a.default.Fragment,null,null!=i&&a.default.createElement(t.StyledTimer,{isOpen:o},a.default.createElement(r.default,{date:Number(i)+s||(new Date).getTime()/1e3,interval:1e3,format:"h:mm:ss",trim:!1,unix:!0,durationFromNow:!0})))};
|
|
2
|
+
//# sourceMappingURL=Timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Timer.js","sources":["../../../src/components/CallView/Timer.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect, type FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledTimer } from '../../styles/Island.styles'\nimport Moment from 'react-moment'\n\nconst Timer: FC = () => {\n // Set timer negative differences\n const [timerNegativeDifference, setTimerNegativeDifference] = useState<number>(0)\n // Get multiple values from the currentCall store\n const { startTime } = useSelector((state: RootState) => state.currentCall)\n // Get isOpen from the island store\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n useEffect(() => {\n if (startTime) {\n const difference = new Date().getTime() / 1000 - Number(startTime)\n if (difference < 0) {\n setTimerNegativeDifference(difference)\n }\n }\n }, [startTime])\n\n return (\n <>\n {startTime != null && (\n <StyledTimer isOpen={isOpen}>\n <Moment\n date={Number(startTime) + timerNegativeDifference || new Date().getTime() / 1000}\n interval={1000}\n format='h:mm:ss'\n trim={false}\n unix\n durationFromNow\n />\n </StyledTimer>\n )}\n </>\n )\n}\n\nexport default Timer\n"],"names":["_a","useState","timerNegativeDifference","setTimerNegativeDifference","startTime","useSelector","state","currentCall","isOpen","island","useEffect","difference","Date","getTime","Number","React","createElement","Fragment","StyledTimer","Moment","date","interval","format","trim","unix","durationFromNow"],"mappings":"kaASkB,WAEV,IAAAA,EAAwDC,EAAAA,SAAiB,GAAxEC,EAAuBF,EAAA,GAAEG,EAA0BH,EAAA,GAElDI,EAAcC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,yBAEtDC,EAAWH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,iBAW3D,OATAC,EAAAA,WAAU,WACR,GAAIN,EAAW,CACb,IAAMO,GAAa,IAAIC,MAAOC,UAAY,IAAOC,OAAOV,GACpDO,EAAa,GACfR,EAA2BQ,EAE9B,CACH,GAAG,CAACP,IAGFW,EAAA,QAAAC,cAAAD,UAAAE,SAAA,KACgB,MAAbb,GACCW,EAAA,QAAAC,cAACE,EAAWA,YAAA,CAACV,OAAQA,GACnBO,EAAAA,QAAAC,cAACG,UACC,CAAAC,KAAMN,OAAOV,GAAaF,IAA2B,IAAIU,MAAOC,UAAY,IAC5EQ,SAAU,IACVC,OAAO,UACPC,MAAM,EACNC,QACAC,iBAAe,KAM3B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../styles/Island.styles.js");require("../../node_modules/framer-motion/dist/framer-motion.js"),require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),a=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 i=require("../Button.js"),o=require("../AudioBars.js"),l=require("./Timer.js"),u=require("./Number.js"),s=require("./DisplayName.js"),d=require("./Avatar.js"),c=require("./Actions.js"),m=require("../../_virtual/framer-motion.js"),f=require("../../node_modules/react-redux/es/hooks/useSelector.js");function j(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var p=j(e),q=m.framerMotion.exports.motion(t.StyledCallView),g=m.framerMotion.exports.motion(t.StyledDetails);function E(e,t){return!e&&!t}exports.default=function(){var e=f.useSelector((function(e){return e.currentCall})),j=e.incoming,y=e.accepted,x=e.outgoing,v=f.useSelector((function(e){return e.island})).isOpen,_=f.useSelector((function(e){return e.webrtc})).remoteAudioStream;return p.default.createElement(q,{incoming:j,accepted:y,outgoing:x,isOpen:v},p.default.createElement(t.StyledTopContent,{isOpen:v,incoming:j,accepted:y,outgoing:x},p.default.createElement(d.default,null),v&&p.default.createElement(g,null,p.default.createElement(s.default,null),y?p.default.createElement(l.default,null):p.default.createElement(u.default,null)),!v&&!y&&p.default.createElement(s.default,null),!v&&y&&p.default.createElement(l.default,null),y&&_&&p.default.createElement(m.framerMotion.exports.motion.div,{initial:{opacity:0},animate:{opacity:1}},p.default.createElement(o.AudioBars,{audioStream:_,size:v?"large":"small"}))),v&&p.default.createElement(m.framerMotion.exports.motion.div,{className:"grid gap-y-5",initial:{opacity:0},animate:{opacity:1}},y&&p.default.createElement(c.default,null),p.default.createElement(m.framerMotion.exports.motion.div,{className:"grid ".concat(E(x,y)?"grid-cols-2":y?"grid-cols-1 justify-items-center":"grid-cols-1 justify-items-end"," gap-3.5"),animate:{opacity:1}},p.default.createElement(i.Button,{onClick:n.hangupCurrentCall,variant:"red"},p.default.createElement(r.FontAwesomeIcon,{className:"rotate-135 w-6 h-6",icon:a.faPhone})),E(x,y)&&p.default.createElement(i.Button,{onClick:n.answerIncomingCall,variant:"green"},p.default.createElement(r.FontAwesomeIcon,{className:"w-6 h-6",icon:a.faPhone})))))};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 { motion } from 'framer-motion/dist/framer-motion'\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\nconst CallViewMotion = motion(StyledCallView)\nconst DetailsMotion = motion(StyledDetails)\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 <CallViewMotion incoming={incoming} accepted={accepted} outgoing={outgoing} isOpen={isOpen}>\n <StyledTopContent isOpen={isOpen} incoming={incoming} accepted={accepted} outgoing={outgoing}>\n <Avatar />\n {isOpen && (\n <DetailsMotion>\n <DisplayName />\n {/* The timer when expanded */}\n {accepted ? <Timer /> : <Number />}\n </DetailsMotion>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <Timer />}\n {accepted && remoteAudioStream && (\n <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>\n <AudioBars audioStream={remoteAudioStream} size={isOpen ? 'large' : 'small'} />\n </motion.div>\n )}\n </StyledTopContent>\n {isOpen && (\n <motion.div className='grid gap-y-5' initial={{ opacity: 0 }} animate={{ opacity: 1 }}>\n {accepted && <Actions />}\n <motion.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 animate={{ opacity: 1 }}\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 </motion.div>\n </motion.div>\n )}\n </CallViewMotion>\n )\n}\n\nexport default CallView\n\nexport interface CallViewProps {}\n"],"names":["CallViewMotion","motion","StyledCallView","DetailsMotion","StyledDetails","isAnswerVisible","outgoing","accepted","_a","useSelector","state","currentCall","incoming","isOpen","island","remoteAudioStream","webrtc","React","createElement","StyledTopContent","Avatar","DisplayName","Timer","Number","framerMotion","exports","div","initial","opacity","animate","AudioBars","audioStream","size","className","Actions","concat","Button","onClick","hangupCurrentCall","variant","FontAwesomeIcon","icon","faPhone","answerIncomingCall"],"mappings":"2lCAmBMA,EAAiBC,EAAAA,aAAAA,QAAAA,OAAOC,EAAAA,gBACxBC,EAAgBF,EAAAA,aAAAA,QAAAA,OAAOG,EAAAA,eAE7B,SAASC,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,cAAAlB,GAAeY,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,EAAUO,OAAQA,GAClFI,EAAAA,QAAAC,cAACC,mBAAiB,CAAAN,OAAQA,EAAQD,SAAUA,EAAUL,SAAUA,EAAUD,SAAUA,GAClFW,UAAAC,cAACE,EAAM,QAAG,MACTP,GACCI,EAAA,QAAAC,cAACf,EAAa,KACZc,UAAAC,cAACG,EAAW,QAAG,MAEdd,EAAWU,EAAA,QAAAC,cAACI,EAAAA,QAAK,MAAML,EAAA,QAAAC,cAACK,EAAAA,QAAM,QAIjCV,IAAWN,GAAYU,EAAA,QAAAC,cAACG,EAAW,QAAG,OAEtCR,GAAUN,GAAYU,EAAAA,QAAAC,cAACI,EAAAA,QAAQ,MAChCf,GAAYQ,GACXE,wBAAChB,EAAMuB,aAAAC,QAAAxB,OAACyB,IAAG,CAACC,QAAS,CAAEC,QAAS,GAAKC,QAAS,CAAED,QAAS,IACvDX,EAAAA,QAACC,cAAAY,aAAUC,YAAahB,EAAmBiB,KAAMnB,EAAS,QAAU,YAIzEA,GACCI,EAAA,QAAAC,cAACjB,EAAMuB,aAAAC,QAAAxB,OAACyB,IAAI,CAAAO,UAAU,eAAeN,QAAS,CAAEC,QAAS,GAAKC,QAAS,CAAED,QAAS,IAC/ErB,GAAYU,EAAC,QAAAC,cAAAgB,EAAAA,QAAU,MACxBjB,EAAAA,QAAAC,cAACjB,8BAAOyB,IAAG,CACTO,UAAW,QACTE,OAAA9B,EAAgBC,EAAUC,GACtB,cACAA,EACA,mCACA,gCAA+B,YAErCsB,QAAS,CAAED,QAAS,IAGpBX,EAAC,QAAAC,cAAAkB,UAAOC,QAASC,EAAiBA,kBAAEC,QAAQ,OAC1CtB,UAACC,cAAAsB,EAAAA,gBAAgB,CAAAP,UAAU,qBAAqBQ,KAAMC,EAAOA,WAG9DrC,EAAgBC,EAAUC,IACzBU,UAAAC,cAACkB,EAAMA,OAAA,CAACC,QAASM,qBAAoBJ,QAAQ,SAC3CtB,EAAAA,QAAAC,cAACsB,kBAAgB,CAAAP,UAAU,UAAUQ,KAAMC,EAAAA,aAQ3D"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../events/CallEvents.js");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=r(e);exports.Events=function(e){var r=e.children;return l.default.createElement(l.default.Fragment,null,l.default.createElement(t.CallEvents,null),r)};
|
|
2
2
|
//# sourceMappingURL=Events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Events.js","sources":["../../src/components/Events.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { CallEvents } from '../events'\n\ninterface EventsProps {\n children: ReactNode\n}\n\nexport const Events: FC<EventsProps> = ({ children }) => {\n return (\n <>\n {<CallEvents />}\n {children}\n </>\n )\n}\n"],"names":["_a","children","React","createElement","Fragment","CallEvents"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Events.js","sources":["../../src/components/Events.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC } from 'react'\nimport { CallEvents } from '../events'\n\ninterface EventsProps {\n children: ReactNode\n}\n\nexport const Events: FC<EventsProps> = ({ children }) => {\n return (\n <>\n {<CallEvents />}\n {children}\n </>\n )\n}\n"],"names":["_a","children","React","createElement","Fragment","CallEvents"],"mappings":"kOAUuC,SAACA,GAAE,IAAAC,EAAQD,EAAAC,SAChD,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACGF,UAAAC,cAACE,EAAUA,WAAG,MACdJ,EAGP"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { type FC } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Provides the Island logic
|
|
4
|
+
*
|
|
5
|
+
* @param showAlways Sets the Island ever visible
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
export declare const Island: FC<IslandProps>;
|
|
2
9
|
interface IslandProps {
|
|
3
|
-
|
|
10
|
+
showAlways?: boolean;
|
|
4
11
|
}
|
|
5
|
-
export declare const Island: {
|
|
6
|
-
({ always }: IslandProps): JSX.Element;
|
|
7
|
-
displayName: string;
|
|
8
|
-
};
|
|
9
12
|
export {};
|
|
@@ -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")
|
|
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"),o=require("../utils/customHooks/useLongPress.js"),u=require("../utils/genericFunctions/styleTransformValues.js");require("../node_modules/framer-motion/dist/framer-motion.js");var l=require("./CallView/index.js"),a=require("../lib/island/island.js"),s=require("./AlertGuard.js"),i=require("../_virtual/framer-motion.js"),d=require("../node_modules/react-redux/es/hooks/useSelector.js"),c=require("../node_modules/react-redux/es/hooks/useDispatch.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=f(t),p=function(f){var p=f.showAlways,x=d.useSelector((function(e){return e.currentCall})),v=x.incoming,y=x.accepted,g=x.outgoing,h=d.useSelector((function(e){return e.island})),j=h.isOpen,q=h.startPosition,w=d.useSelector((function(e){return e.alerts.status})).activeAlertsCount,E=d.useSelector((function(e){return e.animations})).variants,P=i.framerMotion.exports.useDragControls(),A=n.useLocalStorage("phone-island",null),S=A[0],V=A[1],_=t.useRef(null),b=t.useRef(null),D=t.useState(S&&S.position?S.position:null),I=D[0],R=D[1],k=t.useState(!1),C=k[0],L=k[1],M=c.useDispatch();var N=o.useLongPress((function(){}),(function(){M.island.toggleIsOpen()}),C,(function(){return L(!1)}),{shouldPreventDefault:!0,delay:250}),H=t.useRef(null),O=t.useRef(null),T=t.useRef(null),W=t.useRef(null),G=t.useRef(null);return r.useIsomorphicLayoutEffect((function(){M.player.updatePlayer({audioPlayer:H.current,localAudio:O.current,localVideo:W.current,remoteVideo:G.current,remoteAudio:T.current})}),[]),m.default.createElement("div",{ref:b,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"},(v||g||y||p||w>0)&&m.default.createElement(i.framerMotion.exports.motion.div,e.__assign({className:"font-sans absolute pointer-events-auto overflow-hidden bg-black text-xs cursor-pointer text-white",animate:j&&(v||g)&&!y?w>0?E.callView.expandedIncomingWithAlerts:E.callView.expandedIncoming:j&&y?w>0?E.callView.expandedAcceptedWithAlerts:E.callView.expandedAccepted:w>0?E.expandedWithAlerts:E.callView.collapsed,drag:!0,onPointerDown:function(e){P.start(e)},onDragStart:function(){L(!0)},dragTransition:{power:0},initial:{x:(null==I?void 0:I.x)||q.x,y:(null==I?void 0:I.y)||q.y},dragControls:P,dragConstraints:b,onDragEnd:function(){var e=u.styleTransformValues(_.current),t=e.x,r=e.y;t=a.xPosition(Math.round(t),_.current,b.current),r=a.yPosition(Math.round(r),_.current,b.current),V({position:{x:t,y:r}}),R({x:t,y:r})},ref:_},N),m.default.createElement(s.AlertGuard,null,m.default.createElement(l.default,null))),m.default.createElement("div",{className:"hidden"},m.default.createElement("audio",{ref:H}),m.default.createElement("audio",{muted:!0,ref:O}),m.default.createElement("audio",{autoPlay:!0,ref:T}),m.default.createElement("video",{muted:!0,autoPlay:!0,ref:W}),m.default.createElement("video",{autoPlay:!0,ref:G})))};p.displayName="Island",exports.Island=p;
|
|
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, useLayoutEffect, type FC } from 'react'\nimport {\n StyledAvatar,\n StyledDetails,\n StyledTimer,\n StyledPhoneIsland,\n StyledTopContent,\n StyledName,\n} from '../styles/Island.styles'\n\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone, faMicrophoneSlash, faPlay } from '@nethesis/nethesis-solid-svg-icons'\n\nimport { motion, useDragControls } from 'framer-motion/dist/framer-motion'\nimport { useLongPress } from '../utils/useLongPress'\nimport Moment from 'react-moment'\nimport { useLocalStorage, getTranslateValues } from '../utils'\nimport { AudioBars } from './AudioBars'\nimport { Button } from './Button'\n\nimport {\n hangupCurrentCall,\n answerIncomingCall,\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n} from '../lib/phone/call'\n\nimport {\n faPause as faPauseRegular,\n faMicrophone as faMicrophoneRegular,\n faRightLeft as faRightLeftRegualar,\n} from '@nethesis/nethesis-light-svg-icons'\n\nimport PhoneKeyboardLight from '../static/icons/PhoneKeyboardLight'\nimport PhoneKeyboardSolid from '../static/icons/PhoneKeyboardSolid'\n\nconst PhoneIslandMotion = motion(StyledPhoneIsland)\nconst AvatarMotion = motion(StyledAvatar)\nconst DetailsMotion = motion(StyledDetails)\nconst NameMotion = motion(StyledName)\n\nimport { useIsomorphicLayoutEffect } from '../utils'\n\ninterface IslandProps {\n always?: boolean\n}\n\ninterface PositionTypes {\n x: number\n y: number\n}\n\ninterface PhoneIslandStorageTypes {\n position: PositionTypes\n}\n\nconst ISLAND_STARTING_POSITION = {\n x: 0,\n y: 0,\n}\n\nexport const Island = ({ always }: IslandProps) => {\n const [isOpen, setIsOpen] = useState(true)\n // Get the currentCall info\n const { incoming, accepted, outgoing, displayName, number, startTime, muted, paused, username } =\n useSelector((state: RootState) => state.currentCall)\n\n const { localAudio: storeLocalAudio, remoteAudio: storeRemoteAudio } = useSelector(\n (state: RootState) => state.player,\n )\n\n const { view } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n\n const controls = useDragControls()\n\n const [phoneIslandStorage, setPhoneIslandStorage] =\n useLocalStorage<PhoneIslandStorageTypes | null>('phone-island', null)\n\n const islandRef = useRef<any>(null)\n\n const islandContainerRef = useRef<any>(null)\n\n const [position, setPosition] = useState<PositionTypes | null>(\n phoneIslandStorage && phoneIslandStorage.position ? phoneIslandStorage.position : null,\n )\n\n const [moved, setMoved] = useState<boolean>(false)\n\n const dispatch = useDispatch<Dispatch>()\n\n function isAnswerVisible() {\n return !outgoing && !accepted\n }\n\n function startDrag(event) {\n controls.start(event)\n }\n\n function handleAnswer(event) {\n answerIncomingCall()\n }\n\n function handleHangup(event) {\n event.stopPropagation()\n hangupCurrentCall()\n }\n\n const onLongPress = () => {\n console.log('long press trigger')\n }\n\n const islandClick = () => {\n setIsOpen(!isOpen)\n }\n\n function innerXPosition(x) {\n // Get horizontal constraints\n const xConstraintPosition =\n islandContainerRef.current.offsetWidth / 2 - islandRef.current.offsetWidth / 2\n\n // Return the X position inside the constraints\n return x > 0 && x > xConstraintPosition\n ? xConstraintPosition\n : x < 0 && x < -xConstraintPosition\n ? -xConstraintPosition\n : x\n }\n\n function innerYPosition(y) {\n // Get vertical constraints\n const yConstraintPosition =\n islandContainerRef.current.offsetHeight / 2 - islandRef.current.offsetHeight / 2\n\n // Return the Y position inside the constraints\n return y > 0 && y > yConstraintPosition\n ? yConstraintPosition\n : y < 0 && y < -yConstraintPosition\n ? -yConstraintPosition\n : y\n }\n\n const onDragEnd = () => {\n // Get initial translation values\n let { x, y }: any = getTranslateValues(islandRef.current)\n\n // Round position\n x = innerXPosition(Math.round(x))\n y = innerYPosition(Math.round(y))\n\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 function resetMoved() {\n setMoved(false)\n }\n\n function dragStarted() {\n setMoved(true)\n }\n\n const longPressEvent = useLongPress(onLongPress, islandClick, moved, resetMoved, {\n shouldPreventDefault: true,\n delay: 250,\n })\n\n const variants = {\n openIncoming: {\n width: '418px',\n height: '96px',\n borderRadius: '20px',\n },\n openAccepted: {\n width: '348px',\n height: '236px',\n borderRadius: '20px',\n },\n closed: {\n width: '168px',\n height: '40px',\n borderRadius: '99px',\n },\n }\n\n const 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\n const [audioStream, setAudioStream] = useState<MediaStream | null>(null)\n\n useEffect(() => {\n function audioStreamListener() {\n storeRemoteAudio?.addEventListener('play', () => {\n if (navigator.userAgent.indexOf('Firefox') > -1) {\n // @ts-ignore\n setAudioStream(storeRemoteAudio.mozCaptureStream())\n } else {\n // @ts-ignore\n setAudioStream(storeRemoteAudio.captureStream())\n }\n })\n }\n audioStreamListener()\n return () => {\n storeRemoteAudio?.removeEventListener('play', audioStreamListener)\n }\n }, [storeRemoteAudio])\n\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 localAudio: localAudio.current,\n localVideo: localVideo.current,\n remoteVideo: remoteVideo.current,\n remoteAudio: remoteAudio.current,\n })\n }, [])\n\n // Set timer negative differences\n const [timerNegativeDifference, setTimerNegativeDifference] = useState<number>(0)\n\n useEffect(() => {\n // Handle\n if (startTime) {\n const difference = new Date().getTime() / 1000 - Number(startTime)\n if (difference < 0) {\n setTimerNegativeDifference(difference)\n }\n }\n }, [startTime])\n\n const NumberToTimer: FC = () => (\n <StyledTimer isOpen={isOpen}>\n {accepted && startTime && timerNegativeDifference ? (\n <Moment\n date={Number(startTime) + timerNegativeDifference || new Date().getTime() / 1000}\n interval={1000}\n format='h:mm:ss'\n trim={false}\n unix\n durationFromNow\n />\n ) : (\n <>{number && number !== '<unknown>' && number}</>\n )}\n </StyledTimer>\n )\n\n interface DisplayNameProps {\n displayName: string\n }\n\n const DisplayName: FC<DisplayNameProps> = ({ displayName }) => {\n const [animateText, setAnimateText] = useState<boolean>(false)\n const nameContainer = useRef<null | HTMLDivElement>(null)\n const nameText = useRef<null | HTMLDivElement>(null)\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\n function openKeyboard() {\n dispatch.island.updateIsland({\n view: view !== 'keyboard' ? 'keyboard' : 'call',\n })\n }\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 || always) && (\n <PhoneIslandMotion\n className='font-sans absolute pointer-events-auto overflow-hidden'\n incoming={incoming}\n accepted={accepted}\n outgoing={outgoing}\n isOpen={isOpen}\n animate={\n isOpen && (incoming || outgoing) && !accepted\n ? 'openIncoming'\n : isOpen && accepted\n ? 'openAccepted'\n : 'closed'\n }\n variants={variants}\n drag\n onPointerDown={startDrag}\n onDragStart={dragStarted}\n dragTransition={{\n power: 0,\n }}\n initial={{\n x: position?.x || ISLAND_STARTING_POSITION.x,\n y: position?.y || ISLAND_STARTING_POSITION.y,\n }}\n style={{\n padding: isOpen ? '24px' : '8px 16px',\n }}\n dragControls={controls}\n dragConstraints={islandContainerRef}\n onDragEnd={onDragEnd}\n ref={islandRef}\n {...longPressEvent}\n >\n <StyledTopContent\n isOpen={isOpen}\n incoming={incoming}\n accepted={accepted}\n outgoing={outgoing}\n >\n <motion.div\n className='relative'\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n >\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 {isOpen && (\n <DetailsMotion>\n <DisplayName displayName={displayName} />\n {/* The timer when expanded */}\n <NumberToTimer />\n </DetailsMotion>\n )}\n {/* The display name when collepsed */}\n {!isOpen && !accepted && <DisplayName displayName={displayName} />}\n {/* The timer when collapsed */}\n {!isOpen && accepted && <NumberToTimer />}\n {accepted && (\n <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>\n <AudioBars audioStream={audioStream} size={isOpen ? 'large' : 'small'} />\n </motion.div>\n )}\n </StyledTopContent>\n {isOpen && (\n <motion.div className='grid gap-y-5' initial={{ opacity: 0 }} animate={{ opacity: 1 }}>\n {accepted && (\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={openKeyboard}>\n {view === 'keyboard' ? <PhoneKeyboardSolid /> : <PhoneKeyboardLight />}\n </Button>\n </div>\n )}\n <motion.div\n className={`grid ${\n isAnswerVisible()\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 animate={{ opacity: 1 }}\n >\n <Button onClick={handleHangup} variant='red'>\n <FontAwesomeIcon className='rotate-135 w-6 h-6' icon={faPhone} />\n </Button>\n {isAnswerVisible() && (\n <Button onClick={handleAnswer} variant='green'>\n <FontAwesomeIcon className='w-6 h-6' icon={faPhone} />\n </Button>\n )}\n </motion.div>\n </motion.div>\n )}\n </PhoneIslandMotion>\n )}\n <div className='hidden'>\n <audio autoPlay 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"],"names":["PhoneIslandMotion","motion","StyledPhoneIsland","AvatarMotion","StyledAvatar","DetailsMotion","StyledDetails","NameMotion","StyledName","ISLAND_STARTING_POSITION","Island","_a","always","_b","useState","isOpen","setIsOpen","_c","useSelector","state","currentCall","incoming","accepted","outgoing","displayName","number","startTime","muted","paused","username","_d","player","storeRemoteAudio","view","island","avatars","controls","useDragControls","_e","useLocalStorage","phoneIslandStorage","setPhoneIslandStorage","islandRef","useRef","islandContainerRef","_f","position","setPosition","_g","moved","setMoved","dispatch","useDispatch","isAnswerVisible","longPressEvent","useLongPress","console","log","shouldPreventDefault","delay","iconVariants","open","width","height","borderRadius","closed","_h","audioStream","setAudioStream","useEffect","audioStreamListener","addEventListener","navigator","userAgent","indexOf","mozCaptureStream","captureStream","removeEventListener","localAudio","remoteAudio","localVideo","remoteVideo","useIsomorphicLayoutEffect","updatePlayer","current","_j","timerNegativeDifference","setTimerNegativeDifference","difference","Date","getTime","Number","NumberToTimer","React","StyledTimer","createElement","Moment","date","interval","format","trim","unix","durationFromNow","Fragment","DisplayName","animateText","setAnimateText","nameContainer","nameText","useLayoutEffect","clientWidth","ref","className","concat","__assign","animate","variants","openIncoming","openAccepted","drag","onPointerDown","event","start","onDragStart","dragTransition","power","initial","x","y","style","padding","dragControls","dragConstraints","onDragEnd","getTranslateValues","xConstraintPosition","offsetWidth","innerXPosition","Math","round","yConstraintPosition","offsetHeight","innerYPosition","StyledTopContent","div","animation","backgroundImage","backgroundRepeat","backgroundSize","opacity","AudioBars","size","framerMotion","exports","Button","variant","active","onClick","unpauseCurrentCall","pauseCurrentCall","FontAwesomeIcon","icon","faPlay","faPauseRegular","unmuteCurrentCall","muteCurrentCall","faMicrophoneSlash","faMicrophoneRegular","faRightLeftRegualar","faRightLeft","updateIsland","PhoneKeyboardSolid","PhoneKeyboardLight","stopPropagation","hangupCurrentCall","faPhone","answerIncomingCall","autoPlay"],"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, 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 { xPosition, yPosition } from '../lib/island/island'\nimport { AlertGuard } from './AlertGuard'\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 } = 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\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 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 <motion.div\n className='font-sans absolute pointer-events-auto overflow-hidden bg-black text-xs cursor-pointer text-white'\n animate={\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 }\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 >\n {/* The views logic */}\n <AlertGuard>\n <CallView />\n </AlertGuard>\n </motion.div>\n )}\n <div className='hidden'>\n <audio 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","activeAlertsCount","alerts","status","variants","animations","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","player","updatePlayer","current","React","ref","className","motion","framerMotion","exports","div","__assign","animate","callView","expandedIncomingWithAlerts","expandedIncoming","expandedAcceptedWithAlerts","expandedAccepted","expandedWithAlerts","collapsed","drag","onPointerDown","event","start","onDragStart","dragTransition","power","initial","x","y","dragControls","dragConstraints","onDragEnd","styleTransformValues","xPosition","Math","round","yPosition","createElement","AlertGuard","CallView","muted","autoPlay","displayName"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../services/user.js"),s=require("../lib/avatars/avatars.js");require("../node_modules/react-redux/es/index.js");var u=require("../services/extensions.js"),n=require("../node_modules/react-redux/es/hooks/useDispatch.js"),a=require("../node_modules/react-redux/es/hooks/useSelector.js");function c(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("../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../services/user.js"),s=require("../lib/avatars/avatars.js");require("../node_modules/react-redux/es/index.js");var u=require("../services/extensions.js"),n=require("../node_modules/react-redux/es/hooks/useDispatch.js"),a=require("../node_modules/react-redux/es/hooks/useSelector.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=c(t);exports.RestAPI=function(c){var i=c.hostName,f=c.username,d=c.authToken,l=c.children,h=n.useDispatch(),v=a.useSelector((function(e){return e.fetchDefaults})).fetchReady;return a.useSelector((function(e){return e.currentUser})).currentUserReady,t.useEffect((function(){f&&d&&i&&(h.fetchDefaults.updateFetchBaseURL("https://".concat(i,"/webrest")),h.fetchDefaults.updateFetchHeaders({Authorization:"".concat(f,":").concat(d)}),h.fetchDefaults.setFetchReady())}),[f,d,i]),t.useEffect((function(){v&&(function(){e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,r.getCurrentUserInfo()];case 1:return(t=e.sent())&&(h.currentUser.updateCurrentUser(t),h.currentUser.setCurrentUserReady(!0)),[2]}}))}))}(),function(){e.__awaiter(this,void 0,void 0,(function(){var t;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,u.getAllExtensions()];case 1:return(t=e.sent())&&h.users.updateExtensions(t),[2]}}))}))}())}),[v]),t.useLayoutEffect((function(){f&&v&&s.retrieveAvatars(f)}),[v]),o.default.createElement(o.default.Fragment,null,v&&l)};
|
|
2
2
|
//# sourceMappingURL=RestAPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestAPI.js","sources":["../../src/components/RestAPI.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, type FC, useEffect, useLayoutEffect } from 'react'\nimport { getCurrentUserInfo } from '../services/user'\nimport { retrieveAvatars } from '../lib/avatars/avatars'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { getAllExtensions } from '../services/extensions'\n\nexport const RestAPI: FC<RestAPIProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const { fetchReady } = useSelector((state: RootState) => state.fetchDefaults)\n\n useEffect(() => {\n if (username && authToken && hostName) {\n // Initialize API defaults\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/webrest`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `${username}:${authToken}`,\n })\n dispatch.fetchDefaults.setFetchReady()\n }\n }, [username, authToken, hostName])\n\n useEffect(() => {\n // Get users info and set to store\n async function initCurrentUser() {\n const userInfo = await getCurrentUserInfo()\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n }\n }\n // Get all extensions info and set to store\n async function initExtensions() {\n const extensions = await getAllExtensions()\n if (extensions) {\n dispatch.users.updateExtensions(extensions)\n }\n }\n if (fetchReady) {\n initCurrentUser()\n initExtensions()\n }\n }, [fetchReady])\n\n useLayoutEffect(() => {\n // Initialize avatars request it or get from storage\n if (username && fetchReady) {\n retrieveAvatars(username)\n }\n }, [fetchReady])\n\n return <>{fetchReady && children}</>\n}\n\ninterface RestAPIProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n"],"names":["_a","hostName","username","authToken","children","dispatch","useDispatch","fetchReady","useSelector","state","fetchDefaults","useEffect","updateFetchBaseURL","concat","updateFetchHeaders","Authorization","setFetchReady","getCurrentUserInfo","userInfo","sent","
|
|
1
|
+
{"version":3,"file":"RestAPI.js","sources":["../../src/components/RestAPI.tsx"],"sourcesContent":["// Copyright (C) 2022 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, type FC, useEffect, useLayoutEffect } from 'react'\nimport { getCurrentUserInfo } from '../services/user'\nimport { retrieveAvatars } from '../lib/avatars/avatars'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../store'\nimport { getAllExtensions } from '../services/extensions'\n\nexport const RestAPI: FC<RestAPIProps> = ({ hostName, username, authToken, children }) => {\n const dispatch = useDispatch<Dispatch>()\n const { fetchReady } = useSelector((state: RootState) => state.fetchDefaults)\n const { currentUserReady } = useSelector((state: RootState) => state.currentUser)\n\n useEffect(() => {\n if (username && authToken && hostName) {\n // Initialize API defaults\n dispatch.fetchDefaults.updateFetchBaseURL(`https://${hostName}/webrest`)\n dispatch.fetchDefaults.updateFetchHeaders({\n Authorization: `${username}:${authToken}`,\n })\n dispatch.fetchDefaults.setFetchReady()\n }\n }, [username, authToken, hostName])\n\n useEffect(() => {\n // Get users info and set to store\n async function initCurrentUser() {\n const userInfo = await getCurrentUserInfo()\n if (userInfo) {\n dispatch.currentUser.updateCurrentUser(userInfo)\n dispatch.currentUser.setCurrentUserReady(true)\n }\n }\n // Get all extensions info and set to store\n async function initExtensions() {\n const extensions = await getAllExtensions()\n if (extensions) {\n dispatch.users.updateExtensions(extensions)\n }\n }\n if (fetchReady) {\n initCurrentUser()\n initExtensions()\n }\n }, [fetchReady])\n\n useLayoutEffect(() => {\n // Initialize avatars request it or get from storage\n if (username && fetchReady) {\n retrieveAvatars(username)\n }\n }, [fetchReady])\n\n return <>{fetchReady && children}</>\n}\n\ninterface RestAPIProps {\n children: ReactNode\n hostName: string\n username: string\n authToken: string\n}\n"],"names":["_a","hostName","username","authToken","children","dispatch","useDispatch","fetchReady","useSelector","state","fetchDefaults","currentUser","useEffect","updateFetchBaseURL","concat","updateFetchHeaders","Authorization","setFetchReady","getCurrentUserInfo","userInfo","sent","updateCurrentUser","setCurrentUserReady","initCurrentUser","getAllExtensions","extensions","users","updateExtensions","initExtensions","useLayoutEffect","retrieveAvatars","React","createElement","Fragment"],"mappings":"shBAUyC,SAACA,OAAEC,EAAQD,EAAAC,SAAEC,EAAQF,EAAAE,SAAEC,EAASH,EAAAG,UAAEC,EAAQJ,EAAAI,SAC3EC,EAAWC,EAAAA,cACTC,EAAeC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,4BA2C/D,OA1C6BF,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAME,WAAW,qBAEhFC,EAAAA,WAAU,WACJV,GAAYC,GAAaF,IAE3BI,EAASK,cAAcG,mBAAmB,WAAWC,OAAAb,EAAkB,aACvEI,EAASK,cAAcK,mBAAmB,CACxCC,cAAe,GAAAF,OAAGZ,EAAQ,KAAAY,OAAIX,KAEhCE,EAASK,cAAcO,gBAE1B,GAAE,CAACf,EAAUC,EAAWF,IAEzBW,EAAAA,WAAU,WAgBJL,IAdJ,0HACmB,MAAM,CAAA,EAAAW,EAAAA,oCAAjBC,EAAWnB,EAA0BoB,UAEzCf,EAASM,YAAYU,kBAAkBF,GACvCd,EAASM,YAAYW,qBAAoB,cAE5C,CASCC,GAPF,0HACqB,MAAM,CAAA,EAAAC,EAAAA,kCAAnBC,EAAazB,EAAwBoB,SAEzCf,EAASqB,MAAMC,iBAAiBF,aAEnC,CAGCG,GAEJ,GAAG,CAACrB,IAEJsB,EAAAA,iBAAgB,WAEV3B,GAAYK,GACduB,EAAeA,gBAAC5B,EAEpB,GAAG,CAACK,IAEGwB,EAAAA,QAAGC,cAAAD,EAAA,QAAAE,SAAA,KAAA1B,GAAcH,EAC1B"}
|
|
@@ -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"),
|
|
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"),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].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].username)||""}):n&&!n.connected&&"out"===n.direction&&p.currentCall.checkOutgoingUpdateAndPlay({outgoingSocket:!0,displayName:t.getDisplayName(n),number:"".concat(n.counterpartNum),username:"".concat(r&&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
|