@nethesis/phone-island 1.0.16 → 1.1.1-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CallView/Avatar.js +1 -1
- package/dist/components/CallView/Avatar.js.map +1 -1
- package/dist/components/CallView/DeviceIcon.js +2 -0
- package/dist/components/CallView/DeviceIcon.js.map +1 -0
- package/dist/components/CallView/NumberPopover.js +2 -0
- package/dist/components/CallView/NumberPopover.js.map +1 -0
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/CustomThemedTooltip.js +1 -1
- package/dist/components/CustomThemedTooltip.js.map +1 -1
- package/dist/components/IslandMotion.js +1 -1
- package/dist/components/IslandMotion.js.map +1 -1
- package/dist/components/Socket.js +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/VideoView/index.js +1 -1
- package/dist/components/VideoView/index.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/lib/phone/conversation.js +1 -1
- package/dist/lib/phone/conversation.js.map +1 -1
- package/dist/lib/phone/counterpartDevice.js +2 -0
- package/dist/lib/phone/counterpartDevice.js.map +1 -0
- package/dist/models/currentCall.js +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js +1 -1
- package/dist/node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js.map +1 -1
- package/dist/node_modules/react-redux/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +1 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/package.json.js +1 -1
- package/dist/public/locales/en/translation.json.js +1 -1
- package/dist/public/locales/it/translation.json.js +1 -1
- package/package.json +1 -1
|
@@ -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
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),i=require("../../node_modules/react-redux/es/hooks/useSelector.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=o(e),s={open:{width:"56px",height:"56px",borderRadius:"50%"},closed:{width:"24px",height:"24px",borderRadius:"50%"}};exports.default=function(){var o=i.useSelector(function(e){return e.island}).isOpen,u=i.useSelector(function(e){return e.avatars}).avatars,d=i.useSelector(function(e){return e.users}),c=i.useSelector(function(e){return e.currentCall}),l=c.username,p=c.number,m=c.incoming,f=c.outgoing,v=c.accepted,x=c.transferring,g=e.useMemo(function(){var e;return x?(null==d?void 0:d.extensions)&&(null===(e=d.extensions[p])||void 0===e?void 0:e.username)?null==u?void 0:u[d.extensions[p].username]:void 0:null==u?void 0:u[l]},[u,l,x,d,p]),b=m||f&&!v;return a.default.createElement(r.motion.div,{className:"pi-relative ".concat(o?"pi--mt-1":""),animate:o?"open":"closed",variants:s},b&&a.default.createElement(r.motion.div,{style:{animationDuration:"2s"},animate:o?"open":"closed",variants:s,className:"pi-rounded-xl pi-bg-gray-600 pi-absolute pi-opacity-60 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12"}),a.default.createElement(r.motion.div,{className:"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-secondaryNeutral dark:pi-bg-secondaryNeutralDark pi-rounded-sm pi-bg-cover pi-flex pi-items-center pi-justify-center",style:{backgroundImage:g?"url(".concat(g,")"):"none",backgroundRepeat:"no-repeat",backgroundSize:"contain"},animate:o?"open":"closed",variants:s},!g&&a.default.createElement(t.FontAwesomeIcon,{icon:n.faUser,className:"".concat(o?"pi-h-8 pi-w-8":"pi-h-3.5 pi-w-3.5"," pi-text-white dark:pi-text-gray-950")})))};
|
|
2
2
|
//# sourceMappingURL=Avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo } from 'react'\nimport { motion } from 'framer-motion'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst iconVariants = {\n open: {\n width: '56px',\n height: '56px',\n borderRadius: '
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../../src/components/CallView/Avatar.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo } from 'react'\nimport { motion } from 'framer-motion'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faUser } from '@fortawesome/free-solid-svg-icons'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\n\nconst iconVariants = {\n open: {\n width: '56px',\n height: '56px',\n borderRadius: '50%',\n },\n closed: {\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n },\n}\n\nconst Avatar: FC = () => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const user = useSelector((state: RootState) => state.users)\n const {\n username,\n number,\n incoming,\n outgoing,\n accepted,\n transferring,\n } = useSelector((state: RootState) => state.currentCall)\n\n const avatarUrl = useMemo(() => {\n if (transferring) {\n return user?.extensions && user.extensions[number]?.username\n ? avatars?.[user.extensions[number].username]\n : undefined\n }\n return avatars?.[username]\n }, [avatars, username, transferring, user, number])\n\n const showPulseEffect = incoming || (outgoing && !accepted)\n\n return (\n <motion.div\n className={`pi-relative ${isOpen ? 'pi--mt-1' : ''}`}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n >\n {showPulseEffect && (\n <motion.div\n style={{ animationDuration: '2s' }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n className='pi-rounded-xl pi-bg-gray-600 pi-absolute pi-opacity-60 pi-top-0 pi-left-0 pi-animate-ping pi-h-12 pi-w-12'\n />\n )}\n <motion.div\n className='pi-relative pi-z-30 pi-h-12 pi-w-12 pi-bg-secondaryNeutral dark:pi-bg-secondaryNeutralDark pi-rounded-sm pi-bg-cover pi-flex pi-items-center pi-justify-center'\n style={{\n backgroundImage: avatarUrl ? `url(${avatarUrl})` : 'none',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'contain',\n }}\n animate={isOpen ? 'open' : 'closed'}\n variants={iconVariants}\n >\n {!avatarUrl && (\n <FontAwesomeIcon\n icon={faUser}\n className={`${\n isOpen ? 'pi-h-8 pi-w-8' : 'pi-h-3.5 pi-w-3.5'\n } pi-text-white dark:pi-text-gray-950`}\n />\n )}\n </motion.div>\n </motion.div>\n )\n}\n\nexport default Avatar\n"],"names":["iconVariants","open","width","height","borderRadius","closed","isOpen","useSelector","state","island","avatars","user","users","_a","currentCall","username","number","incoming","outgoing","accepted","transferring","avatarUrl","useMemo","extensions","undefined","showPulseEffect","React","createElement","motion","div","className","concat","animate","variants","style","animationDuration","backgroundImage","backgroundRepeat","backgroundSize","FontAwesomeIcon","icon","faUser"],"mappings":"oiBAUMA,EAAe,CACnBC,KAAM,CACJC,MAAO,OACPC,OAAQ,OACRC,aAAc,OAEhBC,OAAQ,CACNH,MAAO,OACPC,OAAQ,OACRC,aAAc,wBAIC,WACT,IAAAE,EAAWC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,gBACnDC,EAAYH,cAAY,SAACC,GAAqB,OAAAA,EAAME,kBACtDC,EAAOJ,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMI,KAAN,GACzCC,EAOFN,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMM,WAAN,GANpCC,EAAQF,EAAAE,SACRC,EAAMH,EAAAG,OACNC,aACAC,EAAQL,EAAAK,SACRC,EAAQN,EAAAM,SACRC,iBAGIC,EAAYC,EAAAA,QAAQ,iBACxB,OAAIF,GACKT,aAAA,EAAAA,EAAMY,cAAqC,QAAvBV,EAAAF,EAAKY,WAAWP,UAAO,IAAAH,OAAA,EAAAA,EAAEE,UAChDL,eAAAA,EAAUC,EAAKY,WAAWP,GAAQD,eAClCS,EAECd,aAAO,EAAPA,EAAUK,EACnB,EAAG,CAACL,EAASK,EAAUK,EAAcT,EAAMK,IAErCS,EAAkBR,GAAaC,IAAaC,EAElD,OACEO,EAAAA,QAAAC,cAACC,EAAMA,OAACC,IACN,CAAAC,UAAW,eAAAC,OAAezB,EAAS,WAAa,IAChD0B,QAAS1B,EAAS,OAAS,SAC3B2B,SAAUjC,GAETyB,GACCC,EAAAA,QAACC,cAAAC,EAAMA,OAACC,IAAG,CACTK,MAAO,CAAEC,kBAAmB,MAC5BH,QAAS1B,EAAS,OAAS,SAC3B2B,SAAUjC,EACV8B,UAAU,8GAGdJ,EAAC,QAAAC,cAAAC,SAAOC,IAAG,CACTC,UAAU,iKACVI,MAAO,CACLE,gBAAiBf,EAAY,OAAOU,OAAAV,EAAY,KAAG,OACnDgB,iBAAkB,YAClBC,eAAgB,WAElBN,QAAS1B,EAAS,OAAS,SAC3B2B,SAAUjC,IAERqB,GACAK,EAAC,QAAAC,cAAAY,EAAeA,iBACdC,KAAMC,SACNX,UAAW,GACTC,OAAAzB,EAAS,gBAAkB,oBAAmB,2CAO5D"}
|
|
@@ -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"),require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var r=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),i=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),n=require("../../node_modules/react-redux/es/hooks/useSelector.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=s(e),a="tooltip-device",u={webrtc:{icon:o.faHeadset,labelKey:"Call.Web phone"},nethlink:{icon:o.faDesktop,labelKey:"Call.Desktop phone"},physical:{icon:i.faOfficePhone,labelKey:"Common.Physical phone"},mobile:{icon:o.faMobileScreen,labelKey:"Phone Island.Mobile app"}},d=e.memo(function(){var e=r.useTranslation().t,o=n.useSelector(function(e){return e.currentCall}),i=o.counterpartDeviceType,s=o.number,d=i?u[i]:void 0;if(!d)return null;var c=e(d.labelKey),p=s?"".concat(c,": ").concat(s):c;return l.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-5 pi-w-5 pi-text-iconPrimaryNeutral dark:pi-text-iconPrimaryNeutralDark","data-tooltip-id":a,"data-tooltip-content":p,"aria-label":p},l.default.createElement(t.FontAwesomeIcon,{icon:d.icon,className:"pi-h-5 pi-w-5"}))});exports.DEVICE_TOOLTIP_ID=a,exports.default=d;
|
|
2
|
+
//# sourceMappingURL=DeviceIcon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceIcon.js","sources":["../../../src/components/CallView/DeviceIcon.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport type { IconProp } from '@fortawesome/fontawesome-svg-core'\nimport { faDesktop, faHeadset, faMobileScreen } from '@fortawesome/free-solid-svg-icons'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState } from '../../store'\n\nexport const DEVICE_TOOLTIP_ID = 'tooltip-device'\n\nconst DEVICE_ICONS: Record<string, { icon: IconProp; labelKey: string }> = {\n webrtc: { icon: faHeadset, labelKey: 'Call.Web phone' },\n nethlink: { icon: faDesktop, labelKey: 'Call.Desktop phone' },\n physical: { icon: faOfficePhone as IconProp, labelKey: 'Common.Physical phone' },\n mobile: { icon: faMobileScreen, labelKey: 'Phone Island.Mobile app' },\n}\n\nconst DeviceIcon: FC = () => {\n const { t } = useTranslation()\n const { counterpartDeviceType, number } = useSelector((state: RootState) => state.currentCall)\n\n const device = counterpartDeviceType ? DEVICE_ICONS[counterpartDeviceType] : undefined\n if (!device) return null\n\n const label = t(device.labelKey)\n const tooltipContent = number ? `${label}: ${number}` : label\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-5 pi-w-5 pi-text-iconPrimaryNeutral dark:pi-text-iconPrimaryNeutralDark'\n data-tooltip-id={DEVICE_TOOLTIP_ID}\n data-tooltip-content={tooltipContent}\n aria-label={tooltipContent}\n >\n <FontAwesomeIcon icon={device.icon} className='pi-h-5 pi-w-5' />\n </span>\n )\n}\n\nexport default memo(DeviceIcon)\n"],"names":["DEVICE_TOOLTIP_ID","DEVICE_ICONS","webrtc","icon","faHeadset","labelKey","nethlink","faDesktop","physical","faOfficePhone","mobile","faMobileScreen","memo","t","useTranslation","_a","useSelector","state","currentCall","counterpartDeviceType","number","device","undefined","label","tooltipContent","concat","React","createElement","className","FontAwesomeIcon"],"mappings":"+gCAYaA,EAAoB,iBAE3BC,EAAqE,CACzEC,OAAQ,CAAEC,KAAMC,YAAWC,SAAU,kBACrCC,SAAU,CAAEH,KAAMI,YAAWF,SAAU,sBACvCG,SAAU,CAAEL,KAAMM,gBAA2BJ,SAAU,yBACvDK,OAAQ,CAAEP,KAAMQ,iBAAgBN,SAAU,4BAyB7BO,EAAAA,EAAAA,KAtBQ,WACb,IAAAC,EAAMC,qBACRC,EAAoCC,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAMC,WAAW,GAArFC,0BAAuBC,WAEzBC,EAASF,EAAwBlB,EAAakB,QAAyBG,EAC7E,IAAKD,EAAQ,OAAO,KAEpB,IAAME,EAAQV,EAAEQ,EAAOhB,UACjBmB,EAAiBJ,EAAS,GAAAK,OAAGF,EAAK,MAAAE,OAAKL,GAAWG,EAExD,OACEG,UACEC,cAAA,OAAA,CAAAC,UAAU,+JACO5B,EAAiB,uBACZwB,EAAc,aACxBA,GAEZE,UAAAC,cAACE,EAAeA,gBAAA,CAAC1B,KAAMkB,EAAOlB,KAAMyB,UAAU,kBAGpD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var r=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../CustomThemedTooltip.js"),a=require("../../node_modules/react-redux/es/hooks/useSelector.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=s(t),u="tooltip-number-popover",c=function(e){var t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="-1000px",t.style.opacity="0",document.body.appendChild(t),t.select();var r=!1;try{r=document.execCommand("copy")}catch(e){r=!1}return document.body.removeChild(t),r},p=t.memo(function(){var s=r.useTranslation().t,p=a.useSelector(function(e){return e.currentCall}).number,d=t.useState(!1),m=d[0],f=d[1],b=t.useRef(null),v=t.useRef(!0);t.useEffect(function(){return v.current=!0,function(){v.current=!1,b.current&&clearTimeout(b.current)}},[]),t.useEffect(function(){f(!1)},[p]);var h=t.useCallback(function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(t){switch(t.label){case 0:return p?[4,(r=p,e.__awaiter(void 0,void 0,void 0,function(){var t;return e.__generator(this,function(e){switch(e.label){case 0:if(!(null===(t=null===navigator||void 0===navigator?void 0:navigator.clipboard)||void 0===t?void 0:t.writeText)||!window.isSecureContext)return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,navigator.clipboard.writeText(r)];case 2:return e.sent(),[2,!0];case 3:return e.sent(),[2,c(r)];case 4:return[2,c(r)]}})}))]:[2];case 1:return t.sent()&&v.current?(f(!0),b.current&&clearTimeout(b.current),b.current=setTimeout(function(){v.current&&f(!1)},2e3),[2]):[2]}var r})})},[p]);return p?l.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center","data-stop-propagation":!0},l.default.createElement("button",{type:"button",className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-6 pi-w-6 pi--m-1 pi-p-1 pi-rounded-md pi-bg-transparent pi-text-gray-700 dark:pi-text-gray-200 hover:pi-bg-gray-200/70 dark:hover:pi-bg-gray-700/70 focus:pi-outline-none focus-visible:pi-ring-2 focus-visible:pi-ring-emerald-500","data-tooltip-id":u,"data-stop-propagation":!0,"aria-label":s("Call.Show number")||""},l.default.createElement(i.FontAwesomeIcon,{icon:n.faEllipsis,className:"pi-h-4 pi-w-4","data-stop-propagation":!0})),l.default.createElement(o.CustomThemedTooltip,{id:u,place:"bottom",offset:12,maxWidth:"300px",openOnClick:!0,clickable:!0,globalCloseEvents:{clickOutsideAnchor:!0,escape:!0}},l.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-2","data-stop-propagation":!0},l.default.createElement("span",{className:"pi-whitespace-nowrap","data-stop-propagation":!0},p),l.default.createElement("button",{type:"button",onClick:h,className:"pi-inline-flex pi-items-center pi-justify-center pi-h-4 pi-w-4 pi-p-0 pi-bg-transparent focus:pi-outline-none ".concat(m?"pi-text-inherit":"pi-text-emerald-500 dark:pi-text-emerald-700"),"data-stop-propagation":!0,"aria-label":s(m?"Call.Copied":"Call.Copy number")||""},l.default.createElement(i.FontAwesomeIcon,{icon:m?n.faCheck:n.faCopy,className:"pi-h-4 pi-w-4","data-stop-propagation":!0}))))):null});exports.default=p;
|
|
2
|
+
//# sourceMappingURL=NumberPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberPopover.js","sources":["../../../src/components/CallView/NumberPopover.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo, useCallback, useEffect, useRef, useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faCopy, faEllipsis } from '@fortawesome/free-solid-svg-icons'\nimport { RootState } from '../../store'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nconst NUMBER_POPOVER_ID = 'tooltip-number-popover'\nconst COPIED_FEEDBACK_MS = 2000\n\nconst copyWithTextarea = (text: string): boolean => {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'fixed'\n textarea.style.top = '-1000px'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n let copied = false\n try {\n copied = document.execCommand('copy')\n } catch (error) {\n copied = false\n }\n document.body.removeChild(textarea)\n return copied\n}\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n if (navigator?.clipboard?.writeText && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch (error) {\n return copyWithTextarea(text)\n }\n }\n return copyWithTextarea(text)\n}\n\nconst NumberPopover: FC = () => {\n const { t } = useTranslation()\n const { number } = useSelector((state: RootState) => state.currentCall)\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n\n useEffect(() => {\n setCopied(false)\n }, [number])\n\n const handleCopy = useCallback(async () => {\n if (!number) return\n const success = await copyToClipboard(number)\n if (!success || !isMountedRef.current) return\n setCopied(true)\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) setCopied(false)\n }, COPIED_FEEDBACK_MS)\n }, [number])\n\n if (!number) return null\n\n return (\n <span className='pi-inline-flex pi-flex-none pi-items-center' data-stop-propagation={true}>\n <button\n type='button'\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-6 pi-w-6 pi--m-1 pi-p-1 pi-rounded-md pi-bg-transparent pi-text-gray-700 dark:pi-text-gray-200 hover:pi-bg-gray-200/70 dark:hover:pi-bg-gray-700/70 focus:pi-outline-none focus-visible:pi-ring-2 focus-visible:pi-ring-emerald-500'\n data-tooltip-id={NUMBER_POPOVER_ID}\n data-stop-propagation={true}\n aria-label={t('Call.Show number') || ''}\n >\n <FontAwesomeIcon icon={faEllipsis} className='pi-h-4 pi-w-4' data-stop-propagation={true} />\n </button>\n <CustomThemedTooltip\n id={NUMBER_POPOVER_ID}\n place='bottom'\n offset={12}\n maxWidth='300px'\n openOnClick\n clickable\n globalCloseEvents={{ clickOutsideAnchor: true, escape: true }}\n >\n <div className='pi-flex pi-items-center pi-gap-2' data-stop-propagation={true}>\n <span className='pi-whitespace-nowrap' data-stop-propagation={true}>\n {number}\n </span>\n <button\n type='button'\n onClick={handleCopy}\n className={`pi-inline-flex pi-items-center pi-justify-center pi-h-4 pi-w-4 pi-p-0 pi-bg-transparent focus:pi-outline-none ${\n copied ? 'pi-text-inherit' : 'pi-text-emerald-500 dark:pi-text-emerald-700'\n }`}\n data-stop-propagation={true}\n aria-label={(copied ? t('Call.Copied') : t('Call.Copy number')) || ''}\n >\n <FontAwesomeIcon\n icon={copied ? faCheck : faCopy}\n className='pi-h-4 pi-w-4'\n data-stop-propagation={true}\n />\n </button>\n </div>\n </CustomThemedTooltip>\n </span>\n )\n}\n\nexport default memo(NumberPopover)\n"],"names":["NUMBER_POPOVER_ID","copyWithTextarea","text","textarea","document","createElement","value","setAttribute","style","position","top","opacity","body","appendChild","select","copied","execCommand","error","removeChild","memo","t","useTranslation","number","useSelector","state","currentCall","_a","useState","setCopied","timeoutRef","useRef","isMountedRef","useEffect","current","clearTimeout","handleCopy","useCallback","__awaiter","navigator","clipboard","writeText","window","isSecureContext","_b","sent","setTimeout","React","className","type","FontAwesomeIcon","icon","faEllipsis","CustomThemedTooltip","id","place","offset","maxWidth","openOnClick","clickable","globalCloseEvents","clickOutsideAnchor","escape","onClick","concat","faCheck","faCopy"],"mappings":"yhCAWMA,EAAoB,yBAGpBC,EAAmB,SAACC,GACxB,IAAMC,EAAWC,SAASC,cAAc,YACxCF,EAASG,MAAQJ,EACjBC,EAASI,aAAa,WAAY,IAClCJ,EAASK,MAAMC,SAAW,QAC1BN,EAASK,MAAME,IAAM,UACrBP,EAASK,MAAMG,QAAU,IACzBP,SAASQ,KAAKC,YAAYV,GAC1BA,EAASW,SACT,IAAIC,GAAS,EACb,IACEA,EAASX,SAASY,YAAY,OAC/B,CAAC,MAAOC,GACPF,GAAS,CACV,CAED,OADAX,SAASQ,KAAKM,YAAYf,GACnBY,CACT,EA2FeI,EAAAA,EAAAA,KA7EW,WAChB,IAAAC,EAAMC,qBACNC,EAAWC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,qBACrDC,EAAsBC,EAAAA,UAAS,GAA9BZ,EAAMW,EAAA,GAAEE,EAASF,EAAA,GAClBG,EAAaC,SAA6C,MAC1DC,EAAeD,UAAO,GAE5BE,EAAAA,UAAU,WAER,OADAD,EAAaE,SAAU,EAChB,WACLF,EAAaE,SAAU,EACnBJ,EAAWI,SAASC,aAAaL,EAAWI,QAClD,CACD,EAAE,IAEHD,EAAAA,UAAU,WACRJ,GAAU,EACZ,EAAG,CAACN,IAEJ,IAAMa,EAAaC,cAAY,WAAA,OAAAC,EAAAA,eAAA,OAAA,OAAA,EAAA,wEAC7B,OAAKf,EACW,CAAA,GAjCWpB,EAiCWoB,EAjCCe,EAAAA,eAAA,OAAA,OAAA,EAAA,8EACrC,KAAoB,QAApBX,EAAA,OAAAY,oBAAAA,iBAAAA,UAAWC,iBAAS,IAAAb,OAAA,EAAAA,EAAEc,aAAaC,OAAOC,gBAA1C,MAAyD,CAAA,EAAA,oBAEzD,6BAAM,CAAA,EAAAJ,UAAUC,UAAUC,UAAUtC,WACpC,OADAyC,EAAAC,OACA,CAAA,GAAO,UAEP,gBAAA,CAAA,EAAO3C,EAAiBC,IAG5B,KAAA,EAAA,MAAA,CAAA,EAAOD,EAAiBC,WAuBH,CAAA,UAEnB,OADgBwB,EAA6BkB,QAC5Bb,EAAaE,SAC9BL,GAAU,GACNC,EAAWI,SAASC,aAAaL,EAAWI,SAChDJ,EAAWI,QAAUY,WAAW,WAC1Bd,EAAaE,SAASL,GAAU,EACrC,EA5DsB,UAuDsB,CAAA,GAlCzB,IAAO1B,GAwC5B,EAAA,EAAE,CAACoB,IAEJ,OAAKA,EAGHwB,EAAAA,QAAMzC,cAAA,OAAA,CAAA0C,UAAU,uEAAqE,GACnFD,EAAA,QAAAzC,cAAA,SAAA,CACE2C,KAAK,SACLD,UAAU,ySAAwS,kBACjS/C,EAAiB,yBACX,EACX,aAAAoB,EAAE,qBAAuB,IAErC0B,EAAAA,QAAAzC,cAAC4C,kBAAe,CAACC,KAAMC,EAAAA,WAAYJ,UAAU,gBAAe,yBAAwB,KAEtFD,UAAAzC,cAAC+C,EAAmBA,oBAAA,CAClBC,GAAIrD,EACJsD,MAAM,SACNC,OAAQ,GACRC,SAAS,QACTC,aAAW,EACXC,WAAS,EACTC,kBAAmB,CAAEC,oBAAoB,EAAMC,QAAQ,IAEvDf,EAAA,QAAAzC,cAAA,MAAA,CAAK0C,UAAU,mCAAkC,yBAAwB,GACvED,UAAAzC,cAAA,OAAA,CAAM0C,UAAU,gDAA8C,GAC3DzB,GAEHwB,EAAAA,QAAAzC,cAAA,SAAA,CACE2C,KAAK,SACLc,QAAS3B,EACTY,UAAW,iHACTgB,OAAAhD,EAAS,kBAAoB,gDAER,yBAAA,eACDK,EAATL,EAAW,cAAmB,qBAAwB,IAEnE+B,EAAC,QAAAzC,cAAA4C,EAAeA,gBACd,CAAAC,KAAMnC,EAASiD,EAAAA,QAAUC,EAAAA,OACzBlB,UAAU,gBACa,yBAAA,QAtCf,IA6CtB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../../utils/streaming/streamingUtils.js"),a=require("../../lib/phone/call.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var l=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../Island.js");var r=require("../Button.js"),o=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var s=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var u=require("./Timer.js"),c=require("./Number.js"),d=require("./DisplayName.js"),p=require("./Avatar.js"),m=require("./Actions.js"),f=require("../Hangup.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var g=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var x=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),v=require("../StreamingImage/index.js"),E=require("../VideoStreamingSkeleton/index.js"),w=require("../VideoStreamingEmptyState/index.js"),h=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),j=require("../../node_modules/react-redux/es/hooks/useSelector.js");function b(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var N=b(e);function y(e,t){return!e&&!t}var q=e.memo(function(e){var t=e.children,i=e.className,n=void 0===i?"pi-gap-1 pi-grid-rows-2":i;return N.default.createElement("div",{className:"pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ".concat(n)},t)});q.displayName="Details";var _=e.memo(function(e){var n=e.label,a=e.tooltipContent;return n?N.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary","data-tooltip-id":a?"tooltip-queue":void 0,"data-tooltip-content":a||""},N.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-4 pi-w-4"})):null});_.displayName="QueueBadge";var T=e.memo(function(e){var n=e.label,a=e.tooltipContent;return n?N.default.createElement("span",{className:"pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark","data-tooltip-id":a?"tooltip-queue":void 0,"data-tooltip-content":a||"","aria-label":a||n},N.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-3 pi-w-3 pi-flex-none"}),N.default.createElement("span",{className:"pi-block pi-max-w-28 pi-truncate"},n)):null});T.displayName="IncomingQueueBadge";var k=e.memo(function(){var b,k=g.useTranslation().t,A=h.useDispatch(),C=j.useSelector(function(e){return e.currentCall}),S=C.incoming,I=C.accepted,F=C.outgoing,P=C.startTime,M=C.paused,B=C.number,O=C.isRecording,U=C.username,L=C.streamingSourceNumber,V=C.queueName,W=C.queueNumber,D=C.throughQueue,z=j.useSelector(function(e){return e.island}),H=z.isOpen,Q=z.isFromStreaming,R=j.useSelector(function(e){return e.webrtc}).remoteAudioStream,G=j.useSelector(function(e){return e.listen}),J=G.isListen,K=G.isIntrude,X=G.isListenExtension,Y=G.isIntrudeExtension,Z=j.useSelector(function(e){return e.alerts}).data,$=j.useSelector(function(e){return e.currentUser}),ee=j.useSelector(function(e){return e.streaming}),te=ee.videoSources,ie=ee.sourceImages,ne=e.useMemo(function(){return Object.values(Z).filter(function(e){return e.active})},[Z]),ae=e.useMemo(function(){return ne.length>0?ne[ne.length-1]:null},[ne]),le=e.useMemo(function(){return Q&&L&&!I},[Q,L,I]),re=e.useMemo(function(){if(!L||!te)return{canUnlock:!1,tooltipText:""};var e=Object.values(te).find(function(e){return(null==e?void 0:e.extension)===L}),t=Boolean((null==e?void 0:e.cmdOpen)&&""!==(null==e?void 0:e.cmdOpen.trim()));return{canUnlock:t,tooltipText:t&&e?"".concat(k("VideoStreaming.Open"),": ").concat(null==e?void 0:e.description):""}},[L,te,k]),oe=e.useMemo(function(){return""!==U&&"undefined"!==U},[U]),se=e.useMemo(function(){return V||W||""},[V,W]),ue=e.useMemo(function(){return D&&se?"".concat(k("Common.Queue"),": ").concat(se):""},[D,se,k]),ce=e.useMemo(function(){return Boolean(S&&!I&&D&&se)},[I,S,D,se]),de=e.useCallback(function(){var e;return N.default.createElement("div",{className:"pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate"},N.default.createElement(t.FontAwesomeIcon,{size:"sm",icon:x.faOfficePhone,className:"pi-mr-1"}),N.default.createElement("span",{className:"pi-max-w-16 pi-truncate"},(null===(e=null==$?void 0:$.default_device)||void 0===e?void 0:e.description)||k("Common.Physical phone")))},[null===(b=null==$?void 0:$.default_device)||void 0===b?void 0:b.description,k]),pe=e.useCallback(function(e){var n=H?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",a=H?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",l=H?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",r="red"===e?"pi-bg-red-400":"pi-bg-green-400",o="red"===e?"pi-text-red-500":"pi-text-green-500";return N.default.createElement("div",{className:"".concat(n," pi-flex pi-justify-center pi-items-center")},N.default.createElement("div",{className:"".concat(a," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},N.default.createElement("span",{className:"".concat(l," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(r," pi-opacity-75")}),N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(o),icon:i.faCircle})))},[H]),me=e.useMemo(function(){var e="pi-grid pi-items-center";return H&&(e=ce?"pi-grid pi-items-center":"pi-grid pi-items-start",I?e+=" pi-grid-rows-[72px_1fr]":S?e+=" pi-grid-cols-[256px_114px]":F&&(e+=" pi-grid-cols-[1fr_84px]")),le?"pi-flex pi-flex-col":e},[H,I,S,F,le,ce]),fe=e.useMemo(function(){var e=H&&!ce?"start":"center";return"pi-grid ".concat(H&&!I&&F?"pi-grid-cols-[48px_1fr]":H&&!I&&S?"pi-grid-cols-[48px_1fr_1px]":H&&I?"pi-grid-cols-[48px_164px_48px]":H||I?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(H?"5":"3"," pi-items-").concat(e," pi-justify-center pi-w-full")},[H,I,S,F,ce]),ge=e.useMemo(function(){return le?"pi-grid-cols-3":y(F,I)?"pi-grid-cols-2":I?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"},[le,F,I]),xe=e.useCallback(function(){var e=H?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover";return J?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):K?N.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):""!==B&&oe?N.default.createElement(p.default,null):S&&!oe?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft}):!I||F||oe?F&&!oe?N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi-rotate-[135deg]"),icon:i.faArrowLeft}):null:N.default.createElement(t.FontAwesomeIcon,{className:"".concat(e," pi--rotate-45"),icon:i.faArrowLeft})},[H,J,K,B,oe,S,F,I]),ve=e.useCallback(function(){return H?K?N.default.createElement(q,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},k("Common.Intrude"),Y?" - ".concat(Y):""),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):Y?"".concat(Y):""):J?N.default.createElement(q,null,N.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},k("Common.Listen"),X?" - ".concat(X):""),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):X?"".concat(X):""):ce?N.default.createElement(q,{className:"pi-grid-rows-[20px_24px_24px] pi-gap-0.5"},N.default.createElement(T,{label:se,tooltipContent:ue}),N.default.createElement(d.default,null),N.default.createElement(c.default,null)):N.default.createElement(q,null,I&&D&&se?N.default.createElement("div",{className:"pi-flex pi-min-w-0 pi-items-center pi-gap-2"},N.default.createElement("div",{className:"pi-min-w-0 pi-flex-1"},N.default.createElement(d.default,null)),N.default.createElement(_,{label:se,tooltipContent:ue})):N.default.createElement(d.default,null),I?l.isPhysical()?de():N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}):N.default.createElement(c.default,null)):null},[H,K,J,I,P,Y,X,k,de,I,D,se,ue,ce]),Ee=e.useCallback(function(){return I&&O?pe("red"):I&&R&&!l.isPhysical()?N.default.createElement(o.AudioBars,{audioStream:R,paused:M,size:H?"large":"small"}):I&&l.isPhysical()?pe("green"):null},[I,O,R,H,M,pe]),we=e.useCallback(function(){if(!te||0===Object.keys(te).length||!L)return N.default.createElement(E.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(te).find(function(e){return e.extension===L});return e&&(ie[e.id]||e.image)?N.default.createElement(v.default,null):N.default.createElement(w.default,{className:"pi-w-full pi-h-40 pi-mt-4"})},[L,te,ie]);if(null!==ae)return null;return N.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},N.default.createElement("div",{className:me},le?N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2"},N.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4 pi-min-w-0 pi-flex-1"},xe(),N.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0"},N.default.createElement(d.default,null),N.default.createElement(c.default,null))),N.default.createElement("div",{className:"pi-flex pi-gap-2 pi-flex-shrink-0"},N.default.createElement(f.default,{description:k("Tooltip.Hangup")}),!F&&N.default.createElement(r.Button,{onClick:function(){return a.answerIncomingCall(),void setTimeout(function(){A.island.setIslandView("streamingAnswer")},200)},variant:"green","data-tooltip-id":"tooltip-answer","data-tooltip-content":k("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faPhone})),(null==re?void 0:re.canUnlock)&&N.default.createElement(r.Button,{variant:"default",onClick:n.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==re?void 0:re.tooltipText},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),we()):N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:fe},xe(),ve(),!H&&!I&&N.default.createElement(d.default,null),!H&&I&&N.default.createElement(u.default,{startTime:P,isNotAlwaysWhite:!0}),Ee()),H&&N.default.createElement(N.default.Fragment,null,N.default.createElement("div",{className:"".concat(J||K?"":"pi-grid pi-gap-y-5")},I&&N.default.createElement(m.default,null),N.default.createElement("div",{className:"pi-grid ".concat(ge," pi-gap-3.5")},N.default.createElement(f.default,{description:k("Tooltip.Hangup and transfer")}),y(F,I)&&N.default.createElement(r.Button,{onClick:a.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":k("Tooltip.Answer")||""},N.default.createElement(t.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:i.faPhone}))))))),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-display-name",place:"bottom"}),N.default.createElement(s.CustomThemedTooltip,{id:"tooltip-queue",place:"bottom"}))});exports.default=k;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),a=require("../../utils/streaming/streamingUtils.js"),l=require("../../lib/phone/call.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var n=require("../../lib/phone/conversation.js"),r=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../Island.js");var o=require("../Button.js"),s=require("../AudioBars.js");require("../../node_modules/i18next/dist/esm/i18next.js");var u=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var c=require("./Timer.js"),d=require("./Number.js"),p=require("./DisplayName.js"),m=require("./Avatar.js"),f=require("./DeviceIcon.js"),g=require("./NumberPopover.js"),x=require("../../styles/Island.styles.js"),E=require("./Actions.js"),v=require("../Hangup.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var w=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var h=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),b=require("../StreamingImage/index.js"),j=require("../VideoStreamingSkeleton/index.js"),N=require("../VideoStreamingEmptyState/index.js"),y=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),q=require("../../node_modules/react-redux/es/hooks/useSelector.js");function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var T=_(e);function C(e,t){return!e&&!t}var k=e.memo(function(e){var t=e.children,i=e.className,a=void 0===i?"pi-gap-1 pi-grid-rows-2":i;return T.default.createElement("div",{className:"pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ".concat(a)},t)});k.displayName="Details";var I=e.memo(function(e){var a=e.label,l=e.tooltipContent;return a?T.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary dark:pi-text-indigo-400","data-tooltip-id":l?"tooltip-queue":void 0,"data-tooltip-content":l||""},T.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-5 pi-w-5"})):null});I.displayName="QueueBadge";var S=e.memo(function(e){var a=e.label,l=e.tooltipContent;return a?T.default.createElement("span",{className:"pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark","data-tooltip-id":l?"tooltip-queue":void 0,"data-tooltip-content":l||"","aria-label":l||a},T.default.createElement(t.FontAwesomeIcon,{icon:i.faUsers,className:"pi-h-3 pi-w-3 pi-flex-none"}),T.default.createElement("span",{className:"pi-block pi-max-w-28 pi-truncate"},a)):null});S.displayName="IncomingQueueBadge";var A=e.memo(function(){var _,A=w.useTranslation().t,O=y.useDispatch(),P=q.useSelector(function(e){return e.currentCall}),F=P.incoming,M=P.accepted,B=P.outgoing,D=P.startTime,U=P.paused,W=P.number,V=P.displayName,z=P.isRecording,L=P.streamingSourceNumber,H=P.queueName,Q=P.queueNumber,R=P.throughQueue,G=P.counterpartDeviceType,J=q.useSelector(function(e){return e.island}),K=J.isOpen,X=J.isFromStreaming,Y=q.useSelector(function(e){return e.webrtc}).remoteAudioStream,Z=q.useSelector(function(e){return e.listen}),$=Z.isListen,ee=Z.isIntrude,te=Z.isListenExtension,ie=Z.isIntrudeExtension,ae=q.useSelector(function(e){return e.alerts}).data,le=q.useSelector(function(e){return e.currentUser}),ne=q.useSelector(function(e){return e.streaming}),re=ne.videoSources,oe=ne.sourceImages,se=e.useMemo(function(){return Object.values(ae).filter(function(e){return e.active})},[ae]),ue=e.useMemo(function(){return se.length>0?se[se.length-1]:null},[se]),ce=e.useMemo(function(){return X&&L&&!M},[X,L,M]),de=e.useMemo(function(){if(!L||!re)return{canUnlock:!1,tooltipText:""};var e=Object.values(re).find(function(e){return(null==e?void 0:e.extension)===L}),t=Boolean((null==e?void 0:e.cmdOpen)&&""!==(null==e?void 0:e.cmdOpen.trim()));return{canUnlock:t,tooltipText:t&&e?"".concat(A("VideoStreaming.Open"),": ").concat(null==e?void 0:e.description):""}},[L,re,A]),pe=e.useMemo(function(){return n.isNumberOnlyName(V)},[V]),me=e.useMemo(function(){return!pe&&(e=W,(e||"").replace(/\D/g,"")).length>0;var e},[pe,W]),fe=Boolean(G),ge=e.useMemo(function(){return H||Q||""},[H,Q]),xe=e.useMemo(function(){return R&&ge?"".concat(A("Common.Queue"),": ").concat(ge):""},[R,ge,A]),Ee=e.useMemo(function(){return Boolean(F&&!M&&R&&ge)},[M,F,R,ge]),ve=e.useCallback(function(){var e;return T.default.createElement("div",{className:"pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate"},T.default.createElement(t.FontAwesomeIcon,{size:"sm",icon:h.faOfficePhone,className:"pi-mr-1"}),T.default.createElement("span",{className:"pi-max-w-16 pi-truncate"},(null===(e=null==le?void 0:le.default_device)||void 0===e?void 0:e.description)||A("Common.Physical phone")))},[null===(_=null==le?void 0:le.default_device)||void 0===_?void 0:_.description,A]),we=e.useCallback(function(e){var a=K?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6",l=K?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full",n=K?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6",r="red"===e?"pi-bg-red-400":"pi-bg-green-400",o="red"===e?"pi-text-red-500":"pi-text-green-500";return T.default.createElement("div",{className:"".concat(a," pi-flex pi-justify-center pi-items-center")},T.default.createElement("div",{className:"".concat(l," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},T.default.createElement("span",{className:"".concat(n," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ").concat(r," pi-opacity-75")}),T.default.createElement(t.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 ".concat(o),icon:i.faCircle})))},[K]),he=e.useMemo(function(){var e="pi-grid pi-items-center";return K&&(e=Ee?"pi-grid pi-items-center":"pi-grid pi-items-start",M?e+=" pi-grid-rows-[72px_1fr]":F?e+=" pi-grid-cols-[256px_114px]":B&&(e+=" pi-grid-cols-[1fr_84px]")),ce?"pi-flex pi-flex-col":e},[K,M,F,B,ce,Ee]),be=e.useMemo(function(){var e=K&&!Ee?"start":"center";return"pi-grid ".concat(K&&!M&&B?"pi-grid-cols-[48px_1fr]":K&&!M&&F?"pi-grid-cols-[48px_1fr_1px]":K&&M?"pi-grid-cols-[48px_164px_48px]":K||M?"pi-grid-cols-[24px_66px_24px]":"pi-grid-cols-[24px_102px]"," pi-gap-").concat(K?"5":"3"," pi-items-").concat(e," pi-justify-center pi-w-full")},[K,M,F,B,Ee]),je=e.useMemo(function(){return ce?"pi-grid-cols-3":C(B,M)?"pi-grid-cols-2":M?"pi-grid-cols-1 pi-justify-items-center":"pi-grid-cols-1 pi-justify-items-end"},[ce,B,M]),Ne=e.useCallback(function(){var e=K?"pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover":"pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover";return $?T.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faEarListen}):ee?T.default.createElement(t.FontAwesomeIcon,{className:e,icon:i.faHandPointUp}):T.default.createElement(m.default,null)},[K,$,ee]),ye=e.useCallback(function(e,t){return fe||t?T.default.createElement("div",{className:"pi-flex pi-min-w-0 pi-items-center pi-gap-2"},fe&&T.default.createElement(f.default,null),e):e},[fe]),qe=e.useCallback(function(){return K?ee?T.default.createElement(k,null,T.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},A("Common.Intrude"),ie?" - ".concat(ie):""),M?r.isPhysical()?ve():T.default.createElement(c.default,{startTime:D,isNotAlwaysWhite:!0}):ie?"".concat(ie):""):$?T.default.createElement(k,null,T.default.createElement("span",{className:"pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base"},A("Common.Listen"),te?" - ".concat(te):""),M?r.isPhysical()?ve():T.default.createElement(c.default,{startTime:D,isNotAlwaysWhite:!0}):te?"".concat(te):""):Ee?T.default.createElement(k,{className:pe?"pi-grid-rows-[20px_24px] pi-gap-0.5":"pi-grid-rows-[20px_24px_24px] pi-gap-0.5"},T.default.createElement(S,{label:ge,tooltipContent:xe}),T.default.createElement(p.default,null),!pe&&T.default.createElement(d.default,null)):T.default.createElement(k,null,M&&R&&ge?T.default.createElement("div",{className:"pi-flex pi-min-w-0 pi-items-center pi-gap-2"},T.default.createElement("div",{className:"pi-min-w-0 pi-flex-1"},T.default.createElement(p.default,null)),T.default.createElement(I,{label:ge,tooltipContent:xe})):T.default.createElement(p.default,null),M?ye(T.default.createElement(T.default.Fragment,null,r.isPhysical()?ve():me?T.default.createElement("span",{className:"pi-grid pi-items-center"},T.default.createElement(x.StyledTimer,{isOpen:K,size:"large","aria-hidden":"true",className:"pi-invisible pi-col-start-1 pi-row-start-1"},"00:00:00"),T.default.createElement("span",{className:"pi-col-start-1 pi-row-start-1"},T.default.createElement(c.default,{startTime:D,isNotAlwaysWhite:!0}))):T.default.createElement(c.default,{startTime:D,isNotAlwaysWhite:!0}),me&&T.default.createElement(g.default,null)),me):ye(pe&&(B||F)?T.default.createElement(x.StyledNumber,{isOpen:K},T.default.createElement("span",{className:"dark:pi-text-gray-50 pi-text-gray-600"},A(B?"Call.Calling...":"Call.Incoming call"))):T.default.createElement(d.default,null),!1)):null},[F,B,pe,me,ye,K,ee,$,M,D,ie,te,A,ve,M,R,ge,xe,Ee]),_e=e.useCallback(function(){return M&&z?we("red"):M&&Y&&!r.isPhysical()?T.default.createElement(s.AudioBars,{audioStream:Y,paused:U,size:K?"large":"small"}):M&&r.isPhysical()?we("green"):null},[M,z,Y,K,U,we]),Te=e.useCallback(function(){if(!re||0===Object.keys(re).length||!L)return T.default.createElement(j.default,{className:"pi-w-full pi-h-40 pi-mt-4"});var e=Object.values(re).find(function(e){return e.extension===L});return e&&(oe[e.id]||e.image)?T.default.createElement(b.default,null):T.default.createElement(N.default,{className:"pi-w-full pi-h-40 pi-mt-4"})},[L,re,oe]);if(null!==ue)return null;return T.default.createElement("div",{className:"pi-bg-red pi-content-center pi-justify-center"},T.default.createElement("div",{className:he},ce?T.default.createElement(T.default.Fragment,null,T.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2"},T.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4 pi-min-w-0 pi-flex-1"},Ne(),T.default.createElement("div",{className:"pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0"},T.default.createElement(p.default,null),T.default.createElement(d.default,null))),T.default.createElement("div",{className:"pi-flex pi-gap-2 pi-flex-shrink-0"},T.default.createElement(v.default,{description:A("Tooltip.Hangup")}),!B&&T.default.createElement(o.Button,{onClick:function(){return l.answerIncomingCall(),void setTimeout(function(){O.island.setIslandView("streamingAnswer")},200)},variant:"green","data-tooltip-id":"tooltip-answer","data-tooltip-content":A("Tooltip.Answer")||""},T.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faPhone})),(null==de?void 0:de.canUnlock)&&T.default.createElement(o.Button,{variant:"default",onClick:a.handleStreamingUnlock,"data-tooltip-id":"tooltip-unlock","data-tooltip-content":null==de?void 0:de.tooltipText},T.default.createElement(t.FontAwesomeIcon,{className:"pi-w-5 pi-h-5",icon:i.faUnlock})))),Te()):T.default.createElement(T.default.Fragment,null,T.default.createElement("div",{className:be},Ne(),qe(),!K&&!M&&T.default.createElement(p.default,null),!K&&M&&T.default.createElement(c.default,{startTime:D,isNotAlwaysWhite:!0}),_e()),K&&T.default.createElement(T.default.Fragment,null,T.default.createElement("div",{className:"".concat($||ee?"":"pi-grid pi-gap-y-5")},M&&T.default.createElement(E.default,null),T.default.createElement("div",{className:"pi-grid ".concat(je," pi-gap-3.5")},T.default.createElement(v.default,{description:A("Tooltip.Hangup and transfer")}),C(B,M)&&T.default.createElement(o.Button,{onClick:l.answerIncomingCall,variant:"green","data-tooltip-id":"tooltip-answer-left","data-tooltip-content":A("Tooltip.Answer")||""},T.default.createElement(t.FontAwesomeIcon,{className:"pi-w-6 pi-h-6",icon:i.faPhone}))))))),T.default.createElement(u.CustomThemedTooltip,{id:"tooltip-answer-left",place:"left"}),T.default.createElement(u.CustomThemedTooltip,{id:"tooltip-answer",place:"left"}),T.default.createElement(u.CustomThemedTooltip,{id:"tooltip-unlock",place:"left"}),T.default.createElement(u.CustomThemedTooltip,{id:"tooltip-display-name",place:"bottom"}),T.default.createElement(u.CustomThemedTooltip,{id:"tooltip-queue",place:"bottom"}),T.default.createElement(u.CustomThemedTooltip,{id:f.DEVICE_TOOLTIP_ID,place:"right",offset:11,maxWidth:"300px"}))});exports.default=A;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faArrowLeft,\n faCircle,\n faUnlock,\n faUsers,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport Avatar from './Avatar'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { handleStreamingUnlock } from '../../utils'\nimport { useDispatch } from 'react-redux'\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(\n ({\n children,\n className = 'pi-gap-1 pi-grid-rows-2',\n }: {\n children: React.ReactNode\n className?: string\n }) => (\n <div className={`pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ${className}`}>\n {children}\n </div>\n ),\n)\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-4 pi-w-4' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\n\nconst IncomingQueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n aria-label={tooltipContent || label}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-3 pi-w-3 pi-flex-none' />\n <span className='pi-block pi-max-w-28 pi-truncate'>{label}</span>\n </span>\n )\n },\n)\nIncomingQueueBadge.displayName = 'IncomingQueueBadge'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n isRecording,\n username,\n streamingSourceNumber,\n queueName,\n queueNumber,\n throughQueue,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { videoSources, sourceImages } = useSelector((state: RootState) => state.streaming)\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // Check if unlock button should be shown and get tooltip text\n const unlockData = useMemo(() => {\n if (!streamingSourceNumber || !videoSources) return { canUnlock: false, tooltipText: '' }\n\n const source = Object.values(videoSources).find(\n (source) => source?.extension === streamingSourceNumber,\n )\n\n const canUnlock = Boolean(source?.cmdOpen && source?.cmdOpen.trim() !== '')\n const tooltipText =\n canUnlock && source ? `${t('VideoStreaming.Open')}: ${source?.description}` : ''\n\n return { canUnlock, tooltipText }\n }, [streamingSourceNumber, videoSources, t])\n\n const hasValidUsername = useMemo(() => username !== '' && username !== 'undefined', [username])\n\n const queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\n\n const shouldShowIncomingQueueBadge = useMemo(\n () => Boolean(incoming && !accepted && throughQueue && queueLabel),\n [accepted, incoming, throughQueue, queueLabel],\n )\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = shouldShowIncomingQueueBadge ? 'pi-grid pi-items-center' : 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage, shouldShowIncomingQueueBadge])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n const itemsAlign = isOpen && !shouldShowIncomingQueueBadge ? 'start' : 'center'\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${itemsAlign} pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing, shouldShowIncomingQueueBadge])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n if (number !== '' && hasValidUsername) {\n return <Avatar />\n }\n\n if (incoming && !hasValidUsername) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (accepted && !outgoing && !hasValidUsername) {\n return <FontAwesomeIcon className={`${iconSizeClass} pi--rotate-45`} icon={faArrowLeft} />\n }\n\n if (outgoing && !hasValidUsername) {\n return (\n <FontAwesomeIcon className={`${iconSizeClass} pi-rotate-[135deg]`} icon={faArrowLeft} />\n )\n }\n\n return null\n }, [isOpen, isListen, isIntrude, number, hasValidUsername, incoming, outgoing, accepted])\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (shouldShowIncomingQueueBadge) {\n return (\n <Details className='pi-grid-rows-[20px_24px_24px] pi-gap-0.5'>\n <IncomingQueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n <DisplayName />\n <Number />\n </Details>\n )\n }\n\n return (\n <Details>\n {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : (\n <Number />\n )}\n </Details>\n )\n }, [\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\n shouldShowIncomingQueueBadge,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n const renderStreamingContent = useCallback(() => {\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return <VideoStreamingSkeleton className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Find the streaming source\n const source = Object.values(videoSources).find(\n (source) => source.extension === streamingSourceNumber,\n )\n\n // If source doesn't exist, show empty state\n if (!source) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // If we have an image, show StreamingImage component\n return <StreamingImage />\n }, [streamingSourceNumber, videoSources, sourceImages])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2'>\n <div className='pi-flex pi-items-center pi-gap-4 pi-min-w-0 pi-flex-1'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2 pi-flex-shrink-0'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button - only show if cmdOpen is valid */}\n {unlockData?.canUnlock && (\n <Button\n variant='default'\n onClick={handleStreamingUnlock}\n data-tooltip-id='tooltip-unlock'\n data-tooltip-content={unlockData?.tooltipText}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faUnlock} />\n </Button>\n )}\n </div>\n </div>\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-unlock' place='left' />\n <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","_b","className","React","createElement","concat","displayName","QueueBadge","label","tooltipContent","undefined","FontAwesomeIcon","icon","faUsers","IncomingQueueBadge","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","username","streamingSourceNumber","queueName","queueNumber","throughQueue","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","_c","streaming","videoSources","sourceImages","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","unlockData","canUnlock","tooltipText","source","find","extension","Boolean","cmdOpen","trim","description","hasValidUsername","queueLabel","queueTooltipContent","shouldShowIncomingQueueBadge","renderLandlinePhoneDiv","useCallback","size","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","itemsAlign","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","faArrowLeft","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","renderAudioIndicator","AudioBars","audioStream","renderStreamingContent","keys","VideoStreamingSkeleton","id","image","StreamingImage","VideoStreamingEmptyState","Fragment","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","handleStreamingUnlock","faUnlock","Actions","CustomThemedTooltip","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/CallView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useCallback, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPhone,\n faEarListen,\n faHandPointUp,\n faCircle,\n faUnlock,\n faUsers,\n} from '@fortawesome/free-solid-svg-icons'\nimport { Button } from '../'\nimport Timer from './Timer'\nimport Number from './Number'\nimport DisplayName from './DisplayName'\nimport { AudioBars } from '../'\nimport { answerIncomingCall } from '../../lib/phone/call'\nimport { isNumberOnlyName } from '../../lib/phone/conversation'\nimport Avatar from './Avatar'\nimport DeviceIcon, { DEVICE_TOOLTIP_ID } from './DeviceIcon'\nimport NumberPopover from './NumberPopover'\nimport { StyledNumber, StyledTimer } from '../../styles/Island.styles'\nimport Actions from './Actions'\nimport Hangup from '../Hangup'\nimport { useTranslation } from 'react-i18next'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport StreamingImage from '../StreamingImage'\nimport VideoStreamingSkeleton from '../VideoStreamingSkeleton'\nimport VideoStreamingEmptyState from '../VideoStreamingEmptyState'\nimport { handleStreamingUnlock } from '../../utils'\nimport { useDispatch } from 'react-redux'\n\nconst onlyDigits = (value?: string) => (value || '').replace(/\\D/g, '')\n\nfunction isAnswerVisible(outgoing: boolean, accepted: boolean): boolean {\n return !outgoing && !accepted\n}\n\nconst Details = memo(\n ({\n children,\n className = 'pi-gap-1 pi-grid-rows-2',\n }: {\n children: React.ReactNode\n className?: string\n }) => (\n <div className={`pi-grid pi-min-w-0 pi-self-center pi-grid-cols-1 ${className}`}>\n {children}\n </div>\n ),\n)\nDetails.displayName = 'Details'\n\nconst QueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-text-iconSecondary dark:pi-text-indigo-400'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-5 pi-w-5' />\n </span>\n )\n },\n)\nQueueBadge.displayName = 'QueueBadge'\n\nconst IncomingQueueBadge = memo(\n ({\n label,\n tooltipContent,\n }: {\n label: string\n tooltipContent?: string\n }) => {\n if (!label) {\n return null\n }\n\n return (\n <span\n className='pi-inline-flex pi-w-fit pi-max-w-full pi-flex-none pi-items-center pi-gap-1.5 pi-self-start pi-rounded-full pi-bg-iconSecondary pi-px-2.5 pi-py-1 pi-text-xs pi-font-medium pi-leading-none pi-text-iconWhite dark:pi-bg-iconSecondaryDark'\n data-tooltip-id={tooltipContent ? 'tooltip-queue' : undefined}\n data-tooltip-content={tooltipContent || ''}\n aria-label={tooltipContent || label}\n >\n <FontAwesomeIcon icon={faUsers} className='pi-h-3 pi-w-3 pi-flex-none' />\n <span className='pi-block pi-max-w-28 pi-truncate'>{label}</span>\n </span>\n )\n },\n)\nIncomingQueueBadge.displayName = 'IncomingQueueBadge'\n\n/**\n * The main view to manage calls, the starting point for calls actions flows\n */\nconst CallView: FC<CallViewProps> = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const currentCall = useSelector((state: RootState) => state.currentCall)\n const {\n incoming,\n accepted,\n outgoing,\n startTime,\n paused,\n number,\n displayName,\n isRecording,\n streamingSourceNumber,\n queueName,\n queueNumber,\n throughQueue,\n counterpartDeviceType,\n } = currentCall\n\n const { isOpen, isFromStreaming } = useSelector((state: RootState) => state.island)\n const { remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const listenState = useSelector((state: RootState) => state.listen)\n const { isListen, isIntrude, isListenExtension, isIntrudeExtension } = listenState\n const { data: alertsData } = useSelector((state: RootState) => state.alerts)\n const currentUser = useSelector((state: RootState) => state.currentUser)\n const { videoSources, sourceImages } = useSelector((state: RootState) => state.streaming)\n\n const activeAlerts = useMemo(\n () => Object.values(alertsData).filter((alert: any) => alert.active),\n [alertsData],\n )\n\n const latestAlert = useMemo(\n () => (activeAlerts.length > 0 ? activeAlerts[activeAlerts.length - 1] : null),\n [activeAlerts],\n )\n\n const shouldShowStreamingImage = useMemo(\n () => isFromStreaming && streamingSourceNumber && !accepted,\n [isFromStreaming, streamingSourceNumber, accepted],\n )\n\n // Check if unlock button should be shown and get tooltip text\n const unlockData = useMemo(() => {\n if (!streamingSourceNumber || !videoSources) return { canUnlock: false, tooltipText: '' }\n\n const source = Object.values(videoSources).find(\n (source) => source?.extension === streamingSourceNumber,\n )\n\n const canUnlock = Boolean(source?.cmdOpen && source?.cmdOpen.trim() !== '')\n const tooltipText =\n canUnlock && source ? `${t('VideoStreaming.Open')}: ${source?.description}` : ''\n\n return { canUnlock, tooltipText }\n }, [streamingSourceNumber, videoSources, t])\n\n const isNameNumberOnly = useMemo(() => isNumberOnlyName(displayName), [displayName])\n\n const canRevealNumber = useMemo(\n () => !isNameNumberOnly && onlyDigits(number).length > 0,\n [isNameNumberOnly, number],\n )\n\n const hasCounterpartDevice = Boolean(counterpartDeviceType)\n\n const queueLabel = useMemo(() => queueName || queueNumber || '', [queueName, queueNumber])\n\n const queueTooltipContent = useMemo(() => {\n if (!throughQueue || !queueLabel) {\n return ''\n }\n\n return `${t('Common.Queue')}: ${queueLabel}`\n }, [throughQueue, queueLabel, t])\n\n const shouldShowIncomingQueueBadge = useMemo(\n () => Boolean(incoming && !accepted && throughQueue && queueLabel),\n [accepted, incoming, throughQueue, queueLabel],\n )\n\n const renderLandlinePhoneDiv = useCallback(\n () => (\n <div className='pi-text-gray-600 dark:pi-text-gray-300 pi-font-normal pi-text-sm pi-flex pi-items-center pi-truncate'>\n <FontAwesomeIcon size='sm' icon={faOfficePhone} className='pi-mr-1' />\n <span className='pi-max-w-16 pi-truncate'>\n {currentUser?.default_device?.description || t('Common.Physical phone')}\n </span>\n </div>\n ),\n [currentUser?.default_device?.description, t],\n )\n\n const renderPulseIcon = useCallback(\n (color: string) => {\n const sizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n const innerSizeClasses = !isOpen ? 'pi-h-4 pi-w-4 pi-rounded-full' : 'pi-h-8'\n const animationSizeClasses = !isOpen ? 'pi-h-6 pi-w-6' : 'pi-w-8 pi-h-8'\n const colorClasses = color === 'red' ? 'pi-bg-red-400' : 'pi-bg-green-400'\n const textColorClasses = color === 'red' ? 'pi-text-red-500' : 'pi-text-green-500'\n\n return (\n <div className={`${sizeClasses} pi-flex pi-justify-center pi-items-center`}>\n <div\n className={`${innerSizeClasses} pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n >\n <span\n className={`${animationSizeClasses} pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full ${colorClasses} pi-opacity-75`}\n ></span>\n <FontAwesomeIcon\n className={`pi-w-4 pi-h-6 pi-rotate-45 ${textColorClasses}`}\n icon={faCircle}\n />\n </div>\n </div>\n )\n },\n [isOpen],\n )\n\n const callViewClasses = useMemo(() => {\n let baseClasses = 'pi-grid pi-items-center'\n\n if (isOpen) {\n baseClasses = shouldShowIncomingQueueBadge ? 'pi-grid pi-items-center' : 'pi-grid pi-items-start'\n\n if (accepted) {\n baseClasses += ' pi-grid-rows-[72px_1fr]'\n } else if (incoming) {\n baseClasses += ' pi-grid-cols-[256px_114px]'\n } else if (outgoing) {\n baseClasses += ' pi-grid-cols-[1fr_84px]'\n }\n }\n\n return shouldShowStreamingImage ? 'pi-flex pi-flex-col' : baseClasses\n }, [isOpen, accepted, incoming, outgoing, shouldShowStreamingImage, shouldShowIncomingQueueBadge])\n\n const topContentClasses = useMemo(() => {\n let columns = ''\n\n if (isOpen && !accepted && outgoing) {\n columns = 'pi-grid-cols-[48px_1fr]'\n } else if (isOpen && !accepted && incoming) {\n columns = 'pi-grid-cols-[48px_1fr_1px]'\n } else if (isOpen && accepted) {\n columns = 'pi-grid-cols-[48px_164px_48px]'\n } else if (!isOpen && !accepted) {\n columns = 'pi-grid-cols-[24px_102px]'\n } else {\n columns = 'pi-grid-cols-[24px_66px_24px]'\n }\n\n const itemsAlign = isOpen && !shouldShowIncomingQueueBadge ? 'start' : 'center'\n\n return `pi-grid ${columns} pi-gap-${isOpen ? '5' : '3'} pi-items-${itemsAlign} pi-justify-center pi-w-full`\n }, [isOpen, accepted, incoming, outgoing, shouldShowIncomingQueueBadge])\n\n const getGridClasses = useMemo(() => {\n if (shouldShowStreamingImage) return 'pi-grid-cols-3'\n if (isAnswerVisible(outgoing, accepted)) return 'pi-grid-cols-2'\n if (accepted) return 'pi-grid-cols-1 pi-justify-items-center'\n return 'pi-grid-cols-1 pi-justify-items-end'\n }, [shouldShowStreamingImage, outgoing, accepted])\n\n const renderStatusIcon = useCallback(() => {\n const iconSizeClass = isOpen\n ? 'pi-relative pi-z-30 pi-h-12 pi-w-12 pi-rounded-sm pi-bg-cover'\n : 'pi-relative pi-z-30 pi-h-6 pi-w-6 pi-rounded-sm pi-bg-cover'\n\n if (isListen) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faEarListen} />\n }\n\n if (isIntrude) {\n return <FontAwesomeIcon className={iconSizeClass} icon={faHandPointUp} />\n }\n\n return <Avatar />\n }, [isOpen, isListen, isIntrude])\n\n const renderWithDeviceIcon = useCallback(\n (content: React.ReactNode, forceRow: boolean) =>\n hasCounterpartDevice || forceRow ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n {hasCounterpartDevice && <DeviceIcon />}\n {content}\n </div>\n ) : (\n content\n ),\n [hasCounterpartDevice],\n )\n\n const renderDetails = useCallback(() => {\n if (!isOpen) return null\n\n if (isIntrude) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Intrude')}\n {isIntrudeExtension ? ` - ${isIntrudeExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isIntrudeExtension ? (\n `${isIntrudeExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (isListen) {\n return (\n <Details>\n <span className='pi-justify-center pi-w-fit pi-relative pi-inline-block pi-font-bold pi-text-base'>\n {t('Common.Listen')}\n {isListenExtension ? ` - ${isListenExtension}` : ''}\n </span>\n {accepted ? (\n !isPhysical() ? (\n <Timer startTime={startTime} isNotAlwaysWhite />\n ) : (\n renderLandlinePhoneDiv()\n )\n ) : isListenExtension ? (\n `${isListenExtension}`\n ) : (\n ''\n )}\n </Details>\n )\n }\n\n if (shouldShowIncomingQueueBadge) {\n return (\n <Details\n className={\n isNameNumberOnly\n ? 'pi-grid-rows-[20px_24px] pi-gap-0.5'\n : 'pi-grid-rows-[20px_24px_24px] pi-gap-0.5'\n }\n >\n <IncomingQueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n <DisplayName />\n {!isNameNumberOnly && <Number />}\n </Details>\n )\n }\n\n return (\n <Details>\n {accepted && throughQueue && queueLabel ? (\n <div className='pi-flex pi-min-w-0 pi-items-center pi-gap-2'>\n <div className='pi-min-w-0 pi-flex-1'>\n <DisplayName />\n </div>\n <QueueBadge label={queueLabel} tooltipContent={queueTooltipContent} />\n </div>\n ) : (\n <DisplayName />\n )}\n {accepted\n ? renderWithDeviceIcon(\n <>\n {isPhysical() ? (\n renderLandlinePhoneDiv()\n ) : canRevealNumber ? (\n <span className='pi-grid pi-items-center'>\n <StyledTimer\n isOpen={isOpen}\n size='large'\n aria-hidden='true'\n className='pi-invisible pi-col-start-1 pi-row-start-1'\n >\n 00:00:00\n </StyledTimer>\n <span className='pi-col-start-1 pi-row-start-1'>\n <Timer startTime={startTime} isNotAlwaysWhite />\n </span>\n </span>\n ) : (\n <Timer startTime={startTime} isNotAlwaysWhite />\n )}\n {canRevealNumber && <NumberPopover />}\n </>,\n canRevealNumber,\n )\n : renderWithDeviceIcon(\n isNameNumberOnly && (outgoing || incoming) ? (\n <StyledNumber isOpen={isOpen}>\n <span className='dark:pi-text-gray-50 pi-text-gray-600'>\n {outgoing ? t('Call.Calling...') : t('Call.Incoming call')}\n </span>\n </StyledNumber>\n ) : (\n <Number />\n ),\n false,\n )}\n </Details>\n )\n }, [\n incoming,\n outgoing,\n isNameNumberOnly,\n canRevealNumber,\n renderWithDeviceIcon,\n isOpen,\n isIntrude,\n isListen,\n accepted,\n startTime,\n isIntrudeExtension,\n isListenExtension,\n t,\n renderLandlinePhoneDiv,\n accepted,\n throughQueue,\n queueLabel,\n queueTooltipContent,\n shouldShowIncomingQueueBadge,\n ])\n\n const renderAudioIndicator = useCallback(() => {\n if (accepted && isRecording) {\n return renderPulseIcon('red')\n }\n\n if (accepted && remoteAudioStream && !isPhysical()) {\n return (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )\n }\n\n if (accepted && isPhysical()) {\n return renderPulseIcon('green')\n }\n\n return null\n }, [accepted, isRecording, remoteAudioStream, isOpen, paused, renderPulseIcon])\n\n const renderStreamingContent = useCallback(() => {\n // Show skeleton while videoSources are loading or if streaming source number is not set yet\n if (!videoSources || Object.keys(videoSources).length === 0 || !streamingSourceNumber) {\n return <VideoStreamingSkeleton className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Find the streaming source\n const source = Object.values(videoSources).find(\n (source) => source.extension === streamingSourceNumber,\n )\n\n // If source doesn't exist, show empty state\n if (!source) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // Check if image is available\n const hasImage = sourceImages[source.id] || source.image\n\n // If no image available, show empty state\n if (!hasImage) {\n return <VideoStreamingEmptyState className='pi-w-full pi-h-40 pi-mt-4' />\n }\n\n // If we have an image, show StreamingImage component\n return <StreamingImage />\n }, [streamingSourceNumber, videoSources, sourceImages])\n\n // Early return AFTER all hooks have been called\n if (latestAlert !== null) {\n return null\n }\n\n const setVideoStreamingAnswer = () => {\n answerIncomingCall()\n // Set view as video streaming answer with a small delay\n setTimeout(() => {\n dispatch.island.setIslandView('streamingAnswer')\n }, 200)\n }\n\n return (\n <div className='pi-bg-red pi-content-center pi-justify-center'>\n <div className={callViewClasses}>\n {shouldShowStreamingImage ? (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-gap-2'>\n <div className='pi-flex pi-items-center pi-gap-4 pi-min-w-0 pi-flex-1'>\n {renderStatusIcon()}\n <div className='pi-flex pi-flex-col pi-justify-center pi-space-y-2 pi-min-w-0'>\n <DisplayName />\n <Number />\n </div>\n </div>\n\n <div className='pi-flex pi-gap-2 pi-flex-shrink-0'>\n <Hangup description={t('Tooltip.Hangup')} />\n {!outgoing && (\n <Button\n onClick={() => setVideoStreamingAnswer()}\n variant='green'\n data-tooltip-id='tooltip-answer'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faPhone} />\n </Button>\n )}\n {/* Open door button - only show if cmdOpen is valid */}\n {unlockData?.canUnlock && (\n <Button\n variant='default'\n onClick={handleStreamingUnlock}\n data-tooltip-id='tooltip-unlock'\n data-tooltip-content={unlockData?.tooltipText}\n >\n <FontAwesomeIcon className='pi-w-5 pi-h-5' icon={faUnlock} />\n </Button>\n )}\n </div>\n </div>\n\n {renderStreamingContent()}\n </>\n ) : (\n <>\n <div className={topContentClasses}>\n {renderStatusIcon()}\n {renderDetails()}\n\n {!isOpen && !accepted && <DisplayName />}\n {!isOpen && accepted && <Timer startTime={startTime} isNotAlwaysWhite />}\n\n {renderAudioIndicator()}\n </div>\n\n {isOpen && (\n <>\n <div className={`${!(isListen || isIntrude) ? 'pi-grid pi-gap-y-5' : ''}`}>\n {accepted && <Actions />}\n <div className={`pi-grid ${getGridClasses} pi-gap-3.5`}>\n <Hangup description={t('Tooltip.Hangup and transfer')} />\n\n {isAnswerVisible(outgoing, accepted) && (\n <Button\n onClick={answerIncomingCall}\n variant='green'\n data-tooltip-id='tooltip-answer-left'\n data-tooltip-content={t('Tooltip.Answer') || ''}\n >\n <FontAwesomeIcon className='pi-w-6 pi-h-6' icon={faPhone} />\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n <CustomThemedTooltip id='tooltip-answer-left' place='left' />\n <CustomThemedTooltip id='tooltip-answer' place='left' />\n <CustomThemedTooltip id='tooltip-unlock' place='left' />\n <CustomThemedTooltip id='tooltip-display-name' place='bottom' />\n <CustomThemedTooltip id='tooltip-queue' place='bottom' />\n <CustomThemedTooltip\n id={DEVICE_TOOLTIP_ID}\n place='right'\n offset={11}\n maxWidth='300px'\n />\n </div>\n )\n}\n\nexport default memo(CallView)\n\nexport interface CallViewProps {}\n"],"names":["isAnswerVisible","outgoing","accepted","Details","memo","_a","children","_b","className","React","createElement","concat","displayName","QueueBadge","label","tooltipContent","undefined","FontAwesomeIcon","icon","faUsers","IncomingQueueBadge","t","useTranslation","dispatch","useDispatch","currentCall","useSelector","state","incoming","startTime","paused","number","isRecording","streamingSourceNumber","queueName","queueNumber","throughQueue","counterpartDeviceType","island","isOpen","isFromStreaming","remoteAudioStream","webrtc","listenState","listen","isListen","isIntrude","isListenExtension","isIntrudeExtension","alertsData","alerts","currentUser","_c","streaming","videoSources","sourceImages","activeAlerts","useMemo","Object","values","filter","alert","active","latestAlert","length","shouldShowStreamingImage","unlockData","canUnlock","tooltipText","source","find","extension","Boolean","cmdOpen","trim","description","isNameNumberOnly","isNumberOnlyName","canRevealNumber","value","replace","hasCounterpartDevice","queueLabel","queueTooltipContent","shouldShowIncomingQueueBadge","renderLandlinePhoneDiv","useCallback","size","faOfficePhone","default_device","renderPulseIcon","color","sizeClasses","innerSizeClasses","animationSizeClasses","colorClasses","textColorClasses","faCircle","callViewClasses","baseClasses","topContentClasses","itemsAlign","getGridClasses","renderStatusIcon","iconSizeClass","faEarListen","faHandPointUp","Avatar","renderWithDeviceIcon","content","forceRow","DeviceIcon","renderDetails","isPhysical","Timer","isNotAlwaysWhite","DisplayName","Number","Fragment","StyledTimer","NumberPopover","StyledNumber","renderAudioIndicator","AudioBars","audioStream","renderStreamingContent","keys","VideoStreamingSkeleton","id","image","StreamingImage","VideoStreamingEmptyState","Hangup","Button","onClick","answerIncomingCall","setTimeout","setIslandView","variant","faPhone","handleStreamingUnlock","faUnlock","Actions","CustomThemedTooltip","place","DEVICE_TOOLTIP_ID","offset","maxWidth"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var o=require("../node_modules/react-tooltip/dist/react-tooltip.min.mjs.js"),r=require("../node_modules/react-redux/es/hooks/useSelector.js");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=t(e);exports.CustomThemedTooltip=function(e){var t=e.id,l=e.place,a=void 0===l?"bottom":l,d=e.className,n=void 0===d?"":d,c=e.openOnClick,s=e.clickable,u=e.globalCloseEvents,m=e.offset,p=e.maxWidth,f=void 0===p?"185px":p,b=e.children,g="dark"===r.useSelector(function(e){return e.darkTheme}).theme?{backgroundColor:"rgb(243, 244, 246)",color:"rgb(17, 24, 39)",fontSize:"0.875rem",fontWeight:400,lineHeight:"1.25rem",padding:"0.375rem 0.625rem",maxWidth:f,borderRadius:"4px"}:{backgroundColor:"rgb(31, 41, 55)",color:"rgb(249, 250, 251)",fontSize:"0.875rem",fontWeight:400,lineHeight:"1.25rem",padding:"0.375rem 0.625rem",maxWidth:f,borderRadius:"4px"};return i.default.createElement(o.Tooltip,{id:t,place:a,className:"pi-z-1000 [&_.react-tooltip-content-wrapper]:pi-p-0 ".concat(n),opacity:1,style:g,openOnClick:c,clickable:s,globalCloseEvents:u,offset:m},b)};
|
|
2
2
|
//# sourceMappingURL=CustomThemedTooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomThemedTooltip.js","sources":["../../src/components/CustomThemedTooltip.tsx"],"sourcesContent":["// src/components/CustomThemedTooltip.tsx\nimport React, { FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Tooltip } from 'react-tooltip'\n\ninterface CustomThemedTooltipProps {\n id: string\n place?: 'top' | 'right' | 'bottom' | 'left'\n className?: string\n}\n\nexport const CustomThemedTooltip: FC<CustomThemedTooltipProps> = ({\n id,\n place = 'bottom',\n className = '',\n}) => {\n const { theme } = useSelector((state: RootState) => state.darkTheme)\n\n const tooltipStyle =\n theme === 'dark'\n ? {\n backgroundColor: 'rgb(243, 244, 246)',\n color: 'rgb(17, 24, 39)',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.25rem',\n padding: '0.375rem 0.625rem',\n maxWidth
|
|
1
|
+
{"version":3,"file":"CustomThemedTooltip.js","sources":["../../src/components/CustomThemedTooltip.tsx"],"sourcesContent":["// src/components/CustomThemedTooltip.tsx\nimport React, { FC, ReactNode } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Tooltip, type ITooltip } from 'react-tooltip'\n\ninterface CustomThemedTooltipProps {\n id: string\n place?: 'top' | 'right' | 'bottom' | 'left'\n className?: string\n openOnClick?: boolean\n clickable?: boolean\n globalCloseEvents?: ITooltip['globalCloseEvents']\n offset?: number\n maxWidth?: string\n children?: ReactNode\n}\n\nexport const CustomThemedTooltip: FC<CustomThemedTooltipProps> = ({\n id,\n place = 'bottom',\n className = '',\n openOnClick,\n clickable,\n globalCloseEvents,\n offset,\n maxWidth = '185px',\n children,\n}) => {\n const { theme } = useSelector((state: RootState) => state.darkTheme)\n\n const tooltipStyle =\n theme === 'dark'\n ? {\n backgroundColor: 'rgb(243, 244, 246)',\n color: 'rgb(17, 24, 39)',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.25rem',\n padding: '0.375rem 0.625rem',\n maxWidth,\n borderRadius: '4px',\n }\n : {\n backgroundColor: 'rgb(31, 41, 55)',\n color: 'rgb(249, 250, 251)',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.25rem',\n padding: '0.375rem 0.625rem',\n maxWidth,\n borderRadius: '4px',\n }\n\n return (\n <Tooltip\n id={id}\n place={place}\n className={`pi-z-1000 [&_.react-tooltip-content-wrapper]:pi-p-0 ${className}`}\n opacity={1}\n style={tooltipStyle}\n openOnClick={openOnClick}\n clickable={clickable}\n globalCloseEvents={globalCloseEvents}\n offset={offset}\n >\n {children}\n </Tooltip>\n )\n}\n"],"names":["_a","id","_b","place","_c","className","openOnClick","clickable","globalCloseEvents","offset","_d","maxWidth","children","tooltipStyle","useSelector","state","darkTheme","backgroundColor","color","fontSize","fontWeight","lineHeight","padding","borderRadius","React","Tooltip","concat","opacity","style"],"mappings":"2YAkBiE,SAACA,GAChE,IAAAC,OACAC,EAAAF,EAAAG,MAAAA,aAAQ,SAAQD,EAChBE,EAAAJ,EAAAK,UAAAA,OAAS,IAAAD,EAAG,GAAEA,EACdE,EAAWN,EAAAM,YACXC,cACAC,EAAiBR,EAAAQ,kBACjBC,EAAMT,EAAAS,OACNC,EAAkBV,EAAAW,SAAlBA,OAAW,IAAAD,EAAA,QAAOA,EAClBE,EAAQZ,EAAAY,SAIFC,EACM,SAHMC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,kBAIpD,CACEC,gBAAiB,qBACjBC,MAAO,kBACPC,SAAU,WACVC,WAAY,IACZC,WAAY,UACZC,QAAS,oBACTX,SAAQA,EACRY,aAAc,OAEhB,CACEN,gBAAiB,kBACjBC,MAAO,qBACPC,SAAU,WACVC,WAAY,IACZC,WAAY,UACZC,QAAS,oBACTX,SAAQA,EACRY,aAAc,OAGtB,OACEC,wBAACC,UAAO,CACNxB,GAAIA,EACJE,MAAOA,EACPE,UAAW,uDAAuDqB,OAAArB,GAClEsB,QAAS,EACTC,MAAOf,EACPP,YAAaA,EACbC,UAAWA,EACXC,kBAAmBA,EACnBC,OAAQA,GAEPG,EAGP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var i=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var t=require("../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var i=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var t=require("../lib/phone/conversation.js"),d=require("../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),a=require("../node_modules/react-redux/es/hooks/useSelector.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(e),h=function(n){var h=n.children,o=a.useSelector(function(e){return e.currentCall}),s=o.incoming,c=o.outgoing,l=o.accepted,g=o.transferring,p=o.incomingWebRTC,u=o.incomingSocket,w=o.conferencing,x=o.throughQueue,f=o.queueName,m=o.queueNumber,v=o.displayName,b=a.useSelector(function(e){return e.listen}).isListen,y=a.useSelector(function(e){return e.island}),_=y.view,k=y.isOpen,S=y.actionsExpanded,A=y.sideViewIsVisible,j=y.transcriptionViewIsVisible,q=y.isFromStreaming,C=y.isExtraLarge,E=a.useSelector(function(e){return e.alerts.status}).activeAlertsCount,B=a.useSelector(function(e){return e.motions}),N=B.variants,D=B.border_radius_collapsed,L=B.border_radius_expanded,I=B.border_radius_collapsed_conference,O=B.padding_x_collapsed,V=B.padding_y_collapsed,M=B.padding_expanded,Q=B.alert_padding_expanded,R=a.useSelector(function(e){return e.conference}).isActive,z=e.useMemo(function(){var e={width:0,height:0,padding:M};switch(_){case"call":if(k)if(l&&g&&w)e=S?{width:N.call.expanded.transfer.actionsExpanded.width,height:N.call.expanded.transfer.actionsExpanded.height}:{width:N.call.expanded.transfer.width,height:N.call.expanded.transfer.height};else if(l&&S)e={width:N.call.expanded.accepted.actionsExpanded.width,height:N.call.expanded.accepted.actionsExpanded.height};else if(l&&!b)e={width:N.call.expanded.accepted.width,height:N.call.expanded.accepted.height};else if(l&&b)e={width:N.call.expanded.listening.width,height:N.call.expanded.listening.height};else if(s&&!q){e=s&&!l&&x&&Boolean(f||m)&&!t.isNumberOnlyName(v)?{width:N.call.expanded.incomingQueue.width,height:N.call.expanded.incomingQueue.height}:{width:N.call.expanded.incoming.width,height:N.call.expanded.incoming.height}}else s&&q?e={width:N.call.expanded.incomingStreaming.width,height:N.call.expanded.incomingStreaming.height}:c&&!q?e={width:N.call.expanded.outgoing.width,height:N.call.expanded.outgoing.height}:c&&q&&(e={width:N.call.expanded.outgoingStreaming.width,height:N.call.expanded.outgoingStreaming.height});else e={width:N.call.collapsed.width,height:N.call.collapsed.height};break;case"keypad":e=k?{width:N.keypad.expanded.width,height:N.keypad.expanded.height}:{width:N.transfer.collapsed.width,height:N.transfer.collapsed.height};break;case"video":e=k?{width:N.video.expanded.width,height:N.video.expanded.height,padding:N.video.expanded.padding}:{width:N.video.collapsed.width,height:N.video.collapsed.height};break;case"transfer":case"player":case"recorder":case"physicalPhoneRecorder":case"settings":case"conference":e=k?{width:N[_].expanded.width,height:N[_].expanded.height}:{width:N[_].collapsed.width,height:N[_].collapsed.height};break;case"switchDevice":e=k?{width:N.switchDevice.expanded.width,height:N.switchDevice.expanded.height}:{width:N.video.collapsed.width,height:N.video.collapsed.height};break;case"waitingConference":e=k?{width:N.waitingConference.expanded.width,height:N.waitingConference.expanded.height}:{width:N.waitingConference.collapsed.width,height:N.waitingConference.collapsed.height};break;case"streamingAnswer":e=k?C?{width:N.streamingAnswer.extraLarge.width,height:N.streamingAnswer.extraLarge.height,padding:N.streamingAnswer.extraLarge.padding}:{width:N.streamingAnswer.expanded.width,height:N.streamingAnswer.expanded.height,padding:N.streamingAnswer.expanded.padding}:{width:N.streamingAnswer.collapsed.width,height:N.streamingAnswer.collapsed.height};break;case"operatorBusy":e=k?{width:N.operatorBusy.expanded.width,height:N.operatorBusy.expanded.height}:{width:N.operatorBusy.collapsed.width,height:N.operatorBusy.collapsed.height}}var i=E>0;return{width:"".concat(0===e.width&&i?N.alerts.width:e.width,"px"),height:"".concat(i&&k?N.alerts.height+(0===e.height?2*Q:Q):e.height,"px"),borderRadius:"".concat(k?L:R&&"waitingConference"===_?I:D,"px"),padding:k?null!=e.padding?"".concat(e.padding,"px"):"".concat(M,"px"):"".concat(O,"px ").concat(V,"px")}},[_,k,l,g,S,b,s,c,E,N,D,L,O,V,M,Q,p,u,R,q,C,x,f,m,v]);return e.useEffect(function(){var e={};e.width=null==z?void 0:z.width,e.height=null==z?void 0:z.height,i.eventDispatch("phone-island-size-change",{sizeInformation:e})},[z,_,k,l,g,S,b,s,c,E,N,D,L,O,V,M,Q,A,j,u,p,R,C]),r.default.createElement(d.motion.div,{className:"".concat(k?"pi-cursor-grab":"pi-cursor-pointer"," pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-border pi-border-solid pi-border-gray-200 dark:pi-border-gray-800 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow"),animate:z,transition:{duration:.15,ease:"easeOut"}},h)};exports.IslandMotion=h,exports.default=h;
|
|
2
2
|
//# sourceMappingURL=IslandMotion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useMemo, useEffect } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\nimport { eventDispatch } from '../utils'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const {\n incoming,\n outgoing,\n accepted,\n transferring,\n incomingWebRTC,\n incomingSocket,\n conferencing,\n throughQueue,\n queueName,\n queueNumber,\n } = useSelector((state: RootState) => state.currentCall)\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded, sideViewIsVisible,transcriptionViewIsVisible, isFromStreaming, isExtraLarge } = useSelector(\n (state: RootState) => state.island,\n )\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n border_radius_collapsed_conference,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n const motionVariants = useMemo(() => {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n padding: padding_expanded,\n }\n\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring && conferencing) {\n if (actionsExpanded) {\n size = {\n width: variants.call.expanded.transfer.actionsExpanded.width,\n height: variants.call.expanded.transfer.actionsExpanded.height,\n }\n } else {\n size = {\n width: variants.call.expanded.transfer.width,\n height: variants.call.expanded.transfer.height,\n }\n }\n } else if (accepted && actionsExpanded) {\n size = {\n width: variants.call.expanded.accepted.actionsExpanded.width,\n height: variants.call.expanded.accepted.actionsExpanded.height,\n }\n } else if (accepted && !isListen) {\n size = {\n width: variants.call.expanded.accepted.width,\n height: variants.call.expanded.accepted.height,\n }\n } else if (accepted && isListen) {\n size = {\n width: variants.call.expanded.listening.width,\n height: variants.call.expanded.listening.height,\n }\n } else if (incoming && !isFromStreaming) {\n const showIncomingQueueBadge =\n incoming && !accepted && throughQueue && Boolean(queueName || queueNumber)\n size = showIncomingQueueBadge\n ? {\n width: variants.call.expanded.incomingQueue.width,\n height: variants.call.expanded.incomingQueue.height,\n }\n : {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (incoming && isFromStreaming) {\n size = {\n width: variants.call.expanded.incomingStreaming.width,\n height: variants.call.expanded.incomingStreaming.height,\n }\n } else if (outgoing && !isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n } else if (outgoing && isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoingStreaming.width,\n height: variants.call.expanded.outgoingStreaming.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n\n case 'keypad':\n size = isOpen\n ? {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n : {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n break\n\n case 'video':\n if (isOpen) {\n size = {\n width: variants.video.expanded.width,\n height: variants.video.expanded.height,\n padding: variants.video.expanded.padding,\n }\n } else {\n size = {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n }\n break\n case 'transfer':\n case 'player':\n case 'recorder':\n case 'physicalPhoneRecorder':\n case 'settings':\n case 'conference':\n size = isOpen\n ? {\n width: variants[view].expanded.width,\n height: variants[view].expanded.height,\n }\n : {\n width: variants[view].collapsed.width,\n height: variants[view].collapsed.height,\n }\n break\n\n case 'switchDevice':\n size = isOpen\n ? {\n width: variants.switchDevice.expanded.width,\n height: variants.switchDevice.expanded.height,\n }\n : {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n break\n\n case 'waitingConference':\n size = isOpen\n ? {\n width: variants.waitingConference.expanded.width,\n height: variants.waitingConference.expanded.height,\n }\n : {\n width: variants.waitingConference.collapsed.width,\n height: variants.waitingConference.collapsed.height,\n }\n break\n case 'streamingAnswer':\n size = isOpen\n ? isExtraLarge\n ? {\n width: variants.streamingAnswer.extraLarge.width,\n height: variants.streamingAnswer.extraLarge.height,\n padding: variants.streamingAnswer.extraLarge.padding,\n }\n : {\n width: variants.streamingAnswer.expanded.width,\n height: variants.streamingAnswer.expanded.height,\n padding: variants.streamingAnswer.expanded.padding,\n }\n : {\n width: variants.streamingAnswer.collapsed.width,\n height: variants.streamingAnswer.collapsed.height,\n }\n break\n case 'operatorBusy':\n size = isOpen\n ? {\n width: variants.operatorBusy.expanded.width,\n height: variants.operatorBusy.expanded.height,\n }\n : {\n width: variants.operatorBusy.collapsed.width,\n height: variants.operatorBusy.collapsed.height,\n }\n break\n }\n\n const isAlert: boolean = activeAlertsCount > 0\n\n return {\n width: `${size.width === 0 && isAlert ? variants.alerts.width : size.width}px`,\n height: `${\n // If there is an alert and the island is open put the correct height\n isAlert && isOpen\n ? variants.alerts.height +\n (size.height === 0 ? alert_padding_expanded * 2 : alert_padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen\n ? `${border_radius_expanded}px`\n : isActive && view === 'waitingConference'\n ? `${border_radius_collapsed_conference}px`\n : `${border_radius_collapsed}px`,\n padding: isOpen\n ? size.padding != undefined\n ? `${size.padding}px`\n : `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }, [\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n incomingWebRTC,\n incomingSocket,\n isActive,\n isFromStreaming,\n isExtraLarge,\n throughQueue,\n queueName,\n queueNumber,\n ])\n\n useEffect(() => {\n let sizeInformation: any = {}\n sizeInformation.width = motionVariants?.width\n sizeInformation.height = motionVariants?.height\n eventDispatch('phone-island-size-change', {\n sizeInformation,\n })\n }, [\n motionVariants,\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n sideViewIsVisible,\n transcriptionViewIsVisible,\n incomingSocket,\n incomingWebRTC,\n isActive,\n isExtraLarge,\n ])\n\n return (\n <motion.div\n className={`${isOpen ? 'pi-cursor-grab' : 'pi-cursor-pointer'\n } pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-border pi-border-solid pi-border-gray-200 dark:pi-border-gray-800 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow`}\n animate={motionVariants}\n transition={{\n duration: 0.15,\n ease: 'easeOut',\n }}\n >\n {children}\n </motion.div>\n )\n}\n\ninterface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n padding?: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","incomingWebRTC","incomingSocket","conferencing","throughQueue","queueName","queueNumber","isListen","listen","_c","island","view","isOpen","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","isFromStreaming","isExtraLarge","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","border_radius_collapsed_conference","padding_x_collapsed","padding_y_collapsed","padding_expanded","alert_padding_expanded","isActive","conference","motionVariants","useMemo","size","width","height","padding","call","expanded","transfer","listening","Boolean","incomingQueue","incomingStreaming","outgoingStreaming","collapsed","keypad","video","switchDevice","waitingConference","streamingAnswer","extraLarge","operatorBusy","isAlert","concat","borderRadius","undefined","useEffect","sizeInformation","eventDispatch","React","createElement","motion","div","className","animate","transition","duration","ease"],"mappings":"sgBASaA,EAAsC,SAACC,GAAE,IAAAC,EAAQD,EAAAC,SAEtDC,EAWFC,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMC,WAAN,GAVpCC,aACAC,aACAC,aACAC,iBACAC,mBACAC,mBACAC,iBACAC,iBACAC,cACAC,gBAEMC,EAAab,cAAY,SAACC,GAAqB,OAAAA,EAAMa,kBACvDC,EAAiHf,EAAWA,YAChI,SAACC,GAAqB,OAAAA,EAAMe,MAAN,GADhBC,EAAIF,EAAAE,KAAEC,EAAMH,EAAAG,OAAEC,EAAeJ,EAAAI,gBAAEC,EAAiBL,EAAAK,kBAACC,EAA0BN,EAAAM,2BAAEC,EAAeP,EAAAO,gBAAEC,iBAG9FC,EAAsBxB,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAMwB,OAAOC,2BACvEC,EASF3B,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAM2B,UAR1CC,aACAC,EAAuBH,EAAAG,wBACvBC,EAAsBJ,EAAAI,uBACtBC,EAAkCL,EAAAK,mCAClCC,EAAmBN,EAAAM,oBACnBC,wBACAC,qBACAC,2BAEMC,EAAarC,cAAY,SAACC,GAAqB,OAAAA,EAAMqC,sBAEvDC,EAAiBC,EAAAA,QAAQ,WAE7B,IAAIC,EAAkB,CACpBC,MAAO,EACPC,OAAQ,EACRC,QAAST,GAGX,OAAQlB,GACN,IAAK,OACH,GAAIC,EACF,GAAIb,GAAYC,GAAgBG,EAE5BgC,EADEtB,EACK,CACLuB,MAAOb,EAASgB,KAAKC,SAASC,SAAS5B,gBAAgBuB,MACvDC,OAAQd,EAASgB,KAAKC,SAASC,SAAS5B,gBAAgBwB,QAGnD,CACLD,MAAOb,EAASgB,KAAKC,SAASC,SAASL,MACvCC,OAAQd,EAASgB,KAAKC,SAASC,SAASJ,aAGvC,GAAItC,GAAYc,EACrBsB,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAASzC,SAASc,gBAAgBuB,MACvDC,OAAQd,EAASgB,KAAKC,SAASzC,SAASc,gBAAgBwB,aAErD,GAAItC,IAAaQ,EACtB4B,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAASzC,SAASqC,MACvCC,OAAQd,EAASgB,KAAKC,SAASzC,SAASsC,aAErC,GAAItC,GAAYQ,EACrB4B,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAASE,UAAUN,MACxCC,OAAQd,EAASgB,KAAKC,SAASE,UAAUL,aAEtC,GAAIxC,IAAamB,EAAiB,CAGvCmB,EADEtC,IAAaE,GAAYK,GAAgBuC,QAAQtC,GAAaC,GAE5D,CACA8B,MAAOb,EAASgB,KAAKC,SAASI,cAAcR,MAC5CC,OAAQd,EAASgB,KAAKC,SAASI,cAAcP,QAE7C,CACAD,MAAOb,EAASgB,KAAKC,SAAS3C,SAASuC,MACvCC,OAAQd,EAASgB,KAAKC,SAAS3C,SAASwC,OAE7C,MAAUxC,GAAYmB,EACrBmB,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAASK,kBAAkBT,MAChDC,OAAQd,EAASgB,KAAKC,SAASK,kBAAkBR,QAE1CvC,IAAakB,EACtBmB,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAAS1C,SAASsC,MACvCC,OAAQd,EAASgB,KAAKC,SAAS1C,SAASuC,QAEjCvC,GAAYkB,IACrBmB,EAAO,CACLC,MAAOb,EAASgB,KAAKC,SAASM,kBAAkBV,MAChDC,OAAQd,EAASgB,KAAKC,SAASM,kBAAkBT,cAIrDF,EAAO,CACLC,MAAOb,EAASgB,KAAKQ,UAAUX,MAC/BC,OAAQd,EAASgB,KAAKQ,UAAUV,QAGpC,MAEF,IAAK,SACHF,EAAOvB,EACH,CACAwB,MAAOb,EAASyB,OAAOR,SAASJ,MAChCC,OAAQd,EAASyB,OAAOR,SAASH,QAEjC,CACAD,MAAOb,EAASkB,SAASM,UAAUX,MACnCC,OAAQd,EAASkB,SAASM,UAAUV,QAExC,MAEF,IAAK,QAEDF,EADEvB,EACK,CACLwB,MAAOb,EAAS0B,MAAMT,SAASJ,MAC/BC,OAAQd,EAAS0B,MAAMT,SAASH,OAChCC,QAASf,EAAS0B,MAAMT,SAASF,SAG5B,CACLF,MAAOb,EAAS0B,MAAMF,UAAUX,MAChCC,OAAQd,EAAS0B,MAAMF,UAAUV,QAGrC,MACF,IAAK,WACL,IAAK,SACL,IAAK,WACL,IAAK,wBACL,IAAK,WACL,IAAK,aACHF,EAAOvB,EACH,CACAwB,MAAOb,EAASZ,GAAM6B,SAASJ,MAC/BC,OAAQd,EAASZ,GAAM6B,SAASH,QAEhC,CACAD,MAAOb,EAASZ,GAAMoC,UAAUX,MAChCC,OAAQd,EAASZ,GAAMoC,UAAUV,QAErC,MAEF,IAAK,eACHF,EAAOvB,EACH,CACAwB,MAAOb,EAAS2B,aAAaV,SAASJ,MACtCC,OAAQd,EAAS2B,aAAaV,SAASH,QAEvC,CACAD,MAAOb,EAAS0B,MAAMF,UAAUX,MAChCC,OAAQd,EAAS0B,MAAMF,UAAUV,QAErC,MAEF,IAAK,oBACHF,EAAOvB,EACH,CACAwB,MAAOb,EAAS4B,kBAAkBX,SAASJ,MAC3CC,OAAQd,EAAS4B,kBAAkBX,SAASH,QAE5C,CACAD,MAAOb,EAAS4B,kBAAkBJ,UAAUX,MAC5CC,OAAQd,EAAS4B,kBAAkBJ,UAAUV,QAEjD,MACF,IAAK,kBACHF,EAAOvB,EACHK,EACE,CACAmB,MAAOb,EAAS6B,gBAAgBC,WAAWjB,MAC3CC,OAAQd,EAAS6B,gBAAgBC,WAAWhB,OAC5CC,QAASf,EAAS6B,gBAAgBC,WAAWf,SAE7C,CACAF,MAAOb,EAAS6B,gBAAgBZ,SAASJ,MACzCC,OAAQd,EAAS6B,gBAAgBZ,SAASH,OAC1CC,QAASf,EAAS6B,gBAAgBZ,SAASF,SAE7C,CACAF,MAAOb,EAAS6B,gBAAgBL,UAAUX,MAC1CC,OAAQd,EAAS6B,gBAAgBL,UAAUV,QAE/C,MACA,IAAK,eACLF,EAAOvB,EACH,CACAwB,MAAOb,EAAS+B,aAAad,SAASJ,MACtCC,OAAQd,EAAS+B,aAAad,SAASH,QAEvC,CACAD,MAAOb,EAAS+B,aAAaP,UAAUX,MACvCC,OAAQd,EAAS+B,aAAaP,UAAUV,QAKhD,IAAMkB,EAAmBrC,EAAoB,EAE7C,MAAO,CACLkB,MAAO,UAAkB,IAAfD,EAAKC,OAAemB,EAAUhC,EAASJ,OAAOiB,MAAQD,EAAKC,MAAS,MAC9EC,OAAQ,GAAAmB,OAEND,GAAW3C,EACPW,EAASJ,OAAOkB,QACD,IAAhBF,EAAKE,OAAwC,EAAzBP,EAA6BA,GAChDK,EAAKE,OACL,MACNoB,aACI,GAAGD,OADO5C,EACPa,EACHM,GAAqB,sBAATpB,EACPe,EACAF,EAHwB,MAIjCc,QAAS1B,EACW8C,MAAhBvB,EAAKG,QACH,GAAAkB,OAAGrB,EAAKG,QAAW,MACnB,GAAGkB,OAAA3B,EAAoB,MACzB,GAAA2B,OAAG7B,EAAmB,OAAA6B,OAAM5B,EAAuB,MAE3D,EAAG,CACDjB,EACAC,EACAb,EACAC,EACAa,EACAN,EACAV,EACAC,EACAoB,EACAK,EACAC,EACAC,EACAE,EACAC,EACAC,EACAC,EACA7B,EACAC,EACA6B,EACAf,EACAC,EACAb,EACAC,EACAC,IAoCF,OAjCAqD,EAAAA,UAAU,WACR,IAAIC,EAAuB,CAAA,EAC3BA,EAAgBxB,MAAQH,aAAA,EAAAA,EAAgBG,MACxCwB,EAAgBvB,OAASJ,aAAA,EAAAA,EAAgBI,OACzCwB,EAAAA,cAAc,2BAA4B,CACxCD,gBAAeA,GAEnB,EAAG,CACD3B,EACAtB,EACAC,EACAb,EACAC,EACAa,EACAN,EACAV,EACAC,EACAoB,EACAK,EACAC,EACAC,EACAE,EACAC,EACAC,EACAC,EACAhB,EACAC,EACAb,EACAD,EACA8B,EACAd,IAIA6C,EAAAA,QAACC,cAAAC,EAAAA,OAAOC,KACNC,UAAW,GAAGV,OAAA5C,EAAS,iBAAmB,oBAAmB,4PAE7DuD,QAASlC,EACTmC,WAAY,CACVC,SAAU,IACVC,KAAM,YAGP9E,EAGP"}
|
|
1
|
+
{"version":3,"file":"IslandMotion.js","sources":["../../src/components/IslandMotion.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useMemo, useEffect } from 'react'\nimport { RootState } from '../store'\nimport { useSelector } from 'react-redux'\nimport { motion } from 'framer-motion'\nimport { eventDispatch } from '../utils'\nimport { isNumberOnlyName } from '../lib/phone/conversation'\n\nexport const IslandMotion: FC<IslandMotionProps> = ({ children }) => {\n // Retrieve needed stored variables\n const {\n incoming,\n outgoing,\n accepted,\n transferring,\n incomingWebRTC,\n incomingSocket,\n conferencing,\n throughQueue,\n queueName,\n queueNumber,\n displayName,\n } = useSelector((state: RootState) => state.currentCall)\n const { isListen } = useSelector((state: RootState) => state.listen)\n const { view, isOpen, actionsExpanded, sideViewIsVisible,transcriptionViewIsVisible, isFromStreaming, isExtraLarge } = useSelector(\n (state: RootState) => state.island,\n )\n const { activeAlertsCount } = useSelector((state: RootState) => state.alerts.status)\n const {\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n border_radius_collapsed_conference,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n } = useSelector((state: RootState) => state.motions)\n const { isActive } = useSelector((state: RootState) => state.conference)\n\n const motionVariants = useMemo(() => {\n // Initial size\n let size: SizeTypes = {\n width: 0,\n height: 0,\n padding: padding_expanded,\n }\n\n switch (view) {\n case 'call':\n if (isOpen) {\n if (accepted && transferring && conferencing) {\n if (actionsExpanded) {\n size = {\n width: variants.call.expanded.transfer.actionsExpanded.width,\n height: variants.call.expanded.transfer.actionsExpanded.height,\n }\n } else {\n size = {\n width: variants.call.expanded.transfer.width,\n height: variants.call.expanded.transfer.height,\n }\n }\n } else if (accepted && actionsExpanded) {\n size = {\n width: variants.call.expanded.accepted.actionsExpanded.width,\n height: variants.call.expanded.accepted.actionsExpanded.height,\n }\n } else if (accepted && !isListen) {\n size = {\n width: variants.call.expanded.accepted.width,\n height: variants.call.expanded.accepted.height,\n }\n } else if (accepted && isListen) {\n size = {\n width: variants.call.expanded.listening.width,\n height: variants.call.expanded.listening.height,\n }\n } else if (incoming && !isFromStreaming) {\n const showIncomingQueueBadge =\n incoming && !accepted && throughQueue && Boolean(queueName || queueNumber)\n size = showIncomingQueueBadge && !isNumberOnlyName(displayName)\n ? {\n width: variants.call.expanded.incomingQueue.width,\n height: variants.call.expanded.incomingQueue.height,\n }\n : {\n width: variants.call.expanded.incoming.width,\n height: variants.call.expanded.incoming.height,\n }\n } else if (incoming && isFromStreaming) {\n size = {\n width: variants.call.expanded.incomingStreaming.width,\n height: variants.call.expanded.incomingStreaming.height,\n }\n } else if (outgoing && !isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoing.width,\n height: variants.call.expanded.outgoing.height,\n }\n } else if (outgoing && isFromStreaming) {\n size = {\n width: variants.call.expanded.outgoingStreaming.width,\n height: variants.call.expanded.outgoingStreaming.height,\n }\n }\n } else {\n size = {\n width: variants.call.collapsed.width,\n height: variants.call.collapsed.height,\n }\n }\n break\n\n case 'keypad':\n size = isOpen\n ? {\n width: variants.keypad.expanded.width,\n height: variants.keypad.expanded.height,\n }\n : {\n width: variants.transfer.collapsed.width,\n height: variants.transfer.collapsed.height,\n }\n break\n\n case 'video':\n if (isOpen) {\n size = {\n width: variants.video.expanded.width,\n height: variants.video.expanded.height,\n padding: variants.video.expanded.padding,\n }\n } else {\n size = {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n }\n break\n case 'transfer':\n case 'player':\n case 'recorder':\n case 'physicalPhoneRecorder':\n case 'settings':\n case 'conference':\n size = isOpen\n ? {\n width: variants[view].expanded.width,\n height: variants[view].expanded.height,\n }\n : {\n width: variants[view].collapsed.width,\n height: variants[view].collapsed.height,\n }\n break\n\n case 'switchDevice':\n size = isOpen\n ? {\n width: variants.switchDevice.expanded.width,\n height: variants.switchDevice.expanded.height,\n }\n : {\n width: variants.video.collapsed.width,\n height: variants.video.collapsed.height,\n }\n break\n\n case 'waitingConference':\n size = isOpen\n ? {\n width: variants.waitingConference.expanded.width,\n height: variants.waitingConference.expanded.height,\n }\n : {\n width: variants.waitingConference.collapsed.width,\n height: variants.waitingConference.collapsed.height,\n }\n break\n case 'streamingAnswer':\n size = isOpen\n ? isExtraLarge\n ? {\n width: variants.streamingAnswer.extraLarge.width,\n height: variants.streamingAnswer.extraLarge.height,\n padding: variants.streamingAnswer.extraLarge.padding,\n }\n : {\n width: variants.streamingAnswer.expanded.width,\n height: variants.streamingAnswer.expanded.height,\n padding: variants.streamingAnswer.expanded.padding,\n }\n : {\n width: variants.streamingAnswer.collapsed.width,\n height: variants.streamingAnswer.collapsed.height,\n }\n break\n case 'operatorBusy':\n size = isOpen\n ? {\n width: variants.operatorBusy.expanded.width,\n height: variants.operatorBusy.expanded.height,\n }\n : {\n width: variants.operatorBusy.collapsed.width,\n height: variants.operatorBusy.collapsed.height,\n }\n break\n }\n\n const isAlert: boolean = activeAlertsCount > 0\n\n return {\n width: `${size.width === 0 && isAlert ? variants.alerts.width : size.width}px`,\n height: `${\n // If there is an alert and the island is open put the correct height\n isAlert && isOpen\n ? variants.alerts.height +\n (size.height === 0 ? alert_padding_expanded * 2 : alert_padding_expanded)\n : size.height\n }px`,\n borderRadius: isOpen\n ? `${border_radius_expanded}px`\n : isActive && view === 'waitingConference'\n ? `${border_radius_collapsed_conference}px`\n : `${border_radius_collapsed}px`,\n padding: isOpen\n ? size.padding != undefined\n ? `${size.padding}px`\n : `${padding_expanded}px`\n : `${padding_x_collapsed}px ${padding_y_collapsed}px`,\n }\n }, [\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n incomingWebRTC,\n incomingSocket,\n isActive,\n isFromStreaming,\n isExtraLarge,\n throughQueue,\n queueName,\n queueNumber,\n displayName,\n ])\n\n useEffect(() => {\n let sizeInformation: any = {}\n sizeInformation.width = motionVariants?.width\n sizeInformation.height = motionVariants?.height\n eventDispatch('phone-island-size-change', {\n sizeInformation,\n })\n }, [\n motionVariants,\n view,\n isOpen,\n accepted,\n transferring,\n actionsExpanded,\n isListen,\n incoming,\n outgoing,\n activeAlertsCount,\n variants,\n border_radius_collapsed,\n border_radius_expanded,\n padding_x_collapsed,\n padding_y_collapsed,\n padding_expanded,\n alert_padding_expanded,\n sideViewIsVisible,\n transcriptionViewIsVisible,\n incomingSocket,\n incomingWebRTC,\n isActive,\n isExtraLarge,\n ])\n\n return (\n <motion.div\n className={`${isOpen ? 'pi-cursor-grab' : 'pi-cursor-pointer'\n } pi-pointer-events-auto pi-overflow-hidden dark:pi-bg-gray-950 pi-bg-gray-50 pi-border pi-border-solid pi-border-gray-200 dark:pi-border-gray-800 pi-text-xs dark:pi-text-white pi-text-gray-900 hover:pi-shadow-2xl pi-rounded-3xl pi-transition-shadow`}\n animate={motionVariants}\n transition={{\n duration: 0.15,\n ease: 'easeOut',\n }}\n >\n {children}\n </motion.div>\n )\n}\n\ninterface IslandMotionProps {\n children: ReactNode\n}\n\ntype SizeTypes = {\n width: number\n height: number\n padding?: number\n}\n\nexport default IslandMotion\n"],"names":["IslandMotion","_a","children","_b","useSelector","state","currentCall","incoming","outgoing","accepted","transferring","incomingWebRTC","incomingSocket","conferencing","throughQueue","queueName","queueNumber","displayName","isListen","listen","_c","island","view","isOpen","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","isFromStreaming","isExtraLarge","activeAlertsCount","alerts","status","_d","motions","variants","border_radius_collapsed","border_radius_expanded","border_radius_collapsed_conference","padding_x_collapsed","padding_y_collapsed","padding_expanded","alert_padding_expanded","isActive","conference","motionVariants","useMemo","size","width","height","padding","call","expanded","transfer","listening","Boolean","isNumberOnlyName","incomingQueue","incomingStreaming","outgoingStreaming","collapsed","keypad","video","switchDevice","waitingConference","streamingAnswer","extraLarge","operatorBusy","isAlert","concat","borderRadius","undefined","useEffect","sizeInformation","eventDispatch","React","createElement","motion","div","className","animate","transition","duration","ease"],"mappings":"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"}
|