@nethesis/phone-island 1.1.3 → 1.1.5-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 +1 -1
- package/dist/components/SideView/hooks/useSideViewLogic.js.map +1 -1
- package/dist/components/Socket.js +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 +1 -1
- package/dist/components/VideoView/index.js.map +1 -1
- package/dist/components/WebRTC.js +1 -1
- package/dist/components/WebRTC.js.map +1 -1
- package/dist/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 +1 -1
- package/dist/lib/phone/counterpartDevice.js.map +1 -1
- package/dist/lib/phone/screenShare.js +2 -0
- package/dist/lib/phone/screenShare.js.map +1 -0
- 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/classnames/index.js +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/components/AnimatePresence/PresenceChild.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/PresenceChild.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/components/AnimatePresence/utils.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/context/LayoutGroupContext.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/context/LazyContext.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/context/MotionConfigContext.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/context/SwitchLayoutGroupContext.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/index.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/use-drag-controls.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/symbol.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/framer-motion/dist/es/render/components/motion/feature-bundle.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/components/motion/feature-bundle.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/dom/use-render.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/dom/utils/filter-props.mjs.js.map +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.mjs.js +1 -1
- package/dist/node_modules/framer-motion/dist/es/render/svg/use-props.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/NativeAnimationExtended.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/NativeAnimationExtended.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/drivers/frame.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/drivers/frame.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/generators/utils/calc-duration.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/generators/utils/velocity.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/motion-value.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/interfaces/visual-element-variant.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element-variant.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/interfaces/visual-element.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 +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/keyframes/utils/make-none-animatable.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/make-none-animatable.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/keyframes/utils/unit-conversion.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/optimized-appear/data-id.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/animation/utils/WithPromise.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/utils/notify-inspector.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/notify-inspector.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-start-time.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/animation/utils/resolve-start-time.mjs.js.map +1 -0
- 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 +2 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/TransformAnimation.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/groups.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/animation/waapi/transforms/groups.mjs.js.map +1 -0
- 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/events/add-pointer-event.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/events/add-pointer-event.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/events/event-info.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/events/event-info.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/batcher.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame-data.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame-data.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/frame.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/render-step.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/frameloop/sync-time.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/VisualElementDragControls.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/VisualElementDragControls.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/utils/constraints.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/drag/utils/constraints.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/hover.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/hover.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/pan/PanSession.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/gestures/pan/PanSession.mjs.js.map +1 -0
- 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/gestures/utils/setup.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/gestures/utils/setup.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/node/root.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/projection/node/root.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/default-scale-correctors.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/default-scale-correctors.mjs.js.map +1 -0
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/projection/styles/scale-correction.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/each-axis.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/DOMVisualElement.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/svg/SVGVisualElement.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/svg/SVGVisualElement.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/build-attrs.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/svg/utils/scrape-motion-values.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/render/utils/is-controlling-variants.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/is-controlling-variants.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/keys-transform.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-dynamic-variants.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/resolve-variants.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/render/utils/variant-props.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/resize/index.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/resize/index.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/scope/active.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/scope/active.mjs.js.map +1 -0
- 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/delay.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/delay.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/distance.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/mix/index.mjs.js +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/mix/index.mjs.js.map +1 -1
- package/dist/node_modules/motion-dom/dist/es/utils/resolve-elements.mjs.js +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-dom/dist/es/value/utils/as-number.mjs.js +2 -0
- package/dist/node_modules/motion-dom/dist/es/value/utils/as-number.mjs.js.map +1 -0
- package/dist/node_modules/motion-utils/dist/es/easing/circ.mjs.js.map +1 -1
- package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.mjs.js +1 -1
- package/dist/node_modules/motion-utils/dist/es/easing/cubic-bezier.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/motion-utils/dist/es/errors.mjs.js +1 -1
- package/dist/node_modules/motion-utils/dist/es/errors.mjs.js.map +1 -1
- package/dist/node_modules/motion-utils/dist/es/subscription-manager.mjs.js +1 -1
- package/dist/node_modules/motion-utils/dist/es/subscription-manager.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 +6 -6
- 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/events/add-pointer-event.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/events/add-pointer-event.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/events/event-info.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/events/event-info.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/VisualElementDragControls.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/gestures/drag/utils/constraints.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.mjs.js +0 -2
- package/dist/node_modules/framer-motion/dist/es/gestures/pan/PanSession.mjs.js.map +0 -1
- package/dist/node_modules/framer-motion/dist/es/utils/distance.mjs.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/motion-dom/dist/es/render/utils/get-variant-context.mjs.js +0 -2
- package/dist/node_modules/motion-dom/dist/es/render/utils/get-variant-context.mjs.js.map +0 -1
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.mjs.js +0 -2
- package/dist/node_modules/motion-dom/dist/es/value/types/utils/find.mjs.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/distance.mjs.js +0 -0
- /package/dist/node_modules/{framer-motion → motion-dom}/dist/es/utils/is-ref-object.mjs.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactListView.js","sources":["../../../src/components/ContactView/ContactListView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useState, FormEvent, useRef, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { RootState } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { backToPreviousView } from '../../lib/island/island'\nimport {\n faPhone,\n faArrowLeft,\n faUser,\n faBuilding,\n faAngleRight,\n faHeadset,\n} from '@fortawesome/free-solid-svg-icons'\nimport { UserEndpointsTypes } from '../../types'\nimport {\n clickTransferOrConference,\n handleAttendedTransfer,\n isInsideConferenceList,\n} from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainPhoneNumber, getTotalPhoneNumbers, searchPhonebook } from '../../services/phonebook'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { SelectContactNumberView } from './SelectContactNumberView'\nimport debounce from 'lodash/debounce'\nimport ListAvatar from './ListAvatar'\n\nconst USERS_NUMBER_PER_PAGE = 10\nconst SHOW_LIST_GRADIENT_DISTANCE = 3\n\nexport const ContactListView: FC<ContactListViewProps> = () => {\n const { isOpen, contactListView } = useSelector((state: RootState) => state.island)\n const { endpoints } = useSelector((state: RootState) => state.users)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const [loaded, setLoaded] = useState<boolean>(false)\n const [filteredOperators, setFilteredOperators] = useState<UserEndpointsTypes[]>([])\n const [filteredPhonebookContacts, setFilteredPhonebookContacts] = useState<PhonebookContact[]>([])\n const [currentContact, setCurrentContact] = useState<PhonebookContact>()\n const [firstPhonebookLoading, setFirstPhonebookLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [showPhoneNumberTyped, setShowPhoneNumberTyped] = useState<boolean>()\n const relativeRef = useRef<HTMLDivElement>(null)\n const [showGradient, setShowGradient] = useState<boolean>(false)\n const [showingUsers, setShowingUsers] = useState<number>(USERS_NUMBER_PER_PAGE)\n const dispatch = useDispatch<Dispatch>()\n const { paused } = useSelector((state: RootState) => state.currentCall)\n\n const filteredContacts = useMemo(() => {\n return [...filteredOperators, ...filteredPhonebookContacts]\n }, [filteredOperators, filteredPhonebookContacts])\n\n // debounce phonebook search\n const debouncedSearchPhonebookContacts = useRef(\n debounce((value: string) => {\n retrievePhonebookContacts(value)\n }, 300), // debounce delay\n ).current\n\n // cleanup the debounce function on unmount\n useEffect(() => {\n return () => {\n debouncedSearchPhonebookContacts.cancel()\n }\n }, [debouncedSearchPhonebookContacts])\n\n function searchQueryChanged(event: FormEvent<HTMLInputElement>) {\n setSearchQuery(event.currentTarget.value)\n debouncedSearchPhonebookContacts(event.currentTarget.value)\n filterOperators(event.currentTarget.value)\n }\n\n function retrieveContacts() {\n filterOperators(searchQuery)\n\n // load phonebook contacts only once\n\n if (firstPhonebookLoading) {\n retrievePhonebookContacts(searchQuery)\n setFirstPhonebookLoading(false)\n }\n }\n\n function filterOperators(textQuery: string = '') {\n textQuery = textQuery.trim().toLowerCase()\n\n if (endpoints) {\n const operators = Object?.values(endpoints).filter(\n (userEndpoints: UserEndpointsTypes) =>\n // Remove the currentUser from the list\n userEndpoints?.username !== username &&\n (userEndpoints?.endpoints?.extension.find((extension) =>\n extension?.id?.toLowerCase()?.startsWith(textQuery),\n ) ||\n userEndpoints?.username?.toLowerCase()?.includes(textQuery) ||\n userEndpoints?.name?.toLowerCase()?.includes(textQuery)),\n )\n setFilteredOperators(operators)\n }\n }\n\n async function retrievePhonebookContacts(textQuery: string = '') {\n setLoaded(false)\n textQuery = textQuery.trim().toLowerCase()\n\n // phone number typed\n\n if (/^[0-9*#+]+$/.test(textQuery)) {\n setShowPhoneNumberTyped(true)\n } else {\n setShowPhoneNumberTyped(false)\n }\n\n // search phonebook\n\n try {\n const phonebookSearchResult = await searchPhonebook(1, textQuery, '')\n setFilteredPhonebookContacts(phonebookSearchResult.rows)\n } catch (error) {\n console.error('Error fetching phonebook:', error)\n }\n setLoaded(true)\n }\n\n useEventListener('phone-island-call-transfer', (data: CallStartTypes) => {\n handleAttendedTransfer(data.number, dispatch)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n // Retrieve\n useEffect(() => {\n if (endpoints && username) {\n retrieveContacts()\n }\n }, [endpoints, username])\n\n useEffect(() => {\n // Handle users list scrolling\n const handleScroll = () => {\n setShowGradient(\n relativeRef.current && relativeRef.current.scrollTop > SHOW_LIST_GRADIENT_DISTANCE\n ? true\n : false,\n )\n // Manage scroll to bottom\n if (\n relativeRef.current &&\n relativeRef.current?.offsetHeight + relativeRef.current?.scrollTop >=\n relativeRef.current?.scrollHeight - 10\n ) {\n // Improve showing users\n setShowingUsers((state) => state + USERS_NUMBER_PER_PAGE)\n }\n }\n // Manage expansion and collapsing\n if (isOpen) {\n relativeRef.current?.addEventListener('scroll', handleScroll)\n } else {\n relativeRef.current?.removeEventListener('scroll', handleScroll)\n }\n return () => relativeRef.current?.removeEventListener('scroll', handleScroll)\n }, [isOpen])\n\n function handleBackClick() {\n if (isInsideConferenceList()) {\n // Close the conference list\n eventDispatch('phone-island-conference-list-close', {})\n }\n // Unhold the call if it was paused during transfer selection\n if (paused) {\n eventDispatch('phone-island-call-unhold', {})\n }\n // Open the call view\n backToPreviousView()\n }\n\n function isUserEndpointsType(obj: any): obj is UserEndpointsTypes {\n return obj && typeof obj === 'object' && 'endpoints' in obj && 'username' in obj\n }\n\n function isPhonebookContact(obj: any): obj is PhonebookContact {\n return obj && typeof obj === 'object' && 'source' in obj && 'name' in obj\n }\n\n function isContactAvailable(mainPresence: string): boolean {\n return ['online', 'voicemail', 'cellphone', 'callforward']?.includes(mainPresence)\n }\n\n function goToSelectNumberView(phonebookContact: PhonebookContact): void {\n setCurrentContact(phonebookContact)\n dispatch.island.setContactListView('selectContactNumber')\n }\n\n const { t } = useTranslation()\n\n const mainView = (\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={handleBackClick}\n data-tooltip-id='contact-list-tooltip-back-to-call'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n onChange={searchQueryChanged}\n value={searchQuery}\n placeholder={t('Common.Search contact or phone number') || ''}\n autoFocus\n spellCheck={false}\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n </div>\n {/* skeleton loader */}\n {!loaded && (\n <div className='pi-mt-6'>\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className='pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1'\n >\n <div className='pi-flex pi-items-center pi-justify-center'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-flex-col pi-gap-2 pi-w-full'>\n <div className='pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n <div className='pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-items-center pi-justify-center pi-pr-2'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* contact list */}\n <div className={!loaded ? 'pi-hidden' : ''}>\n {/* List shadow */}\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'>\n {showGradient && (\n <div className='pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100'></div>\n )}\n </div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n ref={relativeRef}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* The custom searched number */}\n {showPhoneNumberTyped && (\n <div className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n <ListAvatar placeHolderIcon={faUser} />\n <div>\n <div className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'>\n {t('Common.Phone number entered')}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {searchQuery}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(searchQuery, dispatch)}\n variant='green'\n data-tooltip-id='contact-list-tooltip-call-to-transfer'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n )}\n {/* Operators and phonebook contacts list */}\n {filteredContacts &&\n filteredContacts.slice(0, showingUsers).map((filteredContact, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <>\n <ListAvatar\n username={filteredContact?.username}\n status={filteredContact?.mainPresence}\n placeHolderIcon={faHeadset}\n />\n <div>\n <div\n data-stop-propagation={true}\n className={`pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium`}\n >\n {filteredContact.name}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {filteredContact?.endpoints?.mainextension[0]?.id}\n </div>\n </div>\n </>\n )\n } else if (isPhonebookContact(filteredContact)) {\n return (\n <>\n <ListAvatar\n placeHolderIcon={\n filteredContact?.kind === 'person' ? faUser : faBuilding\n }\n />\n <div>\n <div\n data-stop-propagation={true}\n className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'\n >\n {filteredContact?.displayName || '-'}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n <span>{getMainPhoneNumber(filteredContact) || '-'}</span>\n {getTotalPhoneNumbers(filteredContact) > 1 && (\n <span className='pi-ml-2'>\n {t('Common.plus_x_others', {\n count: getTotalPhoneNumbers(filteredContact) - 1,\n })}\n </span>\n )}\n </div>\n </div>\n </>\n )\n }\n })()}\n </div>\n <div className='pi-flex pi-gap-3.5'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <Button\n onClick={() =>\n isContactAvailable(filteredContact?.mainPresence) &&\n clickTransferOrConference(\n filteredContact?.endpoints?.mainextension[0]?.id,\n dispatch,\n )\n }\n variant='green'\n disabled={!isContactAvailable(filteredContact?.mainPresence)}\n data-tooltip-id={\n isContactAvailable(filteredContact?.mainPresence)\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else if (isPhonebookContact(filteredContact)) {\n if (getTotalPhoneNumbers(filteredContact) < 2) {\n return (\n <Button\n onClick={() =>\n clickTransferOrConference(\n getMainPhoneNumber(filteredContact),\n dispatch,\n )\n }\n variant='green'\n disabled={getTotalPhoneNumbers(filteredContact) == 0}\n data-tooltip-id={\n getTotalPhoneNumbers(filteredContact) > 0\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else {\n // change view to show contact numbers\n return (\n <Button\n onClick={() => goToSelectNumberView(filteredContact)}\n variant='transparent'\n data-tooltip-id={'contact-list-tooltip-left'}\n data-tooltip-content={t('Tooltip.Select phone number')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faAngleRight} />\n </Button>\n )\n }\n }\n })()}\n </div>\n </div>\n ))}\n {filteredContacts.length === 0 && !showPhoneNumberTyped && (\n <p className=' pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm'>\n {t('No contacts found')}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n return (\n <>\n {(() => {\n switch (contactListView) {\n case 'main':\n return mainView\n case 'selectContactNumber':\n return <SelectContactNumberView contact={currentContact} />\n default:\n return mainView\n }\n })()}\n <CustomThemedTooltip className='pi-z-1000' id='contact-list-tooltip-left' place='left' />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-back-to-call'\n place='right'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-call-to-transfer'\n place='left'\n />\n </>\n )\n}\n\ninterface ContactListViewProps {}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["_a","useSelector","state","island","isOpen","contactListView","endpoints","users","username","currentUser","_b","useState","loaded","setLoaded","_c","filteredOperators","setFilteredOperators","_d","filteredPhonebookContacts","setFilteredPhonebookContacts","_e","currentContact","setCurrentContact","_f","firstPhonebookLoading","setFirstPhonebookLoading","_g","searchQuery","setSearchQuery","_h","showPhoneNumberTyped","setShowPhoneNumberTyped","relativeRef","useRef","_j","showGradient","setShowGradient","_k","showingUsers","setShowingUsers","dispatch","useDispatch","paused","currentCall","filteredContacts","useMemo","__spreadArray","debouncedSearchPhonebookContacts","debounce","value","retrievePhonebookContacts","current","filterOperators","textQuery","trim","toLowerCase","operators","Object","values","filter","userEndpoints","extension","find","id","startsWith","includes","name","test","searchPhonebook","phonebookSearchResult","sent","rows","console","error","error_1","isUserEndpointsType","obj","isPhonebookContact","isContactAvailable","mainPresence","useEffect","cancel","useEventListener","data","handleAttendedTransfer","number","eventDispatch","handleScroll","scrollTop","offsetHeight","scrollHeight","addEventListener","removeEventListener","t","useTranslation","mainView","React","createElement","className","Button","variant","onClick","isInsideConferenceList","backToPreviousView","FontAwesomeIcon","icon","faArrowLeft","type","onChange","event","currentTarget","placeholder","autoFocus","spellCheck","Array","from","length","map","_","i","key","style","marginTop","height","ref","ListAvatar","placeHolderIcon","faUser","clickTransferOrConference","faPhone","slice","filteredContact","Fragment","status","faHeadset","mainextension","kind","faBuilding","displayName","getMainPhoneNumber","getTotalPhoneNumbers","count","disabled","setContactListView","faAngleRight","SelectContactNumberView","contact","CustomThemedTooltip","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContactListView.js","sources":["../../../src/components/ContactView/ContactListView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useState, FormEvent, useRef, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { RootState } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { backToPreviousView } from '../../lib/island/island'\nimport {\n faPhone,\n faArrowLeft,\n faUser,\n faBuilding,\n faAngleRight,\n faHeadset,\n} from '@fortawesome/free-solid-svg-icons'\nimport { UserEndpointsTypes } from '../../types'\nimport {\n clickTransferOrConference,\n handleAttendedTransfer,\n isInsideConferenceList,\n} from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getMainPhoneNumber, getTotalPhoneNumbers, searchPhonebook } from '../../services/phonebook'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { SelectContactNumberView } from './SelectContactNumberView'\nimport debounce from 'lodash/debounce'\nimport ListAvatar from './ListAvatar'\n\nconst USERS_NUMBER_PER_PAGE = 10\nconst SHOW_LIST_GRADIENT_DISTANCE = 3\n\nexport const ContactListView: FC<ContactListViewProps> = () => {\n const { isOpen, contactListView } = useSelector((state: RootState) => state.island)\n const { endpoints } = useSelector((state: RootState) => state.users)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const [loaded, setLoaded] = useState<boolean>(false)\n const [filteredOperators, setFilteredOperators] = useState<UserEndpointsTypes[]>([])\n const [filteredPhonebookContacts, setFilteredPhonebookContacts] = useState<PhonebookContact[]>([])\n const [currentContact, setCurrentContact] = useState<PhonebookContact>()\n const [firstPhonebookLoading, setFirstPhonebookLoading] = useState(true)\n const [searchQuery, setSearchQuery] = useState('')\n const [showPhoneNumberTyped, setShowPhoneNumberTyped] = useState<boolean>()\n const relativeRef = useRef<HTMLDivElement>(null)\n const [showGradient, setShowGradient] = useState<boolean>(false)\n const [showingUsers, setShowingUsers] = useState<number>(USERS_NUMBER_PER_PAGE)\n const dispatch = useDispatch<Dispatch>()\n const { paused } = useSelector((state: RootState) => state.currentCall)\n\n const filteredContacts = useMemo(() => {\n return [...filteredOperators, ...filteredPhonebookContacts]\n }, [filteredOperators, filteredPhonebookContacts])\n\n // debounce phonebook search\n const debouncedSearchPhonebookContacts = useRef(\n debounce((value: string) => {\n retrievePhonebookContacts(value)\n }, 300), // debounce delay\n ).current\n\n // cleanup the debounce function on unmount\n useEffect(() => {\n return () => {\n debouncedSearchPhonebookContacts.cancel()\n }\n }, [debouncedSearchPhonebookContacts])\n\n function searchQueryChanged(event: FormEvent<HTMLInputElement>) {\n setSearchQuery(event.currentTarget.value)\n debouncedSearchPhonebookContacts(event.currentTarget.value)\n filterOperators(event.currentTarget.value)\n }\n\n function retrieveContacts() {\n filterOperators(searchQuery)\n\n // load phonebook contacts only once\n\n if (firstPhonebookLoading) {\n retrievePhonebookContacts(searchQuery)\n setFirstPhonebookLoading(false)\n }\n }\n\n function filterOperators(textQuery: string = '') {\n textQuery = textQuery.trim().toLowerCase()\n\n if (endpoints) {\n const operators = Object?.values(endpoints).filter(\n (userEndpoints: UserEndpointsTypes) =>\n // Remove the currentUser from the list\n userEndpoints?.username !== username &&\n (userEndpoints?.endpoints?.extension.find((extension) =>\n extension?.id?.toLowerCase()?.startsWith(textQuery),\n ) ||\n userEndpoints?.username?.toLowerCase()?.includes(textQuery) ||\n userEndpoints?.name?.toLowerCase()?.includes(textQuery)),\n )\n setFilteredOperators(operators)\n }\n }\n\n async function retrievePhonebookContacts(textQuery: string = '') {\n setLoaded(false)\n textQuery = textQuery.trim().toLowerCase()\n\n // phone number typed\n\n if (/^[0-9*#+]+$/.test(textQuery)) {\n setShowPhoneNumberTyped(true)\n } else {\n setShowPhoneNumberTyped(false)\n }\n\n // search phonebook\n\n try {\n const phonebookSearchResult = await searchPhonebook(1, textQuery, '')\n setFilteredPhonebookContacts(phonebookSearchResult.rows)\n } catch (error) {\n console.error('Error fetching phonebook:', error)\n }\n setLoaded(true)\n }\n\n useEventListener('phone-island-call-transfer', (data: CallStartTypes) => {\n handleAttendedTransfer(data.number, dispatch)\n eventDispatch('phone-island-call-transfer-opened', {})\n })\n\n // Retrieve\n useEffect(() => {\n if (endpoints && username) {\n retrieveContacts()\n }\n }, [endpoints, username])\n\n useEffect(() => {\n // Handle users list scrolling\n const handleScroll = () => {\n setShowGradient(\n relativeRef.current && relativeRef.current.scrollTop > SHOW_LIST_GRADIENT_DISTANCE\n ? true\n : false,\n )\n // Manage scroll to bottom\n if (\n relativeRef.current &&\n relativeRef.current?.offsetHeight + relativeRef.current?.scrollTop >=\n relativeRef.current?.scrollHeight - 10\n ) {\n // Improve showing users\n setShowingUsers((state) => state + USERS_NUMBER_PER_PAGE)\n }\n }\n // Manage expansion and collapsing\n if (isOpen) {\n relativeRef.current?.addEventListener('scroll', handleScroll)\n } else {\n relativeRef.current?.removeEventListener('scroll', handleScroll)\n }\n return () => relativeRef.current?.removeEventListener('scroll', handleScroll)\n }, [isOpen])\n\n function handleBackClick() {\n if (isInsideConferenceList()) {\n // Close the conference list\n eventDispatch('phone-island-conference-list-close', {})\n }\n // Unhold the call if it was paused during transfer selection\n if (paused) {\n eventDispatch('phone-island-call-unhold', {})\n }\n // Open the call view\n backToPreviousView()\n }\n\n function isUserEndpointsType(obj: any): obj is UserEndpointsTypes {\n return obj && typeof obj === 'object' && 'endpoints' in obj && 'username' in obj\n }\n\n function isPhonebookContact(obj: any): obj is PhonebookContact {\n return obj && typeof obj === 'object' && 'source' in obj && 'name' in obj\n }\n\n function isContactAvailable(mainPresence: string): boolean {\n return ['online', 'voicemail', 'cellphone', 'callforward']?.includes(mainPresence)\n }\n\n function goToSelectNumberView(phonebookContact: PhonebookContact): void {\n setCurrentContact(phonebookContact)\n dispatch.island.setContactListView('selectContactNumber')\n }\n\n const { t } = useTranslation()\n\n const mainView = (\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={handleBackClick}\n data-tooltip-id='contact-list-tooltip-back-to-call'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n onChange={searchQueryChanged}\n value={searchQuery}\n placeholder={t('Common.Search contact or phone number') || ''}\n autoFocus\n spellCheck={false}\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-sm pi-px-5 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n </div>\n {/* skeleton loader */}\n {!loaded && (\n <div className='pi-mt-6'>\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={i}\n className='pi-animate-pulse pi-flex pi-items-center pi-space-x-4 pi-px-3 pi-py-1'\n >\n <div className='pi-flex pi-items-center pi-justify-center'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-flex-col pi-gap-2 pi-w-full'>\n <div className='pi-h-3 pi-w-4/5 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n <div className='pi-h-3 pi-w-1/2 pi-rounded pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n <div className='pi-flex pi-items-center pi-justify-center pi-pr-2'>\n <div className='pi-rounded-full pi-h-12 pi-w-12 pi-bg-gray-300 dark:pi-bg-gray-700'></div>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* contact list */}\n <div className={!loaded ? 'pi-hidden' : ''}>\n {/* List shadow */}\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'>\n {showGradient && (\n <div className='pi-h-6 pi-w-full pi-bg-gradient-to-b dark:pi-from-black pi-from-gray-100 pi-to-transparent pi-z-100'></div>\n )}\n </div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n ref={relativeRef}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* The custom searched number */}\n {showPhoneNumberTyped && (\n <div className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'>\n <div className='pi-flex pi-items-center pi-gap-4'>\n <ListAvatar placeHolderIcon={faUser} />\n <div>\n <div className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'>\n {t('Common.Phone number entered')}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {searchQuery}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(searchQuery, dispatch)}\n variant='green'\n data-tooltip-id='contact-list-tooltip-call-to-transfer'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n )}\n {/* Operators and phonebook contacts list */}\n {filteredContacts &&\n filteredContacts.slice(0, showingUsers).map((filteredContact, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <>\n <ListAvatar\n username={filteredContact?.username}\n status={filteredContact?.mainPresence}\n placeHolderIcon={faHeadset}\n />\n <div>\n <div\n data-stop-propagation={true}\n className={`pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium`}\n >\n {filteredContact.name}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n {filteredContact?.endpoints?.mainextension[0]?.id}\n </div>\n </div>\n </>\n )\n } else if (isPhonebookContact(filteredContact)) {\n return (\n <>\n <ListAvatar\n placeHolderIcon={\n filteredContact?.kind === 'person' ? faUser : faBuilding\n }\n />\n <div>\n <div\n data-stop-propagation={true}\n className='pi-h-fit pi-max-w-48 pi-truncate pi-text-sm pi-font-medium'\n >\n {filteredContact?.displayName || '-'}\n </div>\n <div className='pi-text-sm pi-max-w-48 pi-text-gray-700 dark:pi-text-gray-300'>\n <span>{getMainPhoneNumber(filteredContact) || '-'}</span>\n {getTotalPhoneNumbers(filteredContact) > 1 && (\n <span className='pi-ml-2'>\n {t('Common.plus_x_others', {\n count: getTotalPhoneNumbers(filteredContact) - 1,\n })}\n </span>\n )}\n </div>\n </div>\n </>\n )\n }\n })()}\n </div>\n <div className='pi-flex pi-gap-3.5'>\n {(() => {\n if (isUserEndpointsType(filteredContact)) {\n return (\n <Button\n onClick={() =>\n isContactAvailable(filteredContact?.mainPresence) &&\n clickTransferOrConference(\n filteredContact?.endpoints?.mainextension[0]?.id,\n dispatch,\n )\n }\n variant='green'\n disabled={!isContactAvailable(filteredContact?.mainPresence)}\n data-tooltip-id={\n isContactAvailable(filteredContact?.mainPresence)\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else if (isPhonebookContact(filteredContact)) {\n if (getTotalPhoneNumbers(filteredContact) < 2) {\n return (\n <Button\n onClick={() =>\n clickTransferOrConference(\n getMainPhoneNumber(filteredContact),\n dispatch,\n )\n }\n variant='green'\n disabled={getTotalPhoneNumbers(filteredContact) == 0}\n data-tooltip-id={\n getTotalPhoneNumbers(filteredContact) > 0\n ? 'contact-list-tooltip-left'\n : ''\n }\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n )\n } else {\n // change view to show contact numbers\n return (\n <Button\n onClick={() => goToSelectNumberView(filteredContact)}\n variant='transparent'\n data-tooltip-id={'contact-list-tooltip-left'}\n data-tooltip-content={t('Tooltip.Select phone number')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faAngleRight} />\n </Button>\n )\n }\n }\n })()}\n </div>\n </div>\n ))}\n {filteredContacts.length === 0 && !showPhoneNumberTyped && (\n <p className=' pi-font-medium pi-w-full pi-flex pi-justify-center pi-text-sm'>\n {t('No contacts found')}\n </p>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n\n return (\n <>\n {(() => {\n switch (contactListView) {\n case 'main':\n return mainView\n case 'selectContactNumber':\n return <SelectContactNumberView contact={currentContact} />\n default:\n return mainView\n }\n })()}\n <CustomThemedTooltip className='pi-z-1000' id='contact-list-tooltip-left' place='left' />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-back-to-call'\n place='right'\n />\n <CustomThemedTooltip\n className='pi-z-1000'\n id='contact-list-tooltip-call-to-transfer'\n place='left'\n />\n </>\n )\n}\n\ninterface ContactListViewProps {}\n\ninterface CallStartTypes {\n number: string\n}\n"],"names":["_a","useSelector","state","island","isOpen","contactListView","endpoints","users","username","currentUser","_b","useState","loaded","setLoaded","_c","filteredOperators","setFilteredOperators","_d","filteredPhonebookContacts","setFilteredPhonebookContacts","_e","currentContact","setCurrentContact","_f","firstPhonebookLoading","setFirstPhonebookLoading","_g","searchQuery","setSearchQuery","_h","showPhoneNumberTyped","setShowPhoneNumberTyped","relativeRef","useRef","_j","showGradient","setShowGradient","_k","showingUsers","setShowingUsers","dispatch","useDispatch","paused","currentCall","filteredContacts","useMemo","__spreadArray","debouncedSearchPhonebookContacts","debounce","value","retrievePhonebookContacts","current","filterOperators","textQuery","trim","toLowerCase","operators","Object","values","filter","userEndpoints","extension","find","id","startsWith","includes","name","test","searchPhonebook","phonebookSearchResult","sent","rows","console","error","error_1","isUserEndpointsType","obj","isPhonebookContact","isContactAvailable","mainPresence","useEffect","cancel","useEventListener","data","handleAttendedTransfer","number","eventDispatch","handleScroll","scrollTop","offsetHeight","scrollHeight","addEventListener","removeEventListener","t","useTranslation","mainView","React","createElement","className","Button","variant","onClick","isInsideConferenceList","backToPreviousView","FontAwesomeIcon","icon","faArrowLeft","type","onChange","event","currentTarget","placeholder","autoFocus","spellCheck","Array","from","length","map","_","i","key","style","marginTop","height","ref","ListAvatar","placeHolderIcon","faUser","clickTransferOrConference","faPhone","slice","filteredContact","Fragment","status","faHeadset","mainextension","kind","faBuilding","displayName","getMainPhoneNumber","getTotalPhoneNumbers","count","disabled","setContactListView","faAngleRight","SelectContactNumberView","contact","CustomThemedTooltip","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),a=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../lib/phone/call.js");require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),a=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../lib/phone/call.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var l=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),n=require("../CustomThemedTooltip.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),s=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function p(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=p(e);exports.SelectContactNumberView=function(p){var d=p.contact,u=s.useDispatch(),m=l.useTranslation().t,f=e.useMemo(function(){for(var e=[],t=0,i=["extension","workphone","cellphone"];t<i.length;t++){var a=i[t],r=null==d?void 0:d[a];r&&e.push({number:r,type:a})}return e},[d]);function h(e){switch(e){case"extension":return a.faHeadset;case"workphone":return o.faOfficePhone;case"cellphone":return a.faMobile;default:return a.faPhone}}return c.default.createElement(c.default.Fragment,null,c.default.createElement("div",{className:"pi-relative pi-flex pi-flex-col"},c.default.createElement("div",{className:"pi-relative pi-z-50"},c.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-2 pi-text-gray-900 dark:pi-text-gray-50"},c.default.createElement(t.Button,{onClick:function(){return u.island.setContactListView("main")},variant:"transparent","data-tooltip-id":"tooltip-back-to-transfer-results","data-tooltip-content":m("Common.Back")||""},c.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:a.faArrowLeft})),c.default.createElement("h1",{className:"pi-text-lg pi-font-medium pi-leading-7"},(null==d?void 0:d.displayName)||"-"))),c.default.createElement("div",{className:"pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4"}),c.default.createElement("div",{style:{marginTop:"-22px"},className:"pi-flex pi-flex-col pi-gap-7"},c.default.createElement("div",{style:{height:"17rem"},className:"pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25"},f.map(function(e,l){return c.default.createElement("div",{key:l,className:"pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800"},c.default.createElement("div",{className:"pi-flex pi-items-center pi-gap-4"},c.default.createElement("div",{className:"pi-relative pi-block pi-shrink-0 pi-h-12 pi-w-12 pi-text-base pi-bg-gray-700 dark:pi-bg-gray-200 pi-rounded-full"},c.default.createElement("div",{className:"pi-text-white dark:pi-text-gray-950 pi-w-full pi-h-full pi-fill-white pi-flex pi-justify-center pi-items-center"},c.default.createElement(i.FontAwesomeIcon,{icon:h(e.type),className:"pi-h-6 pi-w-6","aria-hidden":"true"}))),c.default.createElement("div",null,c.default.createElement("div",{style:{maxWidth:"196px"},"data-stop-propagation":!0,className:"pi-h-fit pi-truncate pi-text-sm pi-font-medium"},m("Phone.".concat(e.type))),c.default.createElement("div",{className:"pi-text-sm pi-text-gray-700 dark:pi-text-gray-300"},e.number))),c.default.createElement("div",{className:"pi-flex pi-gap-3.5"},c.default.createElement(t.Button,{onClick:function(){return r.clickTransferOrConference(e.number,u)},variant:"green","data-tooltip-id":"transfer-list-tooltip-left","data-tooltip-content":r.isInsideConferenceList()?m("Conference.Add participant"):m("Tooltip.Transfer call")},c.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:a.faPhone}))))})))),c.default.createElement(n.CustomThemedTooltip,{id:"tooltip-back-to-transfer-results",place:"right"}),c.default.createElement(n.CustomThemedTooltip,{className:"pi-z-1000",id:"transfer-list-tooltip-left",place:"left"}))};
|
|
2
2
|
//# sourceMappingURL=SelectContactNumberView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectContactNumberView.js","sources":["../../../src/components/ContactView/SelectContactNumberView.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone, faArrowLeft, faMobile, faHeadset } from '@fortawesome/free-solid-svg-icons'\nimport { clickTransferOrConference, isInsideConferenceList } from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\n\nexport const SelectContactNumberView: FC<SelectContactNumberViewProps> = ({ contact }) => {\n const dispatch = useDispatch<Dispatch>()\n const { t } = useTranslation()\n\n type PhoneNumber = {\n number: string\n type: string\n }\n\n const phoneNumbers = useMemo(() => {\n const phoneNumbers: PhoneNumber[] = []\n\n const phoneTypes = ['extension', 'workphone', 'cellphone']\n\n for (const type of phoneTypes) {\n const phoneNumber = contact?.[type]\n if (phoneNumber) {\n phoneNumbers.push({\n number: phoneNumber,\n type: type,\n })\n }\n }\n return phoneNumbers\n }, [contact])\n\n function getPhoneIcon(type: string) {\n switch (type) {\n case 'extension':\n return faHeadset\n case 'workphone':\n return faOfficePhone\n case 'cellphone':\n return faMobile\n default:\n return faPhone\n }\n }\n\n return (\n <>\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-items-center pi-gap-2 pi-text-gray-900 dark:pi-text-gray-50'>\n <Button\n onClick={() => dispatch.island.setContactListView('main')}\n variant='transparent'\n data-tooltip-id='tooltip-back-to-transfer-results'\n data-tooltip-content={t('Common.Back') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7'>\n {contact?.displayName || '-'}\n </h1>\n </div>\n </div>\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'></div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* Phone numbers of phonebook contact */}\n {phoneNumbers.map((phoneNumber, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n <div className='pi-relative pi-block pi-shrink-0 pi-h-12 pi-w-12 pi-text-base pi-bg-gray-700 dark:pi-bg-gray-200 pi-rounded-full'>\n <div className='pi-text-white dark:pi-text-gray-950 pi-w-full pi-h-full pi-fill-white pi-flex pi-justify-center pi-items-center'>\n <FontAwesomeIcon\n icon={getPhoneIcon(phoneNumber.type)}\n className='pi-h-6 pi-w-6'\n aria-hidden='true'\n />\n </div>\n </div>\n <div>\n <div\n style={{ maxWidth: '196px' }}\n data-stop-propagation={true}\n className='pi-h-fit pi-truncate pi-text-sm pi-font-medium'\n >\n {t(`Phone.${phoneNumber.type}`)}\n </div>\n <div className='pi-text-sm pi-text-gray-700 dark:pi-text-gray-300'>\n {phoneNumber.number}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(phoneNumber.number, dispatch)}\n variant='green'\n data-tooltip-id='transfer-list-tooltip-left'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n <CustomThemedTooltip id={`tooltip-back-to-transfer-results`} place='right' />\n <CustomThemedTooltip className='pi-z-1000' id='transfer-list-tooltip-left' place='left' />\n </>\n )\n}\n\ninterface SelectContactNumberViewProps {\n contact?: PhonebookContact\n}\n"],"names":["_a","contact","dispatch","useDispatch","t","useTranslation","phoneNumbers","useMemo","
|
|
1
|
+
{"version":3,"file":"SelectContactNumberView.js","sources":["../../../src/components/ContactView/SelectContactNumberView.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useMemo } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch } from 'react-redux'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faPhone, faArrowLeft, faMobile, faHeadset } from '@fortawesome/free-solid-svg-icons'\nimport { clickTransferOrConference, isInsideConferenceList } from '../../lib/phone/call'\nimport { Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { PhonebookContact } from '../../types/phonebook'\nimport { faOfficePhone } from '@nethesis/nethesis-solid-svg-icons'\n\nexport const SelectContactNumberView: FC<SelectContactNumberViewProps> = ({ contact }) => {\n const dispatch = useDispatch<Dispatch>()\n const { t } = useTranslation()\n\n type PhoneNumber = {\n number: string\n type: string\n }\n\n const phoneNumbers = useMemo(() => {\n const phoneNumbers: PhoneNumber[] = []\n\n const phoneTypes = ['extension', 'workphone', 'cellphone']\n\n for (const type of phoneTypes) {\n const phoneNumber = contact?.[type]\n if (phoneNumber) {\n phoneNumbers.push({\n number: phoneNumber,\n type: type,\n })\n }\n }\n return phoneNumbers\n }, [contact])\n\n function getPhoneIcon(type: string) {\n switch (type) {\n case 'extension':\n return faHeadset\n case 'workphone':\n return faOfficePhone\n case 'cellphone':\n return faMobile\n default:\n return faPhone\n }\n }\n\n return (\n <>\n <div className='pi-relative pi-flex pi-flex-col'>\n {/* Top section */}\n <div className='pi-relative pi-z-50'>\n <div className='pi-flex pi-items-center pi-gap-2 pi-text-gray-900 dark:pi-text-gray-50'>\n <Button\n onClick={() => dispatch.island.setContactListView('main')}\n variant='transparent'\n data-tooltip-id='tooltip-back-to-transfer-results'\n data-tooltip-content={t('Common.Back') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowLeft} />\n </Button>\n <h1 className='pi-text-lg pi-font-medium pi-leading-7'>\n {contact?.displayName || '-'}\n </h1>\n </div>\n </div>\n <div className='pi-z-30 pi-h-6 pi-pointer-events-none pi-bg-transparent pi-mt-7 pi-pr-4'></div>\n <div style={{ marginTop: '-22px' }} className='pi-flex pi-flex-col pi-gap-7'>\n {/* List section */}\n <div\n style={{ height: '17rem' }}\n className='pi-relative pi-w-full pi-flex pi-flex-col pi-gap-1 pi-overflow-y-auto pi-overflow-x-hidden pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'\n >\n {/* Phone numbers of phonebook contact */}\n {phoneNumbers.map((phoneNumber, i) => (\n <div\n key={i}\n className='pi-flex pi-items-center pi-w-full pi-justify-between pi-px-3 pi-py-1 pi-rounded-md hover:pi-bg-gray-200 hover:dark:pi-bg-gray-800'\n >\n <div className='pi-flex pi-items-center pi-gap-4'>\n <div className='pi-relative pi-block pi-shrink-0 pi-h-12 pi-w-12 pi-text-base pi-bg-gray-700 dark:pi-bg-gray-200 pi-rounded-full'>\n <div className='pi-text-white dark:pi-text-gray-950 pi-w-full pi-h-full pi-fill-white pi-flex pi-justify-center pi-items-center'>\n <FontAwesomeIcon\n icon={getPhoneIcon(phoneNumber.type)}\n className='pi-h-6 pi-w-6'\n aria-hidden='true'\n />\n </div>\n </div>\n <div>\n <div\n style={{ maxWidth: '196px' }}\n data-stop-propagation={true}\n className='pi-h-fit pi-truncate pi-text-sm pi-font-medium'\n >\n {t(`Phone.${phoneNumber.type}`)}\n </div>\n <div className='pi-text-sm pi-text-gray-700 dark:pi-text-gray-300'>\n {phoneNumber.number}\n </div>\n </div>\n </div>\n <div className='pi-flex pi-gap-3.5'>\n <Button\n onClick={() => clickTransferOrConference(phoneNumber.number, dispatch)}\n variant='green'\n data-tooltip-id='transfer-list-tooltip-left'\n data-tooltip-content={\n isInsideConferenceList()\n ? t('Conference.Add participant')\n : t('Tooltip.Transfer call')\n }\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faPhone} />\n </Button>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n <CustomThemedTooltip id={`tooltip-back-to-transfer-results`} place='right' />\n <CustomThemedTooltip className='pi-z-1000' id='transfer-list-tooltip-left' place='left' />\n </>\n )\n}\n\ninterface SelectContactNumberViewProps {\n contact?: PhonebookContact\n}\n"],"names":["_a","contact","dispatch","useDispatch","t","useTranslation","phoneNumbers","useMemo","_i","phoneTypes_1","type","phoneNumber","push","number","getPhoneIcon","faHeadset","faOfficePhone","faMobile","faPhone","React","createElement","Fragment","className","Button","onClick","island","setContactListView","variant","FontAwesomeIcon","icon","faArrowLeft","displayName","style","marginTop","height","map","i","key","maxWidth","concat","clickTransferOrConference","isInsideConferenceList","CustomThemedTooltip","id","place"],"mappings":"m2BAeyE,SAACA,GAAE,IAAAC,EAAOD,EAAAC,QAC3EC,EAAWC,EAAAA,cACTC,EAAMC,qBAORC,EAAeC,EAAAA,QAAQ,WAK3B,IAJA,IAAMD,EAA8B,GAIjBE,EAAA,EAAAC,EAFA,CAAC,YAAa,YAAa,aAE3BD,WAAAA,IAAY,CAA1B,IAAME,EAAID,EAAAD,GACPG,EAAcV,eAAAA,EAAUS,GAC1BC,GACFL,EAAaM,KAAK,CAChBC,OAAQF,EACRD,KAAMA,GAGX,CACD,OAAOJ,CACT,EAAG,CAACL,IAEJ,SAASa,EAAaJ,GACpB,OAAQA,GACN,IAAK,YACH,OAAOK,YACT,IAAK,YACH,OAAOC,gBACT,IAAK,YACH,OAAOC,WACT,QACE,OAAOC,UAEZ,CAED,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,mCAEbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,uBACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,0EACbH,UAAAC,cAACG,EAAAA,OAAM,CACLC,QAAS,WAAM,OAAAtB,EAASuB,OAAOC,mBAAmB,SAClDC,QAAQ,cACQ,kBAAA,mCACM,uBAAAvB,EAAE,gBAAkB,IAE1Ce,UAACC,cAAAQ,EAAAA,gBAAgB,CAAAN,UAAU,gBAAgBO,KAAMC,EAAWA,eAE9DX,EAAA,QAAAC,cAAA,KAAA,CAAIE,UAAU,2CACXrB,aAAA,EAAAA,EAAS8B,cAAe,OAI/BZ,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,4EACfH,UAAKC,cAAA,MAAA,CAAAY,MAAO,CAAEC,UAAW,SAAWX,UAAU,gCAE5CH,EAAAA,QAAAC,cAAA,MAAA,CACEY,MAAO,CAAEE,OAAQ,SACjBZ,UAAU,qUAGThB,EAAa6B,IAAI,SAACxB,EAAayB,GAAM,OACpCjB,UACEC,cAAA,MAAA,CAAAiB,IAAKD,EACLd,UAAU,qIAEVH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oCACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oHACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,mHACbH,EAAAA,QAAAC,cAACQ,EAAAA,gBACC,CAAAC,KAAMf,EAAaH,EAAYD,MAC/BY,UAAU,8BACE,WAIlBH,UAAAC,cAAA,MAAA,KACED,EACE,QAAAC,cAAA,MAAA,CAAAY,MAAO,CAAEM,SAAU,SACI,yBAAA,EACvBhB,UAAU,kDAETlB,EAAE,SAAAmC,OAAS5B,EAAYD,QAE1BS,UAAKC,cAAA,MAAA,CAAAE,UAAU,qDACZX,EAAYE,UAInBM,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sBACbH,EAAC,QAAAC,cAAAG,SACC,CAAAC,QAAS,WAAM,OAAAgB,EAAyBA,0BAAC7B,EAAYE,OAAQX,EAAS,EACtEyB,QAAQ,QACQ,kBAAA,6BAEd,uBAAAc,2BACIrC,EAAE,8BACFA,EAAE,0BAGRe,EAAAA,QAAAC,cAACQ,EAAAA,gBAAgB,CAAAN,UAAU,gBAAgBO,KAAMX,EAAOA,YAI/D,MAIPC,EAAC,QAAAC,cAAAsB,uBAAoBC,GAAI,mCAAoCC,MAAM,UACnEzB,EAAAA,QAAAC,cAACsB,sBAAoB,CAAApB,UAAU,YAAYqB,GAAG,6BAA6BC,MAAM,SAGvF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js"),s=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),r=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),i=require("../../lib/webrtc/messages.js"),n=require("../../store/index.js");require("../../node_modules/react-redux/es/index.js");var o=require("../../static/outgoing_ringtone.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var a=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),u=require("../../utils/customHooks/useEventListener.js"),l=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js");var d=require("../CustomThemedTooltip.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e);exports.TransferActions=function(){var e=c.useDispatch(),m=p.useSelector(function(e){return e.currentCall});function j(){e.currentCall.updateTransferSwitching(!0),i.sendDTMF("*"),n.store.getState().player.audioPlayerPlaying||e.player.updateStartAudioPlayer({src:o.default,loop:!0}),setTimeout(function(){i.sendDTMF("4"),e.player.stopAudioPlayer(),l.eventDispatch("phone-island-call-transfer-switched",{})},500)}m.transferCalls,m.number,u.useEventListener("phone-island-call-transfer-switch",function(){j()});var h=a.useTranslation().t;return f.default.createElement(f.default.Fragment,null,f.default.createElement("div",{className:"pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center"},f.default.createElement("div",null),f.default.createElement(t.Button,{onClick:j,variant:"default","data-tooltip-id":"transfer-actions-tooltip","data-tooltip-content":h("Tooltip.Switch call")||""},f.default.createElement(s.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:r.faArrowsRepeat})),f.default.createElement("div",null)),f.default.createElement(d.CustomThemedTooltip,{className:"pi-z-1000",id:"transfer-actions-tooltip",place:"bottom"}))};
|
|
2
2
|
//# sourceMappingURL=TransferActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransferActions.js","sources":["../../../src/components/ContactView/TransferActions.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 { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowsRepeat } from '@nethesis/nethesis-solid-svg-icons'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store, Dispatch } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { RootState } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\n//// TODO this component and related events seems unused, remove?\n\nexport const TransferActions: FC<TransferActionsProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { transferCalls, number } = useSelector((state: RootState) => state.currentCall)\n\n // Cancels the current transfer through dtmfs\n function switchTransfer() {\n dispatch.currentCall.updateTransferSwitching(true)\n // Start sending the DTMFs for transferring\n sendDTMF('*')\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 setTimeout(() => {\n // Send the second DTMF for transferring\n sendDTMF('4')\n dispatch.player.stopAudioPlayer()\n\n eventDispatch('phone-island-call-transfer-switched', {})\n }, 500)\n }\n useEventListener('phone-island-call-transfer-switch', () => {\n switchTransfer()\n })\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <div></div>\n <Button\n onClick={switchTransfer}\n variant='default'\n data-tooltip-id='transfer-actions-tooltip'\n data-tooltip-content={t('Tooltip.Switch call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowsRepeat} />\n </Button>\n <div></div>\n </div>\n <CustomThemedTooltip className='pi-z-1000' id='transfer-actions-tooltip' place='bottom' />\n </>\n )\n}\n\ninterface TransferActionsProps {}\n\ninterface CurrentCallsTypes {\n [name: string]: {\n name: string\n time: string\n }\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","currentCall","switchTransfer","updateTransferSwitching","sendDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","eventDispatch","useEventListener","t","useTranslation","React","createElement","Fragment","className","Button","onClick","variant","FontAwesomeIcon","icon","faArrowsRepeat","CustomThemedTooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"TransferActions.js","sources":["../../../src/components/ContactView/TransferActions.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 { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowsRepeat } from '@nethesis/nethesis-solid-svg-icons'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { store, Dispatch } from '../../store'\nimport { useDispatch, useSelector } from 'react-redux'\nimport outgoingRingtone from '../../static/outgoing_ringtone'\nimport { RootState } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\n//// TODO this component and related events seems unused, remove?\n\nexport const TransferActions: FC<TransferActionsProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { transferCalls, number } = useSelector((state: RootState) => state.currentCall)\n\n // Cancels the current transfer through dtmfs\n function switchTransfer() {\n dispatch.currentCall.updateTransferSwitching(true)\n // Start sending the DTMFs for transferring\n sendDTMF('*')\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 setTimeout(() => {\n // Send the second DTMF for transferring\n sendDTMF('4')\n dispatch.player.stopAudioPlayer()\n\n eventDispatch('phone-island-call-transfer-switched', {})\n }, 500)\n }\n useEventListener('phone-island-call-transfer-switch', () => {\n switchTransfer()\n })\n\n const { t } = useTranslation()\n\n return (\n <>\n <div className='pi-grid pi-grid-cols-3 pi-auto-cols-max pi-gap-y-5 pi-justify-items-center pi-place-items-center pi-justify-center'>\n <div></div>\n <Button\n onClick={switchTransfer}\n variant='default'\n data-tooltip-id='transfer-actions-tooltip'\n data-tooltip-content={t('Tooltip.Switch call') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faArrowsRepeat} />\n </Button>\n <div></div>\n </div>\n <CustomThemedTooltip className='pi-z-1000' id='transfer-actions-tooltip' place='bottom' />\n </>\n )\n}\n\ninterface TransferActionsProps {}\n\ninterface CurrentCallsTypes {\n [name: string]: {\n name: string\n time: string\n }\n}\n"],"names":["dispatch","useDispatch","_a","useSelector","state","currentCall","switchTransfer","updateTransferSwitching","sendDTMF","store","getState","player","audioPlayerPlaying","updateStartAudioPlayer","src","outgoingRingtone","loop","setTimeout","stopAudioPlayer","eventDispatch","useEventListener","t","useTranslation","React","createElement","Fragment","className","Button","onClick","variant","FontAwesomeIcon","icon","faArrowsRepeat","CustomThemedTooltip","id","place"],"mappings":"+kCAkByD,WACvD,IAAMA,EAAWC,EAAAA,cACXC,EAA4BC,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMC,WAAN,GAGpE,SAASC,IACPN,EAASK,YAAYE,yBAAwB,GAE7CC,EAAQA,SAAC,KACsBC,EAAKA,MAACC,WAAWC,OAAMC,oBAGpDZ,EAASW,OAAOE,uBAAuB,CACrCC,IAAKC,EAAgB,QACrBC,MAAM,IAGVC,WAAW,WAETT,EAAQA,SAAC,KACTR,EAASW,OAAOO,kBAEhBC,gBAAc,sCAAuC,CAAA,EACtD,EAAE,IACJ,0BACDC,EAAgBA,iBAAC,oCAAqC,WACpDd,GACF,GAEQ,IAAAe,EAAMC,qBAEd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,sHACbH,UAAWC,cAAA,MAAA,MACXD,EAAAA,QAAAC,cAACG,EAAAA,OACC,CAAAC,QAAStB,EACTuB,QAAQ,UAAS,kBACD,2BACM,uBAAAR,EAAE,wBAA0B,IAElDE,UAACC,cAAAM,EAAAA,gBAAgB,CAAAJ,UAAU,gBAAgBK,KAAMC,EAAcA,kBAEjET,EAAAA,QAAAC,cAAA,MAAA,OAEFD,EAAAA,QAAAC,cAACS,sBAAoB,CAAAP,UAAU,YAAYQ,GAAG,2BAA2BC,MAAM,WAGrF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./Button.js"),i=require("../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../lib/phone/call.js");require("../node_modules/react-redux/es/index.js"),require("../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./Button.js"),i=require("../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../lib/phone/call.js");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 s=require("../node_modules/react-i18next/dist/es/useTranslation.js"),a=require("../utils/genericFunctions/eventDispatch.js");require("../node_modules/tslib/tslib.es6.js"),require("../store/index.js");var l=require("./CustomThemedTooltip.js"),r=require("../node_modules/framer-motion/dist/es/render/components/motion/proxy.mjs.js"),p=require("../node_modules/react-redux/es/hooks/useSelector.js"),c=require("../node_modules/react-redux/es/hooks/useDispatch.js");function d(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=d(e);exports.default=function(e){e.clickCallback,e.isDestination;var d=e.description,f=e.isPhysicalRecording,m=e.buttonsVariant,h=void 0===m?"transparent":m,g=e.showFullscreenButton,v=void 0!==g&&g,w=e.isExtraLarge,T=void 0!==w&&w,x=e.onToggleExtraLarge,j=p.useSelector(function(e){return e.currentCall}),C=j.transferring,E=j.incoming,D=j.accepted,q=c.useDispatch(),N=p.useSelector(function(e){return e.island}),y=N.isOpen,b=N.sideViewIsVisible,_=N.view,A=p.useSelector(function(e){return e.conference}),F=A.isActive,I=A.conferenceStartedFrom,k=p.useSelector(function(e){return e.currentUser}).username;function S(){E?o.hangupAllExtensions():o.hangupCurrentCall(),setTimeout(function(){q.listen.setUpdateIntrudeStatus(!1,""),q.listen.setUpdateListenStatus(!1,"")},2e3),C&&setTimeout(function(){q.alerts.setAlert("call_transfered"),a.eventDispatch("phone-island-call-transfer-successfully-popup-open",{}),setTimeout(function(){q.alerts.removeAlert("call_transfered"),a.eventDispatch("phone-island-call-transfer-successfully-popup-close",{})},2e3)},300)}var z=s.useTranslation().t,B=y&&D||"waitingConference"===_&&y,L=!C;return u.default.createElement(u.default.Fragment,null,u.default.createElement("div",{className:" ".concat(C?"pi-grid pi-w-full pi-space-x-2 pi-justify-start":"pi-flex pi-justify-center")},u.default.createElement(r.motion.div,{className:"".concat(C&&d?"pi-grid pi-grid-cols-4 pi-ml-4 pi-justify-start":L&&B?"pi-relative pi-flex pi-h-12 pi-w-64 pi-items-center pi-justify-center pi-overflow-hidden":"pi-flex pi-w-12 pi-items-center pi-justify-center"," ")},B&&!v&&u.default.createElement("div",{className:L?"pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1":"pi-grid pi-grid-cols-1"},u.default.createElement(t.Button,{variant:h,onClick:function(){return q.island.handleToggleIsOpen()},"data-tooltip-id":"tooltip-open-close-phone-island","data-tooltip-content":y?z("Tooltip.Collapse")||"":z("Tooltip.Open")||""},u.default.createElement(i.FontAwesomeIcon,{icon:n.faDownLeftAndUpRightToCenter,className:"pi-w-6 pi-h-6"}))),B&&v&&u.default.createElement("div",{className:L?"pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1":"pi-grid pi-grid-cols-1"},u.default.createElement(t.Button,{variant:h,onClick:x,"data-tooltip-id":"tooltip-toggle-fullscreen-hangup","data-tooltip-content":z("streamingAnswer"===_?T?"Tooltip.Decrease":"Tooltip.Increase":"Tooltip.Toggle fullscreen")},u.default.createElement(i.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:T?n.faDownLeftAndUpRightToCenter:n.faUpRightAndDownLeftFromCenter}))),u.default.createElement(t.Button,{onClick:function(){f?(a.eventDispatch("phone-island-sideview-close",{}),a.eventDispatch("phone-island-transcription-close",{}),o.hangupCurrentPhysicalRecording()):F&&I===k&&"waitingConference"===_?(a.eventDispatch("phone-island-sideview-close",{}),a.eventDispatch("phone-island-transcription-close",{}),o.endConference()):(a.eventDispatch("phone-island-sideview-close",{}),a.eventDispatch("phone-island-transcription-close",{}),S())},variant:"red",className:"".concat(C&&d?"pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full pi-col-span-2":L&&B?"pi-relative pi-z-10 pi-gap-4 pi-font-medium pi-text-base pi-transition pi-h-12 pi-w-12 pi-min-w-12 pi-overflow-hidden":"pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full"),"data-tooltip-id":d&&C||"waitingConference"===_&&F?"tooltip-top-transfer":"tooltip-left-transfer","data-tooltip-content":d&&C?d:"waitingConference"===_&&F?z("Conference.End conference"):"".concat(z("Tooltip.Hangup"))},u.default.createElement(i.FontAwesomeIcon,{className:"pi-rotate-135 pi-h-6 pi-w-6",icon:n.faPhone}),C&&d&&u.default.createElement(r.motion.div,{style:{height:"17px"},className:"pi-whitespace-nowrap pi-overflow-hidden"},d)),B&&u.default.createElement(t.Button,{variant:h,onClick:function(){return b&&a.eventDispatch("phone-island-sideview-close",{}),a.eventDispatch("phone-island-transcription-close",{}),void q.island.setIslandView("settings")},"data-tooltip-id":"tooltip-settings-view","data-tooltip-content":z("Tooltip.Go to settings")||"",className:"".concat(C&&d?"pi-ml-5":L?"pi-absolute pi-right-0 pi-top-0 pi-justify-end":"pi-justify-end pi-ml-16"," pi-flex pi-items-center")},u.default.createElement(i.FontAwesomeIcon,{icon:n.faGear,className:"pi-h-6 pi-w-6"})))),u.default.createElement(l.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-left-transfer",place:"left"}),u.default.createElement(l.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-top-transfer",place:"top"}),u.default.createElement(l.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-open-close-phone-island",place:"right"}),u.default.createElement(l.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-settings-view",place:"left"}),u.default.createElement(l.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-toggle-fullscreen-hangup",place:"top"}))};
|
|
2
2
|
//# sourceMappingURL=Hangup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hangup.js","sources":["../../src/components/Hangup.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 { motion } from 'framer-motion'\nimport { Button } from './Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faDownLeftAndUpRightToCenter, faGear, faPhone, faUpRightAndDownLeftFromCenter } from '@fortawesome/free-solid-svg-icons'\nimport { endConference, hangupCurrentCall, hangupCurrentPhysicalRecording } from '../lib/phone/call'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Dispatch } from '../store'\nimport { hangupAllExtensions } from '../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport { eventDispatch } from '../utils'\nimport { CustomThemedTooltip } from './CustomThemedTooltip'\n\n/**\n * Return the status of the\n */\nconst Hangup: FC<HangupProps> = ({\n clickCallback,\n isDestination,\n description,\n isPhysicalRecording,\n buttonsVariant = 'transparent',\n showFullscreenButton = false,\n isExtraLarge = false,\n onToggleExtraLarge,\n}) => {\n const { transferring, incoming, accepted } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n const { isOpen, sideViewIsVisible, view } = useSelector((state: RootState) => state.island)\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n\n function handleHangup() {\n if (incoming) {\n hangupAllExtensions()\n } else {\n hangupCurrentCall()\n }\n\n // Delay the dispatch actions\n setTimeout(() => {\n dispatch.listen.setUpdateIntrudeStatus(false, '')\n dispatch.listen.setUpdateListenStatus(false, '')\n }, 2000)\n\n // Show confirmation message when a call is transferred\n if (transferring) {\n setTimeout(() => {\n dispatch.alerts.setAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-open', {})\n setTimeout(() => {\n dispatch.alerts.removeAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-close', {})\n }, 2000)\n }, 300)\n }\n }\n\n const { t } = useTranslation()\n const showSecondaryControls = (isOpen && accepted) || (view === 'waitingConference' && isOpen)\n const useCompactLayout = !transferring\n\n // Helper function to determine tooltip content\n const getToggleTooltipContent = () => {\n if (view === 'streamingAnswer') {\n return isExtraLarge ? t('Tooltip.Decrease') : t('Tooltip.Increase')\n }\n return t('Tooltip.Toggle fullscreen')\n }\n\n // Close side view and open settings view\n const closeSideViewOpenSettings = () => {\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n eventDispatch('phone-island-transcription-close', {})\n dispatch.island.setIslandView('settings')\n }\n\n // Phone island footer section\n return (\n <>\n <div\n className={` ${transferring\n ? 'pi-grid pi-w-full pi-space-x-2 pi-justify-start'\n : 'pi-flex pi-justify-center'\n }`}\n >\n {/* The button to hangup the currentCall */}\n <motion.div\n className={`${transferring && description\n ? 'pi-grid pi-grid-cols-4 pi-ml-4 pi-justify-start'\n : useCompactLayout && showSecondaryControls\n ? 'pi-relative pi-flex pi-h-12 pi-w-64 pi-items-center pi-justify-center pi-overflow-hidden'\n : 'pi-flex pi-w-12 pi-items-center pi-justify-center'\n } `}\n >\n {/* collapse phone island button */}\n {showSecondaryControls && !showFullscreenButton && (\n <div className={useCompactLayout ? 'pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1' : 'pi-grid pi-grid-cols-1'}>\n <Button\n variant={buttonsVariant}\n onClick={() => dispatch.island.handleToggleIsOpen()}\n data-tooltip-id='tooltip-open-close-phone-island'\n data-tooltip-content={\n isOpen ? t('Tooltip.Collapse') || '' : t('Tooltip.Open') || ''\n }\n >\n <FontAwesomeIcon icon={faDownLeftAndUpRightToCenter} className='pi-w-6 pi-h-6' />\n </Button>\n </div>\n )}\n\n {/* expand/compress button for streaming */}\n {showSecondaryControls && showFullscreenButton && (\n <div className={useCompactLayout ? 'pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1' : 'pi-grid pi-grid-cols-1'}>\n <Button\n variant={buttonsVariant}\n onClick={onToggleExtraLarge}\n data-tooltip-id='tooltip-toggle-fullscreen-hangup'\n data-tooltip-content={getToggleTooltipContent()}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isExtraLarge ? faDownLeftAndUpRightToCenter : faUpRightAndDownLeftFromCenter}\n />\n </Button>\n </div>\n )}\n\n <Button\n onClick={() => {\n if (isPhysicalRecording) {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n hangupCurrentPhysicalRecording()\n } else if (isActive) {\n if (conferenceStartedFrom === username && view === 'waitingConference') {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n endConference()\n } else {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n handleHangup()\n }\n } else {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n handleHangup()\n }\n }}\n variant='red'\n className={`${transferring && description\n ? 'pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full pi-col-span-2'\n : useCompactLayout && showSecondaryControls\n ? 'pi-relative pi-z-10 pi-gap-4 pi-font-medium pi-text-base pi-transition pi-h-12 pi-w-12 pi-min-w-12 pi-overflow-hidden'\n : 'pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full'\n }`}\n data-tooltip-id={\n (description && transferring) || (view === 'waitingConference' && isActive)\n ? 'tooltip-top-transfer'\n : 'tooltip-left-transfer'\n }\n data-tooltip-content={\n description && transferring\n ? description\n : view === 'waitingConference' && isActive\n ? t('Conference.End conference')\n : `${t('Tooltip.Hangup')}`\n }\n >\n <FontAwesomeIcon className='pi-rotate-135 pi-h-6 pi-w-6' icon={faPhone} />\n {transferring && description && (\n <motion.div\n style={{ height: '17px' }}\n className='pi-whitespace-nowrap pi-overflow-hidden'\n >\n {description}\n </motion.div>\n )}\n </Button>\n {showSecondaryControls && (\n <Button\n variant={buttonsVariant}\n onClick={() => closeSideViewOpenSettings()}\n data-tooltip-id='tooltip-settings-view'\n data-tooltip-content={t('Tooltip.Go to settings') || ''}\n className={`${transferring && description\n ? 'pi-ml-5'\n : useCompactLayout\n ? 'pi-absolute pi-right-0 pi-top-0 pi-justify-end'\n : 'pi-justify-end pi-ml-16'\n } pi-flex pi-items-center`}\n >\n <FontAwesomeIcon icon={faGear} className={`pi-h-6 pi-w-6`} />\n </Button>\n )}\n </motion.div>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-left-transfer' place='left' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-top-transfer' place='top' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-open-close-phone-island' place='right' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-settings-view' place='left' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-fullscreen-hangup' place='top' />\n </>\n )\n}\n\nexport default Hangup\n\ninterface HangupProps {\n clickCallback?: () => void\n isDestination?: boolean\n description?: any\n isPhysicalRecording?: boolean\n buttonsVariant?:\n | 'transparent'\n | 'default'\n | 'red'\n | 'green'\n | 'neutral'\n | 'transparentSideView'\n | 'transparentSettings'\n showFullscreenButton?: boolean\n isFullscreen?: boolean\n onToggleFullscreen?: () => void\n isExtraLarge?: boolean\n onToggleExtraLarge?: () => void\n}\n"],"names":["_a","clickCallback","isDestination","description","isPhysicalRecording","_b","buttonsVariant","_c","showFullscreenButton","_d","isExtraLarge","onToggleExtraLarge","_e","useSelector","state","currentCall","transferring","incoming","accepted","dispatch","useDispatch","_f","island","isOpen","sideViewIsVisible","view","_g","conference","isActive","conferenceStartedFrom","username","currentUser","handleHangup","hangupAllExtensions","hangupCurrentCall","setTimeout","listen","setUpdateIntrudeStatus","setUpdateListenStatus","alerts","setAlert","eventDispatch","removeAlert","t","useTranslation","showSecondaryControls","useCompactLayout","React","createElement","Fragment","className","concat","motion","div","Button","variant","onClick","handleToggleIsOpen","FontAwesomeIcon","icon","faDownLeftAndUpRightToCenter","faUpRightAndDownLeftFromCenter","hangupCurrentPhysicalRecording","endConference","faPhone","style","height","setIslandView","faGear","CustomThemedTooltip","id","place"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Hangup.js","sources":["../../src/components/Hangup.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 { motion } from 'framer-motion'\nimport { Button } from './Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faDownLeftAndUpRightToCenter, faGear, faPhone, faUpRightAndDownLeftFromCenter } from '@fortawesome/free-solid-svg-icons'\nimport { endConference, hangupCurrentCall, hangupCurrentPhysicalRecording } from '../lib/phone/call'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { RootState } from '../store'\nimport { Dispatch } from '../store'\nimport { hangupAllExtensions } from '../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport { eventDispatch } from '../utils'\nimport { CustomThemedTooltip } from './CustomThemedTooltip'\n\n/**\n * Return the status of the\n */\nconst Hangup: FC<HangupProps> = ({\n clickCallback,\n isDestination,\n description,\n isPhysicalRecording,\n buttonsVariant = 'transparent',\n showFullscreenButton = false,\n isExtraLarge = false,\n onToggleExtraLarge,\n}) => {\n const { transferring, incoming, accepted } = useSelector((state: RootState) => state.currentCall)\n const dispatch = useDispatch<Dispatch>()\n const { isOpen, sideViewIsVisible, view } = useSelector((state: RootState) => state.island)\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n\n function handleHangup() {\n if (incoming) {\n hangupAllExtensions()\n } else {\n hangupCurrentCall()\n }\n\n // Delay the dispatch actions\n setTimeout(() => {\n dispatch.listen.setUpdateIntrudeStatus(false, '')\n dispatch.listen.setUpdateListenStatus(false, '')\n }, 2000)\n\n // Show confirmation message when a call is transferred\n if (transferring) {\n setTimeout(() => {\n dispatch.alerts.setAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-open', {})\n setTimeout(() => {\n dispatch.alerts.removeAlert('call_transfered')\n eventDispatch('phone-island-call-transfer-successfully-popup-close', {})\n }, 2000)\n }, 300)\n }\n }\n\n const { t } = useTranslation()\n const showSecondaryControls = (isOpen && accepted) || (view === 'waitingConference' && isOpen)\n const useCompactLayout = !transferring\n\n // Helper function to determine tooltip content\n const getToggleTooltipContent = () => {\n if (view === 'streamingAnswer') {\n return isExtraLarge ? t('Tooltip.Decrease') : t('Tooltip.Increase')\n }\n return t('Tooltip.Toggle fullscreen')\n }\n\n // Close side view and open settings view\n const closeSideViewOpenSettings = () => {\n if (sideViewIsVisible) {\n eventDispatch('phone-island-sideview-close', {})\n }\n eventDispatch('phone-island-transcription-close', {})\n dispatch.island.setIslandView('settings')\n }\n\n // Phone island footer section\n return (\n <>\n <div\n className={` ${transferring\n ? 'pi-grid pi-w-full pi-space-x-2 pi-justify-start'\n : 'pi-flex pi-justify-center'\n }`}\n >\n {/* The button to hangup the currentCall */}\n <motion.div\n className={`${transferring && description\n ? 'pi-grid pi-grid-cols-4 pi-ml-4 pi-justify-start'\n : useCompactLayout && showSecondaryControls\n ? 'pi-relative pi-flex pi-h-12 pi-w-64 pi-items-center pi-justify-center pi-overflow-hidden'\n : 'pi-flex pi-w-12 pi-items-center pi-justify-center'\n } `}\n >\n {/* collapse phone island button */}\n {showSecondaryControls && !showFullscreenButton && (\n <div className={useCompactLayout ? 'pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1' : 'pi-grid pi-grid-cols-1'}>\n <Button\n variant={buttonsVariant}\n onClick={() => dispatch.island.handleToggleIsOpen()}\n data-tooltip-id='tooltip-open-close-phone-island'\n data-tooltip-content={\n isOpen ? t('Tooltip.Collapse') || '' : t('Tooltip.Open') || ''\n }\n >\n <FontAwesomeIcon icon={faDownLeftAndUpRightToCenter} className='pi-w-6 pi-h-6' />\n </Button>\n </div>\n )}\n\n {/* expand/compress button for streaming */}\n {showSecondaryControls && showFullscreenButton && (\n <div className={useCompactLayout ? 'pi-absolute pi-left-0 pi-top-0 pi-grid pi-grid-cols-1' : 'pi-grid pi-grid-cols-1'}>\n <Button\n variant={buttonsVariant}\n onClick={onToggleExtraLarge}\n data-tooltip-id='tooltip-toggle-fullscreen-hangup'\n data-tooltip-content={getToggleTooltipContent()}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isExtraLarge ? faDownLeftAndUpRightToCenter : faUpRightAndDownLeftFromCenter}\n />\n </Button>\n </div>\n )}\n\n <Button\n onClick={() => {\n if (isPhysicalRecording) {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n hangupCurrentPhysicalRecording()\n } else if (isActive) {\n if (conferenceStartedFrom === username && view === 'waitingConference') {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n endConference()\n } else {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n handleHangup()\n }\n } else {\n eventDispatch('phone-island-sideview-close', {})\n eventDispatch('phone-island-transcription-close', {})\n handleHangup()\n }\n }}\n variant='red'\n className={`${transferring && description\n ? 'pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full pi-col-span-2'\n : useCompactLayout && showSecondaryControls\n ? 'pi-relative pi-z-10 pi-gap-4 pi-font-medium pi-text-base pi-transition pi-h-12 pi-w-12 pi-min-w-12 pi-overflow-hidden'\n : 'pi-gap-4 pi-font-medium pi-text-base pi-transition pi-min-w-12 pi-w-full'\n }`}\n data-tooltip-id={\n (description && transferring) || (view === 'waitingConference' && isActive)\n ? 'tooltip-top-transfer'\n : 'tooltip-left-transfer'\n }\n data-tooltip-content={\n description && transferring\n ? description\n : view === 'waitingConference' && isActive\n ? t('Conference.End conference')\n : `${t('Tooltip.Hangup')}`\n }\n >\n <FontAwesomeIcon className='pi-rotate-135 pi-h-6 pi-w-6' icon={faPhone} />\n {transferring && description && (\n <motion.div\n style={{ height: '17px' }}\n className='pi-whitespace-nowrap pi-overflow-hidden'\n >\n {description}\n </motion.div>\n )}\n </Button>\n {showSecondaryControls && (\n <Button\n variant={buttonsVariant}\n onClick={() => closeSideViewOpenSettings()}\n data-tooltip-id='tooltip-settings-view'\n data-tooltip-content={t('Tooltip.Go to settings') || ''}\n className={`${transferring && description\n ? 'pi-ml-5'\n : useCompactLayout\n ? 'pi-absolute pi-right-0 pi-top-0 pi-justify-end'\n : 'pi-justify-end pi-ml-16'\n } pi-flex pi-items-center`}\n >\n <FontAwesomeIcon icon={faGear} className={`pi-h-6 pi-w-6`} />\n </Button>\n )}\n </motion.div>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-left-transfer' place='left' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-top-transfer' place='top' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-open-close-phone-island' place='right' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-settings-view' place='left' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-fullscreen-hangup' place='top' />\n </>\n )\n}\n\nexport default Hangup\n\ninterface HangupProps {\n clickCallback?: () => void\n isDestination?: boolean\n description?: any\n isPhysicalRecording?: boolean\n buttonsVariant?:\n | 'transparent'\n | 'default'\n | 'red'\n | 'green'\n | 'neutral'\n | 'transparentSideView'\n | 'transparentSettings'\n showFullscreenButton?: boolean\n isFullscreen?: boolean\n onToggleFullscreen?: () => void\n isExtraLarge?: boolean\n onToggleExtraLarge?: () => void\n}\n"],"names":["_a","clickCallback","isDestination","description","isPhysicalRecording","_b","buttonsVariant","_c","showFullscreenButton","_d","isExtraLarge","onToggleExtraLarge","_e","useSelector","state","currentCall","transferring","incoming","accepted","dispatch","useDispatch","_f","island","isOpen","sideViewIsVisible","view","_g","conference","isActive","conferenceStartedFrom","username","currentUser","handleHangup","hangupAllExtensions","hangupCurrentCall","setTimeout","listen","setUpdateIntrudeStatus","setUpdateListenStatus","alerts","setAlert","eventDispatch","removeAlert","t","useTranslation","showSecondaryControls","useCompactLayout","React","createElement","Fragment","className","concat","motion","div","Button","variant","onClick","handleToggleIsOpen","FontAwesomeIcon","icon","faDownLeftAndUpRightToCenter","faUpRightAndDownLeftFromCenter","hangupCurrentPhysicalRecording","endConference","faPhone","style","height","setIslandView","faGear","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"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var r=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),a=require("./Actions.js"),o=require("../../lib/webrtc/messages.js"),n=require("../../lib/island/island.js"),s=require("../../lib/phone/call.js");require("../../node_modules/i18next/dist/esm/i18next.js"),require("../../node_modules/react-i18next/dist/es/context.js");var l=require("../../node_modules/react-i18next/dist/es/useTranslation.js"),u=require("../../lib/user/default_device.js"),d=require("../../services/astproxy.js"),c=require("../../utils/customHooks/useEventListener.js"),p=require("../../utils/genericFunctions/eventDispatch.js");require("../../node_modules/tslib/tslib.es6.js"),require("../../store/index.js");var f=require("../CustomThemedTooltip.js"),m=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),x=require("../../node_modules/react-redux/es/hooks/useSelector.js");function v(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var y=v(e),b=["0","1","2","3","4","5","6","7","8","9","*","#"];exports.default=function(){var v=m.useDispatch(),k=x.useSelector(function(e){return e.currentCall}).keypadValue,j=x.useSelector(function(e){return e.island}).isOpen,q=e.useRef(k);function h(e){v.currentCall.updateKeypadValue("".concat(q.current).concat(e)),q.current="".concat(q.current).concat(e),s.playDtmfAudio(e),u.isWebRTC()?o.sendDTMF(e):d.sendPhysicalDTMF(e),p.eventDispatch("phone-island-call-keypad-sent",{})}c.useEventListener("phone-island-call-keypad-send",function(e){h(e.key)}),e.useEffect(function(){function e(e){b.includes(e.key)&&h(e.key)}return window.addEventListener("keydown",e),function(){return window.removeEventListener("keydown",e)}},[]);var g=l.useTranslation().t;return y.default.createElement(y.default.Fragment,null,j?y.default.createElement("div",{className:"pi-flex pi-flex-col pi-gap-7"},y.default.createElement("div",{className:"pi-flex pi-gap-4"},y.default.createElement(t.Button,{variant:"transparent",onClick:n.backToPreviousView,"data-tooltip-id":"keyboard-tooltip","data-tooltip-content":g("Tooltip.Back to call")||""},y.default.createElement(r.FontAwesomeIcon,{size:"xl",icon:i.faArrowLeft})),y.default.createElement("input",{"data-stop-propagation":!0,type:"text",readOnly:!0,placeholder:g("Common.Enter a phone number")||"",value:k,autoFocus:!0,className:"pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:focus:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]"})),y.default.createElement(a.default,{keyCallback:h})):y.default.createElement("div",{className:"pi-font-medium pi-text-base"},"Keypad"),y.default.createElement(f.CustomThemedTooltip,{className:"pi-z-1000",id:"keyboard-tooltip",place:"right"}))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons'\nimport Actions from './Actions'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { backToPreviousView } from '../../lib/island/island'\nimport { playDtmfAudio } from '../../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n if (isWebRTC()) {\n sendDTMF(key)\n } else {\n sendPhysicalDTMF(key)\n }\n\n eventDispatch('phone-island-call-keypad-sent', {})\n }\n useEventListener('phone-island-call-keypad-send', (data: KeypadTypes) => {\n sendKey(data.key)\n })\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n const { t } = useTranslation()\n\n return (\n <>\n {isOpen ? (\n <div className='pi-flex pi-flex-col pi-gap-7'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={backToPreviousView}\n data-tooltip-id='keyboard-tooltip'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n readOnly\n placeholder={t('Common.Enter a phone number') || ''}\n value={keypadValue}\n autoFocus\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:focus:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n <Actions keyCallback={sendKey} />\n </div>\n ) : (\n <div className='pi-font-medium pi-text-base'>Keypad</div>\n )}\n <CustomThemedTooltip className='pi-z-1000' id='keyboard-tooltip' place='right' />\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n\ninterface KeypadTypes {\n key: string\n}\n"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","playDtmfAudio","isWebRTC","sendDTMF","sendPhysicalDTMF","eventDispatch","useEventListener","data","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","t","useTranslation","React","createElement","Fragment","className","Button","variant","onClick","backToPreviousView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","placeholder","value","autoFocus","Actions","keyCallback","CustomThemedTooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/KeypadView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faArrowLeft } from '@fortawesome/free-solid-svg-icons'\nimport Actions from './Actions'\nimport { sendDTMF } from '../../lib/webrtc/messages'\nimport { backToPreviousView } from '../../lib/island/island'\nimport { playDtmfAudio } from '../../lib/phone/call'\nimport { useTranslation } from 'react-i18next'\nimport { isWebRTC } from '../../lib/user/default_device'\nimport { sendPhysicalDTMF } from '../../services/astproxy'\nimport { useEventListener, eventDispatch } from '../../utils'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nconst DTMF_KEYS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#']\n\nconst KeypadView: FC<KeypadViewTypes> = () => {\n const dispatch = useDispatch<Dispatch>()\n const { keypadValue } = useSelector((state: RootState) => state.currentCall)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const keypadValueRef = useRef<typeof keypadValue>(keypadValue)\n\n function sendKey(key: string) {\n dispatch.currentCall.updateKeypadValue(`${keypadValueRef.current}${key}`)\n keypadValueRef.current = `${keypadValueRef.current}${key}`\n playDtmfAudio(key)\n if (isWebRTC()) {\n sendDTMF(key)\n } else {\n sendPhysicalDTMF(key)\n }\n\n eventDispatch('phone-island-call-keypad-sent', {})\n }\n useEventListener('phone-island-call-keypad-send', (data: KeypadTypes) => {\n sendKey(data.key)\n })\n\n useEffect(() => {\n function handlePhysicalKeydown(event) {\n if (DTMF_KEYS.includes(event.key)) {\n sendKey(event.key)\n }\n }\n window.addEventListener('keydown', handlePhysicalKeydown)\n return () => window.removeEventListener('keydown', handlePhysicalKeydown)\n }, [])\n\n const { t } = useTranslation()\n\n return (\n <>\n {isOpen ? (\n <div className='pi-flex pi-flex-col pi-gap-7'>\n <div className='pi-flex pi-gap-4'>\n <Button\n variant='transparent'\n onClick={backToPreviousView}\n data-tooltip-id='keyboard-tooltip'\n data-tooltip-content={t('Tooltip.Back to call') || ''}\n >\n <FontAwesomeIcon size='xl' icon={faArrowLeft} />\n </Button>\n <input\n data-stop-propagation={true}\n type='text'\n readOnly\n placeholder={t('Common.Enter a phone number') || ''}\n value={keypadValue}\n autoFocus\n className='pi-w-full pi-rounded-full dark:pi-bg-gray-950 pi-bg-gray-50 pi-border-2 pi-border-emerald-500 dark:pi-border-emerald-200 active:pi-border-emerald-500 dark:active:focus:pi-border-emerald-200 focus:pi-border-emerald-500 dark:focus:pi-border-emerald-200 pi-text-gray-900 dark:pi-text-gray-50 pi-font-light pi-text-xl pi-text-center pi-px-2 focus:pi-outline-0 focus:pi-ring-0 pi-placeholder-gray-400 dark:pi-placeholder-gray-500 pi-font-[inherit]'\n />\n </div>\n <Actions keyCallback={sendKey} />\n </div>\n ) : (\n <div className='pi-font-medium pi-text-base'>Keypad</div>\n )}\n <CustomThemedTooltip className='pi-z-1000' id='keyboard-tooltip' place='right' />\n </>\n )\n}\n\nexport default KeypadView\n\nexport interface KeypadViewTypes {}\n\ninterface KeypadTypes {\n key: string\n}\n"],"names":["DTMF_KEYS","dispatch","useDispatch","keypadValue","useSelector","state","currentCall","isOpen","island","keypadValueRef","useRef","sendKey","key","updateKeypadValue","concat","current","playDtmfAudio","isWebRTC","sendDTMF","sendPhysicalDTMF","eventDispatch","useEventListener","data","useEffect","handlePhysicalKeydown","event","includes","window","addEventListener","removeEventListener","t","useTranslation","React","createElement","Fragment","className","Button","variant","onClick","backToPreviousView","FontAwesomeIcon","size","icon","faArrowLeft","type","readOnly","placeholder","value","autoFocus","Actions","keyCallback","CustomThemedTooltip","id","place"],"mappings":"ksCAmBMA,EAAY,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,qBAElC,WACtC,IAAMC,EAAWC,EAAAA,cACTC,EAAgBC,cAAY,SAACC,GAAqB,OAAAA,EAAMC,0BACxDC,EAAWH,cAAY,SAACC,GAAqB,OAAAA,EAAMG,gBACrDC,EAAiBC,SAA2BP,GAElD,SAASQ,EAAQC,GACfX,EAASK,YAAYO,kBAAkB,GAAAC,OAAGL,EAAeM,SAAOD,OAAGF,IACnEH,EAAeM,QAAU,GAAGD,OAAAL,EAAeM,SAAOD,OAAGF,GACrDI,EAAaA,cAACJ,GACVK,EAAQA,WACVC,EAAQA,SAACN,GAETO,EAAgBA,iBAACP,GAGnBQ,gBAAc,gCAAiC,CAAA,EAChD,CACDC,mBAAiB,gCAAiC,SAACC,GACjDX,EAAQW,EAAKV,IACf,GAEAW,EAAAA,UAAU,WACR,SAASC,EAAsBC,GACzBzB,EAAU0B,SAASD,EAAMb,MAC3BD,EAAQc,EAAMb,IAEjB,CAED,OADAe,OAAOC,iBAAiB,UAAWJ,GAC5B,WAAM,OAAAG,OAAOE,oBAAoB,UAAWL,GACpD,EAAE,IAEK,IAAAM,EAAMC,qBAEd,OACEC,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACG3B,EACCyB,EAAK,QAAAC,cAAA,MAAA,CAAAE,UAAU,gCACbH,EAAAA,QAAKC,cAAA,MAAA,CAAAE,UAAU,oBACbH,EAAAA,QAAAC,cAACG,EAAAA,OACC,CAAAC,QAAQ,cACRC,QAASC,EAAkBA,mBAAA,kBACX,mBACM,uBAAAT,EAAE,yBAA2B,IAEnDE,UAACC,cAAAO,EAAAA,gBAAgB,CAAAC,KAAK,KAAKC,KAAMC,EAAWA,eAE9CX,UACyBC,cAAA,QAAA,CAAA,yBAAA,EACvBW,KAAK,OACLC,UACA,EAAAC,YAAahB,EAAE,gCAAkC,GACjDiB,MAAO5C,EACP6C,WAAS,EACTb,UAAU,gcAGdH,EAAA,QAAAC,cAACgB,EAAO,QAAC,CAAAC,YAAavC,KAGxBqB,EAAA,QAAAC,cAAA,MAAA,CAAKE,UAAU,yCAEjBH,EAAAA,QAAAC,cAACkB,sBAAoB,CAAAhB,UAAU,YAAYiB,GAAG,mBAAmBC,MAAM,UAG7E"}
|
|
@@ -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"),r=require("../Button.js"),l=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),n=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),u=require("../GenericAvatar.js"),a=require("../CustomThemedTooltip.js"),i=require("../../node_modules/react-redux/es/hooks/useSelector.js"),o=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=s(e);exports.OperatorBusyView=function(){var s=i.useSelector(function(e){return e.island}),d=s.operatorBusy,m=s.previousView,f=i.useSelector(function(e){return e.avatars}).avatars,p=i.useSelector(function(e){return e.users}).extensions,v=t.useTranslation().t,x=o.useDispatch(),N=i.useSelector(function(e){return e.conference}),b=N.isActive,y=N.conferenceStartedFrom,j=i.useSelector(function(e){return e.currentUser}).username,w=i.useSelector(function(e){return e.currentCall}),E=w.accepted,q=w.incoming,C=w.outgoing,k=e.useCallback(function(){return b&&y===j?"waitingConference":E||q||C?m||"call":null},[E,y,q,b,C,m,j]),_=e.useCallback(function(){x.player.stopAudioPlayer(),x.island.resetOperatorBusyCompletely(),x.island.setIslandView(k())},[x,k]),T=e.useMemo(function(){if((null==d?void 0:d.calledNumber)&&p){var e=Object.values(p).find(function(e){return e.exten===(null==d?void 0:d.calledNumber)});return e?null==e?void 0:e.username:null}return null},[p,null==d?void 0:d.calledNumber]),g=e.useMemo(function(){return T&&f&&f[T]?f[T]:null},[f,T]),h=e.useMemo(function(){return null!==T},[T]),S=e.useMemo(function(){if(p&&(null==d?void 0:d.calledNumber)&&""!==(null==d?void 0:d.calledNumber)){var e=Object.values(p).find(function(e){return(null==e?void 0:e.exten)===(null==d?void 0:d.calledNumber)});return e&&(null==e?void 0:e.name)&&""!==(null==e?void 0:e.name)?null==e?void 0:e.name:null==d?void 0:d.calledNumber}return"-"},[null==d?void 0:d.calledNumber,p]),A=e.useMemo(function(){return v(h?"Call.User busy":"Call.Number busy")},[v,h]);return e.useEffect(function(){return function(){x.player.stopAudioPlayer()}},[x]),e.useEffect(function(){var e=window.setTimeout(function(){_()},4e3);return function(){window.clearTimeout(e)}},[_]),c.default.createElement(c.default.Fragment,null,c.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-between pi-w-full"},c.default.createElement("div",{className:"pi-flex pi-items-center pi-space-x-3"},c.default.createElement(u.GenericAvatar,{avatarUrl:g,size:"open",showPulseEffect:!1}),c.default.createElement("div",{className:"pi-flex pi-flex-col"},c.default.createElement("div",{className:"pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},S),c.default.createElement("div",{className:"pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark"},A))),c.default.createElement(r.Button,{variant:"default",onClick:_,className:"pi-p-2","data-tooltip-id":"tooltip-close-busy-call","data-tooltip-content":v("Tooltip.Close")||"Close"},c.default.createElement(l.FontAwesomeIcon,{icon:n.faXmark,className:"pi-w-5 pi-h-5"}))),c.default.createElement(a.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-close-busy-call",place:"left"}))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy, previousView } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const { accepted, incoming, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const getNextViewOnClose = useCallback(() => {\n if (isActive && conferenceStartedFrom === username) {\n return 'waitingConference'\n }\n\n if (accepted || incoming || outgoing) {\n return previousView || 'call'\n }\n\n return null\n }, [accepted, conferenceStartedFrom, incoming, isActive, outgoing, previousView, username])\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n dispatch.island.setIslandView(getNextViewOnClose())\n }, [dispatch, getNextViewOnClose])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => {\n handleClose()\n }, 4000)\n\n return () => {\n window.clearTimeout(timeoutId)\n }\n }, [handleClose])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["_a","useSelector","state","island","operatorBusy","previousView","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_b","conference","isActive","conferenceStartedFrom","username","currentUser","_c","currentCall","accepted","incoming","outgoing","getNextViewOnClose","useCallback","handleClose","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","timeoutId","window","setTimeout","clearTimeout","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/OperatorBusyView/index.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useCallback, useMemo, useEffect } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { RootState, Dispatch } from '../../store'\nimport { useTranslation } from 'react-i18next'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faXmark } from '@fortawesome/free-solid-svg-icons'\nimport { GenericAvatar } from '../GenericAvatar'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\n\nexport const OperatorBusyView: FC<OperatorBusyViewProps> = () => {\n const { operatorBusy, previousView } = useSelector((state: RootState) => state.island)\n const { avatars } = useSelector((state: RootState) => state.avatars)\n const { extensions } = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n const dispatch = useDispatch<Dispatch>()\n const { isActive, conferenceStartedFrom } = useSelector((state: RootState) => state.conference)\n const { username } = useSelector((state: RootState) => state.currentUser)\n const { accepted, incoming, outgoing } = useSelector((state: RootState) => state.currentCall)\n\n const getNextViewOnClose = useCallback(() => {\n if (isActive && conferenceStartedFrom === username) {\n return 'waitingConference'\n }\n\n if (accepted || incoming || outgoing) {\n return previousView || 'call'\n }\n\n return null\n }, [accepted, conferenceStartedFrom, incoming, isActive, outgoing, previousView, username])\n\n const handleClose = useCallback(() => {\n // Stop any playing busy tone\n dispatch.player.stopAudioPlayer()\n // Reset operator busy state completely when user closes manually\n dispatch.island.resetOperatorBusyCompletely()\n dispatch.island.setIslandView(getNextViewOnClose())\n }, [dispatch, getNextViewOnClose])\n\n // Get the username of the operator based on called extension number\n const operatorUsername = useMemo(() => {\n // Check if we have the called number and extensions are loaded\n if (operatorBusy?.calledNumber && extensions) {\n // Find the extension that matches the called number\n const extension = Object.values(extensions).find(\n (ext) => ext.exten === operatorBusy?.calledNumber,\n )\n // Return the username if found\n return extension ? extension?.username : null\n }\n return null\n }, [extensions, operatorBusy?.calledNumber])\n\n // Get avatar URL based on operator's username\n const avatarUrl = useMemo(() => {\n // If we have the username and avatars, look for the avatar\n if (operatorUsername && avatars && avatars[operatorUsername]) {\n return avatars[operatorUsername]\n }\n return null\n }, [avatars, operatorUsername])\n\n // Check if the called number is an operator (has username)\n const isOperator = useMemo(() => {\n return operatorUsername !== null\n }, [operatorUsername])\n\n // Format display text - show the operator name or called number\n const displayText = useMemo(() => {\n if (extensions && operatorBusy?.calledNumber && operatorBusy?.calledNumber !== '') {\n // Try to get the extension to display the name if available\n const extension = Object.values(extensions).find(\n (ext) => ext?.exten === operatorBusy?.calledNumber,\n )\n\n // If we found the extension and it has a name, show the name\n if (extension && extension?.name && extension?.name !== '') {\n return extension?.name\n }\n\n // Otherwise just show the extension number\n return operatorBusy?.calledNumber\n }\n //fallback string\n return '-'\n }, [operatorBusy?.calledNumber, extensions])\n\n const statusText = useMemo(() => {\n // If it's an operator, show \"User busy\", otherwise show \"Number busy\"\n if (isOperator) {\n return t('Call.User busy')\n }\n return t('Call.Number busy')\n }, [t, isOperator])\n\n // Stop busy tone when component unmounts\n useEffect(() => {\n return () => {\n dispatch.player.stopAudioPlayer()\n }\n }, [dispatch])\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => {\n handleClose()\n }, 4000)\n\n return () => {\n window.clearTimeout(timeoutId)\n }\n }, [handleClose])\n\n return (\n <>\n <div className='pi-flex pi-items-center pi-justify-between pi-w-full'>\n {/* Left side - Avatar and info */}\n <div className='pi-flex pi-items-center pi-space-x-3'>\n {/* Avatar */}\n <GenericAvatar avatarUrl={avatarUrl} size='open' showPulseEffect={false} />\n\n {/* Number and status */}\n <div className='pi-flex pi-flex-col'>\n <div className='pi-text-lg pi-font-medium pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {displayText}\n </div>\n <div className='pi-text-sm pi-font-regular pi-text-primaryNeutral dark:pi-text-primaryNeutralDark'>\n {statusText}\n </div>\n </div>\n </div>\n\n {/* Right side - Close button */}\n <Button\n variant='default'\n onClick={handleClose}\n className='pi-p-2'\n data-tooltip-id='tooltip-close-busy-call'\n data-tooltip-content={t('Tooltip.Close') || 'Close'}\n >\n <FontAwesomeIcon icon={faXmark} className='pi-w-5 pi-h-5' />\n </Button>\n </div>\n <CustomThemedTooltip className='pi-z-20' id='tooltip-close-busy-call' place='left' />\n </>\n )\n}\n\nexport interface OperatorBusyViewProps {}\n"],"names":["_a","useSelector","state","island","operatorBusy","previousView","avatars","extensions","users","t","useTranslation","dispatch","useDispatch","_b","conference","isActive","conferenceStartedFrom","username","currentUser","_c","currentCall","accepted","incoming","outgoing","getNextViewOnClose","useCallback","handleClose","player","stopAudioPlayer","resetOperatorBusyCompletely","setIslandView","operatorUsername","useMemo","calledNumber","extension","Object","values","find","ext","exten","avatarUrl","isOperator","displayText","name","statusText","useEffect","timeoutId","window","setTimeout","clearTimeout","React","createElement","Fragment","className","GenericAvatar","size","showPulseEffect","Button","variant","onClick","FontAwesomeIcon","icon","faXmark","CustomThemedTooltip","id","place"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react");require("../../node_modules/react-redux/es/index.js");var i=require("../../store/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");var i=require("../../store/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"),n=require("../Hangup.js"),s=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),a=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),c=require("../../utils/customHooks/useEventListener.js"),o=require("../../utils/genericFunctions/eventDispatch.js"),l=require("../../services/offhour.js");require("../../lib/webrtc/janus.js"),require("../../node_modules/webrtc-adapter/src/js/adapter_core.js"),require("../../node_modules/mic-check/lib/index.js");var d=require("../../events/RecorderEvents.js"),u=require("./PhysicalRecordingTimer.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js"),m=require("../../node_modules/react-redux/es/hooks/useDispatch.js");function f(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var h=f(t);exports.PhysicalRecorderView=function(){var f=p.useSelector(function(e){return e.island}).isOpen,v=p.useSelector(function(e){return{recording:e.physicalRecorder.recording}}).recording,g=i.store.getState().currentUser.username,j=t.useRef(null),x=m.useDispatch();t.useEffect(function(){return x.recorder.setVisibleContainerRef(j),function(){x.recorder.reset()}},[]);var w=r.useTranslation().t;c.useEventListener("phone-island-physical-recording-open",function(){!function(){e.__awaiter(this,void 0,void 0,function(){var t;return e.__generator(this,function(e){switch(e.label){case 0:return x.physicalRecorder.setRecording(!0),[4,l.startAnnouncementRecording()];case 1:return(t=e.sent()).tempFilename&&x.physicalRecorder.setTempFilename(t.tempFilename),o.eventDispatch("phone-island-recording-started",{}),[2]}})})}()});var E=i.store.getState().physicalRecorder.recordingTempVariable;return c.useEventListener("phone-island-conversations",function(e){Object.keys(e).forEach(function(t){var i;if(t===g){var r=null===(i=e[t])||void 0===i?void 0:i.conversations;if(r){var n=Object.keys(r);if(n.length>0&&"REC"===r[n[0]].counterpartName){x.physicalRecorder.setStartTime("".concat(Date.now()/1e3));var s=r[n[0]];if(s&&s.chSource){var a={conversationId:s.id,endpointId:s.chSource.callerNum};x.physicalRecorder.setCallRecordingInformations({recordingCallInformation:a})}}0===n.length&&v&&!E&&(d.dispatchPhysicalRecordingSave(),x.island.setIslandView(null),x.physicalRecorder.setRecording(!1))}}})}),h.default.createElement(h.default.Fragment,null,f?h.default.createElement("div",{className:""},E&&h.default.createElement("div",{className:"pi-flex pi-w-full pi-justify-center pi-items-center pi-pt-4 pi-pb-9"},h.default.createElement("div",{className:"pi-font-medium pi-text-4xl pi-w-fit pi-h-fit dark:pi-text-white"},h.default.createElement(u.default,null))),h.default.createElement("div",{className:"pi-flex pi-w-full pi-justify-center pi-items-center"},E?h.default.createElement("div",{className:"pi-sans pi-text-sm pi-w-fit pi-h-fit dark:pi-text-white"},w("Common.Close the call to stop recording")):h.default.createElement("div",{className:"pi-mt-12 pi-font-regular pi-text-lg pi-w-fit pi-h-fit dark:pi-text-white"},w("Common.Answer phone to start recording"))),h.default.createElement("div",{className:"pi-grid pi-pt-2 pi-mt-8"},h.default.createElement("div",{className:"pi-grid pi-justify-items-center"},h.default.createElement(n.default,{description:w("Tooltip.Interrupt recording"),isPhysicalRecording:!0})))):h.default.createElement("div",{className:"pi-flex pi-justify-between pi-items-center"},h.default.createElement("div",{className:"pi-font-medium pi-text-base"},w("Common.Recording")),h.default.createElement("div",{className:"".concat(f?"pi-h-12 pi-w-12":"pi-h-6 pi-w-6"," pi-flex pi-justify-center pi-items-center")},h.default.createElement("div",{className:"".concat(f?"pi-h-8":"pi-h-4 pi-w-4 pi-rounded-full"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden")},h.default.createElement("span",{className:"".concat(f?"pi-w-8 pi-h-8":"pi-h-6 pi-w-6"," pi-animate-ping pi-absolute pi-inline-flex pi-rounded-full pi-bg-red-400 pi-opacity-75 ")}),h.default.createElement(s.FontAwesomeIcon,{className:"pi-w-4 pi-h-6 pi-rotate-45 pi-text-red-500",icon:a.faCircle})))))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|