@nethesis/phone-island 1.0.0-dev.9 → 1.0.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.
@@ -1 +1 @@
1
- {"version":3,"file":"IslandDrag.js","sources":["../../src/components/IslandDrag.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useState, useRef, MutableRefObject } from 'react'\nimport { RootState, Dispatch, store } from '../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { motion, useDragControls, useAnimation } from 'framer-motion'\nimport { useLongPress, useLocalStorage, styleTransformValues, useEventListener } from '../utils'\nimport { xPosition, yPosition } from '../lib/island/island'\n\nexport const IslandDrag: FC<IslandDragProps> = ({ children, islandContainerRef }) => {\n const { startPosition } = useSelector((state: RootState) => state.island)\n\n // Initialize the moved property\n const [moved, setMoved] = useState<boolean>(false)\n\n // Initialize dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize Island drag controls\n const controls = useDragControls()\n\n // Initialize animation controls for reset functionality\n const animationControls = useAnimation()\n\n // Initialize Island storage\n const [phoneIslandStorage, setPhoneIslandStorage] =\n useLocalStorage<PhoneIslandStorageTypes | null>('phone-island', null)\n\n // The Island reference\n const islandRef = useRef<any>(null)\n\n // Initialize position or get from storage\n const [position, setPosition] = useState<PositionTypes | null>(\n phoneIslandStorage && phoneIslandStorage.position ? phoneIslandStorage.position : null,\n )\n\n // Handles reset position to default\n const handleResetPosition = async () => {\n // Clear localStorage\n localStorage.removeItem('phone-island')\n \n // Reset position state\n setPosition(null)\n \n // Animate back to default position\n await animationControls.start({\n x: startPosition.x,\n y: startPosition.y,\n transition: {\n duration: 0.3,\n ease: 'easeOut',\n },\n })\n }\n\n // Listen for reset position event\n useEventListener('phone-island-reset-position', handleResetPosition)\n\n // Handles the drag started event\n function handleStartDrag(event: React.PointerEvent<Element>) {\n const target = event.target as HTMLElement\n if (\n target.closest('[data-stop-propagation=\"true\"]') ||\n target.hasAttribute('data-stop-propagation')\n ) {\n return\n }\n\n controls.start(event)\n }\n\n // Handles log press event\n const handleLongPress = () => {}\n\n const handleIslandClick = (event?: React.MouseEvent<Element> | any) => {\n if (event && event.target) {\n const target = event.target as HTMLElement\n if (\n target.closest('[data-stop-propagation=\"true\"]') ||\n target.hasAttribute('data-stop-propagation')\n ) {\n return\n }\n }\n\n // Only if phone island is close is possible to open it trough the click\n const isPhoneIslandAlreadyOpen = store?.getState()?.island?.isOpen\n !isPhoneIslandAlreadyOpen && dispatch.island.handleToggleIsOpen()\n }\n\n // Handles drag end event\n const handleDragEnd = () => {\n if (!islandRef.current) return\n // Get initial transform values\n let { x, y }: any = styleTransformValues(islandRef.current)\n // Round position\n x = xPosition(Math.round(x), islandRef.current, islandContainerRef.current)\n y = yPosition(Math.round(y), islandRef.current, islandContainerRef.current)\n // Save the new position to localstorage\n setPhoneIslandStorage({\n position: {\n x,\n y,\n },\n })\n // Set position to variable\n setPosition({\n x,\n y,\n })\n }\n\n // Handles drag started event\n function handleDragStarted() {\n setMoved(true)\n }\n\n // Initialize the longPressEvent object\n const longPressEvent = useLongPress(\n handleLongPress,\n handleIslandClick,\n moved,\n () => setMoved(false),\n {\n shouldPreventDefault: true,\n delay: 250,\n },\n )\n\n return (\n <motion.div\n drag\n onPointerDown={handleStartDrag}\n onDragStart={handleDragStarted}\n dragTransition={{ \n power: 0,\n timeConstant: 300\n }}\n initial={{\n x: position?.x || startPosition.x,\n y: position?.y || startPosition.y,\n }}\n animate={animationControls}\n dragControls={controls}\n dragListener={false}\n dragConstraints={islandContainerRef}\n onDragEnd={handleDragEnd}\n ref={islandRef}\n {...longPressEvent}\n className='pi-absolute'\n >\n {children && children}\n </motion.div>\n )\n}\n\nexport default IslandDrag\n\nexport interface IslandDragProps {\n children: ReactNode\n islandContainerRef: MutableRefObject<HTMLDivElement>\n}\n\ninterface PhoneIslandStorageTypes {\n position: PositionTypes\n}\n\ninterface PositionTypes {\n x: number\n y: number\n}\n"],"names":["IslandDrag","_a","children","islandContainerRef","startPosition","useSelector","state","island","_b","useState","moved","setMoved","dispatch","useDispatch","controls","useDragControls","animationControls","useAnimation","_c","useLocalStorage","phoneIslandStorage","setPhoneIslandStorage","islandRef","useRef","_d","position","setPosition","useEventListener","__awaiter","localStorage","removeItem","start","x","y","transition","duration","ease","sent","longPressEvent","useLongPress","event","target","closest","hasAttribute","store","getState","isOpen","handleToggleIsOpen","shouldPreventDefault","delay","React","createElement","motion","div","drag","onPointerDown","onDragStart","dragTransition","power","timeConstant","initial","animate","dragControls","dragListener","dragConstraints","onDragEnd","current","styleTransformValues","xPosition","Math","round","yPosition","ref","className"],"mappings":"k8BAUaA,EAAkC,SAACC,OAAEC,EAAQD,EAAAC,SAAEC,EAAkBF,EAAAE,mBACpEC,EAAkBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,wBAG5DC,EAAoBC,EAAAA,UAAkB,GAArCC,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAGhBI,EAAWC,EAAAA,cAGXC,EAAWC,EAAAA,kBAGXC,EAAoBC,EAAAA,eAGpBC,EACJC,EAAAA,gBAAgD,eAAgB,MAD3DC,EAAkBF,EAAA,GAAEG,OAIrBC,EAAYC,SAAY,MAGxBC,EAA0Bf,EAAAA,SAC9BW,GAAsBA,EAAmBK,SAAWL,EAAmBK,SAAW,MAD7EA,EAAQD,EAAA,GAAEE,EAAWF,EAAA,GAwB5BG,mBAAiB,+BAnBW,WAAA,OAAAC,EAAAA,eAAA,OAAA,OAAA,GAAA,yEAQ1B,OANAC,aAAaC,WAAW,gBAGxBJ,EAAY,MAGN,CAAA,EAAAV,EAAkBe,MAAM,CAC5BC,EAAG5B,EAAc4B,EACjBC,EAAG7B,EAAc6B,EACjBC,WAAY,CACVC,SAAU,GACVC,KAAM,4BALVnC,EAAAoC,qBAyEF,IAAMC,EAAiBC,EAAAA,cA9CC,eAEE,SAACC,WACzB,GAAIA,GAASA,EAAMC,OAAQ,CACzB,IAAMA,EAASD,EAAMC,OACrB,GACEA,EAAOC,QAAQ,mCACfD,EAAOE,aAAa,yBAEpB,MAEH,GAGyD,QAAzBnC,EAAiB,QAAjBP,SAAA2C,EAAAA,YAAK,IAALA,EAAKA,WAAA,EAALA,EAAAA,MAAOC,kBAAU,IAAA5C,OAAA,EAAAA,EAAEM,cAAM,IAAAC,OAAA,EAAAA,EAAEsC,SAC/BlC,EAASL,OAAOwC,oBAC/C,GAiCErC,GACA,WAAM,OAAAC,GAAS,KACf,CACEqC,sBAAsB,EACtBC,MAAO,MAIX,OACEC,EAAC,QAAAC,cAAAC,SAAOC,gBACNC,MAAI,EACJC,cAzEJ,SAAyBf,GACvB,IAAMC,EAASD,EAAMC,OAEnBA,EAAOC,QAAQ,mCACfD,EAAOE,aAAa,0BAKtB7B,EAASiB,MAAMS,EAChB,EAgEGgB,YApBJ,WACE7C,GAAS,EACV,EAmBG8C,eAAgB,CACdC,MAAO,EACPC,aAAc,KAEhBC,QAAS,CACP5B,GAAGP,aAAQ,EAARA,EAAUO,IAAK5B,EAAc4B,EAChCC,GAAGR,aAAQ,EAARA,EAAUQ,IAAK7B,EAAc6B,GAElC4B,QAAS7C,EACT8C,aAAchD,EACdiD,cAAc,EACdC,gBAAiB7D,EACjB8D,UAvDkB,WACpB,GAAK3C,EAAU4C,QAAf,CAEI,IAAAjE,EAAgBkE,EAAAA,qBAAqB7C,EAAU4C,SAA7ClC,EAAC/B,EAAA+B,EAAEC,MAETD,EAAIoC,EAAAA,UAAUC,KAAKC,MAAMtC,GAAIV,EAAU4C,QAAS/D,EAAmB+D,SACnEjC,EAAIsC,EAAAA,UAAUF,KAAKC,MAAMrC,GAAIX,EAAU4C,QAAS/D,EAAmB+D,SAEnE7C,EAAsB,CACpBI,SAAU,CACRO,EAACA,EACDC,EAACA,KAILP,EAAY,CACVM,EAACA,EACDC,EAACA,GAhB2B,CAkBhC,EAqCIuC,IAAKlD,GACDgB,EACJ,CAAAmC,UAAU,gBAETvE,GAAYA,EAGnB"}
1
+ {"version":3,"file":"IslandDrag.js","sources":["../../src/components/IslandDrag.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type ReactNode, FC, useState, useRef, MutableRefObject } from 'react'\nimport { RootState, Dispatch, store } from '../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { motion, useDragControls, useAnimation } from 'framer-motion'\nimport { useLongPress, useLocalStorage, styleTransformValues, useEventListener } from '../utils'\nimport { xPosition, yPosition } from '../lib/island/island'\n\nexport const IslandDrag: FC<IslandDragProps> = ({ children, islandContainerRef }) => {\n const { startPosition } = useSelector((state: RootState) => state.island)\n\n // Initialize the moved property\n const [moved, setMoved] = useState<boolean>(false)\n\n // Initialize dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Initialize Island drag controls\n const controls = useDragControls()\n\n // Initialize animation controls for reset functionality\n const animationControls = useAnimation()\n\n // Initialize Island storage\n const [phoneIslandStorage, setPhoneIslandStorage] =\n useLocalStorage<PhoneIslandStorageTypes | null>('phone-island', null)\n\n // The Island reference\n const islandRef = useRef<any>(null)\n\n // Initialize position or get from storage\n const [position, setPosition] = useState<PositionTypes | null>(\n phoneIslandStorage && phoneIslandStorage.position ? phoneIslandStorage.position : null,\n )\n\n // Handles reset position to default\n const handleResetPosition = async () => {\n // Clear localStorage\n localStorage.removeItem('phone-island')\n \n // Reset position state\n setPosition(null)\n \n // Animate back to default position\n await animationControls.start({\n x: startPosition.x,\n y: startPosition.y,\n transition: {\n duration: 0.3,\n ease: 'easeOut',\n },\n })\n }\n\n // Listen for reset position event\n useEventListener('phone-island-reset-position', handleResetPosition)\n\n // Handles the drag started event\n function handleStartDrag(event: React.PointerEvent<Element>) {\n const target = event.target as HTMLElement\n if (\n target.closest('[data-stop-propagation=\"true\"]') ||\n target.hasAttribute('data-stop-propagation')\n ) {\n return\n }\n\n controls.start(event)\n }\n\n // Handles log press event\n const handleLongPress = () => {}\n\n const handleIslandClick = (event?: React.MouseEvent<Element> | any) => {\n if (event && event.target) {\n const target = event.target as HTMLElement\n if (\n target.closest('[data-stop-propagation=\"true\"]') ||\n target.hasAttribute('data-stop-propagation')\n ) {\n return\n }\n }\n\n // Only if phone island is close is possible to open it trough the click\n const isPhoneIslandAlreadyOpen = store?.getState()?.island?.isOpen\n !isPhoneIslandAlreadyOpen && dispatch.island.handleToggleIsOpen()\n }\n\n // Handles drag end event\n const handleDragEnd = () => {\n // Get initial transform values\n let { x, y }: any = styleTransformValues(islandRef.current)\n // Round position\n x = xPosition(Math.round(x), islandRef.current, islandContainerRef.current)\n y = yPosition(Math.round(y), islandRef.current, islandContainerRef.current)\n // Save the new position to localstorage\n setPhoneIslandStorage({\n position: {\n x,\n y,\n },\n })\n // Set position to variable\n setPosition({\n x,\n y,\n })\n }\n\n // Handles drag started event\n function handleDragStarted() {\n setMoved(true)\n }\n\n // Initialize the longPressEvent object\n const longPressEvent = useLongPress(\n handleLongPress,\n handleIslandClick,\n moved,\n () => setMoved(false),\n {\n shouldPreventDefault: true,\n delay: 250,\n },\n )\n\n return (\n <motion.div\n drag\n onPointerDown={handleStartDrag}\n onDragStart={handleDragStarted}\n dragTransition={{ \n power: 0,\n timeConstant: 300\n }}\n initial={{\n x: position?.x || startPosition.x,\n y: position?.y || startPosition.y,\n }}\n animate={animationControls}\n dragControls={controls}\n dragListener={false}\n dragConstraints={islandContainerRef}\n onDragEnd={handleDragEnd}\n ref={islandRef}\n {...longPressEvent}\n className='pi-absolute'\n >\n {children && children}\n </motion.div>\n )\n}\n\nexport default IslandDrag\n\nexport interface IslandDragProps {\n children: ReactNode\n islandContainerRef: MutableRefObject<HTMLDivElement>\n}\n\ninterface PhoneIslandStorageTypes {\n position: PositionTypes\n}\n\ninterface PositionTypes {\n x: number\n y: number\n}\n"],"names":["IslandDrag","_a","children","islandContainerRef","startPosition","useSelector","state","island","_b","useState","moved","setMoved","dispatch","useDispatch","controls","useDragControls","animationControls","useAnimation","_c","useLocalStorage","phoneIslandStorage","setPhoneIslandStorage","islandRef","useRef","_d","position","setPosition","useEventListener","__awaiter","localStorage","removeItem","start","x","y","transition","duration","ease","sent","longPressEvent","useLongPress","event","target","closest","hasAttribute","store","getState","isOpen","handleToggleIsOpen","shouldPreventDefault","delay","React","createElement","motion","div","drag","onPointerDown","onDragStart","dragTransition","power","timeConstant","initial","animate","dragControls","dragListener","dragConstraints","onDragEnd","styleTransformValues","current","xPosition","Math","round","yPosition","ref","className"],"mappings":"k8BAUaA,EAAkC,SAACC,OAAEC,EAAQD,EAAAC,SAAEC,EAAkBF,EAAAE,mBACpEC,EAAkBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,wBAG5DC,EAAoBC,EAAAA,UAAkB,GAArCC,EAAKF,EAAA,GAAEG,EAAQH,EAAA,GAGhBI,EAAWC,EAAAA,cAGXC,EAAWC,EAAAA,kBAGXC,EAAoBC,EAAAA,eAGpBC,EACJC,EAAAA,gBAAgD,eAAgB,MAD3DC,EAAkBF,EAAA,GAAEG,OAIrBC,EAAYC,SAAY,MAGxBC,EAA0Bf,EAAAA,SAC9BW,GAAsBA,EAAmBK,SAAWL,EAAmBK,SAAW,MAD7EA,EAAQD,EAAA,GAAEE,EAAWF,EAAA,GAwB5BG,mBAAiB,+BAnBW,WAAA,OAAAC,EAAAA,eAAA,OAAA,OAAA,GAAA,yEAQ1B,OANAC,aAAaC,WAAW,gBAGxBJ,EAAY,MAGN,CAAA,EAAAV,EAAkBe,MAAM,CAC5BC,EAAG5B,EAAc4B,EACjBC,EAAG7B,EAAc6B,EACjBC,WAAY,CACVC,SAAU,GACVC,KAAM,4BALVnC,EAAAoC,qBAwEF,IAAMC,EAAiBC,EAAAA,cA7CC,eAEE,SAACC,WACzB,GAAIA,GAASA,EAAMC,OAAQ,CACzB,IAAMA,EAASD,EAAMC,OACrB,GACEA,EAAOC,QAAQ,mCACfD,EAAOE,aAAa,yBAEpB,MAEH,GAGyD,QAAzBnC,EAAiB,QAAjBP,SAAA2C,EAAAA,YAAK,IAALA,EAAKA,WAAA,EAALA,EAAAA,MAAOC,kBAAU,IAAA5C,OAAA,EAAAA,EAAEM,cAAM,IAAAC,OAAA,EAAAA,EAAEsC,SAC/BlC,EAASL,OAAOwC,oBAC/C,GAgCErC,GACA,WAAM,OAAAC,GAAS,KACf,CACEqC,sBAAsB,EACtBC,MAAO,MAIX,OACEC,EAAC,QAAAC,cAAAC,SAAOC,gBACNC,MAAI,EACJC,cAxEJ,SAAyBf,GACvB,IAAMC,EAASD,EAAMC,OAEnBA,EAAOC,QAAQ,mCACfD,EAAOE,aAAa,0BAKtB7B,EAASiB,MAAMS,EAChB,EA+DGgB,YApBJ,WACE7C,GAAS,EACV,EAmBG8C,eAAgB,CACdC,MAAO,EACPC,aAAc,KAEhBC,QAAS,CACP5B,GAAGP,aAAQ,EAARA,EAAUO,IAAK5B,EAAc4B,EAChCC,GAAGR,aAAQ,EAARA,EAAUQ,IAAK7B,EAAc6B,GAElC4B,QAAS7C,EACT8C,aAAchD,EACdiD,cAAc,EACdC,gBAAiB7D,EACjB8D,UAtDkB,WAEhB,IAAAhE,EAAgBiE,EAAAA,qBAAqB5C,EAAU6C,SAA7CnC,EAAC/B,EAAA+B,EAAEC,MAETD,EAAIoC,EAAAA,UAAUC,KAAKC,MAAMtC,GAAIV,EAAU6C,QAAShE,EAAmBgE,SACnElC,EAAIsC,EAAAA,UAAUF,KAAKC,MAAMrC,GAAIX,EAAU6C,QAAShE,EAAmBgE,SAEnE9C,EAAsB,CACpBI,SAAU,CACRO,EAACA,EACDC,EAACA,KAILP,EAAY,CACVM,EAACA,EACDC,EAACA,GAEL,EAqCIuC,IAAKlD,GACDgB,EACJ,CAAAmC,UAAU,gBAETvE,GAAYA,EAGnB"}
@@ -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"),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 t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../GenericAvatar.js"),a=require("../CustomThemedTooltip.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js"),i=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=o(e);exports.OperatorBusyView=function(){var o=s.useSelector((function(e){return e.island})).operatorBusy,c=s.useSelector((function(e){return e.avatars})).avatars,m=s.useSelector((function(e){return e.users})).extensions,f=t.useTranslation().t,p=i.useDispatch(),v=s.useSelector((function(e){return e.conference})),b=v.isActive,x=v.conferenceStartedFrom,y=s.useSelector((function(e){return e.currentUser})).username,j=e.useCallback((function(){p.player.stopAudioPlayer(),p.island.resetOperatorBusyCompletely(),b&&x===y?p.island.setIslandView("waitingConference"):p.island.setIslandView(null)}),[p,b,x,y]),N=e.useMemo((function(){if((null==o?void 0:o.calledNumber)&&m){var e=Object.values(m).find((function(e){return e.exten===(null==o?void 0:o.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[m,null==o?void 0:o.calledNumber]),q=e.useMemo((function(){return N&&c&&c[N]?c[N]:null}),[c,N]),h=e.useMemo((function(){return null!==N}),[N]),_=e.useMemo((function(){if(m&&(null==o?void 0:o.calledNumber)&&""!==(null==o?void 0:o.calledNumber)){var e=Object.values(m).find((function(e){return(null==e?void 0:e.exten)===(null==o?void 0:o.calledNumber)}));return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==o?void 0:o.calledNumber}return"-"}),[null==o?void 0:o.calledNumber,m]),w=e.useMemo((function(){return f(h?"Call.User busy":"Call.Number busy")}),[f,h]);return e.useEffect((function(){return function(){p.player.stopAudioPlayer()}}),[p]),d.default.createElement(d.default.Fragment,null,d.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},d.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},d.default.createElement(n.GenericAvatar,{avatarUrl:q,size:"open",showPulseEffect:!1}),d.default.createElement("div",{className:"pi-flex pi-flex-col"},d.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},_),d.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},w))),d.default.createElement(r.Button,{variant:"default",onClick:j,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":f("Tooltip.Close")||"Close"},d.default.createElement(l.FontAwesomeIcon,{icon:u.faXmark,className:"pi-w-5 pi-h-5"}))),d.default.createElement(a.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
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 t=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),u=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),n=require("../GenericAvatar.js"),i=require("../CustomThemedTooltip.js"),o=require("../../node_modules/react-redux/es/hooks/useSelector.js"),a=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=s(e);exports.OperatorBusyView=function(){var s=o.useSelector((function(e){return e.island})),d=s.operatorBusy,m=s.previousView,f=o.useSelector((function(e){return e.avatars})).avatars,p=o.useSelector((function(e){return e.users})).extensions,v=t.useTranslation().t,b=a.useDispatch(),x=o.useSelector((function(e){return e.conference})),y=x.isActive,j=x.conferenceStartedFrom,N=o.useSelector((function(e){return e.currentUser})).username,q=o.useSelector((function(e){return e.currentCall})),w=q.accepted,h=q.incoming,_=q.outgoing,E=e.useCallback((function(){return y&&j===N?"waitingConference":w||h||_?m||"call":null}),[w,j,h,y,_,m,N]),C=e.useCallback((function(){b.player.stopAudioPlayer(),b.island.resetOperatorBusyCompletely(),b.island.setIslandView(E())}),[b,E]),g=e.useMemo((function(){if((null==d?void 0:d.calledNumber)&&p){var e=Object.values(p).find((function(e){return e.exten===(null==d?void 0:d.calledNumber)}));return e?null==e?void 0:e.username:null}return null}),[p,null==d?void 0:d.calledNumber]),k=e.useMemo((function(){return g&&f&&f[g]?f[g]:null}),[f,g]),T=e.useMemo((function(){return null!==g}),[g]),S=e.useMemo((function(){if(p&&(null==d?void 0:d.calledNumber)&&""!==(null==d?void 0:d.calledNumber)){var e=Object.values(p).find((function(e){return(null==e?void 0:e.exten)===(null==d?void 0:d.calledNumber)}));return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==d?void 0:d.calledNumber}return"-"}),[null==d?void 0:d.calledNumber,p]),A=e.useMemo((function(){return v(T?"Call.User busy":"Call.Number busy")}),[v,T]);return e.useEffect((function(){return function(){b.player.stopAudioPlayer()}}),[b]),e.useEffect((function(){var e=window.setTimeout((function(){C()}),4e3);return function(){window.clearTimeout(e)}}),[C]),c.default.createElement(c.default.Fragment,null,c.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},c.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},c.default.createElement(n.GenericAvatar,{avatarUrl:k,size:"open",showPulseEffect:!1}),c.default.createElement("div",{className:"pi-flex pi-flex-col"},c.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},S),c.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},A))),c.default.createElement(r.Button,{variant:"default",onClick:C,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":v("Tooltip.Close")||"Close"},c.default.createElement(l.FontAwesomeIcon,{icon:u.faXmark,className:"pi-w-5 pi-h-5"}))),c.default.createElement(i.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n\n // Check if conference is active and user is the owner\n if (isActive && conferenceStartedFrom === username) {\n // Go back to waiting conference instead of closing\n dispatch.island.setIslandView('waitingConference')\n } else {\n // Reset island view if no active conference\n dispatch.island.setIslandView(null)\n }\n }, [dispatch, isActive, conferenceStartedFrom, username])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["operatorBusy","useSelector","state","island","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_a","conference","isActive","conferenceStartedFrom","username","currentUser","handleClose","useCallback","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"4nCAa2D,WACjD,IAAAA,EAAiBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,uBACzDC,EAAYH,eAAY,SAACC,GAAqB,OAAAA,EAAME,mBACpDC,EAAeJ,eAAY,SAACC,GAAqB,OAAAA,EAAMI,oBACvDC,EAAMC,qBACRC,EAAWC,EAAAA,cACXC,EAAsCV,EAAAA,aAAY,SAACC,GAAqB,OAAAA,EAAMU,UAAU,IAAtFC,aAAUC,0BACVC,EAAad,eAAY,SAACC,GAAqB,OAAAA,EAAMc,wBAEvDC,EAAcC,EAAAA,aAAY,WAE9BT,EAASU,OAAOC,kBAEhBX,EAASN,OAAOkB,8BAGZR,GAAYC,IAA0BC,EAExCN,EAASN,OAAOmB,cAAc,qBAG9Bb,EAASN,OAAOmB,cAAc,KAEjC,GAAE,CAACb,EAAUI,EAAUC,EAAuBC,IAGzCQ,EAAmBC,EAAAA,SAAQ,WAE/B,IAAIxB,aAAY,EAAZA,EAAcyB,eAAgBpB,EAAY,CAE5C,IAAMqB,EAAYC,OAAOC,OAAOvB,GAAYwB,MAC1C,SAACC,GAAQ,OAAAA,EAAIC,SAAU/B,aAAY,EAAZA,EAAcyB,aAA5B,IAGX,OAAOC,EAAYA,aAAA,EAAAA,EAAWX,SAAW,IAC1C,CACD,OAAO,IACR,GAAE,CAACV,EAAYL,aAAY,EAAZA,EAAcyB,eAGxBO,EAAYR,EAAAA,SAAQ,WAExB,OAAID,GAAoBnB,GAAWA,EAAQmB,GAClCnB,EAAQmB,GAEV,IACT,GAAG,CAACnB,EAASmB,IAGPU,EAAaT,EAAAA,SAAQ,WACzB,OAA4B,OAArBD,CACT,GAAG,CAACA,IAGEW,EAAcV,EAAAA,SAAQ,WAC1B,GAAInB,IAAcL,aAAA,EAAAA,EAAcyB,eAA+C,MAA/BzB,aAAY,EAAZA,EAAcyB,cAAqB,CAEjF,IAAMC,EAAYC,OAAOC,OAAOvB,GAAYwB,MAC1C,SAACC,GAAQ,OAAAA,eAAAA,EAAKC,UAAU/B,aAAA,EAAAA,EAAcyB,aAAY,IAIpD,OAAIC,IAAaA,aAAA,EAAAA,EAAWS,OAA4B,MAApBT,aAAS,EAATA,EAAWS,MACtCT,eAAAA,EAAWS,KAIbnC,eAAAA,EAAcyB,YACtB,CAED,MAAO,GACR,GAAE,CAACzB,aAAY,EAAZA,EAAcyB,aAAcpB,IAE1B+B,EAAaZ,EAAAA,SAAQ,WAEzB,OACSjB,EADL0B,EACO,iBAEF,mBACX,GAAG,CAAC1B,EAAG0B,IASP,OANAI,EAAAA,WAAU,WACR,OAAO,WACL5B,EAASU,OAAOC,iBAClB,CACF,GAAG,CAACX,IAGF6B,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wDAEbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,wCAEbH,UAAAC,cAACG,EAAaA,cAAA,CAACV,UAAWA,EAAWW,KAAK,OAAOC,iBAAiB,IAGlEN,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,uBACbH,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,oFACZP,GAEHI,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,qFACZL,KAMPE,EAAC,QAAAC,cAAAM,EAAMA,QACLC,QAAQ,UACRC,QAAS9B,EACTwB,UAAU,2BACM,0BAAyB,uBACnBlC,EAAE,kBAAoB,SAE5C+B,UAACC,cAAAS,EAAAA,gBAAgB,CAAAC,KAAMC,EAAAA,QAAST,UAAU,oBAG9CH,EAAAA,QAAAC,cAACY,sBAAoB,CAAAV,UAAU,UAAUW,GAAG,0BAA0BC,MAAM,SAGlF"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy, previousView } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const { accepted, incoming, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const getNextViewOnClose = useCallback(() => {\n if (isActive && conferenceStartedFrom === username) {\n return 'waitingConference'\n }\n\n if (accepted || incoming || outgoing) {\n return previousView || 'call'\n }\n\n return null\n }, [accepted, conferenceStartedFrom, incoming, isActive, outgoing, previousView, username])\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n dispatch.island.setIslandView(getNextViewOnClose())\n }, [dispatch, getNextViewOnClose])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => {\n handleClose()\n }, 4000)\n\n return () => {\n window.clearTimeout(timeoutId)\n }\n }, [handleClose])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["_a","useSelector","state","island","operatorBusy","previousView","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_b","conference","isActive","conferenceStartedFrom","username","currentUser","_c","currentCall","accepted","incoming","outgoing","getNextViewOnClose","useCallback","handleClose","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","timeoutId","window","setTimeout","clearTimeout","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js");var r=require("./Actions.js"),i=require("./BarsGroup.js"),a=require("../AudioPlayerView/Progress.js"),n=require("../../lib/phone/audio.js"),s=require("../../node_modules/webm-duration-fix/lib/index.js"),l=require("./Timer.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 o=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var u=require("../Button.js"),d=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),c=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),f=require("../../node_modules/react-redux/es/hooks/useSelector.js"),m=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/utils/shallowEqual.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=x(t),w="audio/webm";exports.RecorderView=function(){var x=f.useSelector((function(e){return e.island})).isOpen,b=f.useSelector((function(e){return e.player})).audioPlayerPlaying,h=t.useRef(null),g=t.useRef(null),j=t.useRef([]),y=m.useDispatch(),E=f.useSelector((function(e){return e.webrtc.localAudioStream})),q=f.useSelector((function(e){return{recording:e.recorder.recording,recorded:e.recorder.recorded,waiting:e.recorder.waiting}}),p.default),_=q.recording,N=q.recorded,k=q.waiting;function A(e){j.current.push(e.data)}function P(){return e.__awaiter(this,void 0,void 0,(function(){var t,r;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,s.default(new Blob(j.current,{type:w}))];case 1:return t=e.sent(),r=URL.createObjectURL(t),n.updateAudioPlayerSource(r),[2]}}))}))}t.useEffect((function(){(null==E?void 0:E.active)&&_&&(g.current=new MediaRecorder(E,{mimeType:w}),g.current.ondataavailable=A,g.current.onstop=P,g.current.start())}),[null==E?void 0:E.active,_]),t.useEffect((function(){var e;N&&(j.current=[],null===(e=g.current)||void 0===e||e.stop())}),[N]),t.useEffect((function(){return y.recorder.setVisibleContainerRef(h),function(){y.recorder.reset()}}),[]);var S=o.useTranslation().t;return v.default.createElement(v.default.Fragment,null,x?v.default.createElement(v.default.Fragment,null," ",v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50"},v.default.createElement("h1",{className:"pi-text-lg pi-font-medium pi-leading-7"},S("Common.Record message")),v.default.createElement(u.Button,{onClick:function(){y.island.resetPlayerClose()},variant:"transparentSettings","data-tooltip-id":"tooltip-close-settings","data-tooltip-content":S("Common.Close")||""},v.default.createElement(d.FontAwesomeIcon,{icon:c.faXmark,className:"pi-w-5 pi-h-5"}))),v.default.createElement("div",{className:"pi-pt-4"},v.default.createElement("div",{className:"".concat(!_||k||b?"pi-mb-3":""," pi-flex pi-w-full pi-justify-center pi-items-center")},v.default.createElement("div",{className:"pi-font-medium pi-text-4xl pi-w-fit pi-h-fit dark:pi-text-white"},v.default.createElement(l.default,null))),v.default.createElement("div",{className:"pi-relative pi-w-full pi-justify-center pi-overflow-hidden pi-flex pi-items-center",ref:h},N?v.default.createElement(a.Progress,null):_&&!k?v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full pi-pb-3 pi-overflow-hidden"},v.default.createElement(u.Button,{variant:"transparent",disabled:!0,className:"pi-flex pi-flex-none"},v.default.createElement(d.FontAwesomeIcon,{icon:c.faPlay,className:"pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200"})),v.default.createElement("div",{className:"pi-relative pi-overflow-hidden pi-flex pi-flex-grow pi-justify-center pi-h-4"},Array.from({length:2}).map((function(e,t){return v.default.createElement(i.BarsGroup,{key:t,index:t,startAnimation:_,audioStream:E})}))),v.default.createElement(u.Button,{variant:"transparent",disabled:!0,className:"pi-flex pi-flex-none"},v.default.createElement(d.FontAwesomeIcon,{icon:c.faTrash,className:"pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200"}))):_&&k?v.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7"},S("Common.Start recording message after")):v.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7"},S("Common.Start recording message before")))),v.default.createElement(r.Actions,null)):v.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Recorder"))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js");var r=require("./Actions.js"),i=require("./BarsGroup.js"),a=require("../AudioPlayerView/Progress.js"),n=require("../../lib/phone/audio.js"),s=require("../../node_modules/webm-duration-fix/lib/index.js"),l=require("./Timer.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 o=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var u=require("../Button.js"),d=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),c=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../store/index.js");var f=require("../../node_modules/react-redux/es/hooks/useSelector.js"),m=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/utils/shallowEqual.js");function x(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var v=x(t),w="audio/webm";exports.RecorderView=function(){var x=f.useSelector((function(e){return e.island})).isOpen,b=f.useSelector((function(e){return e.player})).audioPlayerPlaying,h=t.useRef(null),g=t.useRef(null),j=t.useRef([]),y=m.useDispatch(),E=f.useSelector((function(e){return e.webrtc.localAudioStream})),q=f.useSelector((function(e){return{recording:e.recorder.recording,recorded:e.recorder.recorded,waiting:e.recorder.waiting}}),p.default),_=q.recording,N=q.recorded,k=q.waiting;function A(e){j.current.push(e.data)}function P(){return e.__awaiter(this,void 0,void 0,(function(){var t,r;return e.__generator(this,(function(e){switch(e.label){case 0:return[4,s.default(new Blob(j.current,{type:w}))];case 1:return t=e.sent(),r=URL.createObjectURL(t),n.updateAudioPlayerSource(r),[2]}}))}))}t.useEffect((function(){(null==E?void 0:E.active)&&_&&(g.current=new MediaRecorder(E,{mimeType:w}),g.current.ondataavailable=A,g.current.onstop=P,g.current.start())}),[null==E?void 0:E.active,_]),t.useEffect((function(){var e;N&&(j.current=[],null===(e=g.current)||void 0===e||e.stop())}),[N]),t.useEffect((function(){return y.recorder.setVisibleContainerRef(h),function(){y.recorder.reset()}}),[]);var S=o.useTranslation().t;return v.default.createElement(v.default.Fragment,null,x?v.default.createElement(v.default.Fragment,null," ",v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50"},v.default.createElement("h1",{className:"pi-text-lg pi-font-medium pi-leading-7"},S("Common.Record message")),v.default.createElement(u.Button,{onClick:function(){y.island.resetPlayerClose()},variant:"transparentSettings","data-tooltip-id":"tooltip-close-settings","data-tooltip-content":S("Common.Close")||""},v.default.createElement(d.FontAwesomeIcon,{icon:c.faXmark,className:"pi-w-5 pi-h-5"}))),v.default.createElement("div",{className:"pi-pt-4"},v.default.createElement("div",{className:"".concat(!_||k||b?"pi-mb-3":""," pi-flex pi-w-full pi-justify-center pi-items-center")},v.default.createElement("div",{className:"pi-font-medium pi-text-4xl pi-w-fit pi-h-fit dark:pi-text-white"},v.default.createElement(l.default,null))),v.default.createElement("div",{className:"pi-relative pi-w-full pi-justify-center pi-overflow-hidden pi-flex pi-items-center",ref:h},N?v.default.createElement(a.Progress,null):_&&!k?v.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full pi-pb-3 pi-overflow-hidden"},v.default.createElement(u.Button,{variant:"transparent",disabled:!0,className:"pi-flex pi-flex-none"},v.default.createElement(d.FontAwesomeIcon,{icon:c.faPlay,className:"pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200"})),v.default.createElement("div",{className:"pi-relative pi-overflow-hidden pi-flex pi-flex-grow pi-justify-center pi-h-4"},Array.from({length:2}).map((function(e,t){return v.default.createElement(i.BarsGroup,{key:t,index:t,startAnimation:_,audioStream:E})}))),v.default.createElement(u.Button,{variant:"transparent",disabled:!0,className:"pi-flex pi-flex-none"},v.default.createElement(d.FontAwesomeIcon,{icon:c.faTrash,className:"pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200"}))):_&&k?v.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7"},S("Common.Start recording message after")):v.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7"},S("Common.Start recording message before")))),v.default.createElement(r.Actions,null)):v.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Recorder"))};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/RecorderView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useRef, useEffect } from 'react'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Actions } from './Actions'\nimport { BarsGroup } from './BarsGroup'\nimport Progress from '../AudioPlayerView/Progress'\nimport { updateAudioPlayerSource } from '../../lib/phone/audio'\nimport fixWebmDuration from 'webm-duration-fix'\nimport Timer from './Timer'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faTrash, faXmark, faPlay } from '@fortawesome/free-solid-svg-icons'\n\n// The number of groups to be created\n// ...the minimun to have this effect is 2\nconst BAR_GROUPS_COUNT = 2\n\n// The mime type of the recorded audio\nconst MIME_TYPE = 'audio/webm'\n\nexport const RecorderView: FC<RecorderViewProps> = () => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { audioPlayerPlaying } = useSelector((state: RootState) => state.player)\n const visibleContainerRef = useRef<HTMLDivElement>(null)\n const recorderRef = useRef<MediaRecorder | null>(null)\n const mediaChunks = useRef<BlobPart[]>([])\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Retrieve the local audio stream from webrtc state\n const localAudioStream = useSelector((state: RootState) => state.webrtc.localAudioStream)\n\n // Retrieve the local audio stream from recorder state\n const { recording, recorded, waiting } = useSelector(\n (state: RootState) => ({\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n waiting: state.recorder.waiting,\n }),\n shallowEqual,\n )\n\n function handleRecordedMedia(event: BlobEvent) {\n mediaChunks.current.push(event.data)\n }\n\n async function handleRecordingStopped() {\n const blob = await fixWebmDuration(new Blob(mediaChunks.current, { type: MIME_TYPE }))\n const audioURL = URL.createObjectURL(blob)\n // The next function is async\n updateAudioPlayerSource(audioURL)\n }\n\n // Handle and manage audio recording start\n useEffect(() => {\n // @ts-ignore\n if (localAudioStream?.active && recording) {\n recorderRef.current = new MediaRecorder(localAudioStream, {\n mimeType: MIME_TYPE,\n })\n recorderRef.current.ondataavailable = handleRecordedMedia\n recorderRef.current.onstop = handleRecordingStopped\n // Start the media recording\n recorderRef.current.start()\n }\n // @ts-ignore\n }, [localAudioStream?.active, recording])\n\n // Handle and manage audio recorded\n useEffect(() => {\n if (recorded) {\n mediaChunks.current = []\n recorderRef.current?.stop()\n }\n }, [recorded])\n\n // Handle view close and reset state\n useEffect(() => {\n // Set visible container reference to recorder state\n dispatch.recorder.setVisibleContainerRef(visibleContainerRef)\n\n return () => {\n dispatch.recorder.reset()\n }\n }, [])\n\n const { t } = useTranslation()\n\n function close() {\n dispatch.island.resetPlayerClose()\n }\n\n return (\n <>\n {isOpen ? (\n <>\n {' '}\n <div className='pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50'>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7'>{t('Common.Record message')}</h1>\n <Button\n onClick={() => close()}\n variant='transparentSettings'\n data-tooltip-id='tooltip-close-settings'\n data-tooltip-content={t('Common.Close') || ''}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <div className='pi-pt-4'>\n <div\n className={`${\n !recording || waiting || audioPlayerPlaying ? 'pi-mb-3' : ''\n } pi-flex pi-w-full pi-justify-center pi-items-center`}\n >\n <div className='pi-font-medium pi-text-4xl pi-w-fit pi-h-fit dark:pi-text-white'>\n <Timer />\n </div>\n </div>\n {/* Bars animation section */}\n <div\n className={`pi-relative pi-w-full pi-justify-center pi-overflow-hidden pi-flex pi-items-center`}\n ref={visibleContainerRef}\n >\n {recorded ? (\n <Progress />\n ) : recording && !waiting ? (\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-pb-3 pi-overflow-hidden'>\n {/* Play button (disabled) on left */}\n <Button variant='transparent' disabled className='pi-flex pi-flex-none'>\n <FontAwesomeIcon\n icon={faPlay}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </Button>\n\n {/* Audio visualization in the middle */}\n <div className='pi-relative pi-overflow-hidden pi-flex pi-flex-grow pi-justify-center pi-h-4'>\n {/* Create a custom numbers of bars groups */}\n {Array.from({ length: BAR_GROUPS_COUNT }).map((_, i) => (\n <BarsGroup\n key={i}\n index={i}\n startAnimation={recording}\n audioStream={localAudioStream}\n />\n ))}\n </div>\n\n {/* Trash button (disabled) on right */}\n <Button variant='transparent' disabled className='pi-flex pi-flex-none'>\n <FontAwesomeIcon\n icon={faTrash}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </Button>\n </div>\n ) : recording && waiting ? (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7'>\n {t('Common.Start recording message after')}\n </div>\n ) : (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7'>\n {t('Common.Start recording message before')}\n </div>\n )}\n </div>\n </div>\n {/* Actions section */}\n <Actions />\n </>\n ) : (\n <div className='pi-font-medium pi-text-base'>Recorder</div>\n )}\n </>\n )\n}\n\nexport interface RecorderViewProps {}\n"],"names":["MIME_TYPE","isOpen","useSelector","state","island","audioPlayerPlaying","player","visibleContainerRef","useRef","recorderRef","mediaChunks","dispatch","useDispatch","localAudioStream","webrtc","_a","recording","recorder","recorded","waiting","shallowEqual","handleRecordedMedia","event","current","push","data","handleRecordingStopped","fixWebmDuration","Blob","type","blob","sent","audioURL","URL","createObjectURL","updateAudioPlayerSource","useEffect","active","MediaRecorder","mimeType","ondataavailable","onstop","start","stop","setVisibleContainerRef","reset","t","useTranslation","React","createElement","Fragment","className","Button","onClick","resetPlayerClose","variant","FontAwesomeIcon","icon","faXmark","concat","Timer","ref","Progress","disabled","faPlay","Array","from","length","map","_","i","BarsGroup","key","index","startAnimation","audioStream","faTrash","Actions"],"mappings":"s3CAsBMA,EAAY,kCAEiC,WACzC,IAAAC,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,iBACnDC,EAAuBH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,6BACjEC,EAAsBC,SAAuB,MAC7CC,EAAcD,SAA6B,MAC3CE,EAAcF,SAAmB,IAGjCG,EAAWC,EAAAA,cAGXC,EAAmBX,eAAY,SAACC,GAAqB,OAAAA,EAAMW,OAAOD,gBAAb,IAGrDE,EAAmCb,EAAAA,aACvC,SAACC,GAAqB,MAAC,CACrBa,UAAWb,EAAMc,SAASD,UAC1BE,SAAUf,EAAMc,SAASC,SACzBC,QAAShB,EAAMc,SAASE,WAE1BC,EAAAA,SANMJ,EAASD,EAAAC,UAAEE,EAAQH,EAAAG,SAAEC,YAS7B,SAASE,EAAoBC,GAC3BZ,EAAYa,QAAQC,KAAKF,EAAMG,KAChC,CAED,SAAeC,qHACA,KAAA,EAAA,MAAA,CAAA,EAAMC,EAAAA,QAAgB,IAAIC,KAAKlB,EAAYa,QAAS,CAAEM,KAAM7B,oBAAnE8B,EAAOf,EAAyEgB,OAChFC,EAAWC,IAAIC,gBAAgBJ,GAErCK,EAAuBA,wBAACH,aACzB,CAGDI,EAAAA,WAAU,YAEJvB,aAAgB,EAAhBA,EAAkBwB,SAAUrB,IAC9BP,EAAYc,QAAU,IAAIe,cAAczB,EAAkB,CACxD0B,SAAUvC,IAEZS,EAAYc,QAAQiB,gBAAkBnB,EACtCZ,EAAYc,QAAQkB,OAASf,EAE7BjB,EAAYc,QAAQmB,QAGvB,GAAE,CAAC7B,aAAgB,EAAhBA,EAAkBwB,OAAQrB,IAG9BoB,EAAAA,WAAU,iBACJlB,IACFR,EAAYa,QAAU,GACD,QAArBR,EAAAN,EAAYc,eAAS,IAAAR,GAAAA,EAAA4B,OAEzB,GAAG,CAACzB,IAGJkB,EAAAA,WAAU,WAIR,OAFAzB,EAASM,SAAS2B,uBAAuBrC,GAElC,WACLI,EAASM,SAAS4B,OACpB,CACD,GAAE,IAEK,IAAAC,EAAMC,qBAMd,OACEC,UACGC,cAAAD,EAAA,QAAAE,SAAA,KAAAjD,EACC+C,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG,IACDF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oFACbH,UAAIC,cAAA,KAAA,CAAAE,UAAU,0CAA0CL,EAAE,0BAC1DE,EAAC,QAAAC,cAAAG,UACCC,QAAS,WAXnB1C,EAASP,OAAOkD,kBAWgB,EACtBC,QAAQ,wCACQ,yBAAwB,uBAClBT,EAAE,iBAAmB,IAE3CE,UAACC,cAAAO,EAAAA,gBAAgB,CAAAC,KAAMC,EAAAA,QAASP,UAAU,oBAG9CH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,WACbH,EAAAA,QAAAC,cAAA,MAAA,CACEE,UAAW,GAAAQ,QACR3C,GAAaG,GAAWd,EAAqB,UAAY,GACN,yDAEtD2C,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,mEACbH,EAAAA,QAACC,cAAAW,UAAQ,QAIbZ,UAAAC,cAAA,MAAA,CACEE,UAAW,qFACXU,IAAKtD,GAEJW,EACC8B,UAACC,cAAAa,EAAAA,SAAW,MACV9C,IAAcG,EAChB6B,UAAKC,cAAA,MAAA,CAAAE,UAAU,mFAEbH,UAACC,cAAAG,EAAMA,OAAC,CAAAG,QAAQ,cAAcQ,UAAQ,EAACZ,UAAU,wBAC/CH,UAACC,cAAAO,EAAAA,gBACC,CAAAC,KAAMO,EAAAA,OACNb,UAAU,0DAKdH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,gFAEZc,MAAMC,KAAK,CAAEC,OA5HT,IA4HqCC,KAAI,SAACC,EAAGC,GAAM,OACtDtB,EAAAA,QAACC,cAAAsB,EAAAA,WACCC,IAAKF,EACLG,MAAOH,EACPI,eAAgB1D,EAChB2D,YAAa9D,GAEhB,KAIHmC,UAACC,cAAAG,EAAMA,OAAC,CAAAG,QAAQ,cAAcQ,UAAQ,EAACZ,UAAU,wBAC/CH,EAAC,QAAAC,cAAAO,EAAeA,iBACdC,KAAMmB,EAAAA,QACNzB,UAAU,2DAIdnC,GAAaG,EACf6B,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,mEACZL,EAAE,yCAGLE,EAAAA,6BAAKG,UAAU,mEACZL,EAAE,4CAMXE,EAAAA,QAAAC,cAAC4B,EAAAA,QAAU,OAGb7B,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,+BAA6B,YAIpD"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/RecorderView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useState, useRef, useEffect, useCallback, memo } from 'react'\nimport { useDispatch, useSelector, shallowEqual } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { Actions } from './Actions'\nimport { BarsGroup } from './BarsGroup'\nimport Progress from '../AudioPlayerView/Progress'\nimport { updateAudioPlayerSource } from '../../lib/phone/audio'\nimport fixWebmDuration from 'webm-duration-fix'\nimport Timer from './Timer'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faTrash, faXmark, faPlay } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch } from '../../utils'\n\n// The number of groups to be created\n// ...the minimun to have this effect is 2\nconst BAR_GROUPS_COUNT = 2\n\n// The mime type of the recorded audio\nconst MIME_TYPE = 'audio/webm'\n\nexport const RecorderView: FC<RecorderViewProps> = () => {\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { audioPlayerPlaying } = useSelector((state: RootState) => state.player)\n const visibleContainerRef = useRef<HTMLDivElement>(null)\n const recorderRef = useRef<MediaRecorder | null>(null)\n const mediaChunks = useRef<BlobPart[]>([])\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\n\n // Retrieve the local audio stream from webrtc state\n const localAudioStream = useSelector((state: RootState) => state.webrtc.localAudioStream)\n\n // Retrieve the local audio stream from recorder state\n const { recording, recorded, waiting } = useSelector(\n (state: RootState) => ({\n recording: state.recorder.recording,\n recorded: state.recorder.recorded,\n waiting: state.recorder.waiting,\n }),\n shallowEqual,\n )\n\n function handleRecordedMedia(event: BlobEvent) {\n mediaChunks.current.push(event.data)\n }\n\n async function handleRecordingStopped() {\n const blob = await fixWebmDuration(new Blob(mediaChunks.current, { type: MIME_TYPE }))\n const audioURL = URL.createObjectURL(blob)\n // The next function is async\n updateAudioPlayerSource(audioURL)\n }\n\n // Handle and manage audio recording start\n useEffect(() => {\n // @ts-ignore\n if (localAudioStream?.active && recording) {\n recorderRef.current = new MediaRecorder(localAudioStream, {\n mimeType: MIME_TYPE,\n })\n recorderRef.current.ondataavailable = handleRecordedMedia\n recorderRef.current.onstop = handleRecordingStopped\n // Start the media recording\n recorderRef.current.start()\n }\n // @ts-ignore\n }, [localAudioStream?.active, recording])\n\n // Handle and manage audio recorded\n useEffect(() => {\n if (recorded) {\n mediaChunks.current = []\n recorderRef.current?.stop()\n }\n }, [recorded])\n\n // Handle view close and reset state\n useEffect(() => {\n // Set visible container reference to recorder state\n dispatch.recorder.setVisibleContainerRef(visibleContainerRef)\n\n return () => {\n dispatch.recorder.reset()\n }\n }, [])\n\n const { t } = useTranslation()\n\n function playerClose() {\n if (audioPlayerPlaying) {\n dispatch.player.stopAudioPlayer()\n eventDispatch('phone-island-audio-player-close', {})\n }\n dispatch.island.resetPlayerClose()\n }\n\n function close() {\n dispatch.island.resetPlayerClose()\n }\n\n return (\n <>\n {isOpen ? (\n <>\n {' '}\n <div className='pi-flex pi-items-center pi-justify-between pi-text-gray-900 dark:pi-text-gray-50'>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7'>{t('Common.Record message')}</h1>\n <Button\n onClick={() => close()}\n variant='transparentSettings'\n data-tooltip-id='tooltip-close-settings'\n data-tooltip-content={t('Common.Close') || ''}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <div className='pi-pt-4'>\n <div\n className={`${\n !recording || waiting || audioPlayerPlaying ? 'pi-mb-3' : ''\n } pi-flex pi-w-full pi-justify-center pi-items-center`}\n >\n <div className='pi-font-medium pi-text-4xl pi-w-fit pi-h-fit dark:pi-text-white'>\n <Timer />\n </div>\n </div>\n {/* Bars animation section */}\n <div\n className={`pi-relative pi-w-full pi-justify-center pi-overflow-hidden pi-flex pi-items-center`}\n ref={visibleContainerRef}\n >\n {recorded ? (\n <Progress />\n ) : recording && !waiting ? (\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full pi-pb-3 pi-overflow-hidden'>\n {/* Play button (disabled) on left */}\n <Button variant='transparent' disabled className='pi-flex pi-flex-none'>\n <FontAwesomeIcon\n icon={faPlay}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </Button>\n\n {/* Audio visualization in the middle */}\n <div className='pi-relative pi-overflow-hidden pi-flex pi-flex-grow pi-justify-center pi-h-4'>\n {/* Create a custom numbers of bars groups */}\n {Array.from({ length: BAR_GROUPS_COUNT }).map((_, i) => (\n <BarsGroup\n key={i}\n index={i}\n startAnimation={recording}\n audioStream={localAudioStream}\n />\n ))}\n </div>\n\n {/* Trash button (disabled) on right */}\n <Button variant='transparent' disabled className='pi-flex pi-flex-none'>\n <FontAwesomeIcon\n icon={faTrash}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </Button>\n </div>\n ) : recording && waiting ? (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7'>\n {t('Common.Start recording message after')}\n </div>\n ) : (\n <div className='pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white pi-pb-7'>\n {t('Common.Start recording message before')}\n </div>\n )}\n </div>\n </div>\n {/* Actions section */}\n <Actions />\n </>\n ) : (\n <div className='pi-font-medium pi-text-base'>Recorder</div>\n )}\n </>\n )\n}\n\nexport interface RecorderViewProps {}\n"],"names":["MIME_TYPE","isOpen","useSelector","state","island","audioPlayerPlaying","player","visibleContainerRef","useRef","recorderRef","mediaChunks","dispatch","useDispatch","localAudioStream","webrtc","_a","recording","recorder","recorded","waiting","shallowEqual","handleRecordedMedia","event","current","push","data","handleRecordingStopped","fixWebmDuration","Blob","type","blob","sent","audioURL","URL","createObjectURL","updateAudioPlayerSource","useEffect","active","MediaRecorder","mimeType","ondataavailable","onstop","start","stop","setVisibleContainerRef","reset","t","useTranslation","React","createElement","Fragment","className","Button","onClick","resetPlayerClose","variant","FontAwesomeIcon","icon","faXmark","concat","Timer","ref","Progress","disabled","faPlay","Array","from","length","map","_","i","BarsGroup","key","index","startAnimation","audioStream","faTrash","Actions"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),i=require("../lib/phone/conversation.js"),o=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),v=require("../utils/genericFunctions/isEmpty.js"),m=require("../utils/streaming/getStreamingSourceId.js"),f=require("../events/SocketEvents.js"),g=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),y=require("../utils/streaming/isFromStreaming.js"),b=require("../lib/phone/trunk.js"),S=require("../node_modules/react-redux/es/hooks/useDispatch.js");function k(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=k(n);exports.Socket=function(k){var _=k.hostName,C=k.username,N=k.authToken,T=k.reload,D=k.reloadedCallback,x=k.children,U=k.uaType,j=k.preferredSummaryExtensionType,q=S.useDispatch(),I=n.useRef(),E=n.useRef(),O=n.useRef(!1),P=n.useRef(0);s.useEventListener("phone-island-start-transcription",(function(e){if(E.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;E.current.emit("start_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}})),s.useEventListener("phone-island-stop-transcription",(function(e){if(E.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;E.current.emit("stop_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&y.isFromStreaming(e.counterpartNum)){q.island.setIsFromStreaming(!0),q.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=m.getStreamingSourceId(e.counterpartNum);n&&o.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},S=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,v=l.store.getState().island.view;if(Object.keys(t).length>0){if(n.status){var m=l.store.getState().users.extensions,f=l.store.getState().currentUser.default_device,y=l.store.getState().currentUser,S=y.endpoints,k=y.username,w=l.store.getState().currentCall;w.incoming,w.outgoing;var _=function(){if(!m||!k)return!1;var e=Object.values(m).filter((function(e){return(null==e?void 0:e.username)===k}));return null==e?void 0:e.some((function(e){var n=null==S?void 0:S.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":s(t),("mobile"===U&&_()||"desktop"===U&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!_()||!_()&&"physical"===(null==f?void 0:f.type)))&&(q.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",ownerExtension:t.owner}),l.store.dispatch.island.setIslandView("call")),O.current||(O.current=!0,o.getCurrentUserInfo().then((function(n){n&&(q.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?q.paramUrl.setOpenParamUrlType(n.settings.open_param_url):q.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){O.current=!1}),100)})));var C=l.store.getState().paramUrl.openParamUrlType,N=l.store.getState().island.urlOpened;if("ringing"===C&&!N){var T=b.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(T),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:i.getDisplayName(t),owner:t.owner,uniqueId:t.uniqueId,linkedId:t.linkedId,throughQueue:t.throughQueue,throughTrunk:T,direction:t.direction,connected:t.connected})}break;case"busy":if(s(t),"mobile"===U&&_()||"desktop"===U&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!_()||!_()&&"physical"===(null==f?void 0:f.type))){if(t&&t.connected)q.currentCall.updateCurrentCall({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),q.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),q.currentCall.addTransferCalls({type:"transferred",displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),startTime:"".concat(g.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){q.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){q.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===v&&c&&q.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)q.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var D=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&D&&(q.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),q.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&q.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&q.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:i.getDisplayName(t),number:"".concat(null==t?void 0:t.counterpartNum),username:"".concat(m&&m[null==t?void 0:t.counterpartNum]&&m[null==t?void 0:t.counterpartNum].username)||""})}break;case"onhold":var x=t.counterpartName,j=t.counterpartNum,I=t.startTime;c&&j&&x&&"<unknown>"!==x&&(q.currentCall.addTransferCalls({type:"destination",displayName:i.getDisplayName(t),number:j,startTime:"".concat(g.getTimestampInSeconds())}),q.currentCall.updateCurrentCall({displayName:i.getDisplayName(t),number:j,startTime:"".concat(I/1e3),conversationId:t.id}),q.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(q.player.stopAudioPlayer(),q.currentCall.reset(),q.physicalRecorder.setRecordingTempVariable(!1),q.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(C)&&(n.path="/api/ws"),E.current=t.io("https://"+_,n),q.websocket.update({socket:E.current}),E.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(E.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),E.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),I.current&&(clearInterval(I.current),I.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),E.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),E.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),E.current.io.on("reconnect",(function(e){P.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(E.current.id,")"))})),E.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),E.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),E.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),E.current.on("connect",(function(){console.debug("Socket on: "+_+" is connected!"),E.current.emit("login",{accessKeyId:"".concat(C),token:N,uaType:U})})),E.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),I.current&&clearInterval(I.current),I.current=setInterval((function(){E.current.volatile.emit("ping",u.withTimeout((function(){P.current=0,setTimeout((function(){q.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){P.current++,console.debug("Socket ping timeout (".concat(P.current,"/").concat(3,"), connected: ").concat(E.current.connected)),setTimeout((function(){var e,n,t=E.current.connected&&P.current>=3;if(!E.current.connected||t){var r=l.store.getState().webrtc.sipcall,i=l.store.getState().currentCall,o=i.accepted,c=i.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((o||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:o,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),E.current.disconnect()),q.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),E.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),f.dispatchMainPresence(n)})),E.current.on("extenHangup",(function(n){return e.__awaiter(void 0,void 0,void 0,(function(){var t,r,i,s,u,d,p,v,m,f,g,h,y,b,S,k,w,_,N,T,D,x,U,q,I,E,O,P,F,A,V,R,M,L,B,Q,H,z,J,K,W,G,X,Y,Z,$;return e.__generator(this,(function(e){switch(e.label){case 0:if(t=l.store.getState().currentUser,r=t.endpoints,i=t.default_device,s=(null==r?void 0:r.extension)||[],u=s.find((function(e){return e.id===n.callerNum}))||s.find((function(e){return e.id===n.channelExten})),d=l.store.getState().currentUser.conversations,p=function(e){return!!e&&Object.keys((null==d?void 0:d[e])||{}).length>0},v=null==n?void 0:n.callerNum,m=null==u?void 0:u.type,(null==n?void 0:n.channelExten)&&p(n.channelExten)&&!p(v)&&(v=n.channelExten,u=s.find((function(e){return e.id===n.channelExten}))||u,m=(null==u?void 0:u.type)||m),!(null==n?void 0:n.callerNum)||u&&p(v))return[3,4];if(!(f=j||(null==u?void 0:u.type)||(null===(Y=s.find((function(e){return e.id===(null==n?void 0:n.channelExten)})))||void 0===Y?void 0:Y.type)||(null==i?void 0:i.type)))return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,o.getExtensionByMainExtensionAndType(n.callerNum,f)];case 2:return(null==(g=e.sent())?void 0:g.extension)&&(h=s.find((function(e){return e.id===g.extension})),u=h||u,m=(null==h?void 0:h.type)||f,v=g.extension),[3,4];case 3:return e.sent(),[3,4];case 4:if(y=void 0,b=!1,v&&d[v]&&(S=d[v],(k=Object.keys(S)).length>0)){for(w=null,_=0,N=k;_<N.length;_++)T=N[_],(D=null==S?void 0:S[T])&&(w?(x=!!w.connected,!(U=!!D.connected)||x?(q=null!==(Z=w.startTime)&&void 0!==Z?Z:0,I=null!==($=D.startTime)&&void 0!==$?$:0,U===x&&I>q&&(w=D)):w=D):w=D);y=null==w?void 0:w.linkedId,b=(null==w?void 0:w.connected)||!1}return y&&b&&a.eventDispatch("phone-island-summary-call-check",{linkedid:y}),"normal_clearing"===n.cause&&("physical"===m||"mobile"===m)||"normal_clearing"===n.cause&&("webrtc"===m||"nethlink"===m)&&previewCallFromMobileOrNethlink||"user_busy"===(null==n?void 0:n.cause)||"not_defined"===(null==n?void 0:n.cause)||"call_rejected"===(null==n?void 0:n.cause)||"interworking"===(null==n?void 0:n.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),Q&&H!==C&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==n?void 0:n.cause)&&Q&&H===C?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==n.cause&&"user_busy"!==(null==n?void 0:n.cause)&&"not_defined"!==(null==n?void 0:n.cause)&&"call_rejected"!==(null==n?void 0:n.cause)||"webrtc"!==m&&"nethlink"!==m||!Q||H===C||l.store.dispatch.conference.resetConference(),("normal_clearing"!==n.cause||"webrtc"!==m&&"nethlink"!==m)&&"call_rejected"!==(null==n?void 0:n.cause)||!Q||H!==C||(E=l.store.getState().conference,K=E.usersList,W=E.pendingUsers,G=K&&Object.keys(K).length>0,X=W&&Object.keys(W).length>0,G||X?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()),"interworking"===(null==n?void 0:n.cause)&&Q&&H===C&&"waitingConference"!==view&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==n?void 0:n.cause)&&(O=l.store.getState().currentUser,P=O.endpoints,F=O.username,A=(null==P?void 0:P.extension)||[],V=A.map((function(e){return e.id})),R=l.store.getState().currentCall,M=R.incoming,R.outgoing,L=l.store.getState().conference,Q=L.isActive,H=L.conferenceStartedFrom,M&&V.includes(n.callerNum)||(l.store.dispatch.island.setOperatorBusyActive({callerNumber:n.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),Q&&H===F&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))),"subscriber_absent"===(null==n?void 0:n.cause)&&(B=l.store.getState().conference,Q=B.isActive,H=B.conferenceStartedFrom,z=l.store.getState().currentUser.username,Q&&H===z&&(J=l.store.getState().conference,K=J.usersList,W=J.pendingUsers,G=K&&Object.keys(K).length>0,X=W&&Object.keys(W).length>0,G||X?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),W&&W[n.callerNum]&&l.store.dispatch.conference.removePendingUser(n.callerNum)):l.store.dispatch.conference.resetConference())),[2]}}))}))})),E.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,i=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),o=null==i?void 0:i.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&o&&("mobile"===o||"physical"===o)||"physical"===(null==t?void 0:t.type)&&o&&"physical"!==o)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:o}))})),E.current.on("extenUpdate",(function(e){var n,t;q.users.updateExtension(e);var r=l.store.getState().users.extensions,i={},o=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;i[s]||(i[s]=[]),i[s].push(a)}var u=i[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===C&&!v.isEmpty(d)&&(null==d?void 0:d.owner)){var m=null===(t=null===(n=null==o?void 0:o.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));m&&"mobile"===m.type&&(p=!0)}if(f.dispatchExtensions(e),v.isEmpty(d)){var g=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!v.isEmpty(t)}));g||f.dispatchConversations(e)}else p||f.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===C&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===C&&(S(e,d),q.currentUser.updateConversations(e))})),E.current.on("queueUpdate",(function(e){f.dispatchQueueUpdate(e)})),E.current.on("queueMemberUpdate",(function(e){f.dispatchQueueMemberUpdate(e)})),E.current.on("takeOver",(function(){f.dispatchAlreadyLogin()})),E.current.on("serverReloaded",(function(){f.dispatchServerReload()})),E.current.on("parkingUpdate",(function(e){f.dispatchParkingUpdate(e)})),E.current.on("actionNethLink",(function(e,n){f.dispatchUrlCall(e,n)})),E.current.on("satellite/summary",(function(e){(null==e?void 0:e.uniqueid)&&a.eventDispatch("phone-island-summary-ready",{linkedid:null==e?void 0:e.uniqueid,display_name:null==e?void 0:e.display_name,display_number:null==e?void 0:e.display_number})})),E.current.on("message",(function(e){switch(e.message){case"screenSharingStart":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),E.current.on("updateDefaultDevice",(function(n){f.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var i=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==i.length){var o=i[0],c=r.extension.find((function(e){return e.id===o.exten}));c&&(o=e.__assign(e.__assign({},o),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(o),d.checkMediaPermissions()}}})),E.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,i=l.store.getState().conference.usersList,o=e.__assign({},r);i&&Object.keys(o).forEach((function(n){i[n]&&(o[n]=e.__assign(e.__assign({},o[n]),{muted:i[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(o),l.store.dispatch.conference.updateConferenceId(t)}})),E.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),E.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),E.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),E.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var i=l.store.getState().currentCall.streamingSourceNumber;m.getStreamingSourceId(i),q.streaming.updateSourceImage({source:t,image:r})}}})),E.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(I.current),E.current.close()}}),[_,C,N,U,q]),n.useEffect((function(){var e;if(T){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),I.current&&(clearInterval(I.current),I.current=null),setTimeout((function(){E.current.disconnect(),E.current.connect(),D()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),D())}}),[T]),w.default.createElement(w.default.Fragment,null,x)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../node_modules/tslib/tslib.es6.js"),n=require("react");require("../node_modules/react-redux/es/index.js");var t=require("../node_modules/socket.io-client/build/esm/index.js"),r=require("./RestAPI.js"),i=require("../lib/phone/conversation.js"),o=require("../services/user.js"),c=require("../static/busy_ringtone.js"),s=require("../utils/customHooks/useEventListener.js"),a=require("../utils/genericFunctions/eventDispatch.js"),u=require("../utils/genericFunctions/withTimeout.js"),l=require("../store/index.js");require("../lib/webrtc/janus.js"),require("../node_modules/webrtc-adapter/src/js/adapter_core.js");var d=require("../lib/devices/devices.js"),p=require("../lib/user/default_device.js"),v=require("../utils/genericFunctions/isEmpty.js"),m=require("../utils/streaming/getStreamingSourceId.js"),f=require("../events/SocketEvents.js"),g=require("../utils/genericFunctions/timestamp.js"),h=require("../lib/user/extensions.js"),S=require("../utils/streaming/isFromStreaming.js"),k=require("../lib/phone/trunk.js"),b=require("../node_modules/react-redux/es/hooks/useDispatch.js");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var w=y(n);exports.Socket=function(y){var C=y.hostName,_=y.username,N=y.authToken,T=y.reload,D=y.reloadedCallback,U=y.children,j=y.uaType,q=b.useDispatch(),I=n.useRef(),x=n.useRef(),E=n.useRef(!1),O=n.useRef(0);s.useEventListener("phone-island-start-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("start_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}})),s.useEventListener("phone-island-stop-transcription",(function(e){if(x.current){var n=(null==e?void 0:e.linkedid)||(null==e?void 0:e.uniqueid)||null;if(!n)return;x.current.emit("stop_transcription",{linkedid:n,uniqueid:(null==e?void 0:e.uniqueid)||n})}}));return n.useEffect((function(){var n,s=function(e){if(e.counterpartNum&&S.isFromStreaming(e.counterpartNum)){q.island.setIsFromStreaming(!0),q.currentCall.updateCurrentCall({streamingSourceNumber:e.counterpartNum});var n=m.getStreamingSourceId(e.counterpartNum);n&&o.subscribe({id:n}).catch((function(e){return console.error("Error subscribing to streaming source:",e)}))}},b=function(n,t){var r=l.store.getState().currentCall,c=r.transferring,u=r.transferSwitching,d=r.transferCalls,v=l.store.getState().island.view;if(Object.keys(t).length>0){if(n.status){var m=l.store.getState().users.extensions,f=l.store.getState().currentUser.default_device,S=l.store.getState().currentUser,b=S.endpoints,y=S.username,w=l.store.getState().currentCall;w.incoming,w.outgoing;var C=function(){if(!m||!y)return!1;var e=Object.values(m).filter((function(e){return(null==e?void 0:e.username)===y}));return null==e?void 0:e.some((function(e){var n=null==b?void 0:b.extension.find((function(n){return n.id===(null==e?void 0:e.exten)}));return"nethlink"===(null==n?void 0:n.type)&&"offline"!==(null==e?void 0:e.status)}))};switch(n.status){case"ringing":if(function(e){var n=l.store.getState().currentCall,t=n.accepted,r=n.ownerExtension;return t&&!!r&&!!e&&r!==e}(t.owner))break;s(t),("mobile"===j&&C()||"desktop"===j&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!C()||!C()&&"physical"===(null==f?void 0:f.type)))&&(q.currentCall.checkIncomingUpdatePlay({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),incomingSocket:!0,incoming:!0,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",ownerExtension:t.owner}),l.store.dispatch.island.setIslandView("call")),E.current||(E.current=!0,o.getCurrentUserInfo().then((function(n){n&&(q.currentUser.updateCurrentUser(n),a.eventDispatch("phone-island-user-informations-update",e.__assign({},n)),n.settings&&n.settings.open_param_url?q.paramUrl.setOpenParamUrlType(n.settings.open_param_url):q.paramUrl.setOpenParamUrlType("never"))})).catch((function(e){console.error("Error getting current user info:",e)})).finally((function(){setTimeout((function(){E.current=!1}),100)})));var _=l.store.getState().paramUrl.openParamUrlType,N=l.store.getState().island.urlOpened;if("ringing"===_&&!N){var T=k.isFromTrunk(t.counterpartNum);l.store.dispatch.paramUrl.setThroughTrunk(T),l.store.dispatch.island.setUrlOpened(!1),a.eventDispatch("phone-island-url-parameter-opened",{counterpartNum:t.counterpartNum,counterpartName:i.getDisplayName(t),owner:t.owner,uniqueId:t.uniqueId,linkedId:t.linkedId,throughQueue:t.throughQueue,throughTrunk:T,direction:t.direction,connected:t.connected})}break;case"busy":if(s(t),"mobile"===j&&C()||"desktop"===j&&("webrtc"===(null==f?void 0:f.type)||void 0===(null==f?void 0:f.type)&&!C()||!C()&&"physical"===(null==f?void 0:f.type))){if(t&&t.connected)q.currentCall.updateCurrentCall({conversationId:t.id,displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),ownerExtension:t.owner,username:"".concat(m&&m[t.counterpartNum]&&m[t.counterpartNum].username)||"",chDest:(null==t?void 0:t.chDest)||{},chSource:(null==t?void 0:t.chSource)||{}}),q.currentCall.checkAcceptedUpdate({acceptedSocket:!0}),q.currentCall.addTransferCalls({type:"transferred",displayName:i.getDisplayName(t),number:"".concat(t.counterpartNum),startTime:"".concat(g.getTimestampInSeconds())}),l.store.getState().island.isFromStreaming&&"out"===t.direction&&setTimeout((function(){q.island.setIslandView("streamingAnswer")}),200),p.isPhysical()&&function(e){q.currentCall.updateCurrentCall({conversationId:e.id,accepted:!0,incoming:"in"!==e.direction&&void 0}),a.eventDispatch("phone-island-call-answered",{}),l.store.dispatch.player.stopAudioPlayer(),l.store.dispatch.player.setAudioPlayerLoop(!1)}(t),"call"===v&&c&&q.currentCall.updateCurrentCall({transferring:!1});if(d.length>1)q.currentCall.deleteTransferCalls();else if(t&&!t.connected){if(c&&!u){var D=d.find((function(e){return e.number===t.counterpartNum}));!t.connected&&D&&(q.currentCall.updateCurrentCall({transferring:!1}),a.eventDispatch("phone-island-call-transfer-failed",{}),q.currentCall.updateTransferSwitching(!1))}"REC"===(null==t?void 0:t.counterpartName)&&q.physicalRecorder.setRecordingTempVariable(!0)}t&&!t.connected&&"out"===t.direction&&q.currentCall.checkOutgoingUpdate({outgoingSocket:!0,outgoing:"REC"!==(null==t?void 0:t.counterpartName),displayName:i.getDisplayName(t),number:"".concat(null==t?void 0:t.counterpartNum),username:"".concat(m&&m[null==t?void 0:t.counterpartNum]&&m[null==t?void 0:t.counterpartNum].username)||""})}break;case"onhold":var U=t.counterpartName,I=t.counterpartNum,x=t.startTime;c&&I&&U&&"<unknown>"!==U&&(q.currentCall.addTransferCalls({type:"destination",displayName:i.getDisplayName(t),number:I,startTime:"".concat(g.getTimestampInSeconds())}),q.currentCall.updateCurrentCall({displayName:i.getDisplayName(t),number:I,startTime:"".concat(x/1e3),conversationId:t.id}),q.island.setIslandView("call"));break;case"busy_ringing":a.eventDispatch("phone-island-call-ringing",{})}}}else"online"==n.status&&h.userTotallyFree()&&(q.player.stopAudioPlayer(),q.currentCall.reset(),q.physicalRecorder.setRecordingTempVariable(!1),q.island.setIsFromStreaming(!1))};return n={upgrade:!1,transports:["websocket"],reconnection:!0,reconnectionDelay:2e3},"new"===r.getApiMode(_)&&(n.path="/api/ws"),x.current=t.io("https://"+C,n),q.websocket.update({socket:x.current}),x.current.on("connect",(function(){console.debug("Socket connected sid: ".concat(x.current.id)),a.eventDispatch("phone-island-socket-connected",{})})),x.current.on("disconnect",(function(e){console.debug("Socket disconnect - reason: ".concat(e)),I.current&&(clearInterval(I.current),I.current=null),e.includes("server disconnect")?a.eventDispatch("phone-island-server-disconnected",{}):a.eventDispatch("phone-island-socket-disconnected",{})})),x.current.io.on("error",(function(e){console.debug("Socket error: ",e)})),x.current.on("connect_error",(function(e){console.debug("Socket connect_error: ",e)})),x.current.io.on("reconnect",(function(e){O.current=0,a.eventDispatch("phone-island-socket-reconnected",{}),console.debug("Socket reconnect attemp ".concat(e," (sid: ").concat(x.current.id,")"))})),x.current.io.on("reconnect_attempt",(function(e){console.debug("Socket reconnect_attempt ".concat(e))})),x.current.io.on("reconnect_error",(function(e){console.debug("Socket reconnect_error: ",e)})),x.current.io.on("reconnect_failed",(function(){console.debug("Socket reconnect_failed")})),x.current.on("connect",(function(){console.debug("Socket on: "+C+" is connected!"),x.current.emit("login",{accessKeyId:"".concat(_),token:N,uaType:j})})),x.current.on("authe_ok",(function(){console.debug("Socket authentication success!"),a.eventDispatch("phone-island-socket-authorized",{}),I.current&&clearInterval(I.current),I.current=setInterval((function(){x.current.volatile.emit("ping",u.withTimeout((function(){O.current=0,setTimeout((function(){q.alerts.removeAlert("socket_down"),a.eventDispatch("phone-island-alert-removed",{type:"socket_down"}),a.eventDispatch("phone-island-socket-disconnected-popup-close",{})}),0)}),(function(){O.current++,console.debug("Socket ping timeout (".concat(O.current,"/").concat(3,"), connected: ").concat(x.current.connected)),setTimeout((function(){var e,n,t=x.current.connected&&O.current>=3;if(!x.current.connected||t){var r=l.store.getState().webrtc.sipcall,i=l.store.getState().currentCall,o=i.accepted,c=i.outgoing,s=null===(n=null===(e=null==r?void 0:r.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===n?void 0:n.iceConnectionState;if((o||c)&&("connected"===s||"completed"===s))return void console.debug("Socket unreachable but active call with ICE connected - skipping socket_down alert",{iceState:s,accepted:o,outgoing:c,isStaleConnection:t,timestamp:(new Date).toISOString()});t&&(console.warn("Stale socket connection detected - forcing reconnection"),x.current.disconnect()),q.alerts.setAlert("socket_down"),a.eventDispatch("phone-island-socket-disconnected-popup-open",{}),console.error("Socket is unreachable!")}}),0)}),5e3))}),5e3)})),x.current.on("userMainPresenceUpdate",(function(n){l.store.dispatch.users.updateEndpointMainPresence(e.__assign({},n.mainPresence)),f.dispatchMainPresence(n)})),x.current.on("extenHangup",(function(e){var n,t,r=l.store.getState().currentUser,i=r.endpoints,o=r.username,s=l.store.getState().conference,u=s.isActive,d=s.conferenceStartedFrom,p=l.store.getState().island,v=p.view,m=p.previewCallFromMobileOrNethlink,f=((null==i?void 0:i.extension)||[]).find((function(n){return n.id===e.callerNum})),g=null==f?void 0:f.type,h=l.store.getState().currentUser.conversations,S=void 0,k=!1;if(e.callerNum&&h[e.callerNum]){var b=h[e.callerNum],y=Object.keys(b);if(y.length>0){for(var w=null,C=0,_=y;C<_.length;C++){var N=_[C],T=null==b?void 0:b[N];if(T)if(w){var D=!!w.connected,U=!!T.connected;if(!U||D){var j=null!==(n=w.startTime)&&void 0!==n?n:0,q=null!==(t=T.startTime)&&void 0!==t?t:0;U===D&&q>j&&(w=T)}else w=T}else w=T}S=null==w?void 0:w.linkedId,k=(null==w?void 0:w.connected)||!1}}if(S&&k&&a.eventDispatch("phone-island-summary-call-check",{linkedid:S}),"normal_clearing"===e.cause&&("physical"===g||"mobile"===g)||"normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)&&m||"user_busy"===(null==e?void 0:e.cause)||"not_defined"===(null==e?void 0:e.cause)||"call_rejected"===(null==e?void 0:e.cause)||"interworking"===(null==e?void 0:e.cause)?(setTimeout((function(){l.store.dispatch.island.toggleAvoidToShow(!1),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!1)}),500),u&&d!==o&&l.store.dispatch.conference.resetConference()):"normal_circuit_congestion"===(null==e?void 0:e.cause)&&u&&d===o?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):"normal_clearing"!==e.cause&&"user_busy"!==(null==e?void 0:e.cause)&&"not_defined"!==(null==e?void 0:e.cause)&&"call_rejected"!==(null==e?void 0:e.cause)||"webrtc"!==g&&"nethlink"!==g||!u||d===o||l.store.dispatch.conference.resetConference(),("normal_clearing"===e.cause&&("webrtc"===g||"nethlink"===g)||"call_rejected"===(null==e?void 0:e.cause))&&u&&d===o){var I=l.store.getState().conference,x=I.usersList,E=I.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0;O||F?setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800):l.store.dispatch.conference.resetConference()}if("interworking"===(null==e?void 0:e.cause)&&u&&d===o&&"waitingConference"!==v&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),"user_busy"===(null==e?void 0:e.cause)){var P=l.store.getState().currentUser,A=P.endpoints,V=P.username,R=((null==A?void 0:A.extension)||[]).map((function(e){return e.id})),M=l.store.getState().currentCall,L=M.incoming,B=M.accepted,Q=M.transferring,H=l.store.getState().conference,z=H.isActive,J=H.conferenceStartedFrom;!(L&&e.callerNum&&R.includes(e.callerNum))&&(!B||z||Q)&&(l.store.dispatch.island.setOperatorBusyActive({callerNumber:e.callerNum||"Unknown"}),setTimeout((function(){l.store.dispatch.player.stopAudioPlayer()}),4e3),setTimeout((function(){l.store.dispatch.player.updateStartAudioPlayer({src:c.default,loop:!0}),l.store.dispatch.island.setIslandView("operatorBusy")}),600),z&&J===V&&setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),4e3))}if("subscriber_absent"===(null==e?void 0:e.cause)){var K=l.store.getState().conference,W=K.isActive,G=K.conferenceStartedFrom,X=l.store.getState().currentUser.username;if(W&&G===X){var Y=l.store.getState().conference;x=Y.usersList,E=Y.pendingUsers,O=x&&Object.keys(x).length>0,F=E&&Object.keys(E).length>0,O||F?(setTimeout((function(){a.eventDispatch("phone-island-view-changed",{viewType:"waitingConference"})}),800),E&&E[e.callerNum]&&l.store.dispatch.conference.removePendingUser(e.callerNum)):l.store.dispatch.conference.resetConference()}}})),x.current.on("extenConnected",(function(e){var n=l.store.getState().currentUser,t=n.default_device,r=n.endpoints,i=((null==r?void 0:r.extension)||[]).find((function(n){return n.id===e.extenConnected})),o=null==i?void 0:i.type;(("webrtc"===(null==t?void 0:t.type)||"nethlink"===(null==t?void 0:t.type))&&o&&("mobile"===o||"physical"===o)||"physical"===(null==t?void 0:t.type)&&o&&"physical"!==o)&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0),a.eventDispatch("phone-island-call-answered",{extensionType:o}))})),x.current.on("extenUpdate",(function(e){var n,t;q.users.updateExtension(e);var r=l.store.getState().users.extensions,i={},o=l.store.getState().currentUser;for(var c in r){var s=r[c].username,a=r[c].exten;i[s]||(i[s]=[]),i[s].push(a)}var u=i[e.username],d=e.conversations[Object.keys(e.conversations)[0]]||{},p=!1;if((null==e?void 0:e.username)===_&&!v.isEmpty(d)&&(null==d?void 0:d.owner)){var m=null===(t=null===(n=null==o?void 0:o.endpoints)||void 0===n?void 0:n.extension)||void 0===t?void 0:t.find((function(e){return e.id===d.owner}));m&&"mobile"===m.type&&(p=!0)}if(f.dispatchExtensions(e),v.isEmpty(d)){var g=null==u?void 0:u.some((function(e){var n,t=null===(n=r[e])||void 0===n?void 0:n.conversations;return!v.isEmpty(t)}));g||f.dispatchConversations(e)}else p||f.dispatchConversations(e);p&&"busy"===(null==e?void 0:e.status)&&(null==e?void 0:e.username)===_&&(l.store.dispatch.island.toggleAvoidToShow(!0),l.store.dispatch.island.setPreviewCallFromMobileOrNethlink(!0)),e.username===_&&(b(e,d),q.currentUser.updateConversations(e))})),x.current.on("queueUpdate",(function(e){f.dispatchQueueUpdate(e)})),x.current.on("queueMemberUpdate",(function(e){f.dispatchQueueMemberUpdate(e)})),x.current.on("takeOver",(function(){f.dispatchAlreadyLogin()})),x.current.on("serverReloaded",(function(){f.dispatchServerReload()})),x.current.on("parkingUpdate",(function(e){f.dispatchParkingUpdate(e)})),x.current.on("actionNethLink",(function(e,n){f.dispatchUrlCall(e,n)})),x.current.on("satellite/summary",(function(e){(null==e?void 0:e.uniqueid)&&a.eventDispatch("phone-island-summary-ready",{linkedid:null==e?void 0:e.uniqueid})})),x.current.on("message",(function(e){switch(e.message){case"screenSharingStart":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isJoiningScreenShare:!0,room:e.roomId});break;case"screenSharingStop":q.island.toggleSideViewVisible(!1),q.island.toggleTranscriptionViewVisible(!1),q.island.setIslandView("video"),q.screenShare.update({isLeavingScreenShare:!0});break;default:console.warn("Socket: unknown message type ",e.message)}})),x.current.on("updateDefaultDevice",(function(n){f.dispatchDefaultDeviceUpdate(n);var t=l.store.getState().users.extensions,r=l.store.getState().currentUser.endpoints;if(t&&r){var i=Object.values(t).filter((function(e){return(null==e?void 0:e.exten)===n}));if(0!==i.length){var o=i[0],c=r.extension.find((function(e){return e.id===o.exten}));c&&(o=e.__assign(e.__assign({},o),{type:c.type})),l.store.dispatch.currentUser.updateCurrentDefaultDevice(o),d.checkMediaPermissions()}}})),x.current.on("confBridgeUpdate",(function(n){if(n&&(null==n?void 0:n.users)){var t=null==n?void 0:n.id,r=null==n?void 0:n.users,i=l.store.getState().conference.usersList,o=e.__assign({},r);i&&Object.keys(o).forEach((function(n){i[n]&&(o[n]=e.__assign(e.__assign({},o[n]),{muted:i[n].muted}))})),l.store.dispatch.conference.updateConferenceUsersList(o),l.store.dispatch.conference.updateConferenceId(t)}})),x.current.on("confBridgeEnd",(function(e){e&&(null==e?void 0:e.id)&&(l.store.dispatch.conference.resetConference(),a.eventDispatch("phone-island-conference-finished",{}))})),x.current.on("callWebrtc",(function(e){a.eventDispatch("phone-island-call-start",{number:e})})),x.current.on("newVoiceMessageCounter",(function(e){a.eventDispatch("phone-island-voicemail-received",{voicemailInfo:e})})),x.current.on("streamingSourceUpdate",(function(e){a.eventDispatch("phone-island-streaming-information-received",{res:e});var n=e.streaming||e.res&&e.res.streaming;if(n){var t=n.source,r=n.image;if(t&&r){l.store.getState().island.isFromStreaming;var i=l.store.getState().currentCall.streamingSourceNumber;m.getStreamingSourceId(i),q.streaming.updateSourceImage({source:t,image:r})}}})),x.current.on("satellite/transcription",(function(e){a.eventDispatch("phone-island-conversation-transcription",e)})),function(){clearInterval(I.current),x.current.close()}}),[C,_,N,j,q]),n.useEffect((function(){var e;if(T){console.info("Socket reload requested");var n=l.store.getState().alerts.data,t=l.store.getState().island.forceReload;(null===(e=n.socket_down)||void 0===e?void 0:e.active)||!1||t?(console.info(t?"Force reload requested, performing Socket reconnection":"Socket down detected (alert active), performing reconnection"),t&&l.store.dispatch.island.setForceReload(!1),I.current&&(clearInterval(I.current),I.current=null),setTimeout((function(){x.current.disconnect(),x.current.connect(),D()}),100)):(console.info("Socket already connected (no alert active), skipping reconnection"),D())}}),[T]),w.default.createElement(w.default.Fragment,null,U)};
2
2
  //# sourceMappingURL=Socket.js.map