@nethesis/phone-island 1.1.5 → 1.1.6-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.js.map +1 -1
- package/dist/components/AlertView/index.js.map +1 -1
- package/dist/components/AudioBars.js.map +1 -1
- package/dist/components/AudioPlayerView/PlayerFooterActions.js +1 -1
- package/dist/components/AudioPlayerView/PlayerFooterActions.js.map +1 -1
- package/dist/components/AudioPlayerView/Progress.js.map +1 -1
- package/dist/components/AudioPlayerView/index.js +1 -1
- package/dist/components/AudioPlayerView/index.js.map +1 -1
- package/dist/components/CallView/Actions.js +1 -1
- package/dist/components/CallView/Actions.js.map +1 -1
- package/dist/components/CallView/BackCall.js +1 -1
- package/dist/components/CallView/BackCall.js.map +1 -1
- package/dist/components/CallView/DeviceIcon.js +1 -1
- package/dist/components/CallView/DeviceIcon.js.map +1 -1
- package/dist/components/CallView/DisplayName.js +1 -1
- package/dist/components/CallView/DisplayName.js.map +1 -1
- package/dist/components/CallView/DisplayNameUtils.js.map +1 -1
- package/dist/components/CallView/Number.js +1 -1
- package/dist/components/CallView/Number.js.map +1 -1
- package/dist/components/CallView/NumberPopover.js +1 -1
- package/dist/components/CallView/NumberPopover.js.map +1 -1
- package/dist/components/CallView/index.js +1 -1
- package/dist/components/CallView/index.js.map +1 -1
- package/dist/components/ConferenceView/ConferenceUsersList.js +1 -1
- package/dist/components/ConferenceView/ConferenceUsersList.js.map +1 -1
- package/dist/components/ConferenceView/index.js +1 -1
- package/dist/components/ConferenceView/index.js.map +1 -1
- package/dist/components/ContactView/ContactListView.js +1 -1
- package/dist/components/ContactView/ContactListView.js.map +1 -1
- package/dist/components/ContactView/SelectContactNumberView.js +1 -1
- package/dist/components/ContactView/SelectContactNumberView.js.map +1 -1
- package/dist/components/ContactView/TransferActions.js +1 -1
- package/dist/components/ContactView/TransferActions.js.map +1 -1
- package/dist/components/Hangup.js +1 -1
- package/dist/components/Hangup.js.map +1 -1
- package/dist/components/KeypadView/index.js +1 -1
- package/dist/components/KeypadView/index.js.map +1 -1
- package/dist/components/OperatorBusyView/index.js +1 -1
- package/dist/components/OperatorBusyView/index.js.map +1 -1
- package/dist/components/PhysicalRecorderView/index.js +1 -1
- package/dist/components/PhysicalRecorderView/index.js.map +1 -1
- package/dist/components/RecorderView/Actions.js +1 -1
- package/dist/components/RecorderView/Actions.js.map +1 -1
- package/dist/components/RecorderView/BarsGroup.js.map +1 -1
- package/dist/components/RecorderView/index.js +1 -1
- package/dist/components/RecorderView/index.js.map +1 -1
- package/dist/components/SettingsView/AudioView.js +1 -1
- package/dist/components/SettingsView/AudioView.js.map +1 -1
- package/dist/components/SettingsView/MicrophoneView.js +1 -1
- package/dist/components/SettingsView/MicrophoneView.js.map +1 -1
- package/dist/components/SettingsView/SettingsHeader.js +1 -1
- package/dist/components/SettingsView/SettingsHeader.js.map +1 -1
- package/dist/components/SettingsView/ThemeView.js +1 -1
- package/dist/components/SettingsView/ThemeView.js.map +1 -1
- package/dist/components/SettingsView/index.js +1 -1
- package/dist/components/SettingsView/index.js.map +1 -1
- package/dist/components/SideView/SideView.js +1 -1
- package/dist/components/SideView/SideView.js.map +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js.map +1 -1
- package/dist/components/Socket.js.map +1 -1
- package/dist/components/SwitchDeviceView/index.js +1 -1
- package/dist/components/SwitchDeviceView/index.js.map +1 -1
- package/dist/components/SwitchInputView/DropdownContent.js +1 -1
- package/dist/components/SwitchInputView/DropdownContent.js.map +1 -1
- package/dist/components/SwitchInputView/Index.js +1 -1
- package/dist/components/TextScroll.js +1 -1
- package/dist/components/TextScroll.js.map +1 -1
- package/dist/components/TranscriptionView/TranscriptionView.js +1 -1
- package/dist/components/TranscriptionView/TranscriptionView.js.map +1 -1
- package/dist/components/VideoStreamingEmptyState/index.js +1 -1
- package/dist/components/VideoStreamingEmptyState/index.js.map +1 -1
- package/dist/components/VideoStreamingSkeleton/index.js +1 -1
- package/dist/components/VideoStreamingSkeleton/index.js.map +1 -1
- package/dist/components/VideoView/index.js.map +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/events/SocketEvents.js.map +1 -1
- package/dist/lib/i18n.js +1 -1
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/phone/call.js +1 -1
- package/dist/lib/phone/call.js.map +1 -1
- package/dist/lib/phone/counterpartDevice.js.map +1 -1
- package/dist/lib/phone/video.js.map +1 -1
- package/dist/lib/player/audio.js.map +1 -1
- package/dist/lib/user/default_device.js.map +1 -1
- package/dist/lib/user/extensions.js.map +1 -1
- package/dist/models/currentCall.js.map +1 -1
- package/dist/models/island.js.map +1 -1
- package/dist/models/player.js +1 -1
- package/dist/models/player.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/animation/hooks/animation-controls.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/hover.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/hover.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/index.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/press.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/press.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/exit.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/animation/index.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/definitions.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/features/layout/MeasureLayout.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/index.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/index.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/utils/use-visual-element.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/motion/utils/valid-prop.mjs.js.map +1 -1
- package/dist/node_modules/i18next/dist/esm/i18next.js +1 -1
- package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -1
- package/dist/node_modules/js-base64/base64.mjs.js +1 -1
- package/dist/node_modules/js-base64/base64.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/AsyncMotionValueAnimation.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/JSAnimation.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimation.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/animate/single-value.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/inertia.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/keyframes.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/spring.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-target.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/DOMKeyframesResolver.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/KeyframesResolver.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/get-final.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/can-animate.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/css-variables-conversion.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/is-transition-defined.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/supports/waapi.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/TransformAnimation.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/TransformAnimation.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/groups.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/accelerated-values.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/needs-mixer.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/utils/needs-mixer.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/VisualElementDragControls.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/VisualElementDragControls.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/pan/PanSession.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/pan/PanSession.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/press/index.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/press/index.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/press/utils/keyboard.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/animation/mix-values.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-apply.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-calc.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/delta-remove.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/round.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/projection/geometry/round.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/node/DocumentProjectionNode.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/node/HTMLProjectionNode.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/node/create-projection-node.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/styles/transform.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/utils/has-transform.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/utils/measure.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/VisualElement.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/VisualElement.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/dom/parse-transform.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/html/HTMLVisualElement.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/html/utils/build-transform.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/animation-state.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/stats/buffer.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/stats/buffer.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/interpolate.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/interpolate.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/is-ref-object.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/utils/mix/color.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/mix/color.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/mix/complex.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/index.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/index.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/color/hex.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/complex/index.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/animatable-none.mjs.js.map +1 -1
- package/dist/node_modules/motion-utils/dist/es/easing/utils/map.mjs.js +1 -1
- package/dist/node_modules/motion-utils/dist/es/easing/utils/map.mjs.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/context.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/context.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/defaults.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/defaults.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/unescape.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/unescape.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -1
- package/dist/node_modules/react-i18next/dist/es/utils.js +1 -1
- package/dist/node_modules/react-i18next/dist/es/utils.js.map +1 -1
- package/dist/node_modules/react-redux/node_modules/react-is/index.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +1 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +1 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/package.json.js +1 -1
- package/dist/services/astproxy.js +1 -1
- package/dist/services/astproxy.js.map +1 -1
- package/dist/services/phonebook.js +1 -1
- package/dist/services/phonebook.js.map +1 -1
- package/dist/utils/customHooks/useLocalStorage.js.map +1 -1
- package/dist/utils/deviceUtils.js.map +1 -1
- package/package.json +10 -5
- package/dist/_virtual/arrayLikeToArray.js +0 -2
- package/dist/_virtual/arrayLikeToArray.js.map +0 -1
- package/dist/_virtual/arrayWithHoles.js +0 -2
- package/dist/_virtual/arrayWithHoles.js.map +0 -1
- package/dist/_virtual/classCallCheck.js +0 -2
- package/dist/_virtual/classCallCheck.js.map +0 -1
- package/dist/_virtual/createClass.js +0 -2
- package/dist/_virtual/createClass.js.map +0 -1
- package/dist/_virtual/defineProperty.js +0 -2
- package/dist/_virtual/defineProperty.js.map +0 -1
- package/dist/_virtual/iterableToArrayLimit.js +0 -2
- package/dist/_virtual/iterableToArrayLimit.js.map +0 -1
- package/dist/_virtual/nonIterableRest.js +0 -2
- package/dist/_virtual/nonIterableRest.js.map +0 -1
- package/dist/_virtual/objectWithoutProperties.js +0 -2
- package/dist/_virtual/objectWithoutProperties.js.map +0 -1
- package/dist/_virtual/objectWithoutPropertiesLoose.js +0 -2
- package/dist/_virtual/objectWithoutPropertiesLoose.js.map +0 -1
- package/dist/_virtual/slicedToArray.js +0 -2
- package/dist/_virtual/slicedToArray.js.map +0 -1
- package/dist/_virtual/toPrimitive.js +0 -2
- package/dist/_virtual/toPrimitive.js.map +0 -1
- package/dist/_virtual/toPropertyKey.js +0 -2
- package/dist/_virtual/toPropertyKey.js.map +0 -1
- package/dist/_virtual/typeof.js +0 -2
- package/dist/_virtual/typeof.js.map +0 -1
- package/dist/_virtual/unsupportedIterableToArray.js +0 -2
- package/dist/_virtual/unsupportedIterableToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/arrayLikeToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/arrayWithHoles.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/arrayWithHoles.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/classCallCheck.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/createClass.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/createClass.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/defineProperty.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/inherits.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/inherits.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/iterableToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/toArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/toArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/nonIterableRest.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/nonIterableRest.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/objectWithoutProperties.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/objectWithoutProperties.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/slicedToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/slicedToArray.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/toPrimitive.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/toPropertyKey.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/typeof.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/typeof.js.map +0 -1
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +0 -2
- package/dist/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/utils/get-context-window.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/utils/is-ref-object.mjs.js.map +0 -1
- package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.js +0 -2
- package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.js.map +0 -1
- package/dist/node_modules/void-elements/index.js +0 -2
- package/dist/node_modules/void-elements/index.js.map +0 -1
- /package/dist/node_modules/{framer-motion → motion-dom}/dist/es/utils/is-ref-object.mjs.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Progress.js","sources":["../../../src/components/AudioPlayerView/Progress.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect, useRef, useCallback } from 'react'\nimport { useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { formatTime } from '../../utils/genericFunctions/player'\nimport { useDispatch } from 'react-redux'\nimport { StyledCustomRange } from '../../styles/CustomRange.styles'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPlay, faPause, faTrash, faVolumeHigh, faVolumeXmark } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, useEventListener } from '../../utils'\n\nconst StyledCustomRangeInput =\n StyledCustomRange as unknown as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<'input'> & React.RefAttributes<HTMLInputElement>\n >\n\nexport const Progress: FC<ProgressTypes> = ({ isPlayer }) => {\n const { audioPlayer, audioPlayerPlaying, audioPlayerTrackDuration } = useSelector(\n (state: RootState) => state.player,\n )\n const progressBarRef = useRef<any>()\n const progressAnimationRef = useRef<any>()\n const [timeProgress, setTimeProgress] = useState<string>('00:00')\n const [displayDuration, setDisplayDuration] = useState<string>()\n const dispatch = useDispatch<Dispatch>()\n const [trackDuration, setTrackDuration] = useState<number>(\n (audioPlayerTrackDuration && Math.round(audioPlayerTrackDuration)) || 0,\n )\n const { recorded, playing } = useSelector((state: RootState) => state.recorder)\n const [isMuted, setIsMuted] = useState<boolean>(false)\n\n const progressAnimation = useCallback(() => {\n const currentTime = audioPlayer?.current?.currentTime\n currentTime && setTimeProgress(formatTime(Math.round(currentTime)))\n progressBarRef.current.value = currentTime\n trackDuration &&\n currentTime &&\n progressBarRef.current.style.setProperty(\n '--range-progress',\n `${(currentTime / trackDuration) * 100}%`,\n )\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n }, [audioPlayer, trackDuration, progressBarRef])\n\n useEffect(() => {\n if (audioPlayerPlaying) {\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n } else {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [audioPlayerPlaying])\n\n useEffect(() => {\n if (audioPlayerTrackDuration) {\n setTrackDuration(Math.round(audioPlayerTrackDuration))\n setDisplayDuration(formatTime(audioPlayerTrackDuration))\n }\n }, [audioPlayerTrackDuration])\n\n useEffect(() => {\n return () => {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [])\n\n function handleProgressChange() {\n dispatch.player.setAudioPlayerCurrentTime(progressBarRef.current.value)\n }\n\n function stopPropagation(e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n function handlePause() {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n eventDispatch('phone-island-recording-paused', {})\n }\n useEventListener('phone-island-recording-pause', (data: {}) => {\n handlePause()\n })\n\n function handlePlay() {\n dispatch.player.startAudioPlayer(() => {\n // The callback for the end event of the audio player\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n })\n dispatch.recorder.setPlaying(true)\n eventDispatch('phone-island-recording-played', {})\n }\n useEventListener('phone-island-recording-play', (data: {}) => {\n handlePlay()\n })\n\n function handleDelete() {\n dispatch.recorder.resetRecorded()\n eventDispatch('phone-island-recording-deleted', {})\n }\n useEventListener('phone-island-recording-delete', (data: {}) => {\n handleDelete()\n })\n\n function handleToggleMute() {\n if (audioPlayer?.current) {\n const newMuteState = !isMuted\n audioPlayer.current.muted = newMuteState\n setIsMuted(newMuteState)\n }\n }\n\n return (\n <div className='pi-w-full pi-h-full pi-flex pi-flex-col pi-items-center pi-justify-between pi-px-2'>\n {/* Player controls with progress bar */}\n <div className='pi-w-full pi-flex pi-items-center pi-justify-between pi-gap-2'>\n {isPlayer ? (\n <div className='pi-cursor-pointer pi-flex-none' onClick={handleToggleMute}>\n <FontAwesomeIcon\n icon={isMuted ? faVolumeXmark : faVolumeHigh}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n ) : (\n <>\n {audioPlayerPlaying ? (\n <div\n onClick={handlePause}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-pause-recorder-view'\n data-tooltip-content={'Pause'}\n >\n <FontAwesomeIcon\n icon={faPause}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n ) : (\n <div\n onClick={handlePlay}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-play-recorder-view'\n data-tooltip-content={'Play'}\n >\n <FontAwesomeIcon\n icon={faPlay}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n )}\n </>\n )}\n\n <div\n className='pi-w-full pi-flex-grow pi-mx-2'\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onTouchStart={stopPropagation}\n >\n <StyledCustomRangeInput\n data-stop-propagation={true}\n ref={progressBarRef}\n defaultValue={0}\n type='range'\n step='1'\n min='0'\n max={(trackDuration && trackDuration) || 0}\n onChange={handleProgressChange}\n className='pi-text-green-600 dark:pi-text-green-500'\n />\n </div>\n\n {!isPlayer && (\n <div\n onClick={handleDelete}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-delete-recorder-view'\n data-tooltip-content={'Delete'}\n >\n <FontAwesomeIcon\n icon={faTrash}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </div>\n )}\n </div>\n\n {/* Time indicators */}\n <div className='pi-flex pi-justify-between pi-w-full pi-text-xs pi-mt-2 pi-mb-1'>\n <div className='pi-font-medium pi-text-gray-700 dark:pi-text-gray-200 pi-truncate pi-max-w-[45%]'>\n {timeProgress}\n </div>\n <div className='pi-font-medium pi-text-gray-700 dark:pi-text-gray-200 pi-truncate pi-max-w-[45%]'>\n {displayDuration}\n </div>\n </div>\n </div>\n )\n}\n\nexport default Progress\nexport interface ProgressTypes {\n isPlayer?: boolean\n}\n"],"names":["StyledCustomRangeInput","StyledCustomRange","Progress","_a","isPlayer","_b","useSelector","state","player","audioPlayer","audioPlayerPlaying","audioPlayerTrackDuration","progressBarRef","useRef","progressAnimationRef","_c","useState","timeProgress","setTimeProgress","_d","displayDuration","setDisplayDuration","dispatch","useDispatch","_e","Math","round","trackDuration","setTrackDuration","_f","recorder","_g","isMuted","setIsMuted","progressAnimation","useCallback","currentTime","current","formatTime","value","style","setProperty","requestAnimationFrame","stopPropagation","e","handlePause","pauseAudioPlayer","setPlaying","setPaused","eventDispatch","handlePlay","startAudioPlayer","handleDelete","resetRecorded","useEffect","cancelAnimationFrame","useEventListener","data","React","createElement","className","onClick","newMuteState","muted","FontAwesomeIcon","icon","faVolumeXmark","faVolumeHigh","Fragment","faPause","faPlay","onMouseDown","onTouchStart","ref","defaultValue","type","step","min","max","onChange","setAudioPlayerCurrentTime","faTrash"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Progress.js","sources":["../../../src/components/AudioPlayerView/Progress.tsx"],"sourcesContent":["import React, { type FC, useState, useEffect, useRef, useCallback } from 'react'\nimport { useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { formatTime } from '../../utils/genericFunctions/player'\nimport { useDispatch } from 'react-redux'\nimport { StyledCustomRange } from '../../styles/CustomRange.styles'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPlay, faPause, faTrash, faVolumeHigh, faVolumeXmark } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, useEventListener } from '../../utils'\n\nconst StyledCustomRangeInput =\n StyledCustomRange as unknown as React.ForwardRefExoticComponent<\n React.ComponentPropsWithoutRef<'input'> & React.RefAttributes<HTMLInputElement>\n >\n\nexport const Progress: FC<ProgressTypes> = ({ isPlayer }) => {\n const { audioPlayer, audioPlayerPlaying, audioPlayerTrackDuration } = useSelector(\n (state: RootState) => state.player,\n )\n const progressBarRef = useRef<any>()\n const progressAnimationRef = useRef<any>()\n const [timeProgress, setTimeProgress] = useState<string>('00:00')\n const [displayDuration, setDisplayDuration] = useState<string>()\n const dispatch = useDispatch<Dispatch>()\n const [trackDuration, setTrackDuration] = useState<number>(\n (audioPlayerTrackDuration && Math.round(audioPlayerTrackDuration)) || 0,\n )\n const { recorded, playing } = useSelector((state: RootState) => state.recorder)\n const [isMuted, setIsMuted] = useState<boolean>(false)\n\n const progressAnimation = useCallback(() => {\n const currentTime = audioPlayer?.current?.currentTime\n currentTime && setTimeProgress(formatTime(Math.round(currentTime)))\n progressBarRef.current.value = currentTime\n trackDuration &&\n currentTime &&\n progressBarRef.current.style.setProperty(\n '--range-progress',\n `${(currentTime / trackDuration) * 100}%`,\n )\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n }, [audioPlayer, trackDuration, progressBarRef])\n\n useEffect(() => {\n if (audioPlayerPlaying) {\n progressAnimationRef.current = requestAnimationFrame(progressAnimation)\n } else {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [audioPlayerPlaying])\n\n useEffect(() => {\n if (audioPlayerTrackDuration) {\n setTrackDuration(Math.round(audioPlayerTrackDuration))\n setDisplayDuration(formatTime(audioPlayerTrackDuration))\n }\n }, [audioPlayerTrackDuration])\n\n useEffect(() => {\n return () => {\n cancelAnimationFrame(progressAnimationRef.current)\n }\n }, [])\n\n function handleProgressChange() {\n dispatch.player.setAudioPlayerCurrentTime(progressBarRef.current.value)\n }\n\n function stopPropagation(e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n function handlePause() {\n dispatch.player.pauseAudioPlayer()\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n eventDispatch('phone-island-recording-paused', {})\n }\n useEventListener('phone-island-recording-pause', (data: {}) => {\n handlePause()\n })\n\n function handlePlay() {\n dispatch.player.startAudioPlayer(() => {\n // The callback for the end event of the audio player\n dispatch.recorder.setPlaying(false)\n dispatch.recorder.setPaused(true)\n })\n dispatch.recorder.setPlaying(true)\n eventDispatch('phone-island-recording-played', {})\n }\n useEventListener('phone-island-recording-play', (data: {}) => {\n handlePlay()\n })\n\n function handleDelete() {\n dispatch.recorder.resetRecorded()\n eventDispatch('phone-island-recording-deleted', {})\n }\n useEventListener('phone-island-recording-delete', (data: {}) => {\n handleDelete()\n })\n\n function handleToggleMute() {\n if (audioPlayer?.current) {\n const newMuteState = !isMuted\n audioPlayer.current.muted = newMuteState\n setIsMuted(newMuteState)\n }\n }\n\n return (\n <div className='pi-w-full pi-h-full pi-flex pi-flex-col pi-items-center pi-justify-between pi-px-2'>\n {/* Player controls with progress bar */}\n <div className='pi-w-full pi-flex pi-items-center pi-justify-between pi-gap-2'>\n {isPlayer ? (\n <div className='pi-cursor-pointer pi-flex-none' onClick={handleToggleMute}>\n <FontAwesomeIcon\n icon={isMuted ? faVolumeXmark : faVolumeHigh}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n ) : (\n <>\n {audioPlayerPlaying ? (\n <div\n onClick={handlePause}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-pause-recorder-view'\n data-tooltip-content={'Pause'}\n >\n <FontAwesomeIcon\n icon={faPause}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n ) : (\n <div\n onClick={handlePlay}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-play-recorder-view'\n data-tooltip-content={'Play'}\n >\n <FontAwesomeIcon\n icon={faPlay}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-300'\n />\n </div>\n )}\n </>\n )}\n\n <div\n className='pi-w-full pi-flex-grow pi-mx-2'\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onTouchStart={stopPropagation}\n >\n <StyledCustomRangeInput\n data-stop-propagation={true}\n ref={progressBarRef}\n defaultValue={0}\n type='range'\n step='1'\n min='0'\n max={(trackDuration && trackDuration) || 0}\n onChange={handleProgressChange}\n className='pi-text-green-600 dark:pi-text-green-500'\n />\n </div>\n\n {!isPlayer && (\n <div\n onClick={handleDelete}\n className='pi-cursor-pointer pi-flex-none'\n data-tooltip-id='tooltip-delete-recorder-view'\n data-tooltip-content={'Delete'}\n >\n <FontAwesomeIcon\n icon={faTrash}\n className='pi-h-4 pi-w-4 pi-text-gray-700 dark:pi-text-gray-200'\n />\n </div>\n )}\n </div>\n\n {/* Time indicators */}\n <div className='pi-flex pi-justify-between pi-w-full pi-text-xs pi-mt-2 pi-mb-1'>\n <div className='pi-font-medium pi-text-gray-700 dark:pi-text-gray-200 pi-truncate pi-max-w-[45%]'>\n {timeProgress}\n </div>\n <div className='pi-font-medium pi-text-gray-700 dark:pi-text-gray-200 pi-truncate pi-max-w-[45%]'>\n {displayDuration}\n </div>\n </div>\n </div>\n )\n}\n\nexport default Progress\nexport interface ProgressTypes {\n isPlayer?: boolean\n}\n"],"names":["StyledCustomRangeInput","StyledCustomRange","Progress","_a","isPlayer","_b","useSelector","state","player","audioPlayer","audioPlayerPlaying","audioPlayerTrackDuration","progressBarRef","useRef","progressAnimationRef","_c","useState","timeProgress","setTimeProgress","_d","displayDuration","setDisplayDuration","dispatch","useDispatch","_e","Math","round","trackDuration","setTrackDuration","_f","recorder","_g","isMuted","setIsMuted","progressAnimation","useCallback","currentTime","current","formatTime","value","style","setProperty","requestAnimationFrame","stopPropagation","e","handlePause","pauseAudioPlayer","setPlaying","setPaused","eventDispatch","handlePlay","startAudioPlayer","handleDelete","resetRecorded","useEffect","cancelAnimationFrame","useEventListener","data","React","createElement","className","onClick","newMuteState","muted","FontAwesomeIcon","icon","faVolumeXmark","faVolumeHigh","Fragment","faPause","faPlay","onMouseDown","onTouchStart","ref","defaultValue","type","step","min","max","onChange","setAudioPlayerCurrentTime","faTrash"],"mappings":"yzBAUMA,EACJC,EAAAA,kBAIWC,EAA8B,SAACC,GAAE,IAAAC,EAAQD,EAAAC,SAC9CC,EAAgEC,EAAAA,YACpE,SAACC,GAAqB,OAAAA,EAAMC,SADtBC,EAAWJ,EAAAI,YAAEC,EAAkBL,EAAAK,mBAAEC,EAAwBN,EAAAM,yBAG3DC,EAAiBC,EAAAA,SACjBC,EAAuBD,EAAAA,SACvBE,EAAkCC,EAAAA,SAAiB,SAAlDC,EAAYF,EAAA,GAAEG,EAAeH,EAAA,GAC9BI,EAAwCH,aAAvCI,EAAeD,EAAA,GAAEE,EAAkBF,EAAA,GACpCG,EAAWC,EAAAA,cACXC,EAAoCR,EAAAA,SACvCL,GAA4Bc,KAAKC,MAAMf,IAA8B,GADjEgB,EAAaH,EAAA,GAAEI,EAAgBJ,EAAA,GAGhCK,EAAwBvB,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMuB,QAAN,wBAC1D,IAAAC,EAAwBf,EAAAA,UAAkB,GAAzCgB,EAAOD,EAAA,GAAEE,EAAUF,EAAA,GAEpBG,EAAoBC,EAAAA,YAAY,iBAC9BC,EAAoC,QAAtBjC,EAAAM,aAAA,EAAAA,EAAa4B,eAAS,IAAAlC,OAAA,EAAAA,EAAAiC,YAC1CA,GAAelB,EAAgBoB,aAAWb,KAAKC,MAAMU,KACrDxB,EAAeyB,QAAQE,MAAQH,EAC/BT,GACES,GACAxB,EAAeyB,QAAQG,MAAMC,YAC3B,mBACA,UAAIL,EAAcT,EAAiB,IAAG,MAE1Cb,EAAqBuB,QAAUK,sBAAsBR,EACtD,EAAE,CAACzB,EAAakB,EAAef,IA2BhC,SAAS+B,EAAgBC,GACvBA,EAAED,iBACH,CAED,SAASE,IACPvB,EAASd,OAAOsC,mBAChBxB,EAASQ,SAASiB,YAAW,GAC7BzB,EAASQ,SAASkB,WAAU,GAC5BC,gBAAc,gCAAiC,CAAA,EAChD,CAKD,SAASC,IACP5B,EAASd,OAAO2C,iBAAiB,WAE/B7B,EAASQ,SAASiB,YAAW,GAC7BzB,EAASQ,SAASkB,WAAU,EAC9B,GACA1B,EAASQ,SAASiB,YAAW,GAC7BE,gBAAc,gCAAiC,CAAA,EAChD,CAKD,SAASG,IACP9B,EAASQ,SAASuB,gBAClBJ,gBAAc,iCAAkC,CAAA,EACjD,CAaD,OApEAK,EAAAA,UAAU,WACJ5C,EACFI,EAAqBuB,QAAUK,sBAAsBR,GAErDqB,qBAAqBzC,EAAqBuB,QAE9C,EAAG,CAAC3B,IAEJ4C,EAAAA,UAAU,WACJ3C,IACFiB,EAAiBH,KAAKC,MAAMf,IAC5BU,EAAmBiB,EAAAA,WAAW3B,IAElC,EAAG,CAACA,IAEJ2C,EAAAA,UAAU,WACR,OAAO,WACLC,qBAAqBzC,EAAqBuB,QAC5C,CACD,EAAE,IAgBHmB,mBAAiB,+BAAgC,SAACC,GAChDZ,GACF,GAWAW,mBAAiB,8BAA+B,SAACC,GAC/CP,GACF,GAMAM,mBAAiB,gCAAiC,SAACC,GACjDL,GACF,GAWEM,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,sFAEbF,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,iEACZxD,EACCsD,EAAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,iCAAiCC,QAbxD,WACE,GAAIpD,aAAW,EAAXA,EAAa4B,QAAS,CACxB,IAAMyB,GAAgB9B,EACtBvB,EAAY4B,QAAQ0B,MAAQD,EAC5B7B,EAAW6B,EACZ,CACF,GAQSJ,EAAAA,QAAAC,cAACK,EAAAA,gBACC,CAAAC,KAAMjC,EAAUkC,EAAaA,cAAGC,eAChCP,UAAU,0DAIdF,EAAA,QAAAC,cAAAD,EAAA,QAAAU,SAAA,KACG1D,EACCgD,EAAAA,QAAAC,cAAA,MAAA,CACEE,QAAShB,EACTe,UAAU,iCACM,kBAAA,qDACM,SAEtBF,UAACC,cAAAK,EAAeA,gBACd,CAAAC,KAAMI,EAAOA,QACbT,UAAU,0DAIdF,EAAA,QAAAC,cAAA,MAAA,CACEE,QAASX,EACTU,UAAU,iCAAgC,kBAC1B,6BAA4B,uBACtB,QAEtBF,UAAAC,cAACK,EAAeA,gBAAA,CACdC,KAAMK,SACNV,UAAU,2DAOpBF,EAAAA,QAAAC,cAAA,MAAA,CACEC,UAAU,iCACVC,QAASlB,EACT4B,YAAa5B,EACb6B,aAAc7B,GAEde,EAAAA,QAAAC,cAAC3D,EACwB,CAAA,yBAAA,EACvByE,IAAK7D,EACL8D,aAAc,EACdC,KAAK,QACLC,KAAK,IACLC,IAAI,IACJC,IAAMnD,GAAiBA,GAAkB,EACzCoD,SAtGV,WACEzD,EAASd,OAAOwE,0BAA0BpE,EAAeyB,QAAQE,MAClE,EAqGSqB,UAAU,+CAIZxD,GACAsD,EAAA,QAAAC,cAAA,MAAA,CACEE,QAAST,EACTQ,UAAU,iCACM,kBAAA,sDACM,UAEtBF,UAAAC,cAACK,EAAeA,gBAAA,CACdC,KAAMgB,EAAOA,QACbrB,UAAU,2DAOlBF,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,mEACbF,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,oFACZ3C,GAEHyC,UAAKC,cAAA,MAAA,CAAAC,UAAU,oFACZxC,IAKX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Avatar.js"),r=require("./Progress.js");require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Avatar.js"),r=require("./Progress.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var s=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),a=require("./PlayerFooterActions.js"),i=require("../Button.js"),o=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js");var n=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),l=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),u=require("../../node_modules/react-redux/es/hooks/useSelector.js"),d=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var p=c(e),m=function(){var e=u.useSelector(function(e){return e.player}),c=e.audioPlayerTrackType,m=e.audioPlayerTrackName,f=e.audioPlayerPlaying,x=u.useSelector(function(e){return e.island}).isOpen;function v(e){e.stopPropagation()}var j=s.useTranslation().t,y=d.useDispatch();return p.default.createElement("div",{className:"pi-flex pi-gap-7 pi-flex-col"},p.default.createElement("div",{className:"pi-flex pi-gap-4"},p.default.createElement(t.Avatar,{type:c}),p.default.createElement("div",{className:"pi-flex pi-items-center pi-w-full"},p.default.createElement("div",{style:{width:x?"202px":"60px"},className:"pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block"},m)),p.default.createElement(i.Button,{onClick:function(){return f&&(y.player.stopAudioPlayer(),o.eventDispatch("phone-island-audio-player-close",{})),void y.island.resetPlayerClose()},variant:"transparentSettings","data-tooltip-id":"tooltip-close-settings","data-tooltip-content":j("Common.Close")||""},p.default.createElement(n.FontAwesomeIcon,{icon:l.faXmark,className:"pi-w-5 pi-h-5"}))),x&&p.default.createElement("div",{onClick:v,onMouseDown:v,onTouchStart:v},p.default.createElement(r.Progress,{isPlayer:!0}),p.default.createElement(a.PlayerFooterActions,null)))};exports.KeypadView=m,exports.default=m;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/AudioPlayerView/index.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { Avatar } from './Avatar'\nimport Progress from './Progress'\nimport { useTranslation } from 'react-i18next'\nimport PlayerFooterActions from './PlayerFooterActions'\nimport { Button } from '../Button'\nimport { eventDispatch } from '../../utils'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\n\nexport const KeypadView: FC<KeypadViewTypes> = () => {\n const { audioPlayerTrackType, audioPlayerTrackName, audioPlayerPlaying } =\n useSelector((state: RootState) => state.player)\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n function stopPropagation(e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n const { t } = useTranslation()\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\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 return (\n <div className='pi-flex pi-gap-7 pi-flex-col'>\n <div className='pi-flex pi-gap-4'>\n <Avatar type={audioPlayerTrackType} />\n <div className='pi-flex pi-items-center pi-w-full'>\n <div\n style={{\n width: isOpen ? '202px' : '60px',\n }}\n className={`pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block`}\n >\n {audioPlayerTrackName}\n </div>\n </div>\n <Button\n onClick={() => playerClose()}\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 {isOpen && (\n <div onClick={stopPropagation} onMouseDown={stopPropagation} onTouchStart={stopPropagation}>\n {/* add prop to indicate that is audioplayer view */}\n <Progress isPlayer />\n <PlayerFooterActions />\n </div>\n )}\n {/* Buttons tooltips */}\n </div>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["KeypadView","_a","useSelector","state","player","audioPlayerTrackType","audioPlayerTrackName","audioPlayerPlaying","isOpen","island","stopPropagation","e","t","useTranslation","dispatch","useDispatch","React","createElement","className","Avatar","type","style","width","Button","onClick","stopAudioPlayer","eventDispatch","resetPlayerClose","variant","FontAwesomeIcon","icon","faXmark","onMouseDown","onTouchStart","Progress","isPlayer","PlayerFooterActions"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/AudioPlayerView/index.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { Avatar } from './Avatar'\nimport Progress from './Progress'\nimport { useTranslation } from 'react-i18next'\nimport PlayerFooterActions from './PlayerFooterActions'\nimport { Button } from '../Button'\nimport { eventDispatch } from '../../utils'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\n\nexport const KeypadView: FC<KeypadViewTypes> = () => {\n const { audioPlayerTrackType, audioPlayerTrackName, audioPlayerPlaying } =\n useSelector((state: RootState) => state.player)\n const { isOpen } = useSelector((state: RootState) => state.island)\n\n function stopPropagation(e: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) {\n e.stopPropagation()\n }\n\n const { t } = useTranslation()\n\n // Initialize state dispatch\n const dispatch = useDispatch<Dispatch>()\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 return (\n <div className='pi-flex pi-gap-7 pi-flex-col'>\n <div className='pi-flex pi-gap-4'>\n <Avatar type={audioPlayerTrackType} />\n <div className='pi-flex pi-items-center pi-w-full'>\n <div\n style={{\n width: isOpen ? '202px' : '60px',\n }}\n className={`pi-text-base pi-overflow-hidden pi-text-ellipsis pi-whitespace-nowrap pi-inline-block`}\n >\n {audioPlayerTrackName}\n </div>\n </div>\n <Button\n onClick={() => playerClose()}\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 {isOpen && (\n <div onClick={stopPropagation} onMouseDown={stopPropagation} onTouchStart={stopPropagation}>\n {/* add prop to indicate that is audioplayer view */}\n <Progress isPlayer />\n <PlayerFooterActions />\n </div>\n )}\n {/* Buttons tooltips */}\n </div>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n"],"names":["KeypadView","_a","useSelector","state","player","audioPlayerTrackType","audioPlayerTrackName","audioPlayerPlaying","isOpen","island","stopPropagation","e","t","useTranslation","dispatch","useDispatch","React","createElement","className","Avatar","type","style","width","Button","onClick","stopAudioPlayer","eventDispatch","resetPlayerClose","variant","FontAwesomeIcon","icon","faXmark","onMouseDown","onTouchStart","Progress","isPlayer","PlayerFooterActions"],"mappings":"q9BAeaA,EAAkC,WACvC,IAAAC,EACJC,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAMC,SADlCC,EAAoBJ,EAAAI,qBAAEC,EAAoBL,EAAAK,qBAAEC,EAAkBN,EAAAM,mBAE9DC,EAAWN,cAAY,SAACC,GAAqB,OAAAA,EAAMM,gBAE3D,SAASC,EAAgBC,GACvBA,EAAED,iBACH,CAEO,IAAAE,EAAMC,qBAGRC,EAAWC,EAAAA,cAUjB,OACEC,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,gCACbF,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,oBACbF,EAAAA,QAAAC,cAACE,EAAAA,OAAM,CAACC,KAAMf,IACdW,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,qCACbF,EAAAA,QAAAC,cAAA,MAAA,CACEI,MAAO,CACLC,MAAOd,EAAS,QAAU,QAE5BU,UAAW,yFAEVZ,IAGLU,EAAC,QAAAC,cAAAM,UACCC,QAAS,WAAM,OAtBjBjB,IACFO,EAASV,OAAOqB,kBAChBC,gBAAc,kCAAmC,CAAA,SAEnDZ,EAASL,OAAOkB,kBAkBkB,EAC5BC,QAAQ,wCACQ,yBAAwB,uBAClBhB,EAAE,iBAAmB,IAE3CI,UAACC,cAAAY,EAAAA,gBAAgB,CAAAC,KAAMC,EAAAA,QAASb,UAAU,oBAG7CV,GACCQ,EAAK,QAAAC,cAAA,MAAA,CAAAO,QAASd,EAAiBsB,YAAatB,EAAiBuB,aAAcvB,GAEzEM,EAAAA,QAACC,cAAAiB,EAAAA,SAAS,CAAAC,UAAW,IACrBnB,EAAAA,QAAAC,cAACmB,EAAAA,oBAAsB,OAMjC"}
|
|
@@ -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"),n=require("../../lib/phone/call.js"),i=require("../../utils/customHooks/useEventListener.js"),o=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var l=require("../../services/astproxy.js"),s=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js");var r=require("../../lib/webrtc/messages.js"),c=require("../../static/outgoing_ringtone.js");require("../Island.js");var u=require("../Button.js"),d=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),p=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/i18next/dist/esm/i18next.js");var f=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var m=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),n=require("../../lib/phone/call.js"),i=require("../../utils/customHooks/useEventListener.js"),o=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/socket.io-client/build/esm/index.js");var l=require("../../services/astproxy.js"),s=require("../../lib/user/default_device.js");require("../../node_modules/mic-check/lib/index.js"),require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js");var r=require("../../lib/webrtc/messages.js"),c=require("../../static/outgoing_ringtone.js");require("../Island.js");var u=require("../Button.js"),d=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),p=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules/i18next/dist/esm/i18next.js");var f=require("../CustomThemedTooltip.js");require("../TranscriptionView/TranscriptionView.js");var m=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules/react-i18next/dist/es/context.js");var v=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),h=require("../TransferButton.js"),C=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),T=require("../../node_modules/react-redux/es/hooks/useSelector.js");function j(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=j(t),E=g.default.memo(function(e){var t=e.active,n=e.onClick,i=e.tooltipId,o=e.tooltipContent,a=e.icon,l=e.activeIcon,s=void 0===l?a:l;return g.default.createElement(u.Button,{variant:"default",active:t,onClick:n,"data-tooltip-id":i,"data-tooltip-content":o},g.default.createElement(d.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:t?s:a}))}),b=g.default.memo(function(){var j,b,k,w,y=v.useTranslation().t,x=C.useDispatch(),q=T.useSelector(function(e){return e.currentCall}),D=q.paused,_=q.muted,I=q.parked,A=q.transferring,P=T.useSelector(function(e){return e.island}),M=P.view,V=P.actionsExpanded,S=P.sideViewIsVisible,F=P.transcriptionViewIsVisible,L=T.useSelector(function(e){return e.listen}),B=T.useSelector(function(e){return e.conference}),N=B.isActive,R=B.conferenceStartedFrom,U=T.useSelector(function(e){return null==e?void 0:e.currentUser}),O=U.username,G=U.profile,H=t.useRef(!1),K=t.useRef(!1),W=t.useMemo(function(){return""!==O&&R===O},[O,R]),z=t.useMemo(function(){return N&&!W},[N,W]),J=t.useMemo(function(){return(null==L?void 0:L.isIntrude)||(null==L?void 0:L.isListen)},[L]),Q=t.useCallback(function(){_?n.unmuteCurrentCall():n.muteCurrentCall()},[_]),X=t.useCallback(function(){D?n.unpauseCurrentCall():n.pauseCurrentCall()},[D]),Y=t.useCallback(function(){x.island.setIslandView("keypad"!==M?"keypad":"call"),S&&o.eventDispatch("phone-island-sideview-close",{}),F&&o.eventDispatch("phone-island-transcription-close",{}),o.eventDispatch("phone-island-call-keypad-opened",{})},[M,S,F,x.island]),Z=t.useCallback(function(){var e=!V;x.island.toggleActionsExpanded(e),o.eventDispatch("phone-island-call-actions-".concat(e?"opened":"closed"),{}),e||o.eventDispatch("phone-island-sideview-close",{})},[V,F,x.island]),$=t.useCallback(function(){S?o.eventDispatch("phone-island-sideview-close",{}):(F&&o.eventDispatch("phone-island-transcription-close",{}),o.eventDispatch("phone-island-sideview-open",{}))},[S,F]),ee=t.useCallback(function(){x.island.setIslandView("transfer"!==M?"transfer":"call"),S&&o.eventDispatch("phone-island-sideview-close",{}),F&&o.eventDispatch("phone-island-transcription-close",{}),o.eventDispatch("phone-island-call-transfer-opened",{})},[M,S,F,x.island]),te=t.useCallback(function(){o.eventDispatch("phone-island-conference-list-open",{}),x.island.setIslandView("transfer"!==M?"transfer":"call"),S&&o.eventDispatch("phone-island-sideview-close",{}),F&&o.eventDispatch("phone-island-transcription-close",{})},[M,S,F,x.island]),ne=t.useCallback(function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(e){switch(e.label){case 0:return x.island.setIslandView("waitingConference"),[4,n.startConference()];case 1:return e.sent(),[2]}})})},[x.island]),ie=t.useCallback(function(){N?ne():te()},[N,ne,te]),oe=t.useMemo(function(){return N&&"call"===M&&!V&&!H.current&&W},[N,M,V,W]),ae=t.useMemo(function(){return N&&"call"===M&&V&&!K.current&&""!==O&&!W},[N,M,V,O,W]);t.useEffect(function(){oe&&(x.island.toggleActionsExpanded(!0),o.eventDispatch("phone-island-call-actions-opened",{}),H.current=!0)},[oe,x.island]),t.useEffect(function(){ae&&(x.island.toggleActionsExpanded(!1),o.eventDispatch("phone-island-call-actions-closed",{}),K.current=!0)},[ae,x.island]);var le=t.useCallback(function(){var e=s.isWebRTC()?r.sendDTMF:l.sendPhysicalDTMF;e("*"),a.store.getState().player.audioPlayerPlaying||x.player.updateStartAudioPlayer({src:c.default,loop:!0}),setTimeout(function(){e("1"),x.player.stopAudioPlayer(),A&&setTimeout(function(){x.currentCall.updateTransferring(!1)},500),o.eventDispatch("phone-island-call-transfer-canceled",{})},500)},[A,x.player,x.currentCall]);i.useEventListener("phone-island-call-keypad-open",Y),i.useEventListener("phone-island-call-transfer-open",ee),i.useEventListener("phone-island-call-transfer-cancel",le),i.useEventListener("phone-island-call-actions-open",function(){x.island.toggleActionsExpanded(!0),o.eventDispatch("phone-island-call-actions-opened",{})}),i.useEventListener("phone-island-call-actions-close",function(){x.island.toggleActionsExpanded(!1),o.eventDispatch("phone-island-call-actions-closed",{})});var se=t.useMemo(function(){return(null==L?void 0:L.isListen)||(null==L?void 0:L.isIntrude)||N&&!W?L.isIntrude?"pi-mb-6 pi-grid pi-grid-cols-1 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center":N&&!W?"pi-flex pi-items-center pi-justify-center pi-gap-4":"pi-hidden":"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},[L,N,W]);return g.default.createElement(g.default.Fragment,null,g.default.createElement("div",{className:se},!J&&g.default.createElement(E,{active:D,onClick:X,tooltipId:"tooltip-pause",tooltipContent:y(D?"Tooltip.Play":"Tooltip.Pause"),icon:p.faPause,activeIcon:p.faPlay}),!(null==L?void 0:L.isListen)&&g.default.createElement(E,{active:_,onClick:Q,tooltipId:"tooltip-mute",tooltipContent:y(_?"Tooltip.Unmute":"Tooltip.Mute"),icon:p.faMicrophone,activeIcon:p.faMicrophoneSlash}),!z&&g.default.createElement(h.TransferButton,null),!J&&!z&&g.default.createElement(u.Button,{active:V,variant:"transparent",onClick:Z,"data-tooltip-id":"tooltip-expand","data-tooltip-content":y(V?"Tooltip.Collapse":"Tooltip.Expand")},g.default.createElement(d.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:V?p.faAngleUp:p.faAngleDown}))),V&&g.default.createElement("div",{className:"pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},g.default.createElement(E,{active:"keypad"===M,onClick:Y,tooltipId:"tooltip-keyboard",tooltipContent:y("Tooltip.Keyboard"),icon:m.faGridRound}),g.default.createElement(E,{active:I,onClick:n.parkCurrentCall,tooltipId:"tooltip-park",tooltipContent:y("Tooltip.Park"),icon:p.faSquareParking}),(null===(w=null===(k=null===(b=null===(j=null==G?void 0:G.macro_permissions)||void 0===j?void 0:j.settings)||void 0===b?void 0:b.permissions)||void 0===k?void 0:k.conference)||void 0===w?void 0:w.value)&&g.default.createElement(u.Button,{"data-stop-propagation":!0,variant:"default",onClick:ie,"data-tooltip-id":"tooltip-conference","data-tooltip-content":N?y("Tooltip.Conference")||"":y("Tooltip.Add user to conference")||""},g.default.createElement(d.FontAwesomeIcon,{icon:N?p.faPlus:p.faUserPlus,className:"pi-h-6 pi-w-6"})),g.default.createElement(u.Button,{variant:"default",onClick:$,"data-tooltip-id":"tooltip-sideView","data-tooltip-content":y("Tooltip.Other actions")||""},g.default.createElement(d.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:S?m.faClose:m.faOpen}))),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-transfer",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-pause",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-mute",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-expand",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-keyboard",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-conference",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-park",place:"bottom"}),g.default.createElement(f.CustomThemedTooltip,{id:"tooltip-sideView",place:"left"}))});exports.default=b;
|
|
2
2
|
//# sourceMappingURL=Actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useEffect, useRef, useCallback } from 'react'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n parkCurrentCall,\n startConference,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faSquareParking,\n faUserPlus,\n faPlus,\n faAngleDown,\n faAngleUp,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faClose, faGridRound, faOpen } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport TransferButton from '../TransferButton'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core'\n\ninterface ActionButtonProps {\n active: boolean\n onClick: () => void\n tooltipId: string\n tooltipContent: string\n icon: IconDefinition\n activeIcon?: IconDefinition\n}\n\nconst ActionButton: React.FC<ActionButtonProps> = React.memo(\n ({ active, onClick, tooltipId, tooltipContent, icon, activeIcon = icon }) => (\n <Button\n variant='default'\n active={active}\n onClick={onClick}\n data-tooltip-id={tooltipId}\n data-tooltip-content={tooltipContent}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={active ? activeIcon : icon} />\n </Button>\n ),\n)\n\nconst Actions: FC = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const { paused, muted, parked, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n const { view, actionsExpanded, sideViewIsVisible, transcriptionViewIsVisible } = useSelector(\n (state: RootState) => state.island,\n )\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username, profile } = useSelector((state: RootState) => state?.currentUser)\n\n // Check if the actions should be expanded automatically\n const autoExpandedRef = useRef(false)\n // Check if the actions should be collapsed automatically\n const autoCollapsedRef = useRef(false)\n\n const isOwnerOfConference = useMemo(\n () => username !== '' && conferenceStartedFrom === username,\n [username, conferenceStartedFrom],\n )\n\n const shouldHideTransferButton = useMemo(\n () => isActive && !isOwnerOfConference,\n [isActive, isOwnerOfConference],\n )\n\n const shouldHideButtons = useMemo(\n () => intrudeListenStatus?.isIntrude || intrudeListenStatus?.isListen,\n [intrudeListenStatus],\n )\n\n const toggleMute = useCallback(() => {\n muted ? unmuteCurrentCall() : muteCurrentCall()\n }, [muted])\n\n const togglePause = useCallback(() => {\n paused ? unpauseCurrentCall() : pauseCurrentCall()\n }, [paused])\n\n const openKeypad = useCallback(() => {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-call-keypad-opened', {})\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const toggleActionsExpanded = useCallback(() => {\n const newState = !actionsExpanded\n dispatch.island.toggleActionsExpanded(newState)\n eventDispatch(`phone-island-call-actions-${newState ? 'opened' : 'closed'}`, {})\n if (!newState) {\n eventDispatch('phone-island-sideview-close', {})\n }\n }, [actionsExpanded, transcriptionViewIsVisible, dispatch.island])\n\n const toggleSideView = useCallback(() => {\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n } else {\n // When opening SideView, close TranscriptionView if it's open\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-sideview-open', {})\n }\n }, [sideViewIsVisible, transcriptionViewIsVisible])\n\n const transfer = useCallback(() => {\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-call-transfer-opened', {})\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const beginConference = useCallback(() => {\n eventDispatch('phone-island-conference-list-open', {})\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const addUserToConference = useCallback(async () => {\n dispatch.island.setIslandView('waitingConference')\n await startConference()\n }, [dispatch.island])\n\n const handleConferenceAction = useCallback(() => {\n isActive ? addUserToConference() : beginConference()\n }, [isActive, addUserToConference, beginConference])\n\n const shouldExpandActions = useMemo(() => {\n return (\n isActive &&\n view === 'call' &&\n !actionsExpanded &&\n !autoExpandedRef.current &&\n isOwnerOfConference\n )\n }, [isActive, view, actionsExpanded, isOwnerOfConference])\n\n // Check if user is not the owner of the conference\n const shouldCollapseActions = useMemo(() => {\n return (\n isActive &&\n view === 'call' &&\n actionsExpanded &&\n !autoCollapsedRef.current &&\n username !== '' &&\n !isOwnerOfConference\n )\n }, [isActive, view, actionsExpanded, username, isOwnerOfConference])\n\n // Automatically expand actions if the user has enabled conference\n useEffect(() => {\n if (shouldExpandActions) {\n dispatch.island.toggleActionsExpanded(true)\n eventDispatch('phone-island-call-actions-opened', {})\n autoExpandedRef.current = true\n }\n }, [shouldExpandActions, dispatch.island])\n\n // Automatically collapse actions if the user is not the owner of the conference\n useEffect(() => {\n if (shouldCollapseActions) {\n dispatch.island.toggleActionsExpanded(false)\n eventDispatch('phone-island-call-actions-closed', {})\n autoCollapsedRef.current = true\n }\n }, [shouldCollapseActions, dispatch.island])\n\n const cancelTransfer = useCallback(() => {\n const sendDtmfFunc = isWebRTC() ? sendDTMF : sendPhysicalDTMF\n\n sendDtmfFunc('*')\n\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n\n setTimeout(() => {\n sendDtmfFunc('1')\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n\n eventDispatch('phone-island-call-transfer-canceled', {})\n }, 500)\n }, [transferring, dispatch.player, dispatch.currentCall])\n\n useEventListener('phone-island-call-keypad-open', openKeypad)\n useEventListener('phone-island-call-transfer-open', transfer)\n useEventListener('phone-island-call-transfer-cancel', cancelTransfer)\n useEventListener('phone-island-call-actions-open', () => {\n dispatch.island.toggleActionsExpanded(true)\n eventDispatch('phone-island-call-actions-opened', {})\n })\n useEventListener('phone-island-call-actions-close', () => {\n dispatch.island.toggleActionsExpanded(false)\n eventDispatch('phone-island-call-actions-closed', {})\n })\n\n const mainGridClassName = useMemo(() => {\n if (\n intrudeListenStatus?.isListen ||\n intrudeListenStatus?.isIntrude ||\n (isActive && !isOwnerOfConference)\n ) {\n if (intrudeListenStatus.isIntrude) {\n return 'pi-mb-6 pi-grid pi-grid-cols-1 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'\n }\n if (isActive && !isOwnerOfConference) {\n return 'pi-flex pi-items-center pi-justify-center pi-gap-4'\n }\n return 'pi-hidden'\n }\n return 'pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'\n }, [intrudeListenStatus, isActive, isOwnerOfConference])\n\n return (\n <>\n <div className={mainGridClassName}>\n {!shouldHideButtons && (\n <ActionButton\n active={paused}\n onClick={togglePause}\n tooltipId='tooltip-pause'\n tooltipContent={paused ? t('Tooltip.Play') : t('Tooltip.Pause')}\n icon={faPause}\n activeIcon={faPlay}\n />\n )}\n\n {!intrudeListenStatus?.isListen && (\n <ActionButton\n active={muted}\n onClick={toggleMute}\n tooltipId='tooltip-mute'\n tooltipContent={muted ? t('Tooltip.Unmute') : t('Tooltip.Mute')}\n icon={faMicrophone}\n activeIcon={faMicrophoneSlash}\n />\n )}\n\n {!shouldHideTransferButton && <TransferButton />}\n\n {!shouldHideButtons && !shouldHideTransferButton && (\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={toggleActionsExpanded}\n data-tooltip-id='tooltip-expand'\n data-tooltip-content={actionsExpanded ? t('Tooltip.Collapse') : t('Tooltip.Expand')}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={actionsExpanded ? faAngleUp : faAngleDown}\n />\n </Button>\n )}\n </div>\n\n {/* Actions expanded section */}\n {actionsExpanded && (\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <ActionButton\n active={view === 'keypad'}\n onClick={openKeypad}\n tooltipId='tooltip-keyboard'\n tooltipContent={t('Tooltip.Keyboard')}\n icon={faGridRound}\n />\n\n <ActionButton\n active={parked}\n onClick={parkCurrentCall}\n tooltipId='tooltip-park'\n tooltipContent={t('Tooltip.Park')}\n icon={faSquareParking}\n />\n\n {profile?.macro_permissions?.settings?.permissions?.conference?.value && (\n <Button\n data-stop-propagation={true}\n variant='default'\n onClick={handleConferenceAction}\n data-tooltip-id='tooltip-conference'\n data-tooltip-content={\n isActive ? t('Tooltip.Conference') || '' : t('Tooltip.Add user to conference') || ''\n }\n >\n <FontAwesomeIcon icon={isActive ? faPlus : faUserPlus} className='pi-h-6 pi-w-6' />\n </Button>\n )}\n\n <Button\n variant='default'\n onClick={toggleSideView}\n data-tooltip-id='tooltip-sideView'\n data-tooltip-content={t('Tooltip.Other actions') || ''}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={sideViewIsVisible ? faClose : faOpen}\n />\n </Button>\n </div>\n )}\n {/* Buttons tooltips */}\n <CustomThemedTooltip id='tooltip-transfer' place='bottom' />\n <CustomThemedTooltip id='tooltip-pause' place='bottom' />\n <CustomThemedTooltip id='tooltip-mute' place='bottom' />\n <CustomThemedTooltip id='tooltip-expand' place='bottom' />\n <CustomThemedTooltip id='tooltip-keyboard' place='bottom' />\n <CustomThemedTooltip id='tooltip-conference' place='bottom' />\n <CustomThemedTooltip id='tooltip-park' place='bottom' />\n <CustomThemedTooltip id='tooltip-sideView' place='left' />\n </>\n )\n}\n\nexport default React.memo(Actions)\n"],"names":["ActionButton","React","memo","_a","active","onClick","tooltipId","tooltipContent","icon","_b","activeIcon","createElement","Button","variant","FontAwesomeIcon","className","Actions$1","t","useTranslation","dispatch","useDispatch","_e","useSelector","state","currentCall","paused","muted","parked","transferring","_f","island","view","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","intrudeListenStatus","listen","_g","conference","isActive","conferenceStartedFrom","_h","currentUser","username","profile","autoExpandedRef","useRef","autoCollapsedRef","isOwnerOfConference","useMemo","shouldHideTransferButton","shouldHideButtons","isIntrude","isListen","toggleMute","useCallback","unmuteCurrentCall","muteCurrentCall","togglePause","unpauseCurrentCall","pauseCurrentCall","openKeypad","setIslandView","eventDispatch","toggleActionsExpanded","newState","concat","toggleSideView","transfer","beginConference","addUserToConference","__awaiter","startConference","sent","handleConferenceAction","shouldExpandActions","current","shouldCollapseActions","useEffect","cancelTransfer","sendDtmfFunc","isWebRTC","sendDTMF","sendPhysicalDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","useEventListener","mainGridClassName","Fragment","faPause","faPlay","faMicrophone","faMicrophoneSlash","TransferButton","faAngleUp","faAngleDown","faGridRound","parkCurrentCall","faSquareParking","_d","_c","macro_permissions","settings","permissions","value","faPlus","faUserPlus","faClose","faOpen","CustomThemedTooltip","id","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Actions.js","sources":["../../../src/components/CallView/Actions.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo, useEffect, useRef, useCallback } from 'react'\nimport {\n muteCurrentCall,\n unmuteCurrentCall,\n pauseCurrentCall,\n unpauseCurrentCall,\n parkCurrentCall,\n startConference,\n} from '../../lib/phone/call'\nimport { Button } from '../'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faPause,\n faPlay,\n faMicrophone,\n faMicrophoneSlash,\n faSquareParking,\n faUserPlus,\n faPlus,\n faAngleDown,\n faAngleUp,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faClose, faGridRound, faOpen } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState, Dispatch } from '../../store'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store } from '../../store'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport TransferButton from '../TransferButton'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core'\n\ninterface ActionButtonProps {\n active: boolean\n onClick: () => void\n tooltipId: string\n tooltipContent: string\n icon: IconDefinition\n activeIcon?: IconDefinition\n}\n\nconst ActionButton: React.FC<ActionButtonProps> = React.memo(\n ({ active, onClick, tooltipId, tooltipContent, icon, activeIcon = icon }) => (\n <Button\n variant='default'\n active={active}\n onClick={onClick}\n data-tooltip-id={tooltipId}\n data-tooltip-content={tooltipContent}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={active ? activeIcon : icon} />\n </Button>\n ),\n)\n\nconst Actions: FC = () => {\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n\n const { paused, muted, parked, transferring } = useSelector(\n (state: RootState) => state.currentCall,\n )\n const { view, actionsExpanded, sideViewIsVisible, transcriptionViewIsVisible } = useSelector(\n (state: RootState) => state.island,\n )\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username, profile } = useSelector((state: RootState) => state?.currentUser)\n\n // Check if the actions should be expanded automatically\n const autoExpandedRef = useRef(false)\n // Check if the actions should be collapsed automatically\n const autoCollapsedRef = useRef(false)\n\n const isOwnerOfConference = useMemo(\n () => username !== '' && conferenceStartedFrom === username,\n [username, conferenceStartedFrom],\n )\n\n const shouldHideTransferButton = useMemo(\n () => isActive && !isOwnerOfConference,\n [isActive, isOwnerOfConference],\n )\n\n const shouldHideButtons = useMemo(\n () => intrudeListenStatus?.isIntrude || intrudeListenStatus?.isListen,\n [intrudeListenStatus],\n )\n\n const toggleMute = useCallback(() => {\n muted ? unmuteCurrentCall() : muteCurrentCall()\n }, [muted])\n\n const togglePause = useCallback(() => {\n paused ? unpauseCurrentCall() : pauseCurrentCall()\n }, [paused])\n\n const openKeypad = useCallback(() => {\n dispatch.island.setIslandView(view !== 'keypad' ? 'keypad' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-call-keypad-opened', {})\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const toggleActionsExpanded = useCallback(() => {\n const newState = !actionsExpanded\n dispatch.island.toggleActionsExpanded(newState)\n eventDispatch(`phone-island-call-actions-${newState ? 'opened' : 'closed'}`, {})\n if (!newState) {\n eventDispatch('phone-island-sideview-close', {})\n }\n }, [actionsExpanded, transcriptionViewIsVisible, dispatch.island])\n\n const toggleSideView = useCallback(() => {\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n } else {\n // When opening SideView, close TranscriptionView if it's open\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-sideview-open', {})\n }\n }, [sideViewIsVisible, transcriptionViewIsVisible])\n\n const transfer = useCallback(() => {\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n eventDispatch('phone-island-call-transfer-opened', {})\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const beginConference = useCallback(() => {\n eventDispatch('phone-island-conference-list-open', {})\n dispatch.island.setIslandView(view !== 'transfer' ? 'transfer' : 'call')\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n if (transcriptionViewIsVisible) {\n eventDispatch('phone-island-transcription-close', {})\n }\n }, [view, sideViewIsVisible, transcriptionViewIsVisible, dispatch.island])\n\n const addUserToConference = useCallback(async () => {\n dispatch.island.setIslandView('waitingConference')\n await startConference()\n }, [dispatch.island])\n\n const handleConferenceAction = useCallback(() => {\n isActive ? addUserToConference() : beginConference()\n }, [isActive, addUserToConference, beginConference])\n\n const shouldExpandActions = useMemo(() => {\n return (\n isActive &&\n view === 'call' &&\n !actionsExpanded &&\n !autoExpandedRef.current &&\n isOwnerOfConference\n )\n }, [isActive, view, actionsExpanded, isOwnerOfConference])\n\n // Check if user is not the owner of the conference\n const shouldCollapseActions = useMemo(() => {\n return (\n isActive &&\n view === 'call' &&\n actionsExpanded &&\n !autoCollapsedRef.current &&\n username !== '' &&\n !isOwnerOfConference\n )\n }, [isActive, view, actionsExpanded, username, isOwnerOfConference])\n\n // Automatically expand actions if the user has enabled conference\n useEffect(() => {\n if (shouldExpandActions) {\n dispatch.island.toggleActionsExpanded(true)\n eventDispatch('phone-island-call-actions-opened', {})\n autoExpandedRef.current = true\n }\n }, [shouldExpandActions, dispatch.island])\n\n // Automatically collapse actions if the user is not the owner of the conference\n useEffect(() => {\n if (shouldCollapseActions) {\n dispatch.island.toggleActionsExpanded(false)\n eventDispatch('phone-island-call-actions-closed', {})\n autoCollapsedRef.current = true\n }\n }, [shouldCollapseActions, dispatch.island])\n\n const cancelTransfer = useCallback(() => {\n const sendDtmfFunc = isWebRTC() ? sendDTMF : sendPhysicalDTMF\n\n sendDtmfFunc('*')\n\n const { audioPlayerPlaying } = store.getState().player\n // Check if the local audio is already playing and start playing\n if (!audioPlayerPlaying) {\n dispatch.player.updateStartAudioPlayer({\n src: outgoingRingtone,\n loop: true,\n })\n }\n\n setTimeout(() => {\n sendDtmfFunc('1')\n dispatch.player.stopAudioPlayer()\n // The workarround to disable transfer because of the wrong conv.connection value from ws\n if (transferring) {\n setTimeout(() => {\n dispatch.currentCall.updateTransferring(false)\n }, 500)\n }\n\n eventDispatch('phone-island-call-transfer-canceled', {})\n }, 500)\n }, [transferring, dispatch.player, dispatch.currentCall])\n\n useEventListener('phone-island-call-keypad-open', openKeypad)\n useEventListener('phone-island-call-transfer-open', transfer)\n useEventListener('phone-island-call-transfer-cancel', cancelTransfer)\n useEventListener('phone-island-call-actions-open', () => {\n dispatch.island.toggleActionsExpanded(true)\n eventDispatch('phone-island-call-actions-opened', {})\n })\n useEventListener('phone-island-call-actions-close', () => {\n dispatch.island.toggleActionsExpanded(false)\n eventDispatch('phone-island-call-actions-closed', {})\n })\n\n const mainGridClassName = useMemo(() => {\n if (\n intrudeListenStatus?.isListen ||\n intrudeListenStatus?.isIntrude ||\n (isActive && !isOwnerOfConference)\n ) {\n if (intrudeListenStatus.isIntrude) {\n return 'pi-mb-6 pi-grid pi-grid-cols-1 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'\n }\n if (isActive && !isOwnerOfConference) {\n return 'pi-flex pi-items-center pi-justify-center pi-gap-4'\n }\n return 'pi-hidden'\n }\n return 'pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'\n }, [intrudeListenStatus, isActive, isOwnerOfConference])\n\n return (\n <>\n <div className={mainGridClassName}>\n {!shouldHideButtons && (\n <ActionButton\n active={paused}\n onClick={togglePause}\n tooltipId='tooltip-pause'\n tooltipContent={paused ? t('Tooltip.Play') : t('Tooltip.Pause')}\n icon={faPause}\n activeIcon={faPlay}\n />\n )}\n\n {!intrudeListenStatus?.isListen && (\n <ActionButton\n active={muted}\n onClick={toggleMute}\n tooltipId='tooltip-mute'\n tooltipContent={muted ? t('Tooltip.Unmute') : t('Tooltip.Mute')}\n icon={faMicrophone}\n activeIcon={faMicrophoneSlash}\n />\n )}\n\n {!shouldHideTransferButton && <TransferButton />}\n\n {!shouldHideButtons && !shouldHideTransferButton && (\n <Button\n active={actionsExpanded}\n variant='transparent'\n onClick={toggleActionsExpanded}\n data-tooltip-id='tooltip-expand'\n data-tooltip-content={actionsExpanded ? t('Tooltip.Collapse') : t('Tooltip.Expand')}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={actionsExpanded ? faAngleUp : faAngleDown}\n />\n </Button>\n )}\n </div>\n\n {/* Actions expanded section */}\n {actionsExpanded && (\n <div className='pi-grid pi-grid-cols-4 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <ActionButton\n active={view === 'keypad'}\n onClick={openKeypad}\n tooltipId='tooltip-keyboard'\n tooltipContent={t('Tooltip.Keyboard')}\n icon={faGridRound}\n />\n\n <ActionButton\n active={parked}\n onClick={parkCurrentCall}\n tooltipId='tooltip-park'\n tooltipContent={t('Tooltip.Park')}\n icon={faSquareParking}\n />\n\n {profile?.macro_permissions?.settings?.permissions?.conference?.value && (\n <Button\n data-stop-propagation={true}\n variant='default'\n onClick={handleConferenceAction}\n data-tooltip-id='tooltip-conference'\n data-tooltip-content={\n isActive ? t('Tooltip.Conference') || '' : t('Tooltip.Add user to conference') || ''\n }\n >\n <FontAwesomeIcon icon={isActive ? faPlus : faUserPlus} className='pi-h-6 pi-w-6' />\n </Button>\n )}\n\n <Button\n variant='default'\n onClick={toggleSideView}\n data-tooltip-id='tooltip-sideView'\n data-tooltip-content={t('Tooltip.Other actions') || ''}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={sideViewIsVisible ? faClose : faOpen}\n />\n </Button>\n </div>\n )}\n {/* Buttons tooltips */}\n <CustomThemedTooltip id='tooltip-transfer' place='bottom' />\n <CustomThemedTooltip id='tooltip-pause' place='bottom' />\n <CustomThemedTooltip id='tooltip-mute' place='bottom' />\n <CustomThemedTooltip id='tooltip-expand' place='bottom' />\n <CustomThemedTooltip id='tooltip-keyboard' place='bottom' />\n <CustomThemedTooltip id='tooltip-conference' place='bottom' />\n <CustomThemedTooltip id='tooltip-park' place='bottom' />\n <CustomThemedTooltip id='tooltip-sideView' place='left' />\n </>\n )\n}\n\nexport default React.memo(Actions)\n"],"names":["ActionButton","React","memo","_a","active","onClick","tooltipId","tooltipContent","icon","_b","activeIcon","createElement","Button","variant","FontAwesomeIcon","className","Actions$1","t","useTranslation","dispatch","useDispatch","_e","useSelector","state","currentCall","paused","muted","parked","transferring","_f","island","view","actionsExpanded","sideViewIsVisible","transcriptionViewIsVisible","intrudeListenStatus","listen","_g","conference","isActive","conferenceStartedFrom","_h","currentUser","username","profile","autoExpandedRef","useRef","autoCollapsedRef","isOwnerOfConference","useMemo","shouldHideTransferButton","shouldHideButtons","isIntrude","isListen","toggleMute","useCallback","unmuteCurrentCall","muteCurrentCall","togglePause","unpauseCurrentCall","pauseCurrentCall","openKeypad","setIslandView","eventDispatch","toggleActionsExpanded","newState","concat","toggleSideView","transfer","beginConference","addUserToConference","__awaiter","startConference","sent","handleConferenceAction","shouldExpandActions","current","shouldCollapseActions","useEffect","cancelTransfer","sendDtmfFunc","isWebRTC","sendDTMF","sendPhysicalDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","updateTransferring","useEventListener","mainGridClassName","Fragment","faPause","faPlay","faMicrophone","faMicrophoneSlash","TransferButton","faAngleUp","faAngleDown","faGridRound","parkCurrentCall","faSquareParking","_d","_c","macro_permissions","settings","permissions","value","faPlus","faUserPlus","faClose","faOpen","CustomThemedTooltip","id","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("./Timer.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var s=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../AvatarGroup.js"),a=require("../../utils/genericFunctions/isEmpty.js"),o=require("../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js"),u=require("../../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),l=require("../../node_modules/react-redux/es/hooks/useSelector.js"),p=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var m=d(e);exports.default=function(d){var c=d.isVisible,f=l.useSelector(function(e){return e.currentCall}),x=f.number,g=f.displayName,v=f.transferring,y=f.transferringName,j=f.startTime,h=f.transferringStartTime,w=f.transferCalls,E=p.useDispatch(),b=s.useTranslation().t,q=l.useSelector(function(e){return e.island}),N=q.isOpen,_=q.previousView,S=l.useSelector(function(e){return e.screenShare}),T=S.active,C=S.role,A=l.useSelector(function(e){return e.conference}),P=A.isActive,R=A.usersList,k=A.ownerInformations;return e.useEffect(function(){var e=w.find(function(e){return e.number!==x});e&&E.currentCall.updateCurrentCall({transferringName:e.displayName,transferringStartTime:e.startTime})},[x]),m.default.createElement(o.AnimatePresence,null,c&&m.default.createElement(u.motion.div,{className:"pi-absolute pi-w-full pi-bg-gray-700 pi-flex pi-justify-between pi-text-gray-50 dark:pi-text-gray-50 -pi-mt-10 -pi-z-10 pi-pointer-events-auto pi-items-start ".concat(N?"pi-px-6":"pi-px-4"," pi-pt-3"),style:{borderTopLeftRadius:"20px",borderTopRightRadius:"20px",height:"60px"},initial:{y:60},animate:{y:0},exit:{y:60,transitionEnd:{display:"none"}},transition:{duration:.12,ease:"easeOut"}},m.default.createElement("div",{className:"pi-font-medium pi-text-sm pi-relative"},m.default.createElement("div",{className:"pi-whitespace-nowrap pi-overflow-hidden ".concat(N&&"video"!==_?"pi-w-44":"pi-w-16")},v?y:P&&!a.isEmpty(k)?b("Conference.In conference"):P&&a.isEmpty(k)?b("Conference.Waiting for the conference"):"recorder"===_?b("Common.Record message"):"player"===_?b("Common.Play message"):g),m.default.createElement("div",{className:"pi-w-6 pi-absolute pi-right-0 pi-top-0 pi-h-full pi-bg-gradient-to-r pi-from-transparent pi-to-gray-700"})),m.default.createElement("div",{className:"pi-flex pi-gap-5"},T&&"publisher"===C&&m.default.createElement("div",{className:"pi-flex pi-gap-2 pi-font-medium pi-items-center pi-rounded-full pi-px-2 pi-py-1 pi-text-xs pi-relative -pi-top-0.5 pi-bg-emerald-700 pi-text-emerald-50"},m.default.createElement(i.FontAwesomeIcon,{icon:r.faDisplay,className:"pi-w-4 pi-h-4"}),b("Screen sharing.Sharing")),m.default.createElement("div",{className:"pi-w-16 pi-flex pi-justify-end"},P||"recorder"===_||"player"===_?m.default.createElement(n.default,{usersList:R||{},maxAvatars:5}):m.default.createElement(t.default,{size:"small",startTime:v?h:j})))))};
|
|
2
2
|
//# sourceMappingURL=BackCall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackCall.js","sources":["../../../src/components/CallView/BackCall.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport Timer from './Timer'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { TransferCallsTypes } from '../../models/currentCall'\nimport { faDisplay } from '@fortawesome/free-solid-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { useTranslation } from 'react-i18next'\nimport AvatarGroup from '../AvatarGroup'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\n\nconst BackCall: FC<BackCallTypes> = ({ isVisible }) => {\n const {\n number,\n displayName,\n transferring,\n transferringName,\n startTime,\n transferringStartTime,\n transferCalls,\n } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n\n const { t } = useTranslation()\n const { isOpen, previousView } = useSelector((state: RootState) => state.island)\n const { active: screenShareActive, role: screenShareRole } = useSelector(\n (state: RootState) => state.screenShare,\n )\n const { isActive, usersList, ownerInformations }: any = useSelector(\n (state: RootState) => state.conference,\n )\n\n useEffect(() => {\n const callData: TransferCallsTypes = transferCalls.find((item) => item.number !== number)\n // Handle call switch during transfer\n if (callData) {\n dispatch.currentCall.updateCurrentCall({\n transferringName: callData.displayName,\n transferringStartTime: callData.startTime,\n })\n }\n }, [number])\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className={`pi-absolute pi-w-full pi-bg-gray-700 pi-flex pi-justify-between pi-text-gray-50 dark:pi-text-gray-50 -pi-mt-10 -pi-z-10 pi-pointer-events-auto pi-items-start ${\n isOpen ? 'pi-px-6' : 'pi-px-4'\n } pi-pt-3`}\n style={{ borderTopLeftRadius: '20px', borderTopRightRadius: '20px', height: '60px' }}\n initial={{ y: 60 }}\n animate={{ y: 0 }}\n exit={{\n y: 60,\n transitionEnd: {\n display: 'none',\n },\n }}\n transition={{ duration: 0.12, ease: 'easeOut' }}\n >\n <div className='pi-font-medium pi-text-sm pi-relative'>\n <div\n className={`pi-whitespace-nowrap pi-overflow-hidden ${\n isOpen && previousView !== 'video' ? 'pi-w-44' : 'pi-w-16'\n }`}\n >\n {transferring\n ? transferringName\n : isActive && !isEmpty(ownerInformations)\n ? t('Conference.In conference')\n : isActive && isEmpty(ownerInformations)\n ? t('Conference.Waiting for the conference')\n : previousView === 'recorder'\n ? t('Common.Record message')\n : previousView === 'player'\n ? t('Common.Play message')\n : displayName}\n </div>\n <div className='pi-w-6 pi-absolute pi-right-0 pi-top-0 pi-h-full pi-bg-gradient-to-r pi-from-transparent pi-to-gray-700'></div>\n </div>\n <div className='pi-flex pi-gap-5'>\n {/* Screen sharing badge */}\n {screenShareActive && screenShareRole === 'publisher' && (\n <div className='pi-flex pi-gap-2 pi-font-medium pi-items-center pi-rounded-full pi-px-2 pi-py-1 pi-text-xs pi-relative -pi-top-0.5 pi-bg-emerald-700 pi-text-emerald-50'>\n <FontAwesomeIcon icon={faDisplay} className='pi-w-4 pi-h-4' />\n {t('Screen sharing.Sharing')}\n </div>\n )}\n <div className='pi-w-16 pi-flex pi-justify-end'>\n {!isActive && previousView !== 'recorder' && previousView !== 'player' ? (\n <Timer size='small' startTime={transferring ? transferringStartTime : startTime} />\n ) : (\n <AvatarGroup usersList={usersList || {}} maxAvatars={5} />\n )}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default BackCall\n\ninterface BackCallTypes {\n isVisible: boolean\n}\n"],"names":["_a","isVisible","_b","useSelector","state","currentCall","number","displayName","transferring","transferringName","startTime","transferringStartTime","transferCalls","dispatch","useDispatch","t","useTranslation","_c","island","isOpen","previousView","_d","screenShare","screenShareActive","screenShareRole","_e","conference","isActive","usersList","ownerInformations","useEffect","callData","find","item","updateCurrentCall","React","createElement","AnimatePresence","motion","div","className","concat","style","borderTopLeftRadius","borderTopRightRadius","height","initial","y","animate","exit","transitionEnd","display","transition","duration","ease","isEmpty","FontAwesomeIcon","icon","faDisplay","AvatarGroup","maxAvatars","Timer","size"],"mappings":"
|
|
1
|
+
{"version":3,"file":"BackCall.js","sources":["../../../src/components/CallView/BackCall.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { FC, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport Timer from './Timer'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { TransferCallsTypes } from '../../models/currentCall'\nimport { faDisplay } from '@fortawesome/free-solid-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { useTranslation } from 'react-i18next'\nimport AvatarGroup from '../AvatarGroup'\nimport { isEmpty } from '../../utils/genericFunctions/isEmpty'\n\nconst BackCall: FC<BackCallTypes> = ({ isVisible }) => {\n const {\n number,\n displayName,\n transferring,\n transferringName,\n startTime,\n transferringStartTime,\n transferCalls,\n } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n\n const { t } = useTranslation()\n const { isOpen, previousView } = useSelector((state: RootState) => state.island)\n const { active: screenShareActive, role: screenShareRole } = useSelector(\n (state: RootState) => state.screenShare,\n )\n const { isActive, usersList, ownerInformations }: any = useSelector(\n (state: RootState) => state.conference,\n )\n\n useEffect(() => {\n const callData: TransferCallsTypes = transferCalls.find((item) => item.number !== number)\n // Handle call switch during transfer\n if (callData) {\n dispatch.currentCall.updateCurrentCall({\n transferringName: callData.displayName,\n transferringStartTime: callData.startTime,\n })\n }\n }, [number])\n\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className={`pi-absolute pi-w-full pi-bg-gray-700 pi-flex pi-justify-between pi-text-gray-50 dark:pi-text-gray-50 -pi-mt-10 -pi-z-10 pi-pointer-events-auto pi-items-start ${\n isOpen ? 'pi-px-6' : 'pi-px-4'\n } pi-pt-3`}\n style={{ borderTopLeftRadius: '20px', borderTopRightRadius: '20px', height: '60px' }}\n initial={{ y: 60 }}\n animate={{ y: 0 }}\n exit={{\n y: 60,\n transitionEnd: {\n display: 'none',\n },\n }}\n transition={{ duration: 0.12, ease: 'easeOut' }}\n >\n <div className='pi-font-medium pi-text-sm pi-relative'>\n <div\n className={`pi-whitespace-nowrap pi-overflow-hidden ${\n isOpen && previousView !== 'video' ? 'pi-w-44' : 'pi-w-16'\n }`}\n >\n {transferring\n ? transferringName\n : isActive && !isEmpty(ownerInformations)\n ? t('Conference.In conference')\n : isActive && isEmpty(ownerInformations)\n ? t('Conference.Waiting for the conference')\n : previousView === 'recorder'\n ? t('Common.Record message')\n : previousView === 'player'\n ? t('Common.Play message')\n : displayName}\n </div>\n <div className='pi-w-6 pi-absolute pi-right-0 pi-top-0 pi-h-full pi-bg-gradient-to-r pi-from-transparent pi-to-gray-700'></div>\n </div>\n <div className='pi-flex pi-gap-5'>\n {/* Screen sharing badge */}\n {screenShareActive && screenShareRole === 'publisher' && (\n <div className='pi-flex pi-gap-2 pi-font-medium pi-items-center pi-rounded-full pi-px-2 pi-py-1 pi-text-xs pi-relative -pi-top-0.5 pi-bg-emerald-700 pi-text-emerald-50'>\n <FontAwesomeIcon icon={faDisplay} className='pi-w-4 pi-h-4' />\n {t('Screen sharing.Sharing')}\n </div>\n )}\n <div className='pi-w-16 pi-flex pi-justify-end'>\n {!isActive && previousView !== 'recorder' && previousView !== 'player' ? (\n <Timer size='small' startTime={transferring ? transferringStartTime : startTime} />\n ) : (\n <AvatarGroup usersList={usersList || {}} maxAvatars={5} />\n )}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n )\n}\n\nexport default BackCall\n\ninterface BackCallTypes {\n isVisible: boolean\n}\n"],"names":["_a","isVisible","_b","useSelector","state","currentCall","number","displayName","transferring","transferringName","startTime","transferringStartTime","transferCalls","dispatch","useDispatch","t","useTranslation","_c","island","isOpen","previousView","_d","screenShare","screenShareActive","screenShareRole","_e","conference","isActive","usersList","ownerInformations","useEffect","callData","find","item","updateCurrentCall","React","createElement","AnimatePresence","motion","div","className","concat","style","borderTopLeftRadius","borderTopRightRadius","height","initial","y","animate","exit","transitionEnd","display","transition","duration","ease","isEmpty","FontAwesomeIcon","icon","faDisplay","AvatarGroup","maxAvatars","Timer","size"],"mappings":"ugCAeoC,SAACA,GAAE,IAAAC,EAASD,EAAAC,UACxCC,EAQFC,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMC,WAAN,GAPpCC,EAAMJ,EAAAI,OACNC,EAAWL,EAAAK,YACXC,EAAYN,EAAAM,aACZC,EAAgBP,EAAAO,iBAChBC,EAASR,EAAAQ,UACTC,EAAqBT,EAAAS,sBACrBC,kBAEIC,EAAWC,EAAAA,cAETC,EAAMC,qBACRC,EAA2Bd,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAMc,MAAM,GAAvEC,WAAQC,iBACVC,EAAuDlB,EAAAA,YAC3D,SAACC,GAAqB,OAAAA,EAAMkB,WAAW,GADzBC,WAAyBC,SAGnCC,EAAkDtB,EAAAA,YACtD,SAACC,GAAqB,OAAAA,EAAMsB,aADtBC,EAAQF,EAAAE,SAAEC,EAASH,EAAAG,UAAEC,EAAiBJ,EAAAI,kBAe9C,OAXAC,EAAAA,UAAU,WACR,IAAMC,EAA+BnB,EAAcoB,KAAK,SAACC,GAAS,OAAAA,EAAK3B,SAAWA,CAAhB,GAE9DyB,GACFlB,EAASR,YAAY6B,kBAAkB,CACrCzB,iBAAkBsB,EAASxB,YAC3BI,sBAAuBoB,EAASrB,WAGtC,EAAG,CAACJ,IAGF6B,EAAAA,QAACC,cAAAC,EAAeA,gBACb,KAAApC,GACCkC,EAAC,QAAAC,cAAAE,EAAAA,OAAOC,IACN,CAAAC,UAAW,iKAAAC,OACTtB,EAAS,UAAY,UAAS,YAEhCuB,MAAO,CAAEC,oBAAqB,OAAQC,qBAAsB,OAAQC,OAAQ,QAC5EC,QAAS,CAAEC,EAAG,IACdC,QAAS,CAAED,EAAG,GACdE,KAAM,CACJF,EAAG,GACHG,cAAe,CACbC,QAAS,SAGbC,WAAY,CAAEC,SAAU,IAAMC,KAAM,YAEpCnB,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,yCACbL,EAAAA,QAAAC,cAAA,MAAA,CACEI,UAAW,2CAAAC,OACTtB,GAA2B,UAAjBC,EAA2B,UAAY,YAGlDZ,EACGC,EACAkB,IAAa4B,EAAOA,QAAC1B,GACrBd,EAAE,4BACFY,GAAY4B,EAAOA,QAAC1B,GACpBd,EAAE,yCACe,aAAjBK,EACAL,EAAE,yBACe,WAAjBK,EACAL,EAAE,uBACFR,GAEN4B,EAAA,QAAAC,cAAA,MAAA,CAAKI,UAAU,6GAEjBL,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,oBAEZjB,GAAyC,cAApBC,GACpBW,EAAA,QAAAC,cAAA,MAAA,CAAKI,UAAU,2JACbL,EAAC,QAAAC,cAAAoB,mBAAgBC,KAAMC,YAAWlB,UAAU,kBAC3CzB,EAAE,2BAGPoB,EAAA,QAAAC,cAAA,MAAA,CAAKI,UAAU,kCACXb,GAA6B,aAAjBP,GAAgD,WAAjBA,EAG3Ce,EAAAA,QAAAC,cAACuB,EAAAA,QAAW,CAAC/B,UAAWA,GAAa,CAAA,EAAIgC,WAAY,IAFrDzB,EAAC,QAAAC,cAAAyB,EAAK,QAAC,CAAAC,KAAK,QAAQpD,UAAWF,EAAeG,EAAwBD,OAUtF"}
|
|
@@ -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
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),o=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../lib/phone/counterpartDevice.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=a(e),u="tooltip-device",c={webrtc:{icon:o.faHeadset,labelKey:"Call.Web phone"},nethlink:{icon:o.faDesktop,labelKey:"Call.Desktop phone"},physical:{icon:r.faOfficePhone,labelKey:"Common.Physical phone"},mobile:{icon:o.faMobileScreen,labelKey:"Phone Island.Mobile app"}},d=e.memo(function(){var e=t.useTranslation().t,o=s.useSelector(function(e){return e.currentCall.counterpartDeviceType}),r=s.useSelector(function(e){return i.getMainExtensionNumber(e.currentCall.number,e.users)}),a=o?c[o]:void 0;if(!a)return null;var d=e(a.labelKey),p=r?"".concat(d,": ").concat(r):d;return l.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-5 pi-w-5 pi-text-iconPrimaryNeutral dark:pi-text-iconPrimaryNeutralDark","data-tooltip-id":u,"data-tooltip-content":p,"aria-label":p},l.default.createElement(n.FontAwesomeIcon,{icon:a.icon,className:"pi-h-5 pi-w-5"}))});exports.DEVICE_TOOLTIP_ID=u,exports.default=d;
|
|
2
2
|
//# sourceMappingURL=DeviceIcon.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceIcon.js","sources":["../../../src/components/CallView/DeviceIcon.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport type { IconProp } from '@fortawesome/fontawesome-svg-core'\nimport { faDesktop, faHeadset, faMobileScreen } from '@fortawesome/free-solid-svg-icons'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState } from '../../store'\nimport { getMainExtensionNumber } from '../../lib/phone/counterpartDevice'\n\nexport const DEVICE_TOOLTIP_ID = 'tooltip-device'\n\nconst DEVICE_ICONS: Record<string, { icon: IconProp; labelKey: string }> = {\n webrtc: { icon: faHeadset, labelKey: 'Call.Web phone' },\n nethlink: { icon: faDesktop, labelKey: 'Call.Desktop phone' },\n physical: { icon: faOfficePhone as IconProp, labelKey: 'Common.Physical phone' },\n mobile: { icon: faMobileScreen, labelKey: 'Phone Island.Mobile app' },\n}\n\nconst DeviceIcon: FC = () => {\n const { t } = useTranslation()\n const counterpartDeviceType = useSelector(\n (state: RootState) => state.currentCall.counterpartDeviceType,\n )\n const number = useSelector((state: RootState) =>\n getMainExtensionNumber(state.currentCall.number, state.users),\n )\n\n const device = counterpartDeviceType ? DEVICE_ICONS[counterpartDeviceType] : undefined\n if (!device) return null\n\n const label = t(device.labelKey)\n const tooltipContent = number ? `${label}: ${number}` : label\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-5 pi-w-5 pi-text-iconPrimaryNeutral dark:pi-text-iconPrimaryNeutralDark'\n data-tooltip-id={DEVICE_TOOLTIP_ID}\n data-tooltip-content={tooltipContent}\n aria-label={tooltipContent}\n >\n <FontAwesomeIcon icon={device.icon} className='pi-h-5 pi-w-5' />\n </span>\n )\n}\n\nexport default memo(DeviceIcon)\n"],"names":["DEVICE_TOOLTIP_ID","DEVICE_ICONS","webrtc","icon","faHeadset","labelKey","nethlink","faDesktop","physical","faOfficePhone","mobile","faMobileScreen","memo","t","useTranslation","counterpartDeviceType","useSelector","state","currentCall","number","getMainExtensionNumber","users","device","undefined","label","tooltipContent","concat","React","createElement","className","FontAwesomeIcon"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DeviceIcon.js","sources":["../../../src/components/CallView/DeviceIcon.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport type { IconProp } from '@fortawesome/fontawesome-svg-core'\nimport { faDesktop, faHeadset, faMobileScreen } from '@fortawesome/free-solid-svg-icons'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\nimport { RootState } from '../../store'\nimport { getMainExtensionNumber } from '../../lib/phone/counterpartDevice'\n\nexport const DEVICE_TOOLTIP_ID = 'tooltip-device'\n\nconst DEVICE_ICONS: Record<string, { icon: IconProp; labelKey: string }> = {\n webrtc: { icon: faHeadset, labelKey: 'Call.Web phone' },\n nethlink: { icon: faDesktop, labelKey: 'Call.Desktop phone' },\n physical: { icon: faOfficePhone as IconProp, labelKey: 'Common.Physical phone' },\n mobile: { icon: faMobileScreen, labelKey: 'Phone Island.Mobile app' },\n}\n\nconst DeviceIcon: FC = () => {\n const { t } = useTranslation()\n const counterpartDeviceType = useSelector(\n (state: RootState) => state.currentCall.counterpartDeviceType,\n )\n const number = useSelector((state: RootState) =>\n getMainExtensionNumber(state.currentCall.number, state.users),\n )\n\n const device = counterpartDeviceType ? DEVICE_ICONS[counterpartDeviceType] : undefined\n if (!device) return null\n\n const label = t(device.labelKey)\n const tooltipContent = number ? `${label}: ${number}` : label\n\n return (\n <span\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-5 pi-w-5 pi-text-iconPrimaryNeutral dark:pi-text-iconPrimaryNeutralDark'\n data-tooltip-id={DEVICE_TOOLTIP_ID}\n data-tooltip-content={tooltipContent}\n aria-label={tooltipContent}\n >\n <FontAwesomeIcon icon={device.icon} className='pi-h-5 pi-w-5' />\n </span>\n )\n}\n\nexport default memo(DeviceIcon)\n"],"names":["DEVICE_TOOLTIP_ID","DEVICE_ICONS","webrtc","icon","faHeadset","labelKey","nethlink","faDesktop","physical","faOfficePhone","mobile","faMobileScreen","memo","t","useTranslation","counterpartDeviceType","useSelector","state","currentCall","number","getMainExtensionNumber","users","device","undefined","label","tooltipContent","concat","React","createElement","className","FontAwesomeIcon"],"mappings":"2wBAaaA,EAAoB,iBAE3BC,EAAqE,CACzEC,OAAQ,CAAEC,KAAMC,YAAWC,SAAU,kBACrCC,SAAU,CAAEH,KAAMI,YAAWF,SAAU,sBACvCG,SAAU,CAAEL,KAAMM,gBAA2BJ,SAAU,yBACvDK,OAAQ,CAAEP,KAAMQ,iBAAgBN,SAAU,4BA8B7BO,EAAAA,EAAAA,KA3BQ,WACb,IAAAC,EAAMC,qBACRC,EAAwBC,cAC5B,SAACC,GAAqB,OAAAA,EAAMC,YAAYH,qBAAlB,GAElBI,EAASH,cAAY,SAACC,GAC1B,OAAAG,EAAAA,uBAAuBH,EAAMC,YAAYC,OAAQF,EAAMI,MAAvD,GAGIC,EAASP,EAAwBd,EAAac,QAAyBQ,EAC7E,IAAKD,EAAQ,OAAO,KAEpB,IAAME,EAAQX,EAAES,EAAOjB,UACjBoB,EAAiBN,EAAS,GAAAO,OAAGF,EAAK,MAAAE,OAAKP,GAAWK,EAExD,OACEG,UACEC,cAAA,OAAA,CAAAC,UAAU,+JACO7B,EAAiB,uBACZyB,EAAc,aACxBA,GAEZE,UAAAC,cAACE,EAAeA,gBAAA,CAAC3B,KAAMmB,EAAOnB,KAAM0B,UAAU,kBAGpD"}
|
|
@@ -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
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),i=require("./DisplayNameUtils.js"),n=require("../TextScroll.js"),l=require("../../node_modules/react-redux/es/hooks/useSelector.js");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=r(e),o=function(e){var t,i;return{displayName:null===(t=null==e?void 0:e.currentCall)||void 0===t?void 0:t.displayName,incoming:null===(i=null==e?void 0:e.currentCall)||void 0===i?void 0:i.incoming}},u=function(e){return e.listen},s=e.memo(function(){var r=l.useSelector(o),s=r.displayName,d=r.incoming,c=l.useSelector(u),m=t.useTranslation().t,p=e.useMemo(function(){return i.getDisplayText({intrudeListenStatus:c,displayName:s,incoming:d,t:m})},[c,s,d,m]),f=p.content,v=e.useMemo(function(){return i.getTextClassName()},[]);return a.default.createElement("div",{className:"pi-relative pi-block pi-w-full pi-min-w-0 pi-overflow-hidden pi-whitespace-nowrap pi-text-lg pi-font-medium","data-tooltip-id":f?"tooltip-display-name":void 0,"data-tooltip-content":f||""},a.default.createElement("div",{className:"".concat(v," pi-w-full pi-min-w-0")},"scroll"===p.type?a.default.createElement(n.default,{text:f}):a.default.createElement("span",{className:"pi-block pi-max-w-full pi-truncate"},f)))});exports.default=s;
|
|
2
2
|
//# sourceMappingURL=DisplayName.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useMemo, memo } from 'react'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { getDisplayText, getTextClassName } from './DisplayNameUtils'\nimport TextScroll from '../TextScroll'\n\nconst selectDisplayNameAndIncoming = (state: RootState) => ({\n displayName: state?.currentCall?.displayName,\n incoming: state?.currentCall?.incoming,\n})\n\nconst selectIntrudeListenStatus = (state: RootState) => state.listen\n\nconst DisplayName: React.FC<DisplayNameProps> = () => {\n const { displayName, incoming } = useSelector(selectDisplayNameAndIncoming)\n const intrudeListenStatus = useSelector(selectIntrudeListenStatus)\n\n const { t } = useTranslation()\n\n const displayTextResult = useMemo(\n () => getDisplayText({ intrudeListenStatus, displayName, incoming, t }),\n [intrudeListenStatus, displayName, incoming, t],\n )\n\n const displayText = displayTextResult.content\n\n const textClassName = useMemo(() => getTextClassName(), [])\n\n return (\n <div\n className='pi-relative pi-block pi-w-full pi-min-w-0 pi-overflow-hidden pi-whitespace-nowrap pi-text-lg pi-font-medium'\n data-tooltip-id={displayText ? 'tooltip-display-name' : undefined}\n data-tooltip-content={displayText || ''}\n >\n <div className={`${textClassName} pi-w-full pi-min-w-0`}>\n {displayTextResult.type === 'scroll' ? (\n <TextScroll text={displayText} />\n ) : (\n <span className='pi-block pi-max-w-full pi-truncate'>{displayText}</span>\n )}\n </div>\n </div>\n )\n}\n\nexport default memo(DisplayName)\n\nexport interface DisplayNameProps {}\n"],"names":["selectDisplayNameAndIncoming","state","displayName","_a","currentCall","incoming","_b","selectIntrudeListenStatus","listen","memo","useSelector","intrudeListenStatus","t","useTranslation","displayTextResult","useMemo","getDisplayText","displayText","content","textClassName","getTextClassName","React","createElement","className","undefined","concat","type","TextScroll","text"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DisplayName.js","sources":["../../../src/components/CallView/DisplayName.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useMemo, memo } from 'react'\nimport { RootState } from '../../store'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { getDisplayText, getTextClassName } from './DisplayNameUtils'\nimport TextScroll from '../TextScroll'\n\nconst selectDisplayNameAndIncoming = (state: RootState) => ({\n displayName: state?.currentCall?.displayName,\n incoming: state?.currentCall?.incoming,\n})\n\nconst selectIntrudeListenStatus = (state: RootState) => state.listen\n\nconst DisplayName: React.FC<DisplayNameProps> = () => {\n const { displayName, incoming } = useSelector(selectDisplayNameAndIncoming)\n const intrudeListenStatus = useSelector(selectIntrudeListenStatus)\n\n const { t } = useTranslation()\n\n const displayTextResult = useMemo(\n () => getDisplayText({ intrudeListenStatus, displayName, incoming, t }),\n [intrudeListenStatus, displayName, incoming, t],\n )\n\n const displayText = displayTextResult.content\n\n const textClassName = useMemo(() => getTextClassName(), [])\n\n return (\n <div\n className='pi-relative pi-block pi-w-full pi-min-w-0 pi-overflow-hidden pi-whitespace-nowrap pi-text-lg pi-font-medium'\n data-tooltip-id={displayText ? 'tooltip-display-name' : undefined}\n data-tooltip-content={displayText || ''}\n >\n <div className={`${textClassName} pi-w-full pi-min-w-0`}>\n {displayTextResult.type === 'scroll' ? (\n <TextScroll text={displayText} />\n ) : (\n <span className='pi-block pi-max-w-full pi-truncate'>{displayText}</span>\n )}\n </div>\n </div>\n )\n}\n\nexport default memo(DisplayName)\n\nexport interface DisplayNameProps {}\n"],"names":["selectDisplayNameAndIncoming","state","displayName","_a","currentCall","incoming","_b","selectIntrudeListenStatus","listen","memo","useSelector","intrudeListenStatus","t","useTranslation","displayTextResult","useMemo","getDisplayText","displayText","content","textClassName","getTextClassName","React","createElement","className","undefined","concat","type","TextScroll","text"],"mappings":"8iBAUMA,EAA+B,SAACC,WAAqB,MAAC,CAC1DC,YAA+B,QAAlBC,EAAAF,eAAAA,EAAOG,mBAAW,IAAAD,OAAA,EAAAA,EAAED,YACjCG,SAA4B,QAAlBC,EAAAL,eAAAA,EAAOG,mBAAW,IAAAE,OAAA,EAAAA,EAAED,WAG1BE,EAA4B,SAACN,GAAqB,OAAAA,EAAMO,MAAN,EAkCzCC,EAAAA,EAAAA,KAhCiC,WACxC,IAAAN,EAA4BO,cAAYV,GAAtCE,EAAWC,EAAAD,YAAEG,EAAQF,EAAAE,SACvBM,EAAsBD,cAAYH,GAEhCK,EAAMC,qBAERC,EAAoBC,UACxB,WAAM,OAAAC,EAAAA,eAAe,CAAEL,oBAAmBA,EAAET,YAAWA,EAAEG,SAAQA,EAAEO,KAAI,EACvE,CAACD,EAAqBT,EAAaG,EAAUO,IAGzCK,EAAcH,EAAkBI,QAEhCC,EAAgBJ,EAAAA,QAAQ,WAAM,OAAAK,EAAAA,kBAAA,EAAoB,IAExD,OACEC,EACE,QAAAC,cAAA,MAAA,CAAAC,UAAU,8GAA6G,kBACtGN,EAAc,4BAAyBO,EAClC,uBAAAP,GAAe,IAErCI,EAAAA,QAAAC,cAAA,MAAA,CAAKC,UAAW,GAAAE,OAAGN,EAAa,0BACF,WAA3BL,EAAkBY,KACjBL,EAAA,QAAAC,cAACK,EAAAA,QAAW,CAAAC,KAAMX,IAElBI,EAAM,QAAAC,cAAA,OAAA,CAAAC,UAAU,sCAAsCN,IAKhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DisplayNameUtils.js","sources":["../../../src/components/CallView/DisplayNameUtils.tsx"],"sourcesContent":["import { TFunction } from 'i18next'\n\ninterface DisplayTextProps {\n intrudeListenStatus: any\n displayName: string | undefined\n incoming: boolean | undefined\n t: TFunction\n}\n\nexport interface DisplayTextResult {\n type: 'text' | 'scroll'\n content: string\n}\n\nexport const getDisplayText = ({\n intrudeListenStatus,\n displayName,\n incoming,\n t,\n}: DisplayTextProps): DisplayTextResult => {\n if (intrudeListenStatus?.isIntrude) {\n const extension = intrudeListenStatus?.isIntrudeExtension\n return {\n type: 'text',\n content:\n extension && extension !== ''\n ? `${t('Common.Intrude')}-${extension}`\n : t('Common.Intrude'),\n }\n }\n\n if (intrudeListenStatus?.isListen) {\n const extension = intrudeListenStatus?.isListenExtension\n return {\n type: 'text',\n content:\n extension && extension !== '' ? `${t('Common.Listen')}-${extension}` : t('Common.Listen'),\n }\n }\n\n if (displayName && displayName === '<unknown>') {\n return { type: 'text', content: 'PBX' }\n }\n\n if (displayName) {\n return { type: 'scroll', content: displayName }\n }\n\n return {\n type: 'text',\n content: incoming ? t('Call.Incoming call') || '-' : t('Call.Outgoing call') || '-',\n }\n}\n\nexport const getTextClassName = () =>\n 'pi-relative pi-block pi-max-w-full pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'\n"],"names":["_a","extension","intrudeListenStatus","displayName","incoming","t","isIntrude","type","content","isIntrudeExtension","concat","isListen","isListenExtension"],"mappings":"2FAc8B,SAACA,OAkBrBC,EAjBRC,EAAmBF,EAAAE,oBACnBC,EAAWH,EAAAG,YACXC,EAAQJ,EAAAI,SACRC,EAACL,EAAAK,EAED,OAAIH,
|
|
1
|
+
{"version":3,"file":"DisplayNameUtils.js","sources":["../../../src/components/CallView/DisplayNameUtils.tsx"],"sourcesContent":["import { TFunction } from 'i18next'\n\ninterface DisplayTextProps {\n intrudeListenStatus: any\n displayName: string | undefined\n incoming: boolean | undefined\n t: TFunction\n}\n\nexport interface DisplayTextResult {\n type: 'text' | 'scroll'\n content: string\n}\n\nexport const getDisplayText = ({\n intrudeListenStatus,\n displayName,\n incoming,\n t,\n}: DisplayTextProps): DisplayTextResult => {\n if (intrudeListenStatus?.isIntrude) {\n const extension = intrudeListenStatus?.isIntrudeExtension\n return {\n type: 'text',\n content:\n extension && extension !== ''\n ? `${t('Common.Intrude')}-${extension}`\n : t('Common.Intrude'),\n }\n }\n\n if (intrudeListenStatus?.isListen) {\n const extension = intrudeListenStatus?.isListenExtension\n return {\n type: 'text',\n content:\n extension && extension !== '' ? `${t('Common.Listen')}-${extension}` : t('Common.Listen'),\n }\n }\n\n if (displayName && displayName === '<unknown>') {\n return { type: 'text', content: 'PBX' }\n }\n\n if (displayName) {\n return { type: 'scroll', content: displayName }\n }\n\n return {\n type: 'text',\n content: incoming ? t('Call.Incoming call') || '-' : t('Call.Outgoing call') || '-',\n }\n}\n\nexport const getTextClassName = () =>\n 'pi-relative pi-block pi-max-w-full pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'\n"],"names":["_a","extension","intrudeListenStatus","displayName","incoming","t","isIntrude","type","content","isIntrudeExtension","concat","isListen","isListenExtension"],"mappings":"2FAc8B,SAACA,OAkBrBC,EAjBRC,EAAmBF,EAAAE,oBACnBC,EAAWH,EAAAG,YACXC,EAAQJ,EAAAI,SACRC,EAACL,EAAAK,EAED,OAAIH,aAAmB,EAAnBA,EAAqBI,WAEhB,CACLC,KAAM,OACNC,SAHIP,EAAYC,aAAA,EAAAA,EAAqBO,qBAIR,KAAdR,EACT,UAAGI,EAAE,kBAAiB,KAAAK,OAAIT,GAC1BI,EAAE,oBAIRH,aAAmB,EAAnBA,EAAqBS,UAEhB,CACLJ,KAAM,OACNC,SAHIP,EAAYC,aAAA,EAAAA,EAAqBU,oBAIR,KAAdX,EAAmB,GAAGS,OAAAL,EAAE,iBAAoB,KAAAK,OAAAT,GAAcI,EAAE,kBAI3EF,GAA+B,cAAhBA,EACV,CAAEI,KAAM,OAAQC,QAAS,OAG9BL,EACK,CAAEI,KAAM,SAAUC,QAASL,GAG7B,CACLI,KAAM,OACNC,QAASJ,EAAWC,EAAE,uBAAyB,IAAMA,EAAE,uBAAyB,IAEpF,2BAEgC,WAC9B,MAAA,0GAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var r=require("../../styles/Island.styles.js");require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var r=require("../../styles/Island.styles.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var t=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../../node_modules/react-redux/es/hooks/useSelector.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=s(e);exports.default=function(){var e=n.useSelector(function(e){return e.currentCall}).number,s=n.useSelector(function(e){return e.island}).isOpen,a=t.useTranslation().t,o="unknown"===e?a("TextScroll.unknown"):e||a("Call.In progress...")||"-";return u.default.createElement(r.StyledNumber,{isOpen:s},u.default.createElement("span",{className:"dark:pi-text-gray-50 pi-text-gray-600"},o))};
|
|
2
2
|
//# sourceMappingURL=Number.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Number.js","sources":["../../../src/components/CallView/Number.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledNumber } from '../../styles/Island.styles'\nimport { useTranslation } from 'react-i18next'\n\nconst Number: FC = () => {\n const { number } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { t } = useTranslation()\n\n const displayNumber =\n number === 'unknown' ? t('TextScroll.unknown') : number || t('Call.In progress...') || '-'\n\n return (\n <StyledNumber isOpen={isOpen}>\n <span className='dark:pi-text-gray-50 pi-text-gray-600'>{displayNumber}</span>\n </StyledNumber>\n )\n}\n\nexport default Number\n"],"names":["number","useSelector","state","currentCall","isOpen","island","t","useTranslation","displayNumber","React","createElement","StyledNumber","className"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Number.js","sources":["../../../src/components/CallView/Number.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { StyledNumber } from '../../styles/Island.styles'\nimport { useTranslation } from 'react-i18next'\n\nconst Number: FC = () => {\n const { number } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { t } = useTranslation()\n\n const displayNumber =\n number === 'unknown' ? t('TextScroll.unknown') : number || t('Call.In progress...') || '-'\n\n return (\n <StyledNumber isOpen={isOpen}>\n <span className='dark:pi-text-gray-50 pi-text-gray-600'>{displayNumber}</span>\n </StyledNumber>\n )\n}\n\nexport default Number\n"],"names":["number","useSelector","state","currentCall","isOpen","island","t","useTranslation","displayNumber","React","createElement","StyledNumber","className"],"mappings":"4iBASmB,WACT,IAAAA,EAAWC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,qBACnDC,EAAWH,cAAY,SAACC,GAAqB,OAAAA,EAAMG,gBACnDC,EAAMC,qBAERC,EACO,YAAXR,EAAuBM,EAAE,sBAAwBN,GAAUM,EAAE,wBAA0B,IAEzF,OACEG,EAAC,QAAAC,cAAAC,EAAYA,aAAC,CAAAP,OAAQA,GACpBK,EAAM,QAAAC,cAAA,OAAA,CAAAE,UAAU,yCAAyCJ,GAG/D"}
|
|
@@ -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"),require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js"),require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var r=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),a=require("../CustomThemedTooltip.js"),o=require("../../lib/phone/counterpartDevice.js"),s=require("../../node_modules/react-redux/es/hooks/useSelector.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=u(t),c="tooltip-number-popover",p=function(e){var t=document.createElement("textarea");t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="-1000px",t.style.opacity="0",document.body.appendChild(t),t.select();var r=!1;try{r=document.execCommand("copy")}catch(e){r=!1}return document.body.removeChild(t),r},d=t.memo(function(){var u=r.useTranslation().t,d=s.useSelector(function(e){return o.getMainExtensionNumber(e.currentCall.number,e.users)}),m=t.useState(!1),f=m[0],v=m[1],b=t.useRef(null),x=t.useRef(!0);t.useEffect(function(){return x.current=!0,function(){x.current=!1,b.current&&clearTimeout(b.current)}},[]),t.useEffect(function(){v(!1)},[d]);var g=t.useCallback(function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(t){switch(t.label){case 0:return d?[4,(r=d,e.__awaiter(void 0,void 0,void 0,function(){var t;return e.__generator(this,function(e){switch(e.label){case 0:if(!(null===(t=null===navigator||void 0===navigator?void 0:navigator.clipboard)||void 0===t?void 0:t.writeText)||!window.isSecureContext)return[3,4];e.label=1;case 1:return e.trys.push([1,3,,4]),[4,navigator.clipboard.writeText(r)];case 2:return e.sent(),[2,!0];case 3:return e.sent(),[2,p(r)];case 4:return[2,p(r)]}})}))]:[2];case 1:return t.sent()&&x.current?(v(!0),b.current&&clearTimeout(b.current),b.current=setTimeout(function(){x.current&&v(!1)},2e3),[2]):[2]}var r})})},[d]);return d?l.default.createElement("span",{className:"pi-inline-flex pi-flex-none pi-items-center","data-stop-propagation":!0},l.default.createElement("button",{type:"button",className:"pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-6 pi-w-6 pi--m-1 pi-p-1 pi-rounded-md pi-bg-transparent pi-text-gray-700 dark:pi-text-gray-200 hover:pi-bg-gray-200/70 dark:hover:pi-bg-gray-700/70 focus:pi-outline-none focus-visible:pi-ring-2 focus-visible:pi-ring-emerald-500","data-tooltip-id":c,"data-stop-propagation":!0,"aria-label":u("Call.Show number")||""},l.default.createElement(i.FontAwesomeIcon,{icon:n.faEllipsis,className:"pi-h-4 pi-w-4","data-stop-propagation":!0})),l.default.createElement(a.CustomThemedTooltip,{id:c,place:"bottom",offset:12,maxWidth:"300px",openOnClick:!0,clickable:!0,globalCloseEvents:{clickOutsideAnchor:!0,escape:!0}},l.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-2","data-stop-propagation":!0},l.default.createElement("span",{className:"pi-whitespace-nowrap","data-stop-propagation":!0},d),l.default.createElement("button",{type:"button",onClick:g,className:"pi-inline-flex pi-items-center pi-justify-center pi-h-4 pi-w-4 pi-p-0 pi-bg-transparent focus:pi-outline-none ".concat(f?"pi-text-inherit":"pi-text-emerald-500 dark:pi-text-emerald-700"),"data-stop-propagation":!0,"aria-label":u(f?"Call.Copied":"Call.Copy number")||""},l.default.createElement(i.FontAwesomeIcon,{icon:f?n.faCheck:n.faCopy,className:"pi-h-4 pi-w-4","data-stop-propagation":!0}))))):null});exports.default=d;
|
|
2
2
|
//# sourceMappingURL=NumberPopover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberPopover.js","sources":["../../../src/components/CallView/NumberPopover.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo, useCallback, useEffect, useRef, useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faCopy, faEllipsis } from '@fortawesome/free-solid-svg-icons'\nimport { RootState } from '../../store'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainExtensionNumber } from '../../lib/phone/counterpartDevice'\n\nconst NUMBER_POPOVER_ID = 'tooltip-number-popover'\nconst COPIED_FEEDBACK_MS = 2000\n\nconst copyWithTextarea = (text: string): boolean => {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'fixed'\n textarea.style.top = '-1000px'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n let copied = false\n try {\n copied = document.execCommand('copy')\n } catch (error) {\n copied = false\n }\n document.body.removeChild(textarea)\n return copied\n}\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n if (navigator?.clipboard?.writeText && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch (error) {\n return copyWithTextarea(text)\n }\n }\n return copyWithTextarea(text)\n}\n\nconst NumberPopover: FC = () => {\n const { t } = useTranslation()\n const number = useSelector((state: RootState) =>\n getMainExtensionNumber(state.currentCall.number, state.users),\n )\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n\n useEffect(() => {\n setCopied(false)\n }, [number])\n\n const handleCopy = useCallback(async () => {\n if (!number) return\n const success = await copyToClipboard(number)\n if (!success || !isMountedRef.current) return\n setCopied(true)\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) setCopied(false)\n }, COPIED_FEEDBACK_MS)\n }, [number])\n\n if (!number) return null\n\n return (\n <span className='pi-inline-flex pi-flex-none pi-items-center' data-stop-propagation={true}>\n <button\n type='button'\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-6 pi-w-6 pi--m-1 pi-p-1 pi-rounded-md pi-bg-transparent pi-text-gray-700 dark:pi-text-gray-200 hover:pi-bg-gray-200/70 dark:hover:pi-bg-gray-700/70 focus:pi-outline-none focus-visible:pi-ring-2 focus-visible:pi-ring-emerald-500'\n data-tooltip-id={NUMBER_POPOVER_ID}\n data-stop-propagation={true}\n aria-label={t('Call.Show number') || ''}\n >\n <FontAwesomeIcon icon={faEllipsis} className='pi-h-4 pi-w-4' data-stop-propagation={true} />\n </button>\n <CustomThemedTooltip\n id={NUMBER_POPOVER_ID}\n place='bottom'\n offset={12}\n maxWidth='300px'\n openOnClick\n clickable\n globalCloseEvents={{ clickOutsideAnchor: true, escape: true }}\n >\n <div className='pi-flex pi-items-center pi-gap-2' data-stop-propagation={true}>\n <span className='pi-whitespace-nowrap' data-stop-propagation={true}>\n {number}\n </span>\n <button\n type='button'\n onClick={handleCopy}\n className={`pi-inline-flex pi-items-center pi-justify-center pi-h-4 pi-w-4 pi-p-0 pi-bg-transparent focus:pi-outline-none ${\n copied ? 'pi-text-inherit' : 'pi-text-emerald-500 dark:pi-text-emerald-700'\n }`}\n data-stop-propagation={true}\n aria-label={(copied ? t('Call.Copied') : t('Call.Copy number')) || ''}\n >\n <FontAwesomeIcon\n icon={copied ? faCheck : faCopy}\n className='pi-h-4 pi-w-4'\n data-stop-propagation={true}\n />\n </button>\n </div>\n </CustomThemedTooltip>\n </span>\n )\n}\n\nexport default memo(NumberPopover)\n"],"names":["NUMBER_POPOVER_ID","copyWithTextarea","text","textarea","document","createElement","value","setAttribute","style","position","top","opacity","body","appendChild","select","copied","execCommand","error","removeChild","memo","t","useTranslation","number","useSelector","state","getMainExtensionNumber","currentCall","users","_a","useState","setCopied","timeoutRef","useRef","isMountedRef","useEffect","current","clearTimeout","handleCopy","useCallback","__awaiter","navigator","clipboard","writeText","window","isSecureContext","_b","sent","setTimeout","React","className","type","FontAwesomeIcon","icon","faEllipsis","CustomThemedTooltip","id","place","offset","maxWidth","openOnClick","clickable","globalCloseEvents","clickOutsideAnchor","escape","onClick","concat","faCheck","faCopy"],"mappings":"
|
|
1
|
+
{"version":3,"file":"NumberPopover.js","sources":["../../../src/components/CallView/NumberPopover.tsx"],"sourcesContent":["// Copyright (C) 2026 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, memo, useCallback, useEffect, useRef, useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport { useTranslation } from 'react-i18next'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faCopy, faEllipsis } from '@fortawesome/free-solid-svg-icons'\nimport { RootState } from '../../store'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainExtensionNumber } from '../../lib/phone/counterpartDevice'\n\nconst NUMBER_POPOVER_ID = 'tooltip-number-popover'\nconst COPIED_FEEDBACK_MS = 2000\n\nconst copyWithTextarea = (text: string): boolean => {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'fixed'\n textarea.style.top = '-1000px'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n textarea.select()\n let copied = false\n try {\n copied = document.execCommand('copy')\n } catch (error) {\n copied = false\n }\n document.body.removeChild(textarea)\n return copied\n}\n\nconst copyToClipboard = async (text: string): Promise<boolean> => {\n if (navigator?.clipboard?.writeText && window.isSecureContext) {\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch (error) {\n return copyWithTextarea(text)\n }\n }\n return copyWithTextarea(text)\n}\n\nconst NumberPopover: FC = () => {\n const { t } = useTranslation()\n const number = useSelector((state: RootState) =>\n getMainExtensionNumber(state.currentCall.number, state.users),\n )\n const [copied, setCopied] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const isMountedRef = useRef(true)\n\n useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n }\n }, [])\n\n useEffect(() => {\n setCopied(false)\n }, [number])\n\n const handleCopy = useCallback(async () => {\n if (!number) return\n const success = await copyToClipboard(number)\n if (!success || !isMountedRef.current) return\n setCopied(true)\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n timeoutRef.current = setTimeout(() => {\n if (isMountedRef.current) setCopied(false)\n }, COPIED_FEEDBACK_MS)\n }, [number])\n\n if (!number) return null\n\n return (\n <span className='pi-inline-flex pi-flex-none pi-items-center' data-stop-propagation={true}>\n <button\n type='button'\n className='pi-inline-flex pi-flex-none pi-items-center pi-justify-center pi-h-6 pi-w-6 pi--m-1 pi-p-1 pi-rounded-md pi-bg-transparent pi-text-gray-700 dark:pi-text-gray-200 hover:pi-bg-gray-200/70 dark:hover:pi-bg-gray-700/70 focus:pi-outline-none focus-visible:pi-ring-2 focus-visible:pi-ring-emerald-500'\n data-tooltip-id={NUMBER_POPOVER_ID}\n data-stop-propagation={true}\n aria-label={t('Call.Show number') || ''}\n >\n <FontAwesomeIcon icon={faEllipsis} className='pi-h-4 pi-w-4' data-stop-propagation={true} />\n </button>\n <CustomThemedTooltip\n id={NUMBER_POPOVER_ID}\n place='bottom'\n offset={12}\n maxWidth='300px'\n openOnClick\n clickable\n globalCloseEvents={{ clickOutsideAnchor: true, escape: true }}\n >\n <div className='pi-flex pi-items-center pi-gap-2' data-stop-propagation={true}>\n <span className='pi-whitespace-nowrap' data-stop-propagation={true}>\n {number}\n </span>\n <button\n type='button'\n onClick={handleCopy}\n className={`pi-inline-flex pi-items-center pi-justify-center pi-h-4 pi-w-4 pi-p-0 pi-bg-transparent focus:pi-outline-none ${\n copied ? 'pi-text-inherit' : 'pi-text-emerald-500 dark:pi-text-emerald-700'\n }`}\n data-stop-propagation={true}\n aria-label={(copied ? t('Call.Copied') : t('Call.Copy number')) || ''}\n >\n <FontAwesomeIcon\n icon={copied ? faCheck : faCopy}\n className='pi-h-4 pi-w-4'\n data-stop-propagation={true}\n />\n </button>\n </div>\n </CustomThemedTooltip>\n </span>\n )\n}\n\nexport default memo(NumberPopover)\n"],"names":["NUMBER_POPOVER_ID","copyWithTextarea","text","textarea","document","createElement","value","setAttribute","style","position","top","opacity","body","appendChild","select","copied","execCommand","error","removeChild","memo","t","useTranslation","number","useSelector","state","getMainExtensionNumber","currentCall","users","_a","useState","setCopied","timeoutRef","useRef","isMountedRef","useEffect","current","clearTimeout","handleCopy","useCallback","__awaiter","navigator","clipboard","writeText","window","isSecureContext","_b","sent","setTimeout","React","className","type","FontAwesomeIcon","icon","faEllipsis","CustomThemedTooltip","id","place","offset","maxWidth","openOnClick","clickable","globalCloseEvents","clickOutsideAnchor","escape","onClick","concat","faCheck","faCopy"],"mappings":"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"}
|