@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":"index.js","sources":["../../../src/components/VideoStreamingEmptyState/index.tsx"],"sourcesContent":["import React from 'react'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faVideoSlash } from '@fortawesome/free-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\n\ninterface VideoStreamingEmptyStateProps {\n className?: string\n title?: string\n message?: string\n}\n\nconst VideoStreamingEmptyState: React.FC<VideoStreamingEmptyStateProps> = ({\n className = '',\n title,\n message\n}) => {\n const { t } = useTranslation()\n\n return (\n <div className={`pi-flex pi-items-center pi-justify-center pi-bg-gray-100 dark:pi-bg-gray-800 pi-rounded-lg pi-border pi-border-gray-300 dark:pi-border-gray-700 ${className}`}>\n <div className=\"pi-flex pi-flex-col pi-items-center pi-justify-center pi-space-y-4 pi-p-8\">\n <FontAwesomeIcon\n icon={faVideoSlash}\n className=\"pi-text-3xl pi-text-gray-400 dark:pi-text-gray-600\"\n />\n <div className=\"pi-text-center pi-space-y-2\">\n <h3 className=\"pi-text-lg pi-font-semibold pi-text-gray-700 dark:pi-text-gray-300\">\n {title || t('VideoStreaming.Video not available')}\n </h3>\n <p className=\"pi-text-sm pi-text-gray-500 dark:pi-text-gray-400 pi-max-w-xs\">\n {message || t('VideoStreaming.The video feed is currently unavailable')}\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default VideoStreamingEmptyState\n"],"names":["_a","_b","className","title","message","t","useTranslation","React","createElement","concat","FontAwesomeIcon","icon","faVideoSlash"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/VideoStreamingEmptyState/index.tsx"],"sourcesContent":["import React from 'react'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faVideoSlash } from '@fortawesome/free-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\n\ninterface VideoStreamingEmptyStateProps {\n className?: string\n title?: string\n message?: string\n}\n\nconst VideoStreamingEmptyState: React.FC<VideoStreamingEmptyStateProps> = ({\n className = '',\n title,\n message\n}) => {\n const { t } = useTranslation()\n\n return (\n <div className={`pi-flex pi-items-center pi-justify-center pi-bg-gray-100 dark:pi-bg-gray-800 pi-rounded-lg pi-border pi-border-gray-300 dark:pi-border-gray-700 ${className}`}>\n <div className=\"pi-flex pi-flex-col pi-items-center pi-justify-center pi-space-y-4 pi-p-8\">\n <FontAwesomeIcon\n icon={faVideoSlash}\n className=\"pi-text-3xl pi-text-gray-400 dark:pi-text-gray-600\"\n />\n <div className=\"pi-text-center pi-space-y-2\">\n <h3 className=\"pi-text-lg pi-font-semibold pi-text-gray-700 dark:pi-text-gray-300\">\n {title || t('VideoStreaming.Video not available')}\n </h3>\n <p className=\"pi-text-sm pi-text-gray-500 dark:pi-text-gray-400 pi-max-w-xs\">\n {message || t('VideoStreaming.The video feed is currently unavailable')}\n </p>\n </div>\n </div>\n </div>\n )\n}\n\nexport default VideoStreamingEmptyState\n"],"names":["_a","_b","className","title","message","t","useTranslation","React","createElement","concat","FontAwesomeIcon","icon","faVideoSlash"],"mappings":"+hBAW0E,SAACA,OACvEC,EAAcD,EAAAE,UAAdA,OAAS,IAAAD,EAAG,GAAEA,EACdE,EAAKH,EAAAG,MACLC,EAAOJ,EAAAI,QAECC,EAAMC,qBAEd,OACIC,EAAK,QAAAC,cAAA,MAAA,CAAAN,UAAW,mJAAAO,OAAmJP,IAC/JK,EAAAA,QAAKC,cAAA,MAAA,CAAAN,UAAU,6EACXK,EAAC,QAAAC,cAAAE,mBACGC,KAAMC,eACNV,UAAU,uDAEdK,EAAAA,QAAKC,cAAA,MAAA,CAAAN,UAAU,+BACXK,UAAIC,cAAA,KAAA,CAAAN,UAAU,sEACTC,GAASE,EAAE,uCAEhBE,EAAAA,QAAAC,cAAA,IAAA,CAAGN,UAAU,iEACRE,GAAWC,EAAE,6DAMtC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js");require("../../node_modules
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.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");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var s=r(e);exports.default=function(e){var r=e.className,n=void 0===r?"":r,d=a.useTranslation().t;return s.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-bg-gray-100 dark:pi-bg-gray-800 pi-rounded-lg pi-animate-pulse ".concat(n)},s.default.createElement("div",{className:"pi-flex pi-flex-col pi-items-center pi-justify-center pi-space-y-4"},s.default.createElement("div",{className:"pi-relative"},s.default.createElement(t.FontAwesomeIcon,{icon:i.faVideo,className:"pi-text-4xl pi-text-gray-400 dark:pi-text-gray-600 pi-animate-pulse"}),s.default.createElement("div",{className:"pi-absolute pi-inset-0 pi-rounded-full pi-border-2 pi-border-gray-300 pi-animate-ping"})),s.default.createElement("div",{className:"pi-text-sm pi-text-gray-500 dark:pi-text-gray-400 pi-animate-pulse"},d("VideoStreaming.Loading video"))))};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/VideoStreamingSkeleton/index.tsx"],"sourcesContent":["import React from 'react'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faVideo } from '@fortawesome/free-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\n\ninterface VideoStreamingSkeletonProps {\n className?: string\n}\n\nconst VideoStreamingSkeleton: React.FC<VideoStreamingSkeletonProps> = ({ className = '' }) => {\n const { t } = useTranslation()\n\n return (\n <div className={`pi-flex pi-items-center pi-justify-center pi-bg-gray-100 dark:pi-bg-gray-800 pi-rounded-lg pi-animate-pulse ${className}`}>\n <div className=\"pi-flex pi-flex-col pi-items-center pi-justify-center pi-space-y-4\">\n <div className=\"pi-relative\">\n <FontAwesomeIcon \n icon={faVideo} \n className=\"pi-text-4xl pi-text-gray-400 dark:pi-text-gray-600 pi-animate-pulse\" \n />\n <div className=\"pi-absolute pi-inset-0 pi-rounded-full pi-border-2 pi-border-gray-300 pi-animate-ping\"></div>\n </div>\n <div className=\"pi-text-sm pi-text-gray-500 dark:pi-text-gray-400 pi-animate-pulse\">\n {t('VideoStreaming.Loading video')}\n </div>\n </div>\n </div>\n )\n}\n\nexport default VideoStreamingSkeleton\n"],"names":["_a","_b","className","t","useTranslation","React","createElement","concat","FontAwesomeIcon","icon","faVideo"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/VideoStreamingSkeleton/index.tsx"],"sourcesContent":["import React from 'react'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faVideo } from '@fortawesome/free-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\n\ninterface VideoStreamingSkeletonProps {\n className?: string\n}\n\nconst VideoStreamingSkeleton: React.FC<VideoStreamingSkeletonProps> = ({ className = '' }) => {\n const { t } = useTranslation()\n\n return (\n <div className={`pi-flex pi-items-center pi-justify-center pi-bg-gray-100 dark:pi-bg-gray-800 pi-rounded-lg pi-animate-pulse ${className}`}>\n <div className=\"pi-flex pi-flex-col pi-items-center pi-justify-center pi-space-y-4\">\n <div className=\"pi-relative\">\n <FontAwesomeIcon \n icon={faVideo} \n className=\"pi-text-4xl pi-text-gray-400 dark:pi-text-gray-600 pi-animate-pulse\" \n />\n <div className=\"pi-absolute pi-inset-0 pi-rounded-full pi-border-2 pi-border-gray-300 pi-animate-ping\"></div>\n </div>\n <div className=\"pi-text-sm pi-text-gray-500 dark:pi-text-gray-400 pi-animate-pulse\">\n {t('VideoStreaming.Loading video')}\n </div>\n </div>\n </div>\n )\n}\n\nexport default VideoStreamingSkeleton\n"],"names":["_a","_b","className","t","useTranslation","React","createElement","concat","FontAwesomeIcon","icon","faVideo"],"mappings":"+hBASsE,SAACA,GAAE,IAAAC,EAAAD,EAAAE,UAAAA,OAAY,IAAAD,EAAA,GAAEA,EAC7EE,EAAMC,qBAEd,OACEC,EAAK,QAAAC,cAAA,MAAA,CAAAJ,UAAW,+GAAAK,OAA+GL,IAC7HG,EAAAA,QAAKC,cAAA,MAAA,CAAAJ,UAAU,sEACbG,EAAAA,QAAKC,cAAA,MAAA,CAAAJ,UAAU,eACbG,EAAC,QAAAC,cAAAE,mBACCC,KAAMC,UACNR,UAAU,wEAEZG,EAAA,QAAAC,cAAA,MAAA,CAAKJ,UAAU,2FAEjBG,UAAAC,cAAA,MAAA,CAAKJ,UAAU,sEACZC,EAAE,kCAKb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js"),n=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../../node_modules/i18next/dist/esm/i18next.js"),l=require("../../utils/customHooks/useEventListener.js"),s=require("../../utils/customHooks/useIsomorphicLayoutEffect.js"),c=require("../../utils/genericFunctions/eventDispatch.js"),u=require("../Hangup.js"),d=require("../../lib/phone/call.js"),p=require("../../lib/webrtc/janus.js"),v=require("../CallView/Avatar.js"),m=require("../CallView/Timer.js"),f=require("../../lib/user/default_device.js"),g=require("../AudioBars.js"),h=require("../CustomThemedTooltip.js"),S=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),b=require("../../lib/devices/devices.js"),E=require("../../lib/avatars/avatars.js"),w=require("../../events/SocketEvents.js"),y=require("../../lib/phone/video.js"),k=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),T=require("../../node_modules/react-redux/es/hooks/useSelector.js");function C(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var j=C(t),x=function(){var C,x,V,N,q,R,I,_,D,P,A=k.useDispatch(),L=T.useSelector(function(e){return e.currentCall}),M=L.muted,F=L.startTime,U=L.isRecording,B=L.paused,J=L.isLocalVideoEnabled,z=L.showRemoteVideoPlaceHolder,W=L.hasVideoTrackAdded,G=L.displayName,H=L.isStartingVideoCall,O=T.useSelector(function(e){return e.screenShare}),K=O.localTracks,Q=O.localVideos,X=O.role,Y=O.active,Z=O.isStartingScreenShare,$=O.isJoiningScreenShare,ee=O.isLeavingScreenShare,te=T.useSelector(function(e){return e.listen}),re=T.useSelector(function(e){return e.island}).isOpen,ae=T.useSelector(function(e){return e.webrtc}),ne=ae.janusInstance,ie=ae.remoteAudioStream,oe=a.store.getState().currentUser,le=t.useState(!1),se=le[0],ce=le[1],ue=t.useState(!1),de=ue[0],pe=ue[1],ve=t.useRef(null),me=t.useRef(null),fe=t.useRef(!1),ge=t.useRef(!1),he=t.useRef(null),Se=t.useRef(null),be=t.useRef(null),Ee=t.useRef(null),we=t.useRef(null),ye=t.useRef(null),ke=t.useRef(p.default),Te=a.store.select.mediaDevices.videoInputDevices(a.store.getState());s.useIsomorphicLayoutEffect(function(){A.player.updatePlayer({localScreen:Se,remoteScreen:be,localVideo:Ee,largeRemoteVideo:we,smallRemoteVideo:ye})},[]),t.useEffect(function(){return Ie(),Ce(),addEventListener("fullscreenchange",je),function(){removeEventListener("fullscreenchange",je),ve.current&&clearTimeout(ve.current)}},[]),t.useEffect(function(){H&&(Ne(),A.currentCall.updateCurrentCall({isStartingVideoCall:!1}))},[H]),t.useEffect(function(){Z&&(Ae(),a.store.dispatch.screenShare.update({isStartingScreenShare:!1}))},[Z]),t.useEffect(function(){$&&(Le(),a.store.dispatch.screenShare.update({isJoiningScreenShare:!1}))},[$]),t.useEffect(function(){ee&&(Fe(),a.store.dispatch.screenShare.update({isLeavingScreenShare:!1}))},[ee]),t.useEffect(function(){Ie(),Ce()},[re]);var Ce=function(){var e=a.store.getState().player.localVideo,t=a.store.getState().player.largeRemoteVideo,r=a.store.getState().player.smallRemoteVideo,n=a.store.getState().webrtc,i=n.localVideoStream,o=n.remoteVideoStream;(null==e?void 0:e.current)&&ke.current.attachMediaStream&&ke.current.attachMediaStream(e.current,i),(null==t?void 0:t.current)&&ke.current.attachMediaStream&&ke.current.attachMediaStream(t.current,o),(null==r?void 0:r.current)&&ke.current.attachMediaStream&&ke.current.attachMediaStream(r.current,o),o instanceof MediaStream&&o.getVideoTracks().length>0&&A.currentCall.updateCurrentCall({showRemoteVideoPlaceHolder:!1})},je=function(){ce(!!document.fullscreenElement)},xe=function(){document.fullscreenElement?(document.exitFullscreen(),c.eventDispatch("phone-island-fullscreen-exited",{})):he.current&&(he.current.requestFullscreen(),c.eventDispatch("phone-island-fullscreen-entered",{}))};l.useEventListener("phone-island-fullscreen-enter",function(){xe()}),l.useEventListener("phone-island-fullscreen-exit",function(){xe()});var Ve=function(e,t){A.screenShare.update({source:e});var r=null;null==ne||ne.attach({plugin:"janus.plugin.videoroom",opaqueId:ke.current.randomString(32),success:function(t){var n,i,o,l;r=t,A.screenShare.update({remoteFeed:t}),r.remoteTracks={},r.remoteVideos=0,null===(i=(n=ke.current).log)||void 0===i||i.call(n,"Plugin attached! ("+r.getPlugin()+", id="+r.getId()+")"),null===(l=(o=ke.current).log)||void 0===l||l.call(o," -- This is a subscriber");var s={request:"join",room:a.store.getState().screenShare.room,ptype:"subscriber",feed:e};r.send({message:s})},error:function(e){var t,r;null===(r=(t=ke.current).error)||void 0===r||r.call(t,"Error attaching videoroom plugin",e)},iceState:function(e){var t,a;null===(a=(t=ke.current).log)||void 0===a||a.call(t,"ICE state (feed #"+r.rfindex+") changed to "+e)},webrtcState:function(e){var t,a;null===(a=(t=ke.current).log)||void 0===a||a.call(t,"Janus says this WebRTC PeerConnection (feed #"+r.rfindex+") is "+(e?"up":"down")+" now")},slowLink:function(e,t,r){var a,n;null===(n=(a=ke.current).warn)||void 0===n||n.call(a,"Janus reports problems "+(e?"sending":"receiving")+" packets on mid "+r+" ("+t+" lost packets)")},onmessage:function(n,i){var o,l,s,c,u,d,p,v,m,f;null===(l=(o=ke.current).debug)||void 0===l||l.call(o," ::: Got a message (listener) :::",n);var g=n.videoroom;null===(c=(s=ke.current).debug)||void 0===c||c.call(s,"Event: "+g),g&&("attached"===g?null===(d=(u=ke.current).log)||void 0===d||d.call(u,"Successfully attached to feed "+e+" ("+t+") in room "+n.room):null===(v=(p=ke.current).warn)||void 0===v||v.call(p,"Unhandled event: "+g)),i&&(null===(f=(m=ke.current).debug)||void 0===f||f.call(m,"Handling SDP as well...",i),r.createAnswer({jsep:i,tracks:[{type:"data"}],success:function(e){var t,n;null===(n=(t=ke.current).debug)||void 0===n||n.call(t,"Got SDP!",e);var i={request:"start",room:a.store.getState().screenShare.room};r.send({message:i,jsep:e})},error:function(e){var t,r;null===(r=(t=ke.current).error)||void 0===r||r.call(t,"WebRTC error:",e)}}))},onlocaltrack:function(e,t){},onremotetrack:function(e,t,n,i){var o,l,s,c,u,d,p,v;if(null===(l=(o=ke.current).debug)||void 0===l||l.call(o,"Remote track (mid="+t+") "+(n?"added":"removed")+(i?" ("+i.reason+") ":"")+":",e),"video"!==e.kind||!i||"mute"!==i.reason&&"unmute"!==i.reason){if(!n){var m=a.store.getState().screenShare.remoteScreenStream;return ke.current.stopAllTracks(m),void A.screenShare.update({active:!1})}if("video"===e.kind){var f=new MediaStream([e]);a.store.dispatch.screenShare.update({remoteScreenStream:f}),r.remoteTracks[t]=f,null===(d=(u=ke.current).log)||void 0===d||d.call(u,"Created remote video stream: "+f);var g=a.store.getState().player.remoteScreen;(null==g?void 0:g.current)&&(null===(v=(p=ke.current).attachMediaStream)||void 0===v||v.call(p,g.current,f))}}else null===(c=(s=ke.current).log)||void 0===c||c.call(s,"Ignoring mute/unmute on screen-sharing track.")},oncleanup:function(){var t,a;null===(a=(t=ke.current).log)||void 0===a||a.call(t," ::: Got a cleanup notification (remote feed "+e+") :::"),r.remoteTracks={},r.remoteVideos=0}})},Ne=function(){var e,t,r,n;if(!fe.current){var i=a.store.getState().webrtc.sipcall;fe.current=!0,a.store.dispatch.currentCall.updateCurrentCall({isLocalVideoEnabled:!0});var o=[],l=b.getCurrentVideoInputDeviceId(),s={type:"video",recv:!0};s.capture=!l||{deviceId:{exact:l}};var u=a.store.getState().currentCall.hasVideoTrackAdded,d=a.store.getState().webrtc.remoteVideoStream,p=null===(n=null===(r=null===(t=null===(e=null==i?void 0:i.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===t?void 0:t.getTransceivers)||void 0===r?void 0:r.call(t))||void 0===n?void 0:n.find(function(e){var t,r,a,n;return"video"===(null===(r=null===(t=e.receiver)||void 0===t?void 0:t.track)||void 0===r?void 0:r.kind)||"video"===(null===(n=null===(a=e.sender)||void 0===a?void 0:a.track)||void 0===n?void 0:n.kind)});(u||Boolean(p)||d instanceof MediaStream&&d.getVideoTracks().length>0)&&p?(s.replace=!0,p.mid&&(s.mid=p.mid),u||A.currentCall.setVideoTrackAdded(!0)):(s.add=!0,A.currentCall.setVideoTrackAdded(!0)),o.push(s),i.createOffer({tracks:o,success:function(e){fe.current=!1,i.send({message:{request:"update"},jsep:e}),y.notifyPeerVideoStart(),w.dispatchVideoCallStarted({initiator:"local",callUser:a.store.getState().currentUser.username,destUser:a.store.getState().currentCall.username}),c.eventDispatch("phone-island-video-enabled",{})},error:function(e){fe.current=!1,console.error("WebRTC error... "+JSON.stringify(e))}})}};l.useEventListener("phone-island-video-enable",function(){Ne()});var qe=function(){var t,r,n,i;if(!fe.current){var o=a.store.getState().webrtc,l=o.sipcall,s=o.localVideoStream;fe.current=!0;var u=null===(i=null===(n=null===(r=null===(t=null==l?void 0:l.webrtcStuff)||void 0===t?void 0:t.pc)||void 0===r?void 0:r.getTransceivers)||void 0===n?void 0:n.call(r))||void 0===i?void 0:i.find(function(e){var t,r,a,n;return"video"===(null===(r=null===(t=e.receiver)||void 0===t?void 0:t.track)||void 0===r?void 0:r.kind)||"video"===(null===(n=null===(a=e.sender)||void 0===a?void 0:a.track)||void 0===n?void 0:n.kind)});ke.current.stopAllTracks(s),a.store.dispatch.webrtc.updateLocalVideoStream(null),a.store.dispatch.currentCall.setLocalVideoEnabled(!1);var d=[];d.push(e.__assign(e.__assign({type:"video"},(null==u?void 0:u.mid)?{mid:u.mid}:{}),{remove:!0})),l.createOffer({tracks:d,success:function(e){fe.current=!1,l.send({message:{request:"update"},jsep:e}),c.eventDispatch("phone-island-video-disabled",{})},error:function(e){fe.current=!1,console.error("WebRTC error... "+JSON.stringify(e))}})}};l.useEventListener("phone-island-video-disable",function(){qe()});var Re=function(){null==ne||ne.attach({plugin:"janus.plugin.videoroom",opaqueId:ke.current.randomString(32),success:function(e){A.screenShare.update({plugin:e});var t=a.store.getState().screenShare.role;"publisher"===t?(c.eventDispatch("phone-island-screen-share-initialized",{}),function(){var e,t;if(ke.current.isExtensionEnabled()){var r={request:"create",description:ke.current.randomString(32),bitrate:5e5,publishers:1},n=a.store.getState().screenShare.plugin;n.send({message:r,success:function(e){var t,r,i,o,l,s,c,u;if(e.error)return null===(r=(t=ke.current).error)||void 0===r||r.call(t,"Couldn't create room: "+e.error),void Pe();var d=e.videoroom;if(null===(o=(i=ke.current).debug)||void 0===o||o.call(i,"Event: "+d),d){var p=e.room;A.screenShare.update({room:p}),null===(s=(l=ke.current).log)||void 0===s||s.call(l,"Screen sharing session created: "+p);var v=a.store.getState().currentUser.username;if(ge.current)return void(null===(u=(c=ke.current).log)||void 0===u||u.call(c,"Screen share publisher join already requested on this handle, skipping duplicate join"));ge.current=!0;var m={request:"join",room:p,ptype:"publisher",display:v};n.send({message:m})}}})}else null===(t=(e=ke.current).error)||void 0===t||t.call(e,"This browser doesn't support screensharing (getDisplayMedia unavailable)")}()):"listener"===t&&Me(),c.eventDispatch("phone-island-screen-share-started",{})},error:function(e){var t,r;null===(r=(t=ke.current).error)||void 0===r||r.call(t,"Error attaching videoroom plugin",e),Pe()},consentDialog:function(e){},iceState:function(e){var t,r;null===(r=(t=ke.current).log)||void 0===r||r.call(t,"ICE state changed to "+e)},mediaState:function(e,t){var r,a;null===(a=(r=ke.current).log)||void 0===a||a.call(r,"Janus "+(t?"started":"stopped")+" receiving our "+e)},webrtcState:function(e){var t,r;null===(r=(t=ke.current).log)||void 0===r||r.call(t,"Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},slowLink:function(e,t,r){var a,n;null===(n=(a=ke.current).warn)||void 0===n||n.call(a,"Janus reports problems "+(e?"sending":"receiving")+" packets on mid "+r+" ("+t+" lost packets)")},onmessage:function(e,t){var r,n,i,o,l,s,c,u,d,p,v,m,f,g,h,S,b,E,w,y;null===(n=(r=ke.current).debug)||void 0===n||n.call(r," ::: Got a message (publisher) :::",e);var k=a.store.getState().screenShare,T=k.plugin,C=k.role,j=e.videoroom;if(null===(o=(i=ke.current).debug)||void 0===o||o.call(i,"Event: "+j),j)if("joined"===j){if("publisher"===C){null===(s=(l=ke.current).debug)||void 0===s||s.call(l,"Negotiating WebRTC stream for our screen");var x=a.store.getState().screenShare.pendingScreenStream,V=null==x?void 0:x.getVideoTracks()[0];A.screenShare.update({pendingScreenStream:null}),T.createOffer({tracks:[{type:"audio",capture:!0,recv:!1},{type:"screen",capture:null==V||V,recv:!1}],success:function(e){var t,r;null===(r=(t=ke.current).debug)||void 0===r||r.call(t,"Got publisher SDP!",e);T.send({message:{request:"configure",audio:!0,video:!0},jsep:e})},error:function(e){var t,r;ge.current=!1,null===(r=(t=ke.current).error)||void 0===r||r.call(t,"WebRTC error:",e),null==V||V.stop(),A.screenShare.update({active:!1,role:""}),De();var n=a.store.getState().screenShare.room,i=function(){return T.detach()};T.send({message:{request:"destroy",room:n},success:i,error:i})}})}else if(e.publishers){var N=e.publishers;for(var q in null===(u=(c=ke.current).debug)||void 0===u||u.call(c,"Got a list of available publishers/feeds:",N),N)if(!N[q].dummy){var R=N[q].id,I=N[q].display;null===(p=(d=ke.current).debug)||void 0===p||p.call(d," >> ["+R+"] "+I),Ve(R,I)}}}else if("event"===j)if("listener"===C&&e.publishers){N=e.publishers;for(var q in null===(m=(v=ke.current).debug)||void 0===m||m.call(v,"Got a list of available publishers/feeds:",N),N)if(!N[q].dummy){R=N[q].id,I=N[q].display;null===(g=(f=ke.current).debug)||void 0===g||g.call(f," >> ["+R+"] "+I),Ve(R,I)}}else if(e.leaving){var _=e.leaving;null===(S=(h=ke.current).log)||void 0===S||S.call(h,"Publisher left: "+_)}else e.error&&(null===(E=(b=ke.current).error)||void 0===E||E.call(b,"Error event: "+e.error));t&&(null===(y=(w=ke.current).debug)||void 0===y||y.call(w,"Handling SDP as well...",t),T.handleRemoteJsep({jsep:t}))},onlocaltrack:function(e,t){var r,n,i,o,l,s;null===(n=(r=ke.current).debug)||void 0===n||n.call(r,"Local track "+(t?"added":"removed")+":",e);var c=e.id.replace(/[{}]/g,"");if(t){if(!(null==K?void 0:K[c])){if("video"===e.kind){A.screenShare.update({localVideos:Q+1});var u=new MediaStream([e]);a.store.dispatch.screenShare.update({localScreenStream:u}),null===(o=(i=ke.current).log)||void 0===o||o.call(i,"Created local stream: "+u);var d=a.store.getState().player.localScreen;(null==d?void 0:d.current)&&(null===(s=(l=ke.current).attachMediaStream)||void 0===s||s.call(l,d.current,u),_e(),e.addEventListener("ended",function(){Be()}))}var p=a.store.getState().screenShare.plugin;"completed"!==p.webrtcStuff.pc.iceConnectionState&&p.webrtcStuff.pc.iceConnectionState}}else{var v=null==K?void 0:K[c];if(v)try{var m=v.getTracks();for(var f in m){var g=m[f];g&&g.stop()}}catch(e){}"video"===e.kind&&A.screenShare.update({localVideos:Q-1});var h=null==K?void 0:K.filter(function(e){return e!==K[c]});A.screenShare.update({localTracks:h})}},onremotetrack:function(e,t,r){},oncleanup:function(){var e,t;null===(t=(e=ke.current).log)||void 0===t||t.call(e," ::: Got a cleanup notification :::"),ge.current=!1,A.screenShare.update({localTracks:{},localVideos:0})}})},Ie=function(){var e=a.store.getState().player.localScreen,t=a.store.getState().player.remoteScreen,r=a.store.getState().screenShare,n=r.localScreenStream,i=r.remoteScreenStream;(null==e?void 0:e.current)&&ke.current.attachMediaStream&&ke.current.attachMediaStream(e.current,n),(null==t?void 0:t.current)&&ke.current.attachMediaStream&&ke.current.attachMediaStream(t.current,i)},_e=function(){var e=a.store.getState().websocket.socket,t=a.store.getState().currentCall.username,r=a.store.getState().screenShare.room,n=a.store.getState().currentUser.username;e.emit("message",{message:"screenSharingStart",roomId:r,destUser:t,callUser:n})},De=function(){var e=a.store.getState().currentCall.isLocalVideoEnabled,t=a.store.getState().webrtc.remoteVideoStream,r=a.store.getState().screenShare.active,n=!!(null==t?void 0:t.getVideoTracks().some(function(e){return"live"===e.readyState&&!e.muted}));e||n||r||"video"!==a.store.getState().island.view||A.island.setIslandView("call")},Pe=function(){var e=a.store.getState().screenShare,t=e.pendingScreenStream;"publisher"===e.role&&(ke.current.stopAllTracks(t),A.screenShare.update({active:!1,role:"",pendingScreenStream:null}),De())},Ae=function(){ge.current=!1,A.screenShare.update({active:!0,role:"publisher"}),Re()};l.useEventListener("phone-island-screen-share-start",function(){Ae()});var Le=function(){A.screenShare.update({active:!0,role:"listener"}),Re(),c.eventDispatch("phone-island-screen-share-joined",{})},Me=function(){var e={request:"join",room:a.store.getState().screenShare.room,ptype:"publisher",display:a.store.getState().currentUser.username};a.store.getState().screenShare.plugin.send({message:e})},Fe=function(){var e=a.store.getState().screenShare.remoteScreenStream;ke.current.stopAllTracks(e),A.screenShare.update({active:!1}),De(),c.eventDispatch("phone-island-screen-share-left",{})},Ue=function(){pe(!0),ve.current&&(clearTimeout(ve.current),ve.current=null),me.current&&clearTimeout(me.current),me.current=setTimeout(function(){ve.current=setTimeout(function(){pe(!1)},3e3)},100)},Be=function(){var e=a.store.getState().screenShare,t=e.plugin,r=e.localScreenStream;ge.current=!1,ke.current.stopAllTracks(r),A.screenShare.update({active:!1}),t.detach();var n=a.store.getState().websocket.socket,i=a.store.getState().currentCall.username,o=a.store.getState().screenShare.room,l=a.store.getState().currentUser.username;n.emit("message",{message:"screenSharingStop",roomId:o,destUser:i,callUser:l}),c.eventDispatch("phone-island-screen-share-stopped",{}),De()};l.useEventListener("phone-island-screen-share-stop",function(){Be()});var Je=t.useState(!0),ze=Je[0],We=Je[1],Ge=function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(e){switch(e.label){case 0:return(null==Te?void 0:Te.length)>0?[4,b.checkWebCamPermission()]:[3,2];case 1:return e.sent()?(We(!0),[2,!0]):(We(!1),[2,!1]);case 2:return We(!1),[2,!1];case 3:return[2]}})})};return j.default.createElement(j.default.Fragment,null,re?j.default.createElement("div",{ref:he,onMouseMove:function(){return Ue()},className:se?"pi-h-screen":"pi-h-[480px] pi-w-[600px]"},j.default.createElement("div",{className:"pi-flex pi-relative pi-justify-center pi-w-full pi-h-full"},j.default.createElement("video",{autoPlay:!0,muted:!0,ref:be,className:"pi-rounded-2xl pi-w-full pi-h-full ".concat(Y&&"listener"===X?"":"pi-hidden")}),j.default.createElement("video",{autoPlay:!0,muted:!0,ref:Se,className:"pi-rounded-2xl pi-w-full pi-h-full ".concat(Y&&"publisher"===X?"":"pi-hidden")}),j.default.createElement("video",{autoPlay:!0,muted:!0,ref:we,className:"pi-rounded-2xl ".concat(Y||z?"pi-hidden":"")}),j.default.createElement("div",{className:"pi-w-full pi-bg-gray-200 dark:pi-bg-gray-800 pi-flex pi-items-center pi-justify-center ".concat(Y||!z?"pi-hidden":"")},j.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-32 pi-h-32 pi-flex pi-items-center pi-justify-center"},j.default.createElement("span",{className:"pi-text-4xl pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(G)))),j.default.createElement("video",{muted:!0,autoPlay:!0,ref:Ee,className:"pi-max-w-32 pi-max-h-32 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg ".concat(J?"":"pi-hidden")}),j.default.createElement("div",{className:"pi-w-32 pi-h-24 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ".concat(J||!W?"pi-hidden":"")},j.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center"},j.default.createElement("span",{className:"pi-text-base pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(oe.name||"-")))),j.default.createElement("video",{muted:!0,autoPlay:!0,ref:ye,className:"pi-max-w-32 pi-max-h-32 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg ".concat(!Y||z?"pi-hidden":"")}),j.default.createElement("div",{className:"pi-w-32 pi-h-24 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ".concat(Y&&z&&W?"":"pi-hidden")},j.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center"},j.default.createElement("span",{className:"pi-text-base pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(G))))),j.default.createElement("div",{className:"".concat(!de&&"pi-opacity-0 pi-pointer-events-none"," pi-absolute pi-bottom-0 pi-bg-gray-950/65 pi-w-full pi-p-6 pi-rounded-bl-[20px] pi-rounded-br-[20px] pi-transition-all")},j.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-gap-6 pi-mb-5"},!(null==te?void 0:te.isListen)&&j.default.createElement(r.Button,{variant:"default",active:!!M,onClick:function(){return M?d.unmuteCurrentCall():d.muteCurrentCall()},"data-tooltip-id":"tooltip-mute","data-tooltip-content":"".concat(M?o.t("Tooltip.Unmute"):o.t("Tooltip.Mute"))},M?j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faMicrophoneSlash}):j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faMicrophone})),(null==Te?void 0:Te.length)>0&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(e){switch(e.label){case 0:return[4,Ge()];case 1:return e.sent()&&(J?qe():Ne()),[2]}})})},"data-tooltip-id":"tooltip-toggle-video","data-tooltip-content":"".concat(ze?J?o.t("Tooltip.Disable camera"):o.t("Tooltip.Enable camera"):o.t("Tooltip.Enable camera permission")||""),disabled:!ze,className:"".concat(ze?"":"pi-cursor-auto")},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:J?i.faVideoSlash:i.faVideo})),"safari"!==ke.current.webRTCAdapter.browserDetails.browser&&(null===(q=null===(N=null===(V=null===(x=null===(C=null==oe?void 0:oe.profile)||void 0===C?void 0:C.macro_permissions)||void 0===x?void 0:x.nethvoice_cti)||void 0===V?void 0:V.permissions)||void 0===N?void 0:N.screen_sharing)||void 0===q?void 0:q.value)&&!Y&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return Ae()},"data-tooltip-id":"tooltip-start-screen-share","data-tooltip-content":o.t("Tooltip.Share screen")||""},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faDisplay})),Y&&"publisher"===X&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return Be()},"data-tooltip-id":"tooltip-stop-screen-share","data-tooltip-content":o.t("Tooltip.Stop sharing")},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:S.faDisplaySlash})),Y&&"listener"===X&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return xe()},"data-tooltip-id":"tooltip-toggle-fullscreen","data-tooltip-content":se?o.t("Tooltip.Exit fullscreen"):o.t("Tooltip.Enter fullscreen")},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:se?i.faCompress:i.faExpand})),(null===(P=null===(D=null===(_=null===(I=null===(R=null==oe?void 0:oe.profile)||void 0===R?void 0:R.macro_permissions)||void 0===I?void 0:I.settings)||void 0===_?void 0:_.permissions)||void 0===D?void 0:D.recording)||void 0===P?void 0:P.value)&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return d.recordCurrentCall(U)},"data-tooltip-id":"tooltip-record-video-view","data-tooltip-content":U?o.t("Tooltip.Stop recording"):o.t("Tooltip.Record")},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:U?i.faStop:S.faRecord})),!((null==te?void 0:te.isIntrude)||(null==te?void 0:te.isListen))&&j.default.createElement(r.Button,{variant:"default",onClick:function(){return B?d.unpauseCurrentCall():(d.pauseCurrentCall(),void Be())},"data-tooltip-id":"tooltip-pause-video-view","data-tooltip-content":B?o.t("Tooltip.Play"):o.t("Tooltip.Pause")},j.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:B?i.faPlay:i.faPause}))),j.default.createElement(u.default,{buttonsVariant:"default"})),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-mute-video-view",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-toggle-video",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-toggle-fullscreen",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-start-screen-share",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-stop-screen-share",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-record-video-view",place:"bottom"}),j.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-pause-video-view",place:"bottom"})):j.default.createElement(j.default.Fragment,null,j.default.createElement("div",{className:"pi-flex pi-justify-between pi-items-center"},j.default.createElement(v.default,null),j.default.createElement(m.default,{startTime:F,isNotAlwaysWhite:!0}),!re&&ie&&!f.isPhysical()&&j.default.createElement(g.AudioBars,{audioStream:ie,paused:B,size:re?"large":"small"}))))};exports.VideoView=x,exports.default=x;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../node_modules/tslib/tslib.es6.js"),t=require("react"),r=require("../Button.js");require("../../node_modules/react-redux/es/index.js");var a=require("../../store/index.js"),n=require("../../node_modules/@fortawesome/react-fontawesome/dist/index.js"),i=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),l=require("../../node_modules/i18next/dist/esm/i18next.js"),o=require("../../utils/customHooks/useEventListener.js"),s=require("../../utils/customHooks/useIsomorphicLayoutEffect.js"),c=require("../../utils/genericFunctions/eventDispatch.js"),u=require("../Hangup.js"),d=require("../../lib/phone/call.js"),p=require("../../lib/webrtc/janus.js"),v=require("../CallView/Avatar.js"),m=require("../CallView/Timer.js"),f=require("../../lib/user/default_device.js"),g=require("../AudioBars.js"),h=require("../CustomThemedTooltip.js"),S=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js"),b=require("../../lib/devices/devices.js"),E=require("../../lib/avatars/avatars.js"),w=require("../../events/SocketEvents.js"),y=require("../../lib/phone/video.js"),k=require("../../lib/phone/screenShare.js"),T=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),C=require("../../node_modules/react-redux/es/hooks/useSelector.js");function j(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var x=j(t),V=function(){var j,V,N,q,R,I,_,D,A,P,L=T.useDispatch(),M=C.useSelector(function(e){return e.currentCall}),F=M.muted,U=M.startTime,B=M.isRecording,H=M.paused,J=M.isLocalVideoEnabled,z=M.showRemoteVideoPlaceHolder,W=M.hasVideoTrackAdded,G=M.displayName,O=M.isStartingVideoCall,K=C.useSelector(function(e){return e.screenShare}),Q=K.localTracks,X=K.localVideos,Y=K.role,Z=K.active,$=K.isStartingScreenShare,ee=K.isJoiningScreenShare,te=K.isLeavingScreenShare,re=C.useSelector(function(e){return e.listen}),ae=C.useSelector(function(e){return e.island}).isOpen,ne=C.useSelector(function(e){return e.webrtc}),ie=ne.janusInstance,le=ne.remoteAudioStream,oe=a.store.getState().currentUser,se=t.useState(!1),ce=se[0],ue=se[1],de=t.useState(!1),pe=de[0],ve=de[1],me=t.useRef(null),fe=t.useRef(null),ge=t.useRef(!1),he=t.useRef(!1),Se=t.useRef(null),be=t.useRef(null),Ee=t.useRef(null),we=t.useRef(null),ye=t.useRef(null),ke=t.useRef(null),Te=t.useRef(null),Ce=t.useRef(p.default),je=a.store.select.mediaDevices.videoInputDevices(a.store.getState());s.useIsomorphicLayoutEffect(function(){L.player.updatePlayer({localScreen:Ee,remoteScreen:we,localVideo:ye,largeRemoteVideo:ke,smallRemoteVideo:Te})},[]),t.useEffect(function(){return Ae(),xe(),addEventListener("fullscreenchange",Ve),function(){removeEventListener("fullscreenchange",Ve),Ne(),me.current&&clearTimeout(me.current)}},[]),t.useEffect(function(){O&&(Ie(),L.currentCall.updateCurrentCall({isStartingVideoCall:!1}))},[O]),t.useEffect(function(){$&&(Fe(),a.store.dispatch.screenShare.update({isStartingScreenShare:!1}))},[$]),t.useEffect(function(){ee&&(Ue(),a.store.dispatch.screenShare.update({isJoiningScreenShare:!1}))},[ee]),t.useEffect(function(){te&&(He(),a.store.dispatch.screenShare.update({isLeavingScreenShare:!1}))},[te]),t.useEffect(function(){Ae(),xe()},[ae]);var xe=function(){var e=a.store.getState().player.localVideo,t=a.store.getState().player.largeRemoteVideo,r=a.store.getState().player.smallRemoteVideo,n=a.store.getState().webrtc,i=n.localVideoStream,l=n.remoteVideoStream;(null==e?void 0:e.current)&&Ce.current.attachMediaStream&&Ce.current.attachMediaStream(e.current,i),(null==t?void 0:t.current)&&Ce.current.attachMediaStream&&Ce.current.attachMediaStream(t.current,l),(null==r?void 0:r.current)&&Ce.current.attachMediaStream&&Ce.current.attachMediaStream(r.current,l),l instanceof MediaStream&&l.getVideoTracks().length>0&&L.currentCall.updateCurrentCall({showRemoteVideoPlaceHolder:!1})},Ve=function(){ue(!!document.fullscreenElement)},Ne=function(){document.fullscreenElement&&document.fullscreenElement===be.current&&(document.exitFullscreen(),c.eventDispatch("phone-island-fullscreen-exited",{}))},qe=function(){document.fullscreenElement?(document.exitFullscreen(),c.eventDispatch("phone-island-fullscreen-exited",{})):Se.current&&(be.current=Se.current,be.current.requestFullscreen(),c.eventDispatch("phone-island-fullscreen-entered",{}))};o.useEventListener("phone-island-fullscreen-enter",function(){qe()}),o.useEventListener("phone-island-fullscreen-exit",function(){qe()});var Re=function(e,t){L.screenShare.update({source:e});var r=null;null==ie||ie.attach({plugin:"janus.plugin.videoroom",opaqueId:Ce.current.randomString(32),success:function(t){var n,i,l,o;r=t,L.screenShare.update({remoteFeed:t}),r.remoteTracks={},r.remoteVideos=0,null===(i=(n=Ce.current).log)||void 0===i||i.call(n,"Plugin attached! ("+r.getPlugin()+", id="+r.getId()+")"),null===(o=(l=Ce.current).log)||void 0===o||o.call(l," -- This is a subscriber");var s={request:"join",room:a.store.getState().screenShare.room,ptype:"subscriber",feed:e};r.send({message:s})},error:function(e){var t,r;null===(r=(t=Ce.current).error)||void 0===r||r.call(t,"Error attaching videoroom plugin",e)},iceState:function(e){var t,a;null===(a=(t=Ce.current).log)||void 0===a||a.call(t,"ICE state (feed #"+r.rfindex+") changed to "+e)},webrtcState:function(e){var t,a;null===(a=(t=Ce.current).log)||void 0===a||a.call(t,"Janus says this WebRTC PeerConnection (feed #"+r.rfindex+") is "+(e?"up":"down")+" now")},slowLink:function(e,t,r){var a,n;null===(n=(a=Ce.current).warn)||void 0===n||n.call(a,"Janus reports problems "+(e?"sending":"receiving")+" packets on mid "+r+" ("+t+" lost packets)")},onmessage:function(n,i){var l,o,s,c,u,d,p,v,m,f;null===(o=(l=Ce.current).debug)||void 0===o||o.call(l," ::: Got a message (listener) :::",n);var g=n.videoroom;null===(c=(s=Ce.current).debug)||void 0===c||c.call(s,"Event: "+g),g&&("attached"===g?null===(d=(u=Ce.current).log)||void 0===d||d.call(u,"Successfully attached to feed "+e+" ("+t+") in room "+n.room):null===(v=(p=Ce.current).warn)||void 0===v||v.call(p,"Unhandled event: "+g)),i&&(null===(f=(m=Ce.current).debug)||void 0===f||f.call(m,"Handling SDP as well...",i),r.createAnswer({jsep:i,tracks:[{type:"data"}],success:function(e){var t,n;null===(n=(t=Ce.current).debug)||void 0===n||n.call(t,"Got SDP!",e);var i={request:"start",room:a.store.getState().screenShare.room};r.send({message:i,jsep:e})},error:function(e){var t,r;null===(r=(t=Ce.current).error)||void 0===r||r.call(t,"WebRTC error:",e)}}))},onlocaltrack:function(e,t){},onremotetrack:function(e,t,n,i){var l,o,s,c,u,d,p,v;if(null===(o=(l=Ce.current).debug)||void 0===o||o.call(l,"Remote track (mid="+t+") "+(n?"added":"removed")+(i?" ("+i.reason+") ":"")+":",e),a.store.getState().screenShare.remoteFeed===r)if("video"!==e.kind||!i||"mute"!==i.reason&&"unmute"!==i.reason){if(!n){var m=a.store.getState().screenShare.remoteScreenStream;return Ce.current.stopAllTracks(m),void L.screenShare.update({active:!1})}if("video"===e.kind){var f=new MediaStream([e]);a.store.dispatch.screenShare.update({remoteScreenStream:f}),r.remoteTracks[t]=f,null===(d=(u=Ce.current).log)||void 0===d||d.call(u,"Created remote video stream: "+f);var g=a.store.getState().player.remoteScreen;(null==g?void 0:g.current)&&(null===(v=(p=Ce.current).attachMediaStream)||void 0===v||v.call(p,g.current,f))}}else null===(c=(s=Ce.current).log)||void 0===c||c.call(s,"Ignoring mute/unmute on screen-sharing track.")},oncleanup:function(){var t,a;null===(a=(t=Ce.current).log)||void 0===a||a.call(t," ::: Got a cleanup notification (remote feed "+e+") :::"),r.remoteTracks={},r.remoteVideos=0}})},Ie=function(){var e,t,r,n;if(!ge.current){var i=a.store.getState().webrtc.sipcall;ge.current=!0,a.store.dispatch.currentCall.updateCurrentCall({isLocalVideoEnabled:!0});var l=[],o=b.getCurrentVideoInputDeviceId(),s={type:"video",recv:!0};s.capture=!o||{deviceId:{exact:o}};var u=a.store.getState().currentCall.hasVideoTrackAdded,d=a.store.getState().webrtc.remoteVideoStream,p=null===(n=null===(r=null===(t=null===(e=null==i?void 0:i.webrtcStuff)||void 0===e?void 0:e.pc)||void 0===t?void 0:t.getTransceivers)||void 0===r?void 0:r.call(t))||void 0===n?void 0:n.find(function(e){var t,r,a,n;return"video"===(null===(r=null===(t=e.receiver)||void 0===t?void 0:t.track)||void 0===r?void 0:r.kind)||"video"===(null===(n=null===(a=e.sender)||void 0===a?void 0:a.track)||void 0===n?void 0:n.kind)});(u||Boolean(p)||d instanceof MediaStream&&d.getVideoTracks().length>0)&&p?(s.replace=!0,p.mid&&(s.mid=p.mid),u||L.currentCall.setVideoTrackAdded(!0)):(s.add=!0,L.currentCall.setVideoTrackAdded(!0)),l.push(s),i.createOffer({tracks:l,success:function(e){ge.current=!1,i.send({message:{request:"update"},jsep:e}),y.notifyPeerVideoStart(),w.dispatchVideoCallStarted({initiator:"local",callUser:a.store.getState().currentUser.username,destUser:a.store.getState().currentCall.username}),c.eventDispatch("phone-island-video-enabled",{})},error:function(e){ge.current=!1,console.error("WebRTC error... "+JSON.stringify(e))}})}};o.useEventListener("phone-island-video-enable",function(){Ie()});var _e=function(){var t,r,n,i;if(!ge.current){var l=a.store.getState().webrtc,o=l.sipcall,s=l.localVideoStream;ge.current=!0;var u=null===(i=null===(n=null===(r=null===(t=null==o?void 0:o.webrtcStuff)||void 0===t?void 0:t.pc)||void 0===r?void 0:r.getTransceivers)||void 0===n?void 0:n.call(r))||void 0===i?void 0:i.find(function(e){var t,r,a,n;return"video"===(null===(r=null===(t=e.receiver)||void 0===t?void 0:t.track)||void 0===r?void 0:r.kind)||"video"===(null===(n=null===(a=e.sender)||void 0===a?void 0:a.track)||void 0===n?void 0:n.kind)});Ce.current.stopAllTracks(s),a.store.dispatch.webrtc.updateLocalVideoStream(null),a.store.dispatch.currentCall.setLocalVideoEnabled(!1);var d=[];d.push(e.__assign(e.__assign({type:"video"},(null==u?void 0:u.mid)?{mid:u.mid}:{}),{remove:!0})),o.createOffer({tracks:d,success:function(e){ge.current=!1,o.send({message:{request:"update"},jsep:e}),c.eventDispatch("phone-island-video-disabled",{})},error:function(e){ge.current=!1,console.error("WebRTC error... "+JSON.stringify(e))}})}};o.useEventListener("phone-island-video-disable",function(){_e()});var De=function(){null==ie||ie.attach({plugin:"janus.plugin.videoroom",opaqueId:Ce.current.randomString(32),success:function(e){if(a.store.getState().screenShare.active){L.screenShare.update({plugin:e});var t=a.store.getState().screenShare.role;"publisher"===t?(c.eventDispatch("phone-island-screen-share-initialized",{}),function(){var e,t;if(!Ce.current.isExtensionEnabled())return null===(t=(e=Ce.current).error)||void 0===t||t.call(e,"This browser doesn't support screensharing (getDisplayMedia unavailable)"),void Me();var r={request:"create",description:Ce.current.randomString(32),bitrate:5e5,publishers:1},n=a.store.getState().screenShare.plugin;n.send({message:r,success:function(e){var t,r,i,l,o,s,c,u;if(e.error)return null===(r=(t=Ce.current).error)||void 0===r||r.call(t,"Couldn't create room: "+e.error),void Me();var d=e.videoroom;if(null===(l=(i=Ce.current).debug)||void 0===l||l.call(i,"Event: "+d),d){var p=e.room;if(a.store.getState().screenShare.plugin!==n)return void k.destroyScreenShareRoom(n,p);L.screenShare.update({room:p}),null===(s=(o=Ce.current).log)||void 0===s||s.call(o,"Screen sharing session created: "+p);var v=a.store.getState().currentUser.username;if(he.current)return void(null===(u=(c=Ce.current).log)||void 0===u||u.call(c,"Screen share publisher join already requested on this handle, skipping duplicate join"));he.current=!0;var m={request:"join",room:p,ptype:"publisher",display:v};n.send({message:m})}}})}()):"listener"===t&&Be(),c.eventDispatch("phone-island-screen-share-started",{})}else e.detach()},error:function(e){var t,r;null===(r=(t=Ce.current).error)||void 0===r||r.call(t,"Error attaching videoroom plugin",e),Me()},consentDialog:function(e){},iceState:function(e){var t,r;null===(r=(t=Ce.current).log)||void 0===r||r.call(t,"ICE state changed to "+e)},mediaState:function(e,t){var r,a;null===(a=(r=Ce.current).log)||void 0===a||a.call(r,"Janus "+(t?"started":"stopped")+" receiving our "+e)},webrtcState:function(e){var t,r;null===(r=(t=Ce.current).log)||void 0===r||r.call(t,"Janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},slowLink:function(e,t,r){var a,n;null===(n=(a=Ce.current).warn)||void 0===n||n.call(a,"Janus reports problems "+(e?"sending":"receiving")+" packets on mid "+r+" ("+t+" lost packets)")},onmessage:function(e,t){var r,n,i,l,o,s,c,u,d,p,v,m,f,g,h,S,b,E,w,y;null===(n=(r=Ce.current).debug)||void 0===n||n.call(r," ::: Got a message (publisher) :::",e);var T=a.store.getState().screenShare,C=T.plugin,j=T.role,x=e.videoroom;if(null===(l=(i=Ce.current).debug)||void 0===l||l.call(i,"Event: "+x),x)if("joined"===x){if("publisher"===j){null===(s=(o=Ce.current).debug)||void 0===s||s.call(o,"Negotiating WebRTC stream for our screen");var V=a.store.getState().screenShare.pendingScreenStream,N=null==V?void 0:V.getVideoTracks()[0];L.screenShare.update({pendingScreenStream:null}),C.createOffer({tracks:[{type:"audio",capture:!0,recv:!1},{type:"screen",capture:null==N||N,recv:!1}],success:function(e){var t,r;null===(r=(t=Ce.current).debug)||void 0===r||r.call(t,"Got publisher SDP!",e);C.send({message:{request:"configure",audio:!0,video:!0},jsep:e})},error:function(e){var t,r;he.current=!1,null===(r=(t=Ce.current).error)||void 0===r||r.call(t,"WebRTC error:",e),null==N||N.stop(),L.screenShare.update({active:!1,role:""}),Le(),k.releaseScreenShareHandles(!0)}})}else if(e.publishers){var q=e.publishers;for(var R in null===(u=(c=Ce.current).debug)||void 0===u||u.call(c,"Got a list of available publishers/feeds:",q),q)if(!q[R].dummy){var I=q[R].id,_=q[R].display;null===(p=(d=Ce.current).debug)||void 0===p||p.call(d," >> ["+I+"] "+_),Re(I,_)}}}else if("event"===x)if("listener"===j&&e.publishers){q=e.publishers;for(var R in null===(m=(v=Ce.current).debug)||void 0===m||m.call(v,"Got a list of available publishers/feeds:",q),q)if(!q[R].dummy){I=q[R].id,_=q[R].display;null===(g=(f=Ce.current).debug)||void 0===g||g.call(f," >> ["+I+"] "+_),Re(I,_)}}else if(e.leaving){var D=e.leaving;null===(S=(h=Ce.current).log)||void 0===S||S.call(h,"Publisher left: "+D)}else e.error&&(null===(E=(b=Ce.current).error)||void 0===E||E.call(b,"Error event: "+e.error),Me(),k.releaseScreenShareHandles("publisher"===j));t&&(null===(y=(w=Ce.current).debug)||void 0===y||y.call(w,"Handling SDP as well...",t),C.handleRemoteJsep({jsep:t}))},onlocaltrack:function(e,t){var r,n,i,l,o,s;null===(n=(r=Ce.current).debug)||void 0===n||n.call(r,"Local track "+(t?"added":"removed")+":",e);var c=e.id.replace(/[{}]/g,"");if(t){if(!(null==Q?void 0:Q[c])){if("video"===e.kind){L.screenShare.update({localVideos:X+1});var u=new MediaStream([e]);a.store.dispatch.screenShare.update({localScreenStream:u}),null===(l=(i=Ce.current).log)||void 0===l||l.call(i,"Created local stream: "+u);var d=a.store.getState().player.localScreen;(null==d?void 0:d.current)&&(null===(s=(o=Ce.current).attachMediaStream)||void 0===s||s.call(o,d.current,u),Pe(),e.addEventListener("ended",function(){ze()}))}var p=a.store.getState().screenShare.plugin;"completed"!==p.webrtcStuff.pc.iceConnectionState&&p.webrtcStuff.pc.iceConnectionState}}else{var v=null==Q?void 0:Q[c];if(v)try{var m=v.getTracks();for(var f in m){var g=m[f];g&&g.stop()}}catch(e){}"video"===e.kind&&L.screenShare.update({localVideos:X-1});var h=null==Q?void 0:Q.filter(function(e){return e!==Q[c]});L.screenShare.update({localTracks:h})}},onremotetrack:function(e,t,r){},oncleanup:function(){var e,t;null===(t=(e=Ce.current).log)||void 0===t||t.call(e," ::: Got a cleanup notification :::"),he.current=!1,L.screenShare.update({localTracks:{},localVideos:0})}})},Ae=function(){var e=a.store.getState().player.localScreen,t=a.store.getState().player.remoteScreen,r=a.store.getState().screenShare,n=r.localScreenStream,i=r.remoteScreenStream;(null==e?void 0:e.current)&&Ce.current.attachMediaStream&&Ce.current.attachMediaStream(e.current,n),(null==t?void 0:t.current)&&Ce.current.attachMediaStream&&Ce.current.attachMediaStream(t.current,i)},Pe=function(){var e=a.store.getState().websocket.socket,t=a.store.getState().currentCall.username,r=a.store.getState().screenShare.room,n=a.store.getState().currentUser.username;e.emit("message",{message:"screenSharingStart",roomId:r,destUser:t,callUser:n})},Le=function(){var e=a.store.getState().currentCall.isLocalVideoEnabled,t=a.store.getState().webrtc.remoteVideoStream,r=a.store.getState().screenShare.active,n=!!(null==t?void 0:t.getVideoTracks().some(function(e){return"live"===e.readyState&&!e.muted}));e||n||r||"video"!==a.store.getState().island.view||L.island.setIslandView("call")},Me=function(){var e=a.store.getState().screenShare.pendingScreenStream;Ce.current.stopAllTracks(e),L.screenShare.update({active:!1,role:"",pendingScreenStream:null}),Le()},Fe=function(){if(a.store.getState().screenShare.active){var e=a.store.getState().screenShare.pendingScreenStream;e&&(Ce.current.stopAllTracks(e),L.screenShare.update({pendingScreenStream:null}))}else he.current=!1,L.screenShare.update({active:!0,role:"publisher",room:""}),De()};o.useEventListener("phone-island-screen-share-start",function(){Fe()});var Ue=function(){L.screenShare.update({active:!0,role:"listener"}),De(),c.eventDispatch("phone-island-screen-share-joined",{})},Be=function(){var e={request:"join",room:a.store.getState().screenShare.room,ptype:"publisher",display:a.store.getState().currentUser.username};a.store.getState().screenShare.plugin.send({message:e})},He=function(){var e=a.store.getState().screenShare,t=e.remoteScreenStream,r=e.role,n=e.active;"publisher"!==r?(Ce.current.stopAllTracks(t),L.screenShare.update({active:!1}),k.releaseScreenShareHandles(!1),Ne(),Le(),c.eventDispatch("phone-island-screen-share-left",{})):n&&ze(!1)},Je=function(){ve(!0),me.current&&(clearTimeout(me.current),me.current=null),fe.current&&clearTimeout(fe.current),fe.current=setTimeout(function(){me.current=setTimeout(function(){ve(!1)},3e3)},100)},ze=function(e){void 0===e&&(e=!0);var t=a.store.getState().screenShare,r=t.localScreenStream,n=t.role,i=t.room;if(he.current=!1,Ce.current.stopAllTracks(r),L.screenShare.update({active:!1}),k.releaseScreenShareHandles("publisher"===n),e){var l=a.store.getState().websocket.socket,o=a.store.getState().currentCall.username,s=a.store.getState().currentUser.username;l.emit("message",{message:"screenSharingStop",roomId:i,destUser:o,callUser:s})}c.eventDispatch("phone-island-screen-share-stopped",{}),Le()};o.useEventListener("phone-island-screen-share-stop",function(){ze()});var We=t.useState(!0),Ge=We[0],Oe=We[1],Ke=function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(e){switch(e.label){case 0:return(null==je?void 0:je.length)>0?[4,b.checkWebCamPermission()]:[3,2];case 1:return e.sent()?(Oe(!0),[2,!0]):(Oe(!1),[2,!1]);case 2:return Oe(!1),[2,!1];case 3:return[2]}})})};return x.default.createElement(x.default.Fragment,null,ae?x.default.createElement("div",{ref:Se,onMouseMove:function(){return Je()},className:ce?"pi-h-screen":"pi-h-[480px] pi-w-[600px]"},x.default.createElement("div",{className:"pi-flex pi-relative pi-justify-center pi-w-full pi-h-full"},x.default.createElement("video",{autoPlay:!0,muted:!0,ref:we,className:"pi-rounded-2xl pi-w-full pi-h-full ".concat(Z&&"listener"===Y?"":"pi-hidden")}),x.default.createElement("video",{autoPlay:!0,muted:!0,ref:Ee,className:"pi-rounded-2xl pi-w-full pi-h-full ".concat(Z&&"publisher"===Y?"":"pi-hidden")}),x.default.createElement("video",{autoPlay:!0,muted:!0,ref:ke,className:"pi-rounded-2xl ".concat(Z||z?"pi-hidden":"")}),x.default.createElement("div",{className:"pi-w-full pi-bg-gray-200 dark:pi-bg-gray-800 pi-flex pi-items-center pi-justify-center ".concat(Z||!z?"pi-hidden":"")},x.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-32 pi-h-32 pi-flex pi-items-center pi-justify-center"},x.default.createElement("span",{className:"pi-text-4xl pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(G)))),x.default.createElement("video",{muted:!0,autoPlay:!0,ref:ye,className:"pi-max-w-32 pi-max-h-32 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg ".concat(J?"":"pi-hidden")}),x.default.createElement("div",{className:"pi-w-32 pi-h-24 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ".concat(J||!W?"pi-hidden":"")},x.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center"},x.default.createElement("span",{className:"pi-text-base pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(oe.name||"-")))),x.default.createElement("video",{muted:!0,autoPlay:!0,ref:Te,className:"pi-max-w-32 pi-max-h-32 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg ".concat(!Z||z?"pi-hidden":"")}),x.default.createElement("div",{className:"pi-w-32 pi-h-24 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ".concat(Z&&z&&W?"":"pi-hidden")},x.default.createElement("div",{className:"pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center"},x.default.createElement("span",{className:"pi-text-base pi-text-gray-50 dark:pi-text-gray-900"},E.getInitials(G))))),x.default.createElement("div",{className:"".concat(!pe&&"pi-opacity-0 pi-pointer-events-none"," pi-absolute pi-bottom-0 pi-bg-gray-950/65 pi-w-full pi-p-6 pi-rounded-bl-[20px] pi-rounded-br-[20px] pi-transition-all")},x.default.createElement("div",{className:"pi-flex pi-items-center pi-justify-center pi-gap-6 pi-mb-5"},!(null==re?void 0:re.isListen)&&x.default.createElement(r.Button,{variant:"default",active:!!F,onClick:function(){return F?d.unmuteCurrentCall():d.muteCurrentCall()},"data-tooltip-id":"tooltip-mute","data-tooltip-content":"".concat(F?l.t("Tooltip.Unmute"):l.t("Tooltip.Mute"))},F?x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faMicrophoneSlash}):x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faMicrophone})),(null==je?void 0:je.length)>0&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return e.__awaiter(void 0,void 0,void 0,function(){return e.__generator(this,function(e){switch(e.label){case 0:return[4,Ke()];case 1:return e.sent()&&(J?_e():Ie()),[2]}})})},"data-tooltip-id":"tooltip-toggle-video","data-tooltip-content":"".concat(Ge?J?l.t("Tooltip.Disable camera"):l.t("Tooltip.Enable camera"):l.t("Tooltip.Enable camera permission")||""),disabled:!Ge,className:"".concat(Ge?"":"pi-cursor-auto")},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:J?i.faVideoSlash:i.faVideo})),"safari"!==Ce.current.webRTCAdapter.browserDetails.browser&&(null===(R=null===(q=null===(N=null===(V=null===(j=null==oe?void 0:oe.profile)||void 0===j?void 0:j.macro_permissions)||void 0===V?void 0:V.nethvoice_cti)||void 0===N?void 0:N.permissions)||void 0===q?void 0:q.screen_sharing)||void 0===R?void 0:R.value)&&!Z&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return Fe()},"data-tooltip-id":"tooltip-start-screen-share","data-tooltip-content":l.t("Tooltip.Share screen")||""},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:i.faDisplay})),Z&&"publisher"===Y&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return ze()},"data-tooltip-id":"tooltip-stop-screen-share","data-tooltip-content":l.t("Tooltip.Stop sharing")},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:S.faDisplaySlash})),Z&&"listener"===Y&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return qe()},"data-tooltip-id":"tooltip-toggle-fullscreen","data-tooltip-content":ce?l.t("Tooltip.Exit fullscreen"):l.t("Tooltip.Enter fullscreen")},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:ce?i.faCompress:i.faExpand})),(null===(P=null===(A=null===(D=null===(_=null===(I=null==oe?void 0:oe.profile)||void 0===I?void 0:I.macro_permissions)||void 0===_?void 0:_.settings)||void 0===D?void 0:D.permissions)||void 0===A?void 0:A.recording)||void 0===P?void 0:P.value)&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return d.recordCurrentCall(B)},"data-tooltip-id":"tooltip-record-video-view","data-tooltip-content":B?l.t("Tooltip.Stop recording"):l.t("Tooltip.Record")},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:B?i.faStop:S.faRecord})),!((null==re?void 0:re.isIntrude)||(null==re?void 0:re.isListen))&&x.default.createElement(r.Button,{variant:"default",onClick:function(){return H?d.unpauseCurrentCall():(d.pauseCurrentCall(),void(a.store.getState().screenShare.active&&ze()))},"data-tooltip-id":"tooltip-pause-video-view","data-tooltip-content":H?l.t("Tooltip.Play"):l.t("Tooltip.Pause")},x.default.createElement(n.FontAwesomeIcon,{className:"pi-h-6 pi-w-6",icon:H?i.faPlay:i.faPause}))),x.default.createElement(u.default,{buttonsVariant:"default"})),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-mute-video-view",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-toggle-video",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-toggle-fullscreen",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-start-screen-share",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-stop-screen-share",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-record-video-view",place:"bottom"}),x.default.createElement(h.CustomThemedTooltip,{className:"pi-z-20",id:"tooltip-pause-video-view",place:"bottom"})):x.default.createElement(x.default.Fragment,null,x.default.createElement("div",{className:"pi-flex pi-justify-between pi-items-center"},x.default.createElement(v.default,null),x.default.createElement(m.default,{startTime:U,isNotAlwaysWhite:!0}),!ae&&le&&!f.isPhysical()&&x.default.createElement(g.AudioBars,{audioStream:le,paused:H,size:ae?"large":"small"}))))};exports.VideoView=V,exports.default=V;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/VideoView/index.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef, useState } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faCompress,\n faDisplay,\n faExpand,\n faMicrophone,\n faMicrophoneSlash,\n faPause,\n faPlay,\n faStop,\n faVideo,\n faVideoSlash,\n} from '@fortawesome/free-solid-svg-icons'\nimport { t } from 'i18next'\nimport { eventDispatch, useEventListener, useIsomorphicLayoutEffect } from '../../utils'\nimport Hangup from '../Hangup'\nimport {\n muteCurrentCall,\n pauseCurrentCall,\n recordCurrentCall,\n unmuteCurrentCall,\n unpauseCurrentCall,\n} from '../../lib/phone/call'\nimport { JanusTrack, JanusTypes } from '../../types/webrtc'\nimport JanusLib from '../../lib/webrtc/janus.js'\nimport Avatar from '../CallView/Avatar'\nimport Timer from '../CallView/Timer'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { AudioBars } from '../AudioBars'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { faDisplaySlash, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { getCurrentVideoInputDeviceId } from '../../lib/devices/devices'\nimport { getInitials } from '../../lib/avatars/avatars'\nimport { checkWebCamPermission } from '../../lib/devices/devices'\nimport { dispatchVideoCallStarted } from '../../events/SocketEvents'\nimport { notifyPeerVideoStart } from '../../lib/phone/video'\n\nexport interface VideoViewProps {}\n\nexport type ScreenSharingMessage = {\n message: 'screenSharingStart' | 'screenSharingStop'\n roomId: string\n destUser: string\n callUser: string\n}\n\nexport type VideoCallMessage = {\n message: 'videoCallStart'\n destUser: string\n callUser: string\n}\n\nexport const VideoView: FC<VideoViewProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const {\n muted,\n startTime,\n isRecording,\n paused,\n isLocalVideoEnabled,\n showRemoteVideoPlaceHolder,\n hasVideoTrackAdded,\n displayName,\n isStartingVideoCall,\n } = useSelector((state: RootState) => state.currentCall)\n const {\n localTracks,\n localVideos,\n role: screenShareRole,\n active: screenShareActive,\n isStartingScreenShare,\n isJoiningScreenShare,\n isLeavingScreenShare,\n } = useSelector((state: RootState) => state.screenShare)\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { janusInstance, remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const userInfo = store.getState().currentUser\n const [isFullscreen, setIsFullscreen] = useState(false)\n const [isUiShown, setUiShown] = useState(false)\n const uiTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const videoRenegotiationInFlightRef = useRef(false)\n const screenSharePublisherJoinRequestedRef = useRef(false)\n const screenShareViewRef = useRef(null)\n const localScreen = useRef<HTMLVideoElement>(null)\n const remoteScreen = useRef<HTMLVideoElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const largeRemoteVideo = useRef<HTMLVideoElement>(null)\n const smallRemoteVideo = useRef<HTMLVideoElement>(null)\n const janus = useRef<JanusTypes>(JanusLib)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n localScreen: localScreen,\n remoteScreen: remoteScreen,\n localVideo: localVideo,\n largeRemoteVideo: largeRemoteVideo,\n smallRemoteVideo: smallRemoteVideo,\n })\n }, [])\n\n // component did mount\n useEffect(() => {\n updateScreenStreams()\n updateVideoStreams()\n\n // register for full screen change\n addEventListener('fullscreenchange', handleFullscreenChange)\n\n return () => {\n removeEventListener('fullscreenchange', handleFullscreenChange)\n\n // clear timeout\n if (uiTimeoutRef.current) {\n clearTimeout(uiTimeoutRef.current)\n }\n }\n }, [])\n\n // starting videocall\n useEffect(() => {\n if (isStartingVideoCall) {\n enableVideo()\n dispatch.currentCall.updateCurrentCall({\n isStartingVideoCall: false,\n })\n }\n }, [isStartingVideoCall])\n\n // starting screen sharing\n useEffect(() => {\n if (isStartingScreenShare) {\n initAndStartScreenShare()\n store.dispatch.screenShare.update({\n isStartingScreenShare: false,\n })\n }\n }, [isStartingScreenShare])\n\n // joining screen sharing\n useEffect(() => {\n if (isJoiningScreenShare) {\n initAndJoinScreenShare()\n store.dispatch.screenShare.update({\n isJoiningScreenShare: false,\n })\n }\n }, [isJoiningScreenShare])\n\n // leaving screen sharing\n useEffect(() => {\n if (isLeavingScreenShare) {\n leaveScreenShare()\n store.dispatch.screenShare.update({\n isLeavingScreenShare: false,\n })\n }\n }, [isLeavingScreenShare])\n\n // isOpen changed\n useEffect(() => {\n updateScreenStreams()\n updateVideoStreams()\n }, [isOpen])\n\n const updateVideoStreams = () => {\n const localVideoElement = store.getState().player.localVideo\n const largeRemoteVideoElement = store.getState().player.largeRemoteVideo\n const smallRemoteVideoElement = store.getState().player.smallRemoteVideo\n const { localVideoStream, remoteVideoStream } = store.getState().webrtc\n\n // local video stream\n\n if (localVideoElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(localVideoElement.current, localVideoStream as MediaStream)\n }\n }\n\n // large remote video stream\n\n if (largeRemoteVideoElement?.current && janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n largeRemoteVideoElement.current,\n remoteVideoStream as MediaStream,\n )\n }\n\n // small remote video stream\n\n if (smallRemoteVideoElement?.current && janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n smallRemoteVideoElement.current,\n remoteVideoStream as MediaStream,\n )\n }\n\n if (remoteVideoStream instanceof MediaStream && remoteVideoStream.getVideoTracks().length > 0) {\n dispatch.currentCall.updateCurrentCall({\n showRemoteVideoPlaceHolder: false,\n })\n }\n }\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n const toggleFullScreen = () => {\n if (document.fullscreenElement) {\n document.exitFullscreen()\n eventDispatch('phone-island-fullscreen-exited', {})\n } else {\n if (screenShareViewRef.current) {\n ;(screenShareViewRef.current as HTMLElement).requestFullscreen()\n eventDispatch('phone-island-fullscreen-entered', {})\n }\n }\n }\n useEventListener('phone-island-fullscreen-enter', () => {\n toggleFullScreen()\n })\n useEventListener('phone-island-fullscreen-exit', () => {\n toggleFullScreen()\n })\n\n const newRemoteFeed = (id, display) => {\n // A new feed has been published, create a new plugin handle and attach to it as a listener\n\n dispatch.screenShare.update({\n source: id,\n })\n\n let remoteFeed: any = null\n janusInstance?.attach({\n plugin: 'janus.plugin.videoroom',\n opaqueId: janus.current.randomString(32),\n success: function (pluginHandle) {\n remoteFeed = pluginHandle\n\n dispatch.screenShare.update({\n remoteFeed: pluginHandle,\n })\n remoteFeed.remoteTracks = {}\n remoteFeed.remoteVideos = 0\n janus.current.log?.(\n 'Plugin attached! (' + remoteFeed.getPlugin() + ', id=' + remoteFeed.getId() + ')',\n )\n janus.current.log?.(' -- This is a subscriber')\n // We wait for the plugin to send us an offer\n const { room } = store.getState().screenShare\n\n let listen = {\n request: 'join',\n room: room,\n ptype: 'subscriber',\n feed: id,\n }\n remoteFeed.send({ message: listen })\n },\n error: function (error) {\n janus.current.error?.('Error attaching videoroom plugin', error)\n },\n iceState: function (state) {\n janus.current.log?.('ICE state (feed #' + remoteFeed.rfindex + ') changed to ' + state)\n },\n webrtcState: function (on) {\n janus.current.log?.(\n 'Janus says this WebRTC PeerConnection (feed #' +\n remoteFeed.rfindex +\n ') is ' +\n (on ? 'up' : 'down') +\n ' now',\n )\n },\n slowLink: function (uplink, lost, mid) {\n janus.current.warn?.(\n 'Janus reports problems ' +\n (uplink ? 'sending' : 'receiving') +\n ' packets on mid ' +\n mid +\n ' (' +\n lost +\n ' lost packets)',\n )\n },\n onmessage: function (msg, jsep) {\n janus.current.debug?.(' ::: Got a message (listener) :::', msg)\n let event = msg['videoroom']\n janus.current.debug?.('Event: ' + event)\n if (event) {\n if (event === 'attached') {\n // Subscriber created and attached\n janus.current.log?.(\n 'Successfully attached to feed ' + id + ' (' + display + ') in room ' + msg['room'],\n )\n } else {\n janus.current.warn?.('Unhandled event: ' + event)\n }\n }\n if (jsep) {\n janus.current.debug?.('Handling SDP as well...', jsep)\n // Answer and attach\n remoteFeed.createAnswer({\n jsep: jsep,\n // We only specify data channels here, as this way in\n // case they were offered we'll enable them. Since we\n // don't mention audio or video tracks, we autoaccept them\n // as recvonly (since we won't capture anything ourselves)\n tracks: [{ type: 'data' }],\n success: function (jsep) {\n janus.current.debug?.('Got SDP!', jsep)\n\n const { room } = store.getState().screenShare\n\n let body = { request: 'start', room: room }\n remoteFeed.send({ message: body, jsep: jsep })\n },\n error: function (error) {\n janus.current.error?.('WebRTC error:', error)\n },\n })\n }\n },\n // eslint-disable-next-line no-unused-vars\n onlocaltrack: function (track, on) {\n // The subscriber stream is recvonly, we don't expect anything here\n },\n onremotetrack: function (track, mid, on, metadata) {\n janus.current.debug?.(\n 'Remote track (mid=' +\n mid +\n ') ' +\n (on ? 'added' : 'removed') +\n (metadata ? ' (' + metadata.reason + ') ' : '') +\n ':',\n track,\n )\n // Screen sharing tracks are sometimes muted/unmuted by browser\n // when data is not flowing fast enough; this can make streams blink.\n // We can ignore these.\n if (\n track.kind === 'video' &&\n metadata &&\n (metadata.reason === 'mute' || metadata.reason === 'unmute')\n ) {\n janus.current.log?.('Ignoring mute/unmute on screen-sharing track.')\n return\n }\n if (!on) {\n const { remoteScreenStream } = store.getState().screenShare\n janus.current.stopAllTracks(remoteScreenStream)\n dispatch.screenShare.update({ active: false })\n return\n }\n // If we're here, a new track was added\n if (track.kind === 'video') {\n // New video track: create a stream out of it\n let stream = new MediaStream([track])\n\n // Save the new video stream to the store\n store.dispatch.screenShare.update({ remoteScreenStream: stream })\n\n remoteFeed.remoteTracks[mid] = stream\n janus.current.log?.('Created remote video stream: ' + stream)\n const remoteScreenElement = store.getState().player.remoteScreen\n\n if (remoteScreenElement?.current) {\n janus.current.attachMediaStream?.(remoteScreenElement.current, stream)\n }\n }\n },\n oncleanup: function () {\n janus.current.log?.(' ::: Got a cleanup notification (remote feed ' + id + ') :::')\n remoteFeed.remoteTracks = {}\n remoteFeed.remoteVideos = 0\n },\n })\n }\n\n const enableVideo = () => {\n if (videoRenegotiationInFlightRef.current) {\n return\n }\n\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n videoRenegotiationInFlightRef.current = true\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n })\n const tracks: JanusTrack[] = []\n const currentVideoInputDeviceId = getCurrentVideoInputDeviceId()\n\n const track: Partial<JanusTrack> = {\n type: 'video',\n recv: true,\n }\n\n if (currentVideoInputDeviceId) {\n track.capture = { deviceId: { exact: currentVideoInputDeviceId } }\n } else {\n track.capture = true\n }\n\n const { hasVideoTrackAdded } = store.getState().currentCall\n const { remoteVideoStream } = store.getState().webrtc\n const videoTransceiver = sipcall?.webrtcStuff?.pc\n ?.getTransceivers?.()\n ?.find(\n (transceiver: RTCRtpTransceiver) =>\n transceiver.receiver?.track?.kind === 'video' ||\n transceiver.sender?.track?.kind === 'video',\n )\n const shouldReplaceExistingVideoTransceiver =\n hasVideoTrackAdded ||\n Boolean(videoTransceiver) ||\n (remoteVideoStream instanceof MediaStream && remoteVideoStream.getVideoTracks().length > 0)\n\n if (!shouldReplaceExistingVideoTransceiver) {\n track.add = true\n dispatch.currentCall.setVideoTrackAdded(true)\n } else {\n // Reuse the existing video transceiver when available instead of assuming a\n // fixed mid, otherwise fall back to adding a new local video track.\n if (videoTransceiver) {\n track.replace = true\n if (videoTransceiver.mid) {\n track.mid = videoTransceiver.mid\n }\n if (!hasVideoTrackAdded) {\n dispatch.currentCall.setVideoTrackAdded(true)\n }\n } else {\n track.add = true\n dispatch.currentCall.setVideoTrackAdded(true)\n }\n }\n tracks.push(track as JanusTrack)\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep) {\n videoRenegotiationInFlightRef.current = false\n sipcall.send({ message: { request: 'update' }, jsep: jsep })\n notifyPeerVideoStart()\n dispatchVideoCallStarted({\n initiator: 'local',\n callUser: store.getState().currentUser.username,\n destUser: store.getState().currentCall.username,\n })\n eventDispatch('phone-island-video-enabled', {})\n },\n error: function (error) {\n videoRenegotiationInFlightRef.current = false\n console.error('WebRTC error... ' + JSON.stringify(error))\n },\n })\n }\n useEventListener('phone-island-video-enable', () => {\n enableVideo()\n })\n\n const disableVideo = () => {\n if (videoRenegotiationInFlightRef.current) {\n return\n }\n\n const { sipcall, localVideoStream }: { sipcall: any; localVideoStream: MediaStream | null } =\n store.getState().webrtc\n videoRenegotiationInFlightRef.current = true\n const videoTransceiver = sipcall?.webrtcStuff?.pc\n ?.getTransceivers?.()\n ?.find(\n (transceiver: RTCRtpTransceiver) =>\n transceiver.receiver?.track?.kind === 'video' ||\n transceiver.sender?.track?.kind === 'video',\n )\n\n janus.current.stopAllTracks(localVideoStream)\n store.dispatch.webrtc.updateLocalVideoStream(null)\n store.dispatch.currentCall.setLocalVideoEnabled(false)\n const tracks: JanusTrack[] = []\n tracks.push({\n type: 'video',\n ...(videoTransceiver?.mid ? { mid: videoTransceiver.mid } : {}),\n remove: true,\n })\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep) {\n videoRenegotiationInFlightRef.current = false\n sipcall.send({ message: { request: 'update' }, jsep: jsep })\n eventDispatch('phone-island-video-disabled', {})\n },\n error: function (error) {\n videoRenegotiationInFlightRef.current = false\n console.error('WebRTC error... ' + JSON.stringify(error))\n },\n })\n }\n useEventListener('phone-island-video-disable', () => {\n disableVideo()\n })\n\n const toggleVideo = async () => {\n let cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n if (isLocalVideoEnabled) {\n disableVideo()\n } else {\n enableVideo()\n }\n }\n }\n\n const shareScreen = () => {\n if (!janus.current.isExtensionEnabled()) {\n janus.current.error?.(\n \"This browser doesn't support screensharing (getDisplayMedia unavailable)\",\n )\n return\n }\n\n // Create a new room\n const roomName = janus.current.randomString(32)\n\n let create = {\n request: 'create',\n description: roomName,\n bitrate: 500000,\n publishers: 1,\n }\n\n const { plugin } = store.getState().screenShare\n\n plugin.send({\n message: create,\n success: function (result) {\n if (result['error']) {\n janus.current.error?.(\"Couldn't create room: \" + result['error'])\n abortScreenShare()\n return\n }\n let event = result['videoroom']\n janus.current.debug?.('Event: ' + event)\n if (event) {\n // Our own screen sharing session has been created, join it\n\n const room = result['room']\n // Set room to the store\n dispatch.screenShare.update({\n room: room,\n })\n\n janus.current.log?.('Screen sharing session created: ' + room)\n\n const { username } = store.getState().currentUser\n\n if (screenSharePublisherJoinRequestedRef.current) {\n janus.current.log?.(\n 'Screen share publisher join already requested on this handle, skipping duplicate join',\n )\n return\n }\n\n screenSharePublisherJoinRequestedRef.current = true\n\n let register = {\n request: 'join',\n room: room,\n ptype: 'publisher',\n display: username,\n }\n plugin.send({ message: register })\n }\n },\n })\n }\n\n const initScreenShare = () => {\n janusInstance?.attach({\n plugin: 'janus.plugin.videoroom',\n opaqueId: janus.current.randomString(32),\n success: function (pluginHandle) {\n // Set plugin to the store\n dispatch.screenShare.update({\n plugin: pluginHandle,\n })\n const { role } = store.getState().screenShare\n\n if (role === 'publisher') {\n eventDispatch('phone-island-screen-share-initialized', {})\n shareScreen()\n } else if (role === 'listener') {\n joinScreenShare()\n }\n eventDispatch('phone-island-screen-share-started', {})\n },\n error: function (error) {\n janus.current.error?.('Error attaching videoroom plugin', error)\n abortScreenShare()\n },\n consentDialog: function (on) {},\n iceState: function (state) {\n janus.current.log?.('ICE state changed to ' + state)\n },\n mediaState: function (medium, on) {\n janus.current.log?.('Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium)\n },\n webrtcState: function (on) {\n janus.current.log?.(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n slowLink: function (uplink, lost, mid) {\n janus.current.warn?.(\n 'Janus reports problems ' +\n (uplink ? 'sending' : 'receiving') +\n ' packets on mid ' +\n mid +\n ' (' +\n lost +\n ' lost packets)',\n )\n },\n onmessage: function (msg, jsep) {\n janus.current.debug?.(' ::: Got a message (publisher) :::', msg)\n const { plugin, role } = store.getState().screenShare\n const event = msg['videoroom']\n janus.current.debug?.('Event: ' + event)\n\n if (event) {\n if (event === 'joined') {\n if (role === 'publisher') {\n // This is our session, publish our stream\n janus.current.debug?.('Negotiating WebRTC stream for our screen')\n\n // The screen picked at click time, otherwise Janus asks for one\n const { pendingScreenStream } = store.getState().screenShare\n const screenTrack = pendingScreenStream?.getVideoTracks()[0]\n dispatch.screenShare.update({ pendingScreenStream: null })\n\n plugin.createOffer({\n // We want sendonly audio and screensharing\n tracks: [\n { type: 'audio', capture: true, recv: false },\n { type: 'screen', capture: screenTrack ?? true, recv: false },\n ],\n success: function (jsep) {\n janus.current.debug?.('Got publisher SDP!', jsep)\n let publish = { request: 'configure', audio: true, video: true }\n plugin.send({ message: publish, jsep: jsep })\n },\n error: function (error) {\n screenSharePublisherJoinRequestedRef.current = false\n janus.current.error?.('WebRTC error:', error)\n screenTrack?.stop()\n dispatch.screenShare.update({ active: false, role: '' })\n exitVideoViewIfNoVideo()\n const { room } = store.getState().screenShare\n const releaseHandle = () => plugin.detach()\n plugin.send({\n message: { request: 'destroy', room },\n success: releaseHandle,\n error: releaseHandle,\n })\n },\n })\n } else {\n // We're just watching a session, any feed to attach to?\n if (msg['publishers']) {\n let list = msg['publishers']\n janus.current.debug?.('Got a list of available publishers/feeds:', list)\n for (let f in list) {\n if (list[f]['dummy']) continue\n let id = list[f]['id']\n let display = list[f]['display']\n janus.current.debug?.(' >> [' + id + '] ' + display)\n newRemoteFeed(id, display)\n }\n }\n }\n } else if (event === 'event') {\n // Any feed to attach to?\n if (role === 'listener' && msg['publishers']) {\n let list = msg['publishers']\n janus.current.debug?.('Got a list of available publishers/feeds:', list)\n for (let f in list) {\n if (list[f]['dummy']) continue\n let id = list[f]['id']\n let display = list[f]['display']\n janus.current.debug?.(' >> [' + id + '] ' + display)\n newRemoteFeed(id, display)\n }\n } else if (msg['leaving']) {\n // One of the publishers has gone away?\n let leaving = msg['leaving']\n janus.current.log?.('Publisher left: ' + leaving)\n } else if (msg['error']) {\n janus.current.error?.('Error event: ' + msg['error'])\n }\n }\n }\n if (jsep) {\n janus.current.debug?.('Handling SDP as well...', jsep)\n plugin.handleRemoteJsep({ jsep: jsep })\n }\n },\n onlocaltrack: function (track, on) {\n janus.current.debug?.('Local track ' + (on ? 'added' : 'removed') + ':', track)\n // We use the track ID as name of the element, but it may contain invalid characters\n let trackId = track.id.replace(/[{}]/g, '')\n if (!on) {\n // Track removed, get rid of the stream and the rendering\n let stream = localTracks?.[trackId]\n if (stream) {\n try {\n let tracks = stream.getTracks()\n for (let i in tracks) {\n let mst = tracks[i]\n if (mst) mst.stop()\n }\n // eslint-disable-next-line no-unused-vars\n } catch (e) {}\n }\n if (track.kind === 'video') {\n dispatch.screenShare.update({\n localVideos: localVideos - 1,\n })\n }\n\n // remove track\n const filteredTracks = localTracks?.filter((track) => track !== localTracks[trackId])\n dispatch.screenShare.update({\n localTracks: filteredTracks,\n })\n return\n }\n // If we're here, a new track was added\n let stream = localTracks?.[trackId]\n if (stream) {\n // We've been here already\n return\n }\n\n if (track.kind === 'video') {\n // New video track: create a stream out of it\n dispatch.screenShare.update({\n localVideos: localVideos + 1,\n })\n let stream = new MediaStream([track])\n\n // Save the new video stream to the store\n store.dispatch.screenShare.update({\n localScreenStream: stream,\n })\n\n janus.current.log?.('Created local stream: ' + stream)\n const localScreenElement = store.getState().player.localScreen\n\n if (localScreenElement?.current) {\n janus.current.attachMediaStream?.(localScreenElement.current, stream)\n inviteOtherUser()\n\n // Listen for the 'ended' event on the screen-sharing track\n track.addEventListener('ended', () => {\n stopScreenShare()\n })\n }\n }\n const { plugin } = store.getState().screenShare\n\n if (\n plugin.webrtcStuff.pc.iceConnectionState !== 'completed' &&\n plugin.webrtcStuff.pc.iceConnectionState !== 'connected'\n ) {\n }\n },\n // eslint-disable-next-line no-unused-vars\n onremotetrack: function (track, mid, on) {\n // The publisher stream is sendonly, we don't expect anything here\n },\n oncleanup: function () {\n janus.current.log?.(' ::: Got a cleanup notification :::')\n screenSharePublisherJoinRequestedRef.current = false\n\n dispatch.screenShare.update({\n localTracks: {},\n localVideos: 0,\n })\n },\n })\n }\n\n const updateScreenStreams = () => {\n const localScreenElement = store.getState().player.localScreen\n const remoteScreenElement = store.getState().player.remoteScreen\n const { localScreenStream, remoteScreenStream } = store.getState().screenShare\n\n // local screen stream\n\n if (localScreenElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n localScreenElement.current,\n localScreenStream as MediaStream,\n )\n }\n }\n\n // remote screen stream\n\n if (remoteScreenElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n remoteScreenElement.current,\n remoteScreenStream as MediaStream,\n )\n }\n }\n }\n\n const inviteOtherUser = () => {\n // send message to websocket to invite the other user\n const { socket } = store.getState().websocket\n const { username: destUsername } = store.getState().currentCall\n const { room } = store.getState().screenShare\n const { username } = store.getState().currentUser\n\n socket.emit('message', {\n message: 'screenSharingStart',\n roomId: room,\n destUser: destUsername,\n callUser: username,\n } as ScreenSharingMessage)\n }\n\n // Back to the call view once nothing is left to show: no camera, no remote video\n // and no screen share. Otherwise an audio call stays stuck on the video view\n const exitVideoViewIfNoVideo = () => {\n const { isLocalVideoEnabled } = store.getState().currentCall\n const { remoteVideoStream } = store.getState().webrtc\n const { active: isScreenShareActive } = store.getState().screenShare\n const hasRemoteVideo = !!remoteVideoStream\n ?.getVideoTracks()\n .some((track) => track.readyState === 'live' && !track.muted)\n if (\n !isLocalVideoEnabled &&\n !hasRemoteVideo &&\n !isScreenShareActive &&\n store.getState().island.view === 'video'\n ) {\n dispatch.island.setIslandView('call')\n }\n }\n\n const abortScreenShare = () => {\n const { pendingScreenStream, role } = store.getState().screenShare\n if (role !== 'publisher') return\n janus.current.stopAllTracks(pendingScreenStream)\n dispatch.screenShare.update({ active: false, role: '', pendingScreenStream: null })\n exitVideoViewIfNoVideo()\n }\n\n const initAndStartScreenShare = () => {\n screenSharePublisherJoinRequestedRef.current = false\n dispatch.screenShare.update({ active: true, role: 'publisher' })\n initScreenShare()\n }\n useEventListener('phone-island-screen-share-start', () => {\n initAndStartScreenShare()\n })\n\n const initAndJoinScreenShare = () => {\n dispatch.screenShare.update({ active: true, role: 'listener' })\n initScreenShare()\n eventDispatch('phone-island-screen-share-joined', {})\n }\n\n const joinScreenShare = () => {\n const { room } = store.getState().screenShare\n const { username } = store.getState().currentUser\n\n const joinMessage = {\n request: 'join',\n room: room,\n ptype: 'publisher',\n display: username,\n }\n\n const { plugin } = store.getState().screenShare\n plugin.send({ message: joinMessage })\n }\n\n const leaveScreenShare = () => {\n const { remoteScreenStream } = store.getState().screenShare\n janus.current.stopAllTracks(remoteScreenStream)\n dispatch.screenShare.update({ active: false })\n exitVideoViewIfNoVideo()\n eventDispatch('phone-island-screen-share-left', {})\n }\n\n const handleMouseMove = () => {\n setUiShown(true)\n\n if (uiTimeoutRef.current) {\n clearTimeout(uiTimeoutRef.current)\n uiTimeoutRef.current = null\n }\n }\n\n const startHideTimer = () => {\n // start a timer when mouse stops moving to hide video UI\n uiTimeoutRef.current = setTimeout(() => {\n setUiShown(false)\n }, 3000)\n }\n\n const handleMouseMoveWithDebounce = () => {\n handleMouseMove()\n\n // clear the previous debounce timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // set a new debounce timer - when this isn't cleared, it means the mouse has stopped\n debounceTimerRef.current = setTimeout(() => {\n startHideTimer()\n }, 100) // small delay to detect \"stopped moving\"\n }\n\n const stopScreenShare = () => {\n const { plugin, localScreenStream } = store.getState().screenShare\n\n screenSharePublisherJoinRequestedRef.current = false\n janus.current.stopAllTracks(localScreenStream)\n dispatch.screenShare.update({ active: false })\n plugin.detach()\n\n // send message to websocket to tell the other user the screen share has stopped\n const { socket } = store.getState().websocket\n const { username: destUsername } = store.getState().currentCall\n const { room } = store.getState().screenShare\n const { username } = store.getState().currentUser\n\n socket.emit('message', {\n message: 'screenSharingStop',\n roomId: room,\n destUser: destUsername,\n callUser: username,\n } as ScreenSharingMessage)\n\n eventDispatch('phone-island-screen-share-stopped', {})\n exitVideoViewIfNoVideo()\n }\n useEventListener('phone-island-screen-share-stop', () => {\n stopScreenShare()\n })\n\n const pauseCall = () => {\n pauseCurrentCall()\n stopScreenShare()\n }\n\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const checkCameraPermission = async () => {\n if (videoInputDevices?.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n if (isWebCamAccepted) {\n setIsVideoCallButtonVisible(true)\n return true\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }\n\n return (\n <>\n {isOpen ? (\n <div\n ref={screenShareViewRef}\n onMouseMove={() => handleMouseMoveWithDebounce()}\n className={isFullscreen ? 'pi-h-screen' : 'pi-h-[480px] pi-w-[600px]'}\n >\n <div className={`pi-flex pi-relative pi-justify-center pi-w-full pi-h-full`}>\n {/* large remote screen */}\n <video\n autoPlay\n muted={true}\n ref={remoteScreen}\n className={`pi-rounded-2xl pi-w-full pi-h-full ${\n !screenShareActive || screenShareRole !== 'listener' ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* large local screen */}\n <video\n autoPlay\n muted={true}\n ref={localScreen}\n className={`pi-rounded-2xl pi-w-full pi-h-full ${\n !screenShareActive || screenShareRole !== 'publisher' ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* large remote video */}\n <video\n autoPlay\n muted={true}\n ref={largeRemoteVideo}\n className={`pi-rounded-2xl ${\n screenShareActive || showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* remote video placeholder */}\n <div\n className={`pi-w-full pi-bg-gray-200 dark:pi-bg-gray-800 pi-flex pi-items-center pi-justify-center ${\n screenShareActive || !showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-32 pi-h-32 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-4xl pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(displayName)}\n </span>\n </div>\n </div>\n {/* small local video */}\n <video\n muted={true}\n autoPlay\n ref={localVideo}\n className={`pi-max-w-32 pi-max-h-32 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg ${\n !isLocalVideoEnabled ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* small local video placeholder */}\n <div\n className={`pi-w-32 pi-h-24 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ${\n isLocalVideoEnabled || !hasVideoTrackAdded ? 'pi-hidden' : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-base pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(userInfo.name || '-')}\n </span>\n </div>\n </div>\n {/* small remote video */}\n <video\n muted={true}\n autoPlay\n ref={smallRemoteVideo}\n className={`pi-max-w-32 pi-max-h-32 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg ${\n !screenShareActive || showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* small remote video placeholder */}\n <div\n className={`pi-w-32 pi-h-24 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ${\n !screenShareActive || !showRemoteVideoPlaceHolder || !hasVideoTrackAdded\n ? 'pi-hidden'\n : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-base pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(displayName)}\n </span>\n </div>\n </div>\n </div>\n\n <div\n className={`${\n !isUiShown && 'pi-opacity-0 pi-pointer-events-none'\n } pi-absolute pi-bottom-0 pi-bg-gray-950/65 pi-w-full pi-p-6 pi-rounded-bl-[20px] pi-rounded-br-[20px] pi-transition-all`}\n >\n <div className='pi-flex pi-items-center pi-justify-center pi-gap-6 pi-mb-5'>\n {/* mute button */}\n {!intrudeListenStatus?.isListen && (\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip-mute'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophone} />\n )}\n </Button>\n )}\n\n {/* video button */}\n {videoInputDevices?.length > 0 && (\n <Button\n variant='default'\n onClick={() => toggleVideo()}\n data-tooltip-id='tooltip-toggle-video'\n data-tooltip-content={`${\n !isVideoCallButtonVisible\n ? t('Tooltip.Enable camera permission') || ''\n : isLocalVideoEnabled\n ? t('Tooltip.Disable camera')\n : t('Tooltip.Enable camera')\n }`}\n disabled={!isVideoCallButtonVisible}\n className={`${!isVideoCallButtonVisible ? 'pi-cursor-auto' : ''}`}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isLocalVideoEnabled ? faVideoSlash : faVideo}\n />\n </Button>\n )}\n\n {/* Share screen button */}\n {janus.current.webRTCAdapter.browserDetails.browser !== 'safari' &&\n userInfo?.profile?.macro_permissions?.nethvoice_cti?.permissions?.screen_sharing\n ?.value &&\n !screenShareActive && (\n <Button\n variant='default'\n onClick={() => initAndStartScreenShare()}\n data-tooltip-id='tooltip-start-screen-share'\n data-tooltip-content={t('Tooltip.Share screen') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faDisplay} />\n </Button>\n )}\n\n {/* stop screen share */}\n {screenShareActive && screenShareRole === 'publisher' && (\n <Button\n variant='default'\n onClick={() => stopScreenShare()}\n data-tooltip-id='tooltip-stop-screen-share'\n data-tooltip-content={t('Tooltip.Stop sharing')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faDisplaySlash} />\n </Button>\n )}\n\n {/* fullscreen */}\n {screenShareActive && screenShareRole === 'listener' && (\n <Button\n variant='default'\n onClick={() => toggleFullScreen()}\n data-tooltip-id='tooltip-toggle-fullscreen'\n data-tooltip-content={\n isFullscreen ? t('Tooltip.Exit fullscreen') : t('Tooltip.Enter fullscreen')\n }\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isFullscreen ? faCompress : faExpand}\n />\n </Button>\n )}\n\n {/* record */}\n {userInfo?.profile?.macro_permissions?.settings?.permissions?.recording?.value && (\n <Button\n variant='default'\n onClick={() => recordCurrentCall(isRecording)}\n data-tooltip-id='tooltip-record-video-view'\n data-tooltip-content={\n isRecording ? t('Tooltip.Stop recording') : t('Tooltip.Record')\n }\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isRecording ? faStop : faRecord}\n />\n </Button>\n )}\n\n {/* hold */}\n {!(intrudeListenStatus?.isIntrude || intrudeListenStatus?.isListen) && (\n <Button\n variant='default'\n onClick={() => (paused ? unpauseCurrentCall() : pauseCall())}\n data-tooltip-id='tooltip-pause-video-view'\n data-tooltip-content={paused ? t('Tooltip.Play') : t('Tooltip.Pause')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={paused ? faPlay : faPause} />\n </Button>\n )}\n </div>\n <Hangup buttonsVariant='default' />\n </div>\n {/* Buttons tooltips */}\n <CustomThemedTooltip className='pi-z-20' id='tooltip-mute-video-view' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-video' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-fullscreen' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-start-screen-share' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-stop-screen-share' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-record-video-view' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-pause-video-view' place='bottom' />\n </div>\n ) : (\n // collapsed view\n <>\n <div className='pi-flex pi-justify-between pi-items-center'>\n <Avatar />\n <Timer startTime={startTime} isNotAlwaysWhite />\n {!isOpen && remoteAudioStream && !isPhysical() && (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )}\n </div>\n </>\n )}\n </>\n )\n}\n\nexport default VideoView\n"],"names":["VideoView","dispatch","useDispatch","_l","useSelector","state","currentCall","muted","startTime","isRecording","paused","isLocalVideoEnabled","showRemoteVideoPlaceHolder","hasVideoTrackAdded","displayName","isStartingVideoCall","_m","screenShare","localTracks","localVideos","screenShareRole","role","screenShareActive","active","isStartingScreenShare","isJoiningScreenShare","isLeavingScreenShare","intrudeListenStatus","listen","isOpen","island","_o","webrtc","janusInstance","remoteAudioStream","userInfo","store","getState","currentUser","_p","useState","isFullscreen","setIsFullscreen","_q","isUiShown","setUiShown","uiTimeoutRef","useRef","debounceTimerRef","videoRenegotiationInFlightRef","screenSharePublisherJoinRequestedRef","screenShareViewRef","localScreen","remoteScreen","localVideo","largeRemoteVideo","smallRemoteVideo","janus","JanusLib","videoInputDevices","select","mediaDevices","useIsomorphicLayoutEffect","player","updatePlayer","useEffect","updateScreenStreams","updateVideoStreams","addEventListener","handleFullscreenChange","removeEventListener","current","clearTimeout","enableVideo","updateCurrentCall","initAndStartScreenShare","update","initAndJoinScreenShare","leaveScreenShare","localVideoElement","largeRemoteVideoElement","smallRemoteVideoElement","_a","localVideoStream","remoteVideoStream","attachMediaStream","MediaStream","getVideoTracks","length","document","fullscreenElement","toggleFullScreen","exitFullscreen","eventDispatch","requestFullscreen","useEventListener","newRemoteFeed","id","display","source","remoteFeed","attach","plugin","opaqueId","randomString","success","pluginHandle","remoteTracks","remoteVideos","_b","log","call","getPlugin","getId","_d","_c","request","room","ptype","feed","send","message","error","iceState","rfindex","webrtcState","on","slowLink","uplink","lost","mid","warn","onmessage","msg","jsep","debug","event","_f","_e","_h","_g","_k","_j","createAnswer","tracks","type","body","onlocaltrack","track","onremotetrack","metadata","reason","kind","remoteScreenStream","stopAllTracks","stream","remoteScreenElement","oncleanup","sipcall","currentVideoInputDeviceId","getCurrentVideoInputDeviceId","recv","capture","deviceId","exact","videoTransceiver","webrtcStuff","pc","getTransceivers","find","transceiver","receiver","sender","Boolean","replace","setVideoTrackAdded","add","push","createOffer","notifyPeerVideoStart","dispatchVideoCallStarted","initiator","callUser","username","destUser","console","JSON","stringify","disableVideo","updateLocalVideoStream","setLocalVideoEnabled","__assign","remove","initScreenShare","isExtensionEnabled","create","description","bitrate","publishers","result","abortScreenShare","register","shareScreen","joinScreenShare","consentDialog","mediaState","medium","_w","pendingScreenStream","screenTrack_1","audio","video","stop","exitVideoViewIfNoVideo","releaseHandle","detach","list","f","leaving","_r","_t","_s","_v","_u","handleRemoteJsep","trackId","stream_2","localScreenStream","localScreenElement","inviteOtherUser","stopScreenShare","iceConnectionState","stream_1","getTracks","i","mst","e","filteredTracks","filter","socket","websocket","destUsername","emit","roomId","isScreenShareActive","hasRemoteVideo","some","readyState","view","setIslandView","joinMessage","handleMouseMoveWithDebounce","setTimeout","isVideoCallButtonVisible","setIsVideoCallButtonVisible","checkCameraPermission","__awaiter","checkWebCamPermission","sent","React","createElement","Fragment","ref","onMouseMove","className","autoPlay","concat","getInitials","name","isListen","Button","variant","onClick","unmuteCurrentCall","muteCurrentCall","t","FontAwesomeIcon","icon","faMicrophoneSlash","faMicrophone","disabled","faVideoSlash","faVideo","webRTCAdapter","browserDetails","browser","profile","macro_permissions","nethvoice_cti","permissions","screen_sharing","value","faDisplay","faDisplaySlash","faCompress","faExpand","settings","recording","recordCurrentCall","faStop","faRecord","isIntrude","unpauseCurrentCall","pauseCurrentCall","faPlay","faPause","Hangup","buttonsVariant","CustomThemedTooltip","place","Avatar","Timer","isNotAlwaysWhite","isPhysical","AudioBars","audioStream","size"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/VideoView/index.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef, useState } from 'react'\nimport { Button } from '../Button'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState, store } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faCompress,\n faDisplay,\n faExpand,\n faMicrophone,\n faMicrophoneSlash,\n faPause,\n faPlay,\n faStop,\n faVideo,\n faVideoSlash,\n} from '@fortawesome/free-solid-svg-icons'\nimport { t } from 'i18next'\nimport { eventDispatch, useEventListener, useIsomorphicLayoutEffect } from '../../utils'\nimport Hangup from '../Hangup'\nimport {\n muteCurrentCall,\n pauseCurrentCall,\n recordCurrentCall,\n unmuteCurrentCall,\n unpauseCurrentCall,\n} from '../../lib/phone/call'\nimport { JanusTrack, JanusTypes } from '../../types/webrtc'\nimport JanusLib from '../../lib/webrtc/janus.js'\nimport Avatar from '../CallView/Avatar'\nimport Timer from '../CallView/Timer'\nimport { isPhysical } from '../../lib/user/default_device'\nimport { AudioBars } from '../AudioBars'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { faDisplaySlash, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { getCurrentVideoInputDeviceId } from '../../lib/devices/devices'\nimport { getInitials } from '../../lib/avatars/avatars'\nimport { checkWebCamPermission } from '../../lib/devices/devices'\nimport { dispatchVideoCallStarted } from '../../events/SocketEvents'\nimport { notifyPeerVideoStart } from '../../lib/phone/video'\nimport { destroyScreenShareRoom, releaseScreenShareHandles } from '../../lib/phone/screenShare'\n\nexport interface VideoViewProps {}\n\nexport type ScreenSharingMessage = {\n message: 'screenSharingStart' | 'screenSharingStop'\n roomId: string\n destUser: string\n callUser: string\n}\n\nexport type VideoCallMessage = {\n message: 'videoCallStart'\n destUser: string\n callUser: string\n}\n\nexport const VideoView: FC<VideoViewProps> = () => {\n const dispatch = useDispatch<Dispatch>()\n const {\n muted,\n startTime,\n isRecording,\n paused,\n isLocalVideoEnabled,\n showRemoteVideoPlaceHolder,\n hasVideoTrackAdded,\n displayName,\n isStartingVideoCall,\n } = useSelector((state: RootState) => state.currentCall)\n const {\n localTracks,\n localVideos,\n role: screenShareRole,\n active: screenShareActive,\n isStartingScreenShare,\n isJoiningScreenShare,\n isLeavingScreenShare,\n } = useSelector((state: RootState) => state.screenShare)\n const intrudeListenStatus = useSelector((state: RootState) => state.listen)\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { janusInstance, remoteAudioStream } = useSelector((state: RootState) => state.webrtc)\n const userInfo = store.getState().currentUser\n const [isFullscreen, setIsFullscreen] = useState(false)\n const [isUiShown, setUiShown] = useState(false)\n const uiTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const videoRenegotiationInFlightRef = useRef(false)\n const screenSharePublisherJoinRequestedRef = useRef(false)\n const screenShareViewRef = useRef(null)\n const fullscreenElementRef = useRef<HTMLElement | null>(null)\n const localScreen = useRef<HTMLVideoElement>(null)\n const remoteScreen = useRef<HTMLVideoElement>(null)\n const localVideo = useRef<HTMLVideoElement>(null)\n const largeRemoteVideo = useRef<HTMLVideoElement>(null)\n const smallRemoteVideo = useRef<HTMLVideoElement>(null)\n const janus = useRef<JanusTypes>(JanusLib)\n const videoInputDevices = store.select.mediaDevices.videoInputDevices(store.getState())\n\n\n useIsomorphicLayoutEffect(() => {\n dispatch.player.updatePlayer({\n localScreen: localScreen,\n remoteScreen: remoteScreen,\n localVideo: localVideo,\n largeRemoteVideo: largeRemoteVideo,\n smallRemoteVideo: smallRemoteVideo,\n })\n }, [])\n\n // component did mount\n useEffect(() => {\n updateScreenStreams()\n updateVideoStreams()\n\n // register for full screen change\n addEventListener('fullscreenchange', handleFullscreenChange)\n\n return () => {\n removeEventListener('fullscreenchange', handleFullscreenChange)\n exitFullScreenIfActive()\n\n // clear timeout\n if (uiTimeoutRef.current) {\n clearTimeout(uiTimeoutRef.current)\n }\n }\n }, [])\n\n // starting videocall\n useEffect(() => {\n if (isStartingVideoCall) {\n enableVideo()\n dispatch.currentCall.updateCurrentCall({\n isStartingVideoCall: false,\n })\n }\n }, [isStartingVideoCall])\n\n // starting screen sharing\n useEffect(() => {\n if (isStartingScreenShare) {\n initAndStartScreenShare()\n store.dispatch.screenShare.update({\n isStartingScreenShare: false,\n })\n }\n }, [isStartingScreenShare])\n\n // joining screen sharing\n useEffect(() => {\n if (isJoiningScreenShare) {\n initAndJoinScreenShare()\n store.dispatch.screenShare.update({\n isJoiningScreenShare: false,\n })\n }\n }, [isJoiningScreenShare])\n\n // leaving screen sharing\n useEffect(() => {\n if (isLeavingScreenShare) {\n leaveScreenShare()\n store.dispatch.screenShare.update({\n isLeavingScreenShare: false,\n })\n }\n }, [isLeavingScreenShare])\n\n // isOpen changed\n useEffect(() => {\n updateScreenStreams()\n updateVideoStreams()\n }, [isOpen])\n\n const updateVideoStreams = () => {\n const localVideoElement = store.getState().player.localVideo\n const largeRemoteVideoElement = store.getState().player.largeRemoteVideo\n const smallRemoteVideoElement = store.getState().player.smallRemoteVideo\n const { localVideoStream, remoteVideoStream } = store.getState().webrtc\n\n // local video stream\n\n if (localVideoElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(localVideoElement.current, localVideoStream as MediaStream)\n }\n }\n\n // large remote video stream\n\n if (largeRemoteVideoElement?.current && janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n largeRemoteVideoElement.current,\n remoteVideoStream as MediaStream,\n )\n }\n\n // small remote video stream\n\n if (smallRemoteVideoElement?.current && janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n smallRemoteVideoElement.current,\n remoteVideoStream as MediaStream,\n )\n }\n\n if (remoteVideoStream instanceof MediaStream && remoteVideoStream.getVideoTracks().length > 0) {\n dispatch.currentCall.updateCurrentCall({\n showRemoteVideoPlaceHolder: false,\n })\n }\n }\n\n const handleFullscreenChange = () => {\n setIsFullscreen(!!document.fullscreenElement)\n }\n\n const exitFullScreenIfActive = () => {\n if (document.fullscreenElement && document.fullscreenElement === fullscreenElementRef.current) {\n document.exitFullscreen()\n eventDispatch('phone-island-fullscreen-exited', {})\n }\n }\n\n const toggleFullScreen = () => {\n if (document.fullscreenElement) {\n document.exitFullscreen()\n eventDispatch('phone-island-fullscreen-exited', {})\n } else {\n if (screenShareViewRef.current) {\n fullscreenElementRef.current = screenShareViewRef.current as HTMLElement\n fullscreenElementRef.current.requestFullscreen()\n eventDispatch('phone-island-fullscreen-entered', {})\n }\n }\n }\n useEventListener('phone-island-fullscreen-enter', () => {\n toggleFullScreen()\n })\n useEventListener('phone-island-fullscreen-exit', () => {\n toggleFullScreen()\n })\n\n const newRemoteFeed = (id, display) => {\n // A new feed has been published, create a new plugin handle and attach to it as a listener\n\n dispatch.screenShare.update({\n source: id,\n })\n\n let remoteFeed: any = null\n janusInstance?.attach({\n plugin: 'janus.plugin.videoroom',\n opaqueId: janus.current.randomString(32),\n success: function (pluginHandle) {\n remoteFeed = pluginHandle\n\n dispatch.screenShare.update({\n remoteFeed: pluginHandle,\n })\n remoteFeed.remoteTracks = {}\n remoteFeed.remoteVideos = 0\n janus.current.log?.(\n 'Plugin attached! (' + remoteFeed.getPlugin() + ', id=' + remoteFeed.getId() + ')',\n )\n janus.current.log?.(' -- This is a subscriber')\n // We wait for the plugin to send us an offer\n const { room } = store.getState().screenShare\n\n let listen = {\n request: 'join',\n room: room,\n ptype: 'subscriber',\n feed: id,\n }\n remoteFeed.send({ message: listen })\n },\n error: function (error) {\n janus.current.error?.('Error attaching videoroom plugin', error)\n },\n iceState: function (state) {\n janus.current.log?.('ICE state (feed #' + remoteFeed.rfindex + ') changed to ' + state)\n },\n webrtcState: function (on) {\n janus.current.log?.(\n 'Janus says this WebRTC PeerConnection (feed #' +\n remoteFeed.rfindex +\n ') is ' +\n (on ? 'up' : 'down') +\n ' now',\n )\n },\n slowLink: function (uplink, lost, mid) {\n janus.current.warn?.(\n 'Janus reports problems ' +\n (uplink ? 'sending' : 'receiving') +\n ' packets on mid ' +\n mid +\n ' (' +\n lost +\n ' lost packets)',\n )\n },\n onmessage: function (msg, jsep) {\n janus.current.debug?.(' ::: Got a message (listener) :::', msg)\n let event = msg['videoroom']\n janus.current.debug?.('Event: ' + event)\n if (event) {\n if (event === 'attached') {\n // Subscriber created and attached\n janus.current.log?.(\n 'Successfully attached to feed ' + id + ' (' + display + ') in room ' + msg['room'],\n )\n } else {\n janus.current.warn?.('Unhandled event: ' + event)\n }\n }\n if (jsep) {\n janus.current.debug?.('Handling SDP as well...', jsep)\n // Answer and attach\n remoteFeed.createAnswer({\n jsep: jsep,\n // We only specify data channels here, as this way in\n // case they were offered we'll enable them. Since we\n // don't mention audio or video tracks, we autoaccept them\n // as recvonly (since we won't capture anything ourselves)\n tracks: [{ type: 'data' }],\n success: function (jsep) {\n janus.current.debug?.('Got SDP!', jsep)\n\n const { room } = store.getState().screenShare\n\n let body = { request: 'start', room: room }\n remoteFeed.send({ message: body, jsep: jsep })\n },\n error: function (error) {\n janus.current.error?.('WebRTC error:', error)\n },\n })\n }\n },\n // eslint-disable-next-line no-unused-vars\n onlocaltrack: function (track, on) {\n // The subscriber stream is recvonly, we don't expect anything here\n },\n onremotetrack: function (track, mid, on, metadata) {\n janus.current.debug?.(\n 'Remote track (mid=' +\n mid +\n ') ' +\n (on ? 'added' : 'removed') +\n (metadata ? ' (' + metadata.reason + ') ' : '') +\n ':',\n track,\n )\n if (store.getState().screenShare.remoteFeed !== remoteFeed) {\n return\n }\n // Screen sharing tracks are sometimes muted/unmuted by browser\n // when data is not flowing fast enough; this can make streams blink.\n // We can ignore these.\n if (\n track.kind === 'video' &&\n metadata &&\n (metadata.reason === 'mute' || metadata.reason === 'unmute')\n ) {\n janus.current.log?.('Ignoring mute/unmute on screen-sharing track.')\n return\n }\n if (!on) {\n const { remoteScreenStream } = store.getState().screenShare\n janus.current.stopAllTracks(remoteScreenStream)\n dispatch.screenShare.update({ active: false })\n return\n }\n // If we're here, a new track was added\n if (track.kind === 'video') {\n // New video track: create a stream out of it\n let stream = new MediaStream([track])\n\n // Save the new video stream to the store\n store.dispatch.screenShare.update({ remoteScreenStream: stream })\n\n remoteFeed.remoteTracks[mid] = stream\n janus.current.log?.('Created remote video stream: ' + stream)\n const remoteScreenElement = store.getState().player.remoteScreen\n\n if (remoteScreenElement?.current) {\n janus.current.attachMediaStream?.(remoteScreenElement.current, stream)\n }\n }\n },\n oncleanup: function () {\n janus.current.log?.(' ::: Got a cleanup notification (remote feed ' + id + ') :::')\n remoteFeed.remoteTracks = {}\n remoteFeed.remoteVideos = 0\n },\n })\n }\n\n const enableVideo = () => {\n if (videoRenegotiationInFlightRef.current) {\n return\n }\n\n const { sipcall }: { sipcall: any } = store.getState().webrtc\n videoRenegotiationInFlightRef.current = true\n store.dispatch.currentCall.updateCurrentCall({\n isLocalVideoEnabled: true,\n })\n const tracks: JanusTrack[] = []\n const currentVideoInputDeviceId = getCurrentVideoInputDeviceId()\n\n const track: Partial<JanusTrack> = {\n type: 'video',\n recv: true,\n }\n\n if (currentVideoInputDeviceId) {\n track.capture = { deviceId: { exact: currentVideoInputDeviceId } }\n } else {\n track.capture = true\n }\n\n const { hasVideoTrackAdded } = store.getState().currentCall\n const { remoteVideoStream } = store.getState().webrtc\n const videoTransceiver = sipcall?.webrtcStuff?.pc\n ?.getTransceivers?.()\n ?.find(\n (transceiver: RTCRtpTransceiver) =>\n transceiver.receiver?.track?.kind === 'video' ||\n transceiver.sender?.track?.kind === 'video',\n )\n const shouldReplaceExistingVideoTransceiver =\n hasVideoTrackAdded ||\n Boolean(videoTransceiver) ||\n (remoteVideoStream instanceof MediaStream && remoteVideoStream.getVideoTracks().length > 0)\n\n if (!shouldReplaceExistingVideoTransceiver) {\n track.add = true\n dispatch.currentCall.setVideoTrackAdded(true)\n } else {\n // Reuse the existing video transceiver when available instead of assuming a\n // fixed mid, otherwise fall back to adding a new local video track.\n if (videoTransceiver) {\n track.replace = true\n if (videoTransceiver.mid) {\n track.mid = videoTransceiver.mid\n }\n if (!hasVideoTrackAdded) {\n dispatch.currentCall.setVideoTrackAdded(true)\n }\n } else {\n track.add = true\n dispatch.currentCall.setVideoTrackAdded(true)\n }\n }\n tracks.push(track as JanusTrack)\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep) {\n videoRenegotiationInFlightRef.current = false\n sipcall.send({ message: { request: 'update' }, jsep: jsep })\n notifyPeerVideoStart()\n dispatchVideoCallStarted({\n initiator: 'local',\n callUser: store.getState().currentUser.username,\n destUser: store.getState().currentCall.username,\n })\n eventDispatch('phone-island-video-enabled', {})\n },\n error: function (error) {\n videoRenegotiationInFlightRef.current = false\n console.error('WebRTC error... ' + JSON.stringify(error))\n },\n })\n }\n useEventListener('phone-island-video-enable', () => {\n enableVideo()\n })\n\n const disableVideo = () => {\n if (videoRenegotiationInFlightRef.current) {\n return\n }\n\n const { sipcall, localVideoStream }: { sipcall: any; localVideoStream: MediaStream | null } =\n store.getState().webrtc\n videoRenegotiationInFlightRef.current = true\n const videoTransceiver = sipcall?.webrtcStuff?.pc\n ?.getTransceivers?.()\n ?.find(\n (transceiver: RTCRtpTransceiver) =>\n transceiver.receiver?.track?.kind === 'video' ||\n transceiver.sender?.track?.kind === 'video',\n )\n\n janus.current.stopAllTracks(localVideoStream)\n store.dispatch.webrtc.updateLocalVideoStream(null)\n store.dispatch.currentCall.setLocalVideoEnabled(false)\n const tracks: JanusTrack[] = []\n tracks.push({\n type: 'video',\n ...(videoTransceiver?.mid ? { mid: videoTransceiver.mid } : {}),\n remove: true,\n })\n\n sipcall.createOffer({\n tracks: tracks,\n success: function (jsep) {\n videoRenegotiationInFlightRef.current = false\n sipcall.send({ message: { request: 'update' }, jsep: jsep })\n eventDispatch('phone-island-video-disabled', {})\n },\n error: function (error) {\n videoRenegotiationInFlightRef.current = false\n console.error('WebRTC error... ' + JSON.stringify(error))\n },\n })\n }\n useEventListener('phone-island-video-disable', () => {\n disableVideo()\n })\n\n const toggleVideo = async () => {\n let cameraPermission = await checkCameraPermission()\n if (cameraPermission) {\n if (isLocalVideoEnabled) {\n disableVideo()\n } else {\n enableVideo()\n }\n }\n }\n\n const shareScreen = () => {\n if (!janus.current.isExtensionEnabled()) {\n janus.current.error?.(\n \"This browser doesn't support screensharing (getDisplayMedia unavailable)\",\n )\n abortScreenShare()\n return\n }\n\n // Create a new room\n const roomName = janus.current.randomString(32)\n\n let create = {\n request: 'create',\n description: roomName,\n bitrate: 500000,\n publishers: 1,\n }\n\n const { plugin } = store.getState().screenShare\n\n plugin.send({\n message: create,\n success: function (result) {\n if (result['error']) {\n janus.current.error?.(\"Couldn't create room: \" + result['error'])\n abortScreenShare()\n return\n }\n let event = result['videoroom']\n janus.current.debug?.('Event: ' + event)\n if (event) {\n // Our own screen sharing session has been created, join it\n\n const room = result['room']\n if (store.getState().screenShare.plugin !== plugin) {\n destroyScreenShareRoom(plugin, room)\n return\n }\n // Set room to the store\n dispatch.screenShare.update({\n room: room,\n })\n\n janus.current.log?.('Screen sharing session created: ' + room)\n\n const { username } = store.getState().currentUser\n\n if (screenSharePublisherJoinRequestedRef.current) {\n janus.current.log?.(\n 'Screen share publisher join already requested on this handle, skipping duplicate join',\n )\n return\n }\n\n screenSharePublisherJoinRequestedRef.current = true\n\n let register = {\n request: 'join',\n room: room,\n ptype: 'publisher',\n display: username,\n }\n plugin.send({ message: register })\n }\n },\n })\n }\n\n const initScreenShare = () => {\n janusInstance?.attach({\n plugin: 'janus.plugin.videoroom',\n opaqueId: janus.current.randomString(32),\n success: function (pluginHandle) {\n if (!store.getState().screenShare.active) {\n pluginHandle.detach()\n return\n }\n // Set plugin to the store\n dispatch.screenShare.update({\n plugin: pluginHandle,\n })\n const { role } = store.getState().screenShare\n\n if (role === 'publisher') {\n eventDispatch('phone-island-screen-share-initialized', {})\n shareScreen()\n } else if (role === 'listener') {\n joinScreenShare()\n }\n eventDispatch('phone-island-screen-share-started', {})\n },\n error: function (error) {\n janus.current.error?.('Error attaching videoroom plugin', error)\n abortScreenShare()\n },\n consentDialog: function (on) {},\n iceState: function (state) {\n janus.current.log?.('ICE state changed to ' + state)\n },\n mediaState: function (medium, on) {\n janus.current.log?.('Janus ' + (on ? 'started' : 'stopped') + ' receiving our ' + medium)\n },\n webrtcState: function (on) {\n janus.current.log?.(\n 'Janus says our WebRTC PeerConnection is ' + (on ? 'up' : 'down') + ' now',\n )\n },\n slowLink: function (uplink, lost, mid) {\n janus.current.warn?.(\n 'Janus reports problems ' +\n (uplink ? 'sending' : 'receiving') +\n ' packets on mid ' +\n mid +\n ' (' +\n lost +\n ' lost packets)',\n )\n },\n onmessage: function (msg, jsep) {\n janus.current.debug?.(' ::: Got a message (publisher) :::', msg)\n const { plugin, role } = store.getState().screenShare\n const event = msg['videoroom']\n janus.current.debug?.('Event: ' + event)\n\n if (event) {\n if (event === 'joined') {\n if (role === 'publisher') {\n // This is our session, publish our stream\n janus.current.debug?.('Negotiating WebRTC stream for our screen')\n\n // The screen picked at click time, otherwise Janus asks for one\n const { pendingScreenStream } = store.getState().screenShare\n const screenTrack = pendingScreenStream?.getVideoTracks()[0]\n dispatch.screenShare.update({ pendingScreenStream: null })\n\n plugin.createOffer({\n // We want sendonly audio and screensharing\n tracks: [\n { type: 'audio', capture: true, recv: false },\n { type: 'screen', capture: screenTrack ?? true, recv: false },\n ],\n success: function (jsep) {\n janus.current.debug?.('Got publisher SDP!', jsep)\n let publish = { request: 'configure', audio: true, video: true }\n plugin.send({ message: publish, jsep: jsep })\n },\n error: function (error) {\n screenSharePublisherJoinRequestedRef.current = false\n janus.current.error?.('WebRTC error:', error)\n screenTrack?.stop()\n dispatch.screenShare.update({ active: false, role: '' })\n exitVideoViewIfNoVideo()\n releaseScreenShareHandles(true)\n },\n })\n } else {\n // We're just watching a session, any feed to attach to?\n if (msg['publishers']) {\n let list = msg['publishers']\n janus.current.debug?.('Got a list of available publishers/feeds:', list)\n for (let f in list) {\n if (list[f]['dummy']) continue\n let id = list[f]['id']\n let display = list[f]['display']\n janus.current.debug?.(' >> [' + id + '] ' + display)\n newRemoteFeed(id, display)\n }\n }\n }\n } else if (event === 'event') {\n // Any feed to attach to?\n if (role === 'listener' && msg['publishers']) {\n let list = msg['publishers']\n janus.current.debug?.('Got a list of available publishers/feeds:', list)\n for (let f in list) {\n if (list[f]['dummy']) continue\n let id = list[f]['id']\n let display = list[f]['display']\n janus.current.debug?.(' >> [' + id + '] ' + display)\n newRemoteFeed(id, display)\n }\n } else if (msg['leaving']) {\n // One of the publishers has gone away?\n let leaving = msg['leaving']\n janus.current.log?.('Publisher left: ' + leaving)\n } else if (msg['error']) {\n janus.current.error?.('Error event: ' + msg['error'])\n abortScreenShare()\n releaseScreenShareHandles(role === 'publisher')\n }\n }\n }\n if (jsep) {\n janus.current.debug?.('Handling SDP as well...', jsep)\n plugin.handleRemoteJsep({ jsep: jsep })\n }\n },\n onlocaltrack: function (track, on) {\n janus.current.debug?.('Local track ' + (on ? 'added' : 'removed') + ':', track)\n // We use the track ID as name of the element, but it may contain invalid characters\n let trackId = track.id.replace(/[{}]/g, '')\n if (!on) {\n // Track removed, get rid of the stream and the rendering\n let stream = localTracks?.[trackId]\n if (stream) {\n try {\n let tracks = stream.getTracks()\n for (let i in tracks) {\n let mst = tracks[i]\n if (mst) mst.stop()\n }\n // eslint-disable-next-line no-unused-vars\n } catch (e) {}\n }\n if (track.kind === 'video') {\n dispatch.screenShare.update({\n localVideos: localVideos - 1,\n })\n }\n\n // remove track\n const filteredTracks = localTracks?.filter((track) => track !== localTracks[trackId])\n dispatch.screenShare.update({\n localTracks: filteredTracks,\n })\n return\n }\n // If we're here, a new track was added\n let stream = localTracks?.[trackId]\n if (stream) {\n // We've been here already\n return\n }\n\n if (track.kind === 'video') {\n // New video track: create a stream out of it\n dispatch.screenShare.update({\n localVideos: localVideos + 1,\n })\n let stream = new MediaStream([track])\n\n // Save the new video stream to the store\n store.dispatch.screenShare.update({\n localScreenStream: stream,\n })\n\n janus.current.log?.('Created local stream: ' + stream)\n const localScreenElement = store.getState().player.localScreen\n\n if (localScreenElement?.current) {\n janus.current.attachMediaStream?.(localScreenElement.current, stream)\n inviteOtherUser()\n\n // Listen for the 'ended' event on the screen-sharing track\n track.addEventListener('ended', () => {\n stopScreenShare()\n })\n }\n }\n const { plugin } = store.getState().screenShare\n\n if (\n plugin.webrtcStuff.pc.iceConnectionState !== 'completed' &&\n plugin.webrtcStuff.pc.iceConnectionState !== 'connected'\n ) {\n }\n },\n // eslint-disable-next-line no-unused-vars\n onremotetrack: function (track, mid, on) {\n // The publisher stream is sendonly, we don't expect anything here\n },\n oncleanup: function () {\n janus.current.log?.(' ::: Got a cleanup notification :::')\n screenSharePublisherJoinRequestedRef.current = false\n\n dispatch.screenShare.update({\n localTracks: {},\n localVideos: 0,\n })\n },\n })\n }\n\n const updateScreenStreams = () => {\n const localScreenElement = store.getState().player.localScreen\n const remoteScreenElement = store.getState().player.remoteScreen\n const { localScreenStream, remoteScreenStream } = store.getState().screenShare\n\n // local screen stream\n\n if (localScreenElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n localScreenElement.current,\n localScreenStream as MediaStream,\n )\n }\n }\n\n // remote screen stream\n\n if (remoteScreenElement?.current) {\n if (janus.current.attachMediaStream) {\n janus.current.attachMediaStream(\n remoteScreenElement.current,\n remoteScreenStream as MediaStream,\n )\n }\n }\n }\n\n const inviteOtherUser = () => {\n // send message to websocket to invite the other user\n const { socket } = store.getState().websocket\n const { username: destUsername } = store.getState().currentCall\n const { room } = store.getState().screenShare\n const { username } = store.getState().currentUser\n\n socket.emit('message', {\n message: 'screenSharingStart',\n roomId: room,\n destUser: destUsername,\n callUser: username,\n } as ScreenSharingMessage)\n }\n\n // Back to the call view once nothing is left to show: no camera, no remote video\n // and no screen share. Otherwise an audio call stays stuck on the video view\n const exitVideoViewIfNoVideo = () => {\n const { isLocalVideoEnabled } = store.getState().currentCall\n const { remoteVideoStream } = store.getState().webrtc\n const { active: isScreenShareActive } = store.getState().screenShare\n const hasRemoteVideo = !!remoteVideoStream\n ?.getVideoTracks()\n .some((track) => track.readyState === 'live' && !track.muted)\n if (\n !isLocalVideoEnabled &&\n !hasRemoteVideo &&\n !isScreenShareActive &&\n store.getState().island.view === 'video'\n ) {\n dispatch.island.setIslandView('call')\n }\n }\n\n const abortScreenShare = () => {\n const { pendingScreenStream } = store.getState().screenShare\n janus.current.stopAllTracks(pendingScreenStream)\n dispatch.screenShare.update({ active: false, role: '', pendingScreenStream: null })\n exitVideoViewIfNoVideo()\n }\n\n const initAndStartScreenShare = () => {\n if (store.getState().screenShare.active) {\n const { pendingScreenStream } = store.getState().screenShare\n if (pendingScreenStream) {\n janus.current.stopAllTracks(pendingScreenStream)\n dispatch.screenShare.update({ pendingScreenStream: null })\n }\n return\n }\n screenSharePublisherJoinRequestedRef.current = false\n dispatch.screenShare.update({ active: true, role: 'publisher', room: '' })\n initScreenShare()\n }\n useEventListener('phone-island-screen-share-start', () => {\n initAndStartScreenShare()\n })\n\n const initAndJoinScreenShare = () => {\n dispatch.screenShare.update({ active: true, role: 'listener' })\n initScreenShare()\n eventDispatch('phone-island-screen-share-joined', {})\n }\n\n const joinScreenShare = () => {\n const { room } = store.getState().screenShare\n const { username } = store.getState().currentUser\n\n const joinMessage = {\n request: 'join',\n room: room,\n ptype: 'publisher',\n display: username,\n }\n\n const { plugin } = store.getState().screenShare\n plugin.send({ message: joinMessage })\n }\n\n const leaveScreenShare = () => {\n const { remoteScreenStream, role, active } = store.getState().screenShare\n if (role === 'publisher') {\n if (active) stopScreenShare(false)\n return\n }\n janus.current.stopAllTracks(remoteScreenStream)\n dispatch.screenShare.update({ active: false })\n releaseScreenShareHandles(false)\n exitFullScreenIfActive()\n exitVideoViewIfNoVideo()\n eventDispatch('phone-island-screen-share-left', {})\n }\n\n const handleMouseMove = () => {\n setUiShown(true)\n\n if (uiTimeoutRef.current) {\n clearTimeout(uiTimeoutRef.current)\n uiTimeoutRef.current = null\n }\n }\n\n const startHideTimer = () => {\n // start a timer when mouse stops moving to hide video UI\n uiTimeoutRef.current = setTimeout(() => {\n setUiShown(false)\n }, 3000)\n }\n\n const handleMouseMoveWithDebounce = () => {\n handleMouseMove()\n\n // clear the previous debounce timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // set a new debounce timer - when this isn't cleared, it means the mouse has stopped\n debounceTimerRef.current = setTimeout(() => {\n startHideTimer()\n }, 100) // small delay to detect \"stopped moving\"\n }\n\n const stopScreenShare = (notifyRemote = true) => {\n const { localScreenStream, role, room } = store.getState().screenShare\n\n screenSharePublisherJoinRequestedRef.current = false\n janus.current.stopAllTracks(localScreenStream)\n dispatch.screenShare.update({ active: false })\n releaseScreenShareHandles(role === 'publisher')\n\n if (notifyRemote) {\n // send message to websocket to tell the other user the screen share has stopped\n const { socket } = store.getState().websocket\n const { username: destUsername } = store.getState().currentCall\n const { username } = store.getState().currentUser\n\n socket.emit('message', {\n message: 'screenSharingStop',\n roomId: room,\n destUser: destUsername,\n callUser: username,\n } as ScreenSharingMessage)\n }\n\n eventDispatch('phone-island-screen-share-stopped', {})\n exitVideoViewIfNoVideo()\n }\n useEventListener('phone-island-screen-share-stop', () => {\n stopScreenShare()\n })\n\n const pauseCall = () => {\n pauseCurrentCall()\n if (store.getState().screenShare.active) {\n stopScreenShare()\n }\n }\n\n const [isVideoCallButtonVisible, setIsVideoCallButtonVisible] = useState(true)\n\n const checkCameraPermission = async () => {\n if (videoInputDevices?.length > 0) {\n const isWebCamAccepted = await checkWebCamPermission()\n if (isWebCamAccepted) {\n setIsVideoCallButtonVisible(true)\n return true\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n } else {\n setIsVideoCallButtonVisible(false)\n return false\n }\n }\n\n return (\n <>\n {isOpen ? (\n <div\n ref={screenShareViewRef}\n onMouseMove={() => handleMouseMoveWithDebounce()}\n className={isFullscreen ? 'pi-h-screen' : 'pi-h-[480px] pi-w-[600px]'}\n >\n <div className={`pi-flex pi-relative pi-justify-center pi-w-full pi-h-full`}>\n {/* large remote screen */}\n <video\n autoPlay\n muted={true}\n ref={remoteScreen}\n className={`pi-rounded-2xl pi-w-full pi-h-full ${\n !screenShareActive || screenShareRole !== 'listener' ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* large local screen */}\n <video\n autoPlay\n muted={true}\n ref={localScreen}\n className={`pi-rounded-2xl pi-w-full pi-h-full ${\n !screenShareActive || screenShareRole !== 'publisher' ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* large remote video */}\n <video\n autoPlay\n muted={true}\n ref={largeRemoteVideo}\n className={`pi-rounded-2xl ${\n screenShareActive || showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* remote video placeholder */}\n <div\n className={`pi-w-full pi-bg-gray-200 dark:pi-bg-gray-800 pi-flex pi-items-center pi-justify-center ${\n screenShareActive || !showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-32 pi-h-32 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-4xl pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(displayName)}\n </span>\n </div>\n </div>\n {/* small local video */}\n <video\n muted={true}\n autoPlay\n ref={localVideo}\n className={`pi-max-w-32 pi-max-h-32 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg ${\n !isLocalVideoEnabled ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* small local video placeholder */}\n <div\n className={`pi-w-32 pi-h-24 pi-absolute pi-top-5 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ${\n isLocalVideoEnabled || !hasVideoTrackAdded ? 'pi-hidden' : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-base pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(userInfo.name || '-')}\n </span>\n </div>\n </div>\n {/* small remote video */}\n <video\n muted={true}\n autoPlay\n ref={smallRemoteVideo}\n className={`pi-max-w-32 pi-max-h-32 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg ${\n !screenShareActive || showRemoteVideoPlaceHolder ? 'pi-hidden' : ''\n }`}\n ></video>\n {/* small remote video placeholder */}\n <div\n className={`pi-w-32 pi-h-24 pi-absolute pi-top-32 pi-right-5 pi-rounded-lg pi-bg-gray-200 dark:pi-bg-gray-900 pi-flex pi-items-center pi-justify-center ${\n !screenShareActive || !showRemoteVideoPlaceHolder || !hasVideoTrackAdded\n ? 'pi-hidden'\n : ''\n }`}\n >\n <div className='pi-rounded-full pi-bg-gray-700 dark:pi-bg-gray-200 pi-w-12 pi-h-12 pi-flex pi-items-center pi-justify-center'>\n <span className='pi-text-base pi-text-gray-50 dark:pi-text-gray-900'>\n {getInitials(displayName)}\n </span>\n </div>\n </div>\n </div>\n\n <div\n className={`${\n !isUiShown && 'pi-opacity-0 pi-pointer-events-none'\n } pi-absolute pi-bottom-0 pi-bg-gray-950/65 pi-w-full pi-p-6 pi-rounded-bl-[20px] pi-rounded-br-[20px] pi-transition-all`}\n >\n <div className='pi-flex pi-items-center pi-justify-center pi-gap-6 pi-mb-5'>\n {/* mute button */}\n {!intrudeListenStatus?.isListen && (\n <Button\n variant='default'\n active={muted ? true : false}\n onClick={() => (muted ? unmuteCurrentCall() : muteCurrentCall())}\n data-tooltip-id='tooltip-mute'\n data-tooltip-content={muted ? `${t('Tooltip.Unmute')}` : `${t('Tooltip.Mute')}`}\n >\n {muted ? (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophoneSlash} />\n ) : (\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faMicrophone} />\n )}\n </Button>\n )}\n\n {/* video button */}\n {videoInputDevices?.length > 0 && (\n <Button\n variant='default'\n onClick={() => toggleVideo()}\n data-tooltip-id='tooltip-toggle-video'\n data-tooltip-content={`${\n !isVideoCallButtonVisible\n ? t('Tooltip.Enable camera permission') || ''\n : isLocalVideoEnabled\n ? t('Tooltip.Disable camera')\n : t('Tooltip.Enable camera')\n }`}\n disabled={!isVideoCallButtonVisible}\n className={`${!isVideoCallButtonVisible ? 'pi-cursor-auto' : ''}`}\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isLocalVideoEnabled ? faVideoSlash : faVideo}\n />\n </Button>\n )}\n\n {/* Share screen button */}\n {janus.current.webRTCAdapter.browserDetails.browser !== 'safari' &&\n userInfo?.profile?.macro_permissions?.nethvoice_cti?.permissions?.screen_sharing\n ?.value &&\n !screenShareActive && (\n <Button\n variant='default'\n onClick={() => initAndStartScreenShare()}\n data-tooltip-id='tooltip-start-screen-share'\n data-tooltip-content={t('Tooltip.Share screen') || ''}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faDisplay} />\n </Button>\n )}\n\n {/* stop screen share */}\n {screenShareActive && screenShareRole === 'publisher' && (\n <Button\n variant='default'\n onClick={() => stopScreenShare()}\n data-tooltip-id='tooltip-stop-screen-share'\n data-tooltip-content={t('Tooltip.Stop sharing')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={faDisplaySlash} />\n </Button>\n )}\n\n {/* fullscreen */}\n {screenShareActive && screenShareRole === 'listener' && (\n <Button\n variant='default'\n onClick={() => toggleFullScreen()}\n data-tooltip-id='tooltip-toggle-fullscreen'\n data-tooltip-content={\n isFullscreen ? t('Tooltip.Exit fullscreen') : t('Tooltip.Enter fullscreen')\n }\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isFullscreen ? faCompress : faExpand}\n />\n </Button>\n )}\n\n {/* record */}\n {userInfo?.profile?.macro_permissions?.settings?.permissions?.recording?.value && (\n <Button\n variant='default'\n onClick={() => recordCurrentCall(isRecording)}\n data-tooltip-id='tooltip-record-video-view'\n data-tooltip-content={\n isRecording ? t('Tooltip.Stop recording') : t('Tooltip.Record')\n }\n >\n <FontAwesomeIcon\n className='pi-h-6 pi-w-6'\n icon={isRecording ? faStop : faRecord}\n />\n </Button>\n )}\n\n {/* hold */}\n {!(intrudeListenStatus?.isIntrude || intrudeListenStatus?.isListen) && (\n <Button\n variant='default'\n onClick={() => (paused ? unpauseCurrentCall() : pauseCall())}\n data-tooltip-id='tooltip-pause-video-view'\n data-tooltip-content={paused ? t('Tooltip.Play') : t('Tooltip.Pause')}\n >\n <FontAwesomeIcon className='pi-h-6 pi-w-6' icon={paused ? faPlay : faPause} />\n </Button>\n )}\n </div>\n <Hangup buttonsVariant='default' />\n </div>\n {/* Buttons tooltips */}\n <CustomThemedTooltip className='pi-z-20' id='tooltip-mute-video-view' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-video' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-toggle-fullscreen' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-start-screen-share' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-stop-screen-share' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-record-video-view' place='bottom' />\n <CustomThemedTooltip className='pi-z-20' id='tooltip-pause-video-view' place='bottom' />\n </div>\n ) : (\n // collapsed view\n <>\n <div className='pi-flex pi-justify-between pi-items-center'>\n <Avatar />\n <Timer startTime={startTime} isNotAlwaysWhite />\n {!isOpen && remoteAudioStream && !isPhysical() && (\n <AudioBars\n audioStream={remoteAudioStream}\n paused={paused}\n size={isOpen ? 'large' : 'small'}\n />\n )}\n </div>\n </>\n )}\n </>\n )\n}\n\nexport default VideoView\n"],"names":["VideoView","dispatch","useDispatch","_l","useSelector","state","currentCall","muted","startTime","isRecording","paused","isLocalVideoEnabled","showRemoteVideoPlaceHolder","hasVideoTrackAdded","displayName","isStartingVideoCall","_m","screenShare","localTracks","localVideos","screenShareRole","role","screenShareActive","active","isStartingScreenShare","isJoiningScreenShare","isLeavingScreenShare","intrudeListenStatus","listen","isOpen","island","_o","webrtc","janusInstance","remoteAudioStream","userInfo","store","getState","currentUser","_p","useState","isFullscreen","setIsFullscreen","_q","isUiShown","setUiShown","uiTimeoutRef","useRef","debounceTimerRef","videoRenegotiationInFlightRef","screenSharePublisherJoinRequestedRef","screenShareViewRef","fullscreenElementRef","localScreen","remoteScreen","localVideo","largeRemoteVideo","smallRemoteVideo","janus","JanusLib","videoInputDevices","select","mediaDevices","useIsomorphicLayoutEffect","player","updatePlayer","useEffect","updateScreenStreams","updateVideoStreams","addEventListener","handleFullscreenChange","removeEventListener","exitFullScreenIfActive","current","clearTimeout","enableVideo","updateCurrentCall","initAndStartScreenShare","update","initAndJoinScreenShare","leaveScreenShare","localVideoElement","largeRemoteVideoElement","smallRemoteVideoElement","_a","localVideoStream","remoteVideoStream","attachMediaStream","MediaStream","getVideoTracks","length","document","fullscreenElement","exitFullscreen","eventDispatch","toggleFullScreen","requestFullscreen","useEventListener","newRemoteFeed","id","display","source","remoteFeed","attach","plugin","opaqueId","randomString","success","pluginHandle","remoteTracks","remoteVideos","_b","log","call","getPlugin","getId","_d","_c","request","room","ptype","feed","send","message","error","iceState","rfindex","webrtcState","on","slowLink","uplink","lost","mid","warn","onmessage","msg","jsep","debug","event","_f","_e","_h","_g","_k","_j","createAnswer","tracks","type","body","onlocaltrack","track","onremotetrack","metadata","reason","kind","remoteScreenStream","stopAllTracks","stream","remoteScreenElement","oncleanup","sipcall","currentVideoInputDeviceId","getCurrentVideoInputDeviceId","recv","capture","deviceId","exact","videoTransceiver","webrtcStuff","pc","getTransceivers","find","transceiver","receiver","sender","Boolean","replace","setVideoTrackAdded","add","push","createOffer","notifyPeerVideoStart","dispatchVideoCallStarted","initiator","callUser","username","destUser","console","JSON","stringify","disableVideo","updateLocalVideoStream","setLocalVideoEnabled","__assign","remove","initScreenShare","isExtensionEnabled","abortScreenShare","create","description","bitrate","publishers","result","destroyScreenShareRoom","register","shareScreen","joinScreenShare","detach","consentDialog","mediaState","medium","_w","pendingScreenStream","screenTrack_1","audio","video","stop","exitVideoViewIfNoVideo","releaseScreenShareHandles","list","f","leaving","_r","_t","_s","_v","_u","handleRemoteJsep","trackId","stream_2","localScreenStream","localScreenElement","inviteOtherUser","stopScreenShare","iceConnectionState","stream_1","getTracks","i","mst","e","filteredTracks","filter","socket","websocket","destUsername","emit","roomId","isScreenShareActive","hasRemoteVideo","some","readyState","view","setIslandView","joinMessage","handleMouseMoveWithDebounce","setTimeout","notifyRemote","isVideoCallButtonVisible","setIsVideoCallButtonVisible","checkCameraPermission","__awaiter","checkWebCamPermission","sent","React","createElement","Fragment","ref","onMouseMove","className","autoPlay","concat","getInitials","name","isListen","Button","variant","onClick","unmuteCurrentCall","muteCurrentCall","t","FontAwesomeIcon","icon","faMicrophoneSlash","faMicrophone","disabled","faVideoSlash","faVideo","webRTCAdapter","browserDetails","browser","profile","macro_permissions","nethvoice_cti","permissions","screen_sharing","value","faDisplay","faDisplaySlash","faCompress","faExpand","settings","recording","recordCurrentCall","faStop","faRecord","isIntrude","unpauseCurrentCall","pauseCurrentCall","faPlay","faPause","Hangup","buttonsVariant","CustomThemedTooltip","place","Avatar","Timer","isNotAlwaysWhite","isPhysical","AudioBars","audioStream","size"],"mappings":"06CA4DaA,EAAgC,mCACrCC,EAAWC,EAAAA,cACXC,EAUFC,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAMC,WAAW,GATrDC,EAAKJ,EAAAI,MACLC,EAASL,EAAAK,UACTC,EAAWN,EAAAM,YACXC,EAAMP,EAAAO,OACNC,EAAmBR,EAAAQ,oBACnBC,EAA0BT,EAAAS,2BAC1BC,uBACAC,gBACAC,wBAEIC,EAQFZ,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMY,WAAN,GAPpCC,EAAWF,EAAAE,YACXC,EAAWH,EAAAG,YACLC,EAAeJ,EAAAK,KACbC,EAAiBN,EAAAO,OACzBC,EAAqBR,EAAAQ,sBACrBC,GAAoBT,EAAAS,qBACpBC,0BAEIC,GAAsBvB,EAAWA,YAAC,SAACC,GAAqB,OAAAA,EAAMuB,MAAN,GACtDC,GAAWzB,cAAY,SAACC,GAAqB,OAAAA,EAAMyB,gBACrDC,GAAuC3B,EAAAA,YAAY,SAACC,GAAqB,OAAAA,EAAM2B,MAAM,GAAnFC,oBAAeC,wBACjBC,GAAWC,EAAAA,MAAMC,WAAWC,YAC5BC,GAAkCC,EAAAA,UAAS,GAA1CC,GAAYF,GAAA,GAAEG,GAAeH,GAAA,GAC9BI,GAA0BH,EAAAA,UAAS,GAAlCI,GAASD,GAAA,GAAEE,GAAUF,GAAA,GACtBG,GAAeC,SAA6C,MAC5DC,GAAmBD,SAA6C,MAChEE,GAAgCF,UAAO,GACvCG,GAAuCH,UAAO,GAC9CI,GAAqBJ,SAAO,MAC5BK,GAAuBL,SAA2B,MAClDM,GAAcN,SAAyB,MACvCO,GAAeP,SAAyB,MACxCQ,GAAaR,SAAyB,MACtCS,GAAmBT,SAAyB,MAC5CU,GAAmBV,SAAyB,MAC5CW,GAAQX,SAAmBY,EAAAA,SAC3BC,GAAoBxB,EAAKA,MAACyB,OAAOC,aAAaF,kBAAkBxB,EAAKA,MAACC,YAG5E0B,EAAAA,0BAA0B,WACxB9D,EAAS+D,OAAOC,aAAa,CAC3BZ,YAAaA,GACbC,aAAcA,GACdC,WAAYA,GACZC,iBAAkBA,GAClBC,iBAAkBA,IAErB,EAAE,IAGHS,EAAAA,UAAU,WAOR,OANAC,KACAC,KAGAC,iBAAiB,mBAAoBC,IAE9B,WACLC,oBAAoB,mBAAoBD,IACxCE,KAGI1B,GAAa2B,SACfC,aAAa5B,GAAa2B,QAE9B,CACD,EAAE,IAGHP,EAAAA,UAAU,WACJnD,IACF4D,KACA1E,EAASK,YAAYsE,kBAAkB,CACrC7D,qBAAqB,IAG3B,EAAG,CAACA,IAGJmD,EAAAA,UAAU,WACJ1C,IACFqD,KACAzC,QAAMnC,SAASgB,YAAY6D,OAAO,CAChCtD,uBAAuB,IAG7B,EAAG,CAACA,IAGJ0C,EAAAA,UAAU,WACJzC,KACFsD,KACA3C,QAAMnC,SAASgB,YAAY6D,OAAO,CAChCrD,sBAAsB,IAG5B,EAAG,CAACA,KAGJyC,EAAAA,UAAU,WACJxC,KACFsD,KACA5C,QAAMnC,SAASgB,YAAY6D,OAAO,CAChCpD,sBAAsB,IAG5B,EAAG,CAACA,KAGJwC,EAAAA,UAAU,WACRC,KACAC,IACF,EAAG,CAACvC,KAEJ,IAAMuC,GAAqB,WACzB,IAAMa,EAAoB7C,EAAKA,MAACC,WAAW2B,OAAOT,WAC5C2B,EAA0B9C,EAAKA,MAACC,WAAW2B,OAAOR,iBAClD2B,EAA0B/C,EAAKA,MAACC,WAAW2B,OAAOP,iBAClD2B,EAA0ChD,EAAAA,MAAMC,WAAWL,OAAzDqD,EAAgBD,EAAAC,iBAAEC,uBAItBL,aAAiB,EAAjBA,EAAmBR,UACjBf,GAAMe,QAAQc,mBAChB7B,GAAMe,QAAQc,kBAAkBN,EAAkBR,QAASY,IAM3DH,eAAAA,EAAyBT,UAAWf,GAAMe,QAAQc,mBACpD7B,GAAMe,QAAQc,kBACZL,EAAwBT,QACxBa,IAMAH,eAAAA,EAAyBV,UAAWf,GAAMe,QAAQc,mBACpD7B,GAAMe,QAAQc,kBACZJ,EAAwBV,QACxBa,GAIAA,aAA6BE,aAAeF,EAAkBG,iBAAiBC,OAAS,GAC1FzF,EAASK,YAAYsE,kBAAkB,CACrChE,4BAA4B,GAGlC,EAEM0D,GAAyB,WAC7B5B,KAAkBiD,SAASC,kBAC7B,EAEMpB,GAAyB,WACzBmB,SAASC,mBAAqBD,SAASC,oBAAsBxC,GAAqBqB,UACpFkB,SAASE,iBACTC,gBAAc,iCAAkC,CAAA,GAEpD,EAEMC,GAAmB,WACnBJ,SAASC,mBACXD,SAASE,iBACTC,gBAAc,iCAAkC,CAAA,IAE5C3C,GAAmBsB,UACrBrB,GAAqBqB,QAAUtB,GAAmBsB,QAClDrB,GAAqBqB,QAAQuB,oBAC7BF,gBAAc,kCAAmC,CAAA,GAGvD,EACAG,EAAgBA,iBAAC,gCAAiC,WAChDF,IACF,GACAE,EAAgBA,iBAAC,+BAAgC,WAC/CF,IACF,GAEA,IAAMG,GAAgB,SAACC,EAAIC,GAGzBnG,EAASgB,YAAY6D,OAAO,CAC1BuB,OAAQF,IAGV,IAAIG,EAAkB,KACtBrE,UAAAA,GAAesE,OAAO,CACpBC,OAAQ,yBACRC,SAAU/C,GAAMe,QAAQiC,aAAa,IACrCC,QAAS,SAAUC,eACjBN,EAAaM,EAEb3G,EAASgB,YAAY6D,OAAO,CAC1BwB,WAAYM,IAEdN,EAAWO,aAAe,GAC1BP,EAAWQ,aAAe,EACT,QAAjBC,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAG,IAAAD,GAAAA,EAAAE,KAAA7B,EACf,qBAAuBkB,EAAWY,YAAc,QAAUZ,EAAWa,QAAU,KAEhE,QAAjBC,GAAAC,EAAA3D,GAAMe,SAAQuC,WAAG,IAAAI,GAAAA,EAAAH,KAAAI,EAAG,6BAEZ,IAEJzF,EAAS,CACX0F,QAAS,OACTC,KAJenF,EAAKA,MAACC,WAAWpB,YAAWsG,KAK3CC,MAAO,aACPC,KAAMtB,GAERG,EAAWoB,KAAK,CAAEC,QAAS/F,GAC5B,EACDgG,MAAO,SAAUA,WACI,QAAnBb,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EAAG,mCAAoCwC,EAC3D,EACDC,SAAU,SAAUxH,WACE,QAApB0G,KAAArD,GAAMe,SAAQuC,WAAM,IAAAD,GAAAA,EAAAE,KAAA7B,EAAA,oBAAsBkB,EAAWwB,QAAU,gBAAkBzH,EAClF,EACD0H,YAAa,SAAUC,mBACrBjB,KAAArD,GAAMe,SAAQuC,2BACZ,gDACEV,EAAWwB,QACX,SACCE,EAAK,KAAO,QACb,OAEL,EACDC,SAAU,SAAUC,EAAQC,EAAMC,mBAChCrB,KAAArD,GAAMe,SAAQ4D,4BACZ,2BACGH,EAAS,UAAY,aACtB,mBACAE,EACA,KACAD,EACA,iBAEL,EACDG,UAAW,SAAUC,EAAKC,2BACL,QAAnBzB,GAAA3B,EAAA1B,GAAMe,SAAQgE,aAAK,IAAA1B,GAAAA,EAAAE,KAAA7B,EAAG,oCAAqCmD,GAC3D,IAAIG,EAAQH,EAAe,UACR,QAAnBnB,GAAAC,EAAA3D,GAAMe,SAAQgE,aAAK,IAAArB,GAAAA,EAAAH,KAAAI,EAAG,UAAYqB,GAC9BA,IACY,aAAVA,EAEe,QAAjBC,GAAAC,EAAAlF,GAAMe,SAAQuC,WAAG,IAAA2B,GAAAA,EAAA1B,KAAA2B,EACf,iCAAmCzC,EAAK,KAAOC,EAAU,aAAemC,EAAU,MAGlE,QAAlBM,GAAAC,EAAApF,GAAMe,SAAQ4D,YAAI,IAAAQ,GAAAA,EAAA5B,KAAA6B,EAAG,oBAAsBJ,IAG3CF,IACiB,QAAnBO,GAAAC,EAAAtF,GAAMe,SAAQgE,aAAK,IAAAM,GAAAA,EAAA9B,KAAA+B,EAAG,0BAA2BR,GAEjDlC,EAAW2C,aAAa,CACtBT,KAAMA,EAKNU,OAAQ,CAAC,CAAEC,KAAM,SACjBxC,QAAS,SAAU6B,WACE,QAAnBzB,GAAA3B,EAAA1B,GAAMe,SAAQgE,aAAK,IAAA1B,GAAAA,EAAAE,KAAA7B,EAAG,WAAYoD,GAE1B,IAEJY,EAAO,CAAE9B,QAAS,QAASC,KAFdnF,EAAKA,MAACC,WAAWpB,YAAWsG,MAG7CjB,EAAWoB,KAAK,CAAEC,QAASyB,EAAMZ,KAAMA,GACxC,EACDZ,MAAO,SAAUA,WACI,QAAnBb,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EAAG,gBAAiBwC,EACxC,IAGN,EAEDyB,aAAc,SAAUC,EAAOtB,GAE9B,EACDuB,cAAe,SAAUD,EAAOlB,EAAKJ,EAAIwB,uBAUvC,WATAzC,KAAArD,GAAMe,SAAQgE,6BACZ,qBACEL,EACA,MACCJ,EAAK,QAAU,YACfwB,EAAW,KAAOA,EAASC,OAAS,KAAO,IAC5C,IACFH,GAEElH,EAAKA,MAACC,WAAWpB,YAAYqF,aAAeA,EAMhD,GACiB,UAAfgD,EAAMI,OACNF,GACqB,SAApBA,EAASC,QAAyC,WAApBD,EAASC,OAH1C,CAQA,IAAKzB,EAAI,CACC,IAAA2B,EAAuBvH,EAAKA,MAACC,WAAWpB,YAAW0I,mBAG3D,OAFAjG,GAAMe,QAAQmF,cAAcD,QAC5B1J,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,GAEvC,CAED,GAAmB,UAAf+H,EAAMI,KAAkB,CAE1B,IAAIG,EAAS,IAAIrE,YAAY,CAAC8D,IAG9BlH,EAAKA,MAACnC,SAASgB,YAAY6D,OAAO,CAAE6E,mBAAoBE,IAExDvD,EAAWO,aAAauB,GAAOyB,EACd,QAAjBlB,GAAAC,EAAAlF,GAAMe,SAAQuC,WAAG,IAAA2B,GAAAA,EAAA1B,KAAA2B,EAAG,gCAAkCiB,GACtD,IAAMC,EAAsB1H,EAAKA,MAACC,WAAW2B,OAAOV,cAEhDwG,aAAmB,EAAnBA,EAAqBrF,WACW,QAAlCoE,GAAAC,EAAApF,GAAMe,SAAQc,yBAAoB,IAAAsD,GAAAA,EAAA5B,KAAA6B,EAAAgB,EAAoBrF,QAASoF,GAElE,CAtBA,MAFkB,QAAjBzC,GAAAC,EAAA3D,GAAMe,SAAQuC,WAAG,IAAAI,GAAAA,EAAAH,KAAAI,EAAG,gDAyBvB,EACD0C,UAAW,mBACW,QAApBhD,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAM,IAAAD,GAAAA,EAAAE,KAAA7B,EAAA,gDAAkDe,EAAK,SAC3EG,EAAWO,aAAe,GAC1BP,EAAWQ,aAAe,CAC3B,GAEL,EAEMnC,GAAc,uBAClB,IAAI1B,GAA8BwB,QAAlC,CAIQ,IAAAuF,EAA8B5H,EAAKA,MAACC,WAAWL,OAAMgI,QAC7D/G,GAA8BwB,SAAU,EACxCrC,QAAMnC,SAASK,YAAYsE,kBAAkB,CAC3CjE,qBAAqB,IAEvB,IAAMuI,EAAuB,GACvBe,EAA4BC,EAAAA,+BAE5BZ,EAA6B,CACjCH,KAAM,QACNgB,MAAM,GAINb,EAAMc,SADJH,GACc,CAAEI,SAAU,CAAEC,MAAOL,IAK/B,IAAApJ,EAAuBuB,EAAKA,MAACC,WAAW/B,YAAWO,mBACnDyE,EAAsBlD,EAAKA,MAACC,WAAWL,OAAMsD,kBAC/CiF,EAEF,QAFqBnD,UAAAC,EACrB,UADyC,QAApBjC,EAAA4E,aAAA,EAAAA,EAASQ,mBAAW,IAAApF,OAAA,EAAAA,EAAEqF,UAC3C,IAAA1D,OAAA,EAAAA,EAAA2D,qDACA,IAAAtD,OAAA,EAAAA,EAAAuD,KACA,SAACC,eACC,MAAsC,WAAX,QAA3B7D,EAAoB,QAApB3B,EAAAwF,EAAYC,gBAAQ,IAAAzF,OAAA,EAAAA,EAAEkE,aAAK,IAAAvC,OAAA,EAAAA,EAAE2C,OACO,WAAT,QAA3BtC,EAAoB,QAApBC,EAAAuD,EAAYE,cAAQ,IAAAzD,OAAA,EAAAA,EAAAiC,aAAO,IAAAlC,OAAA,EAAAA,EAAAsC,KAAgB,IAG/C7I,GACAkK,QAAQR,IACPjF,aAA6BE,aAAeF,EAAkBG,iBAAiBC,OAAS,IAQrF6E,GACFjB,EAAM0B,SAAU,EACZT,EAAiBnC,MACnBkB,EAAMlB,IAAMmC,EAAiBnC,KAE1BvH,GACHZ,EAASK,YAAY2K,oBAAmB,KAX5C3B,EAAM4B,KAAM,EACZjL,EAASK,YAAY2K,oBAAmB,IAiB1C/B,EAAOiC,KAAK7B,GAEZU,EAAQoB,YAAY,CAClBlC,OAAQA,EACRvC,QAAS,SAAU6B,GACjBvF,GAA8BwB,SAAU,EACxCuF,EAAQtC,KAAK,CAAEC,QAAS,CAAEL,QAAS,UAAYkB,KAAMA,IACrD6C,EAAAA,uBACAC,2BAAyB,CACvBC,UAAW,QACXC,SAAUpJ,EAAKA,MAACC,WAAWC,YAAYmJ,SACvCC,SAAUtJ,EAAKA,MAACC,WAAW/B,YAAYmL,WAEzC3F,gBAAc,6BAA8B,CAAA,EAC7C,EACD8B,MAAO,SAAUA,GACf3E,GAA8BwB,SAAU,EACxCkH,QAAQ/D,MAAM,mBAAqBgE,KAAKC,UAAUjE,GACnD,GAxEF,CA0EH,EACA3B,EAAgBA,iBAAC,4BAA6B,WAC5CtB,IACF,GAEA,IAAMmH,GAAe,uBACnB,IAAI7I,GAA8BwB,QAAlC,CAIM,IAAAmE,EACJxG,EAAAA,MAAMC,WAAWL,OADXgI,EAAOpB,EAAAoB,QAAE3E,qBAEjBpC,GAA8BwB,SAAU,EACxC,IAAM8F,EAEF,QAFqBnD,UAAAC,EACrB,UADyC,QAApBjC,EAAA4E,aAAA,EAAAA,EAASQ,mBAAW,IAAApF,OAAA,EAAAA,EAAEqF,UAC3C,IAAA1D,OAAA,EAAAA,EAAA2D,qDACA,IAAAtD,OAAA,EAAAA,EAAAuD,KACA,SAACC,eACC,MAAsC,WAAX,QAA3B7D,EAAoB,QAApB3B,EAAAwF,EAAYC,gBAAQ,IAAAzF,OAAA,EAAAA,EAAEkE,aAAK,IAAAvC,OAAA,EAAAA,EAAE2C,OACO,WAAT,QAA3BtC,EAAoB,QAApBC,EAAAuD,EAAYE,cAAQ,IAAAzD,OAAA,EAAAA,EAAAiC,aAAO,IAAAlC,OAAA,EAAAA,EAAAsC,KAAgB,GAGjDhG,GAAMe,QAAQmF,cAAcvE,GAC5BjD,EAAAA,MAAMnC,SAAS+B,OAAO+J,uBAAuB,MAC7C3J,EAAAA,MAAMnC,SAASK,YAAY0L,sBAAqB,GAChD,IAAM9C,EAAuB,GAC7BA,EAAOiC,KAAIc,WAAAA,EAAAA,SAAA,CACT9C,KAAM,UACFoB,aAAgB,EAAhBA,EAAkBnC,KAAM,CAAEA,IAAKmC,EAAiBnC,KAAQ,CAAA,GAC5D,CAAA8D,QAAQ,KAGVlC,EAAQoB,YAAY,CAClBlC,OAAQA,EACRvC,QAAS,SAAU6B,GACjBvF,GAA8BwB,SAAU,EACxCuF,EAAQtC,KAAK,CAAEC,QAAS,CAAEL,QAAS,UAAYkB,KAAMA,IACrD1C,gBAAc,8BAA+B,CAAA,EAC9C,EACD8B,MAAO,SAAUA,GACf3E,GAA8BwB,SAAU,EACxCkH,QAAQ/D,MAAM,mBAAqBgE,KAAKC,UAAUjE,GACnD,GAjCF,CAmCH,EACA3B,EAAgBA,iBAAC,6BAA8B,WAC7C6F,IACF,GAEA,IAgFMK,GAAkB,WACtBlK,UAAAA,GAAesE,OAAO,CACpBC,OAAQ,yBACRC,SAAU/C,GAAMe,QAAQiC,aAAa,IACrCC,QAAS,SAAUC,GACjB,GAAKxE,EAAAA,MAAMC,WAAWpB,YAAYM,OAAlC,CAKAtB,EAASgB,YAAY6D,OAAO,CAC1B0B,OAAQI,IAEF,IAAAvF,EAASe,EAAKA,MAACC,WAAWpB,YAAWI,KAEhC,cAATA,GACFyE,gBAAc,wCAAyC,CAAA,GArF3C,mBAClB,IAAKpC,GAAMe,QAAQ2H,qBAKjB,OAJmB,QAAnBrF,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EACjB,iFAEFiH,KAKF,IAEIC,EAAS,CACXhF,QAAS,SACTiF,YAJe7I,GAAMe,QAAQiC,aAAa,IAK1C8F,QAAS,IACTC,WAAY,GAGNjG,EAAWpE,EAAKA,MAACC,WAAWpB,YAAWuF,OAE/CA,EAAOkB,KAAK,CACVC,QAAS2E,EACT3F,QAAS,SAAU+F,uBACjB,GAAIA,EAAc,MAGhB,OAFmB,QAAnB3F,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EAAG,yBAA2BsH,EAAc,YAC/DL,KAGF,IAAI3D,EAAQgE,EAAkB,UAE9B,GADmB,QAAnBtF,GAAAC,EAAA3D,GAAMe,SAAQgE,aAAK,IAAArB,GAAAA,EAAAH,KAAAI,EAAG,UAAYqB,GAC9BA,EAAO,CAGT,IAAMnB,EAAOmF,EAAa,KAC1B,GAAItK,EAAKA,MAACC,WAAWpB,YAAYuF,SAAWA,EAE1C,YADAmG,yBAAuBnG,EAAQe,GAIjCtH,EAASgB,YAAY6D,OAAO,CAC1ByC,KAAMA,IAGS,QAAjBoB,GAAAC,EAAAlF,GAAMe,SAAQuC,WAAG,IAAA2B,GAAAA,EAAA1B,KAAA2B,EAAG,mCAAqCrB,GAEjD,IAAAkE,EAAarJ,EAAKA,MAACC,WAAWC,YAAWmJ,SAEjD,GAAIvI,GAAqCuB,QAIvC,YAHiB,QAAjBoE,GAAAC,EAAApF,GAAMe,SAAQuC,WAAG,IAAA6B,GAAAA,EAAA5B,KAAA6B,EACf,0FAKJ5F,GAAqCuB,SAAU,EAE/C,IAAImI,EAAW,CACbtF,QAAS,OACTC,KAAMA,EACNC,MAAO,YACPpB,QAASqF,GAEXjF,EAAOkB,KAAK,CAAEC,QAASiF,GACxB,CACF,GAEL,CAmBQC,IACkB,aAATxL,GACTyL,KAEFhH,gBAAc,oCAAqC,CAAA,EAblD,MAFCc,EAAamG,QAgBhB,EACDnF,MAAO,SAAUA,WACI,QAAnBb,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EAAG,mCAAoCwC,GAC1DyE,IACD,EACDW,cAAe,SAAUhF,GAAM,EAC/BH,SAAU,SAAUxH,WACD,QAAjB0G,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAG,IAAAD,GAAAA,EAAAE,KAAA7B,EAAG,wBAA0B/E,EAC/C,EACD4M,WAAY,SAAUC,EAAQlF,WACR,QAApBjB,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAM,IAAAD,GAAAA,EAAAE,KAAA7B,EAAA,UAAY4C,EAAK,UAAY,WAAa,kBAAoBkF,EACnF,EACDnF,YAAa,SAAUC,WACJ,QAAjBjB,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAG,IAAAD,GAAAA,EAAAE,KAAA7B,EACf,4CAA8C4C,EAAK,KAAO,QAAU,OAEvE,EACDC,SAAU,SAAUC,EAAQC,EAAMC,mBAChCrB,KAAArD,GAAMe,SAAQ4D,4BACZ,2BACGH,EAAS,UAAY,aACtB,mBACAE,EACA,KACAD,EACA,iBAEL,EACDG,UAAW,SAAUC,EAAKC,+CACL,QAAnBzB,GAAA3B,EAAA1B,GAAMe,SAAQgE,aAAK,IAAA1B,GAAAA,EAAAE,KAAA7B,EAAG,qCAAsCmD,GACtD,IAAA4E,EAAmB/K,EAAAA,MAAMC,WAAWpB,YAAlCuF,EAAM2G,EAAA3G,OAAEnF,SACVqH,EAAQH,EAAe,UAG7B,GAFmB,QAAnBnB,GAAAC,EAAA3D,GAAMe,SAAQgE,aAAK,IAAArB,GAAAA,EAAAH,KAAAI,EAAG,UAAYqB,GAE9BA,EACF,GAAc,WAAVA,GACF,GAAa,cAATrH,EAAsB,CAEL,QAAnBsH,GAAAC,EAAAlF,GAAMe,SAAQgE,aAAK,IAAAE,GAAAA,EAAA1B,KAAA2B,EAAG,4CAGd,IAAAwE,EAAwBhL,EAAKA,MAACC,WAAWpB,YAAWmM,oBACtDC,EAAcD,aAAmB,EAAnBA,EAAqB3H,iBAAiB,GAC1DxF,EAASgB,YAAY6D,OAAO,CAAEsI,oBAAqB,OAEnD5G,EAAO4E,YAAY,CAEjBlC,OAAQ,CACN,CAAEC,KAAM,QAASiB,SAAS,EAAMD,MAAM,GACtC,CAAEhB,KAAM,SAAUiB,QAASiD,SAAAA,EAAqBlD,MAAM,IAExDxD,QAAS,SAAU6B,WACE,QAAnBzB,GAAA3B,EAAA1B,GAAMe,SAAQgE,aAAK,IAAA1B,GAAAA,EAAAE,KAAA7B,EAAG,qBAAsBoD,GAE5ChC,EAAOkB,KAAK,CAAEC,QADA,CAAEL,QAAS,YAAagG,OAAO,EAAMC,OAAO,GAC1B/E,KAAMA,GACvC,EACDZ,MAAO,SAAUA,WACf1E,GAAqCuB,SAAU,EAC5B,QAAnBsC,GAAA3B,EAAA1B,GAAMe,SAAQmD,aAAK,IAAAb,GAAAA,EAAAE,KAAA7B,EAAG,gBAAiBwC,GACvCyF,SAAAA,EAAaG,OACbvN,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,EAAOF,KAAM,KACnDoM,KACAC,EAAyBA,2BAAC,EAC3B,GAEJ,MAEC,GAAInF,EAAgB,WAAG,CACrB,IAAIoF,EAAOpF,EAAgB,WAE3B,IAAK,IAAIqF,KADU,QAAnB/E,GAAAC,EAAApF,GAAMe,SAAQgE,aAAK,IAAAI,GAAAA,EAAA5B,KAAA6B,EAAG,4CAA6C6E,GACrDA,EACZ,IAAIA,EAAKC,GAAU,MAAnB,CACA,IAAIzH,EAAKwH,EAAKC,GAAO,GACjBxH,EAAUuH,EAAKC,GAAY,QACZ,QAAnB7E,GAAAC,EAAAtF,GAAMe,SAAQgE,aAAK,IAAAM,GAAAA,EAAA9B,KAAA+B,EAAG,SAAW7C,EAAK,KAAOC,GAC7CF,GAAcC,EAAIC,EAJY,CAMjC,OAEE,GAAc,UAAVsC,EAET,GAAa,aAATrH,GAAuBkH,EAAgB,WAAG,CACxCoF,EAAOpF,EAAgB,WAE3B,IAAK,IAAIqF,KADU,QAAnB5M,GAAAb,EAAAuD,GAAMe,SAAQgE,aAAK,IAAAzH,GAAAA,EAAAiG,KAAA9G,EAAG,4CAA6CwN,GACrDA,EACZ,IAAIA,EAAKC,GAAU,MAAnB,CACIzH,EAAKwH,EAAKC,GAAO,GACjBxH,EAAUuH,EAAKC,GAAY,QACZ,QAAnBrL,GAAAR,EAAA2B,GAAMe,SAAQgE,aAAK,IAAAlG,GAAAA,EAAA0E,KAAAlF,EAAG,SAAWoE,EAAK,KAAOC,GAC7CF,GAAcC,EAAIC,EAJY,CAMjC,MAAM,GAAImC,EAAa,QAAG,CAEzB,IAAIsF,EAAUtF,EAAa,QACV,QAAjBuF,GAAAnL,EAAAe,GAAMe,SAAQuC,WAAG,IAAA8G,GAAAA,EAAA7G,KAAAtE,EAAG,mBAAqBkL,EAC1C,MAAUtF,EAAW,QACD,QAAnBwF,GAAAC,EAAAtK,GAAMe,SAAQmD,aAAK,IAAAmG,GAAAA,EAAA9G,KAAA+G,EAAG,gBAAkBzF,EAAW,OACnD8D,KACAqB,4BAAmC,cAATrM,IAI5BmH,IACiB,QAAnByF,GAAAC,EAAAxK,GAAMe,SAAQgE,aAAK,IAAAwF,GAAAA,EAAAhH,KAAAiH,EAAG,0BAA2B1F,GACjDhC,EAAO2H,iBAAiB,CAAE3F,KAAMA,IAEnC,EACDa,aAAc,SAAUC,EAAOtB,mBACP,QAAtBjB,GAAA3B,EAAA1B,GAAMe,SAAQgE,aAAQ,IAAA1B,GAAAA,EAAAE,KAAA7B,EAAA,gBAAkB4C,EAAK,QAAU,WAAa,IAAKsB,GAEzE,IAAI8E,EAAU9E,EAAMnD,GAAG6E,QAAQ,QAAS,IACxC,GAAKhD,EAAL,CA4BA,KADa9G,eAAAA,EAAckN,IAC3B,CAKA,GAAmB,UAAf9E,EAAMI,KAAkB,CAE1BzJ,EAASgB,YAAY6D,OAAO,CAC1B3D,YAAaA,EAAc,IAE7B,IAAIkN,EAAS,IAAI7I,YAAY,CAAC8D,IAG9BlH,QAAMnC,SAASgB,YAAY6D,OAAO,CAChCwJ,kBAAmBD,IAGJ,QAAjBjH,GAAAC,EAAA3D,GAAMe,SAAQuC,WAAG,IAAAI,GAAAA,EAAAH,KAAAI,EAAG,yBAA2BgH,GAC/C,IAAME,EAAqBnM,EAAKA,MAACC,WAAW2B,OAAOX,aAE/CkL,aAAkB,EAAlBA,EAAoB9J,WACY,QAAlCkE,GAAAC,EAAAlF,GAAMe,SAAQc,yBAAoB,IAAAoD,GAAAA,EAAA1B,KAAA2B,EAAA2F,EAAmB9J,QAAS4J,GAC9DG,KAGAlF,EAAMjF,iBAAiB,QAAS,WAC9BoK,IACF,GAEH,CACO,IAAAjI,EAAWpE,EAAKA,MAACC,WAAWpB,YAAWuF,OAGA,cAA7CA,EAAOgE,YAAYC,GAAGiE,oBACtBlI,EAAOgE,YAAYC,GAAGiE,kBA/BvB,CANA,KAzBD,CAEE,IAAIC,EAASzN,eAAAA,EAAckN,GAC3B,GAAIO,EACF,IACE,IAAIzF,EAASyF,EAAOC,YACpB,IAAK,IAAIC,KAAK3F,EAAQ,CACpB,IAAI4F,EAAM5F,EAAO2F,GACbC,GAAKA,EAAItB,MACd,CAEF,CAAC,MAAOuB,GAAK,CAEG,UAAfzF,EAAMI,MACRzJ,EAASgB,YAAY6D,OAAO,CAC1B3D,YAAaA,EAAc,IAK/B,IAAM6N,EAAiB9N,aAAA,EAAAA,EAAa+N,OAAO,SAAC3F,GAAU,OAAAA,IAAUpI,EAAYkN,EAAQ,GACpFnO,EAASgB,YAAY6D,OAAO,CAC1B5D,YAAa8N,GAGhB,CAwCF,EAEDzF,cAAe,SAAUD,EAAOlB,EAAKJ,GAEpC,EACD+B,UAAW,mBACQ,QAAjBhD,GAAA3B,EAAA1B,GAAMe,SAAQuC,WAAG,IAAAD,GAAAA,EAAAE,KAAA7B,EAAG,uCACpBlC,GAAqCuB,SAAU,EAE/CxE,EAASgB,YAAY6D,OAAO,CAC1B5D,YAAa,CAAE,EACfC,YAAa,GAEhB,GAEL,EAEMgD,GAAsB,WAC1B,IAAMoK,EAAqBnM,EAAKA,MAACC,WAAW2B,OAAOX,YAC7CyG,EAAsB1H,EAAKA,MAACC,WAAW2B,OAAOV,aAC9C8B,EAA4ChD,EAAAA,MAAMC,WAAWpB,YAA3DqN,EAAiBlJ,EAAAkJ,kBAAE3E,wBAIvB4E,aAAkB,EAAlBA,EAAoB9J,UAClBf,GAAMe,QAAQc,mBAChB7B,GAAMe,QAAQc,kBACZgJ,EAAmB9J,QACnB6J,IAOFxE,aAAmB,EAAnBA,EAAqBrF,UACnBf,GAAMe,QAAQc,mBAChB7B,GAAMe,QAAQc,kBACZuE,EAAoBrF,QACpBkF,EAIR,EAEM6E,GAAkB,WAEd,IAAAU,EAAW9M,EAAKA,MAACC,WAAW8M,UAASD,OAC3BE,EAAiBhN,EAAKA,MAACC,WAAW/B,YAAWmL,SACvDlE,EAASnF,EAAKA,MAACC,WAAWpB,YAAWsG,KACrCkE,EAAarJ,EAAKA,MAACC,WAAWC,YAAWmJ,SAEjDyD,EAAOG,KAAK,UAAW,CACrB1H,QAAS,qBACT2H,OAAQ/H,EACRmE,SAAU0D,EACV5D,SAAUC,GAEd,EAIMgC,GAAyB,WACrB,IAAA9M,EAAwByB,EAAKA,MAACC,WAAW/B,YAAWK,oBACpD2E,EAAsBlD,EAAKA,MAACC,WAAWL,OAAMsD,kBACrCiK,EAAwBnN,EAAKA,MAACC,WAAWpB,YAAWM,OAC9DiO,KAAmBlK,aAAiB,EAAjBA,EACrBG,iBACDgK,KAAK,SAACnG,GAAU,MAAqB,SAArBA,EAAMoG,aAA0BpG,EAAM/I,KAAK,IAE3DI,GACA6O,GACAD,GACgC,UAAjCnN,EAAAA,MAAMC,WAAWP,OAAO6N,MAExB1P,EAAS6B,OAAO8N,cAAc,OAElC,EAEMvD,GAAmB,WACf,IAAAe,EAAwBhL,EAAKA,MAACC,WAAWpB,YAAWmM,oBAC5D1J,GAAMe,QAAQmF,cAAcwD,GAC5BnN,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,EAAOF,KAAM,GAAI+L,oBAAqB,OAC5EK,IACF,EAEM5I,GAA0B,WAC9B,GAAIzC,QAAMC,WAAWpB,YAAYM,OAAjC,CACU,IAAA6L,EAAwBhL,EAAKA,MAACC,WAAWpB,YAAWmM,oBACxDA,IACF1J,GAAMe,QAAQmF,cAAcwD,GAC5BnN,EAASgB,YAAY6D,OAAO,CAAEsI,oBAAqB,OAGtD,MACDlK,GAAqCuB,SAAU,EAC/CxE,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,EAAMF,KAAM,YAAakG,KAAM,KACrE4E,IACF,EACAlG,EAAgBA,iBAAC,kCAAmC,WAClDpB,IACF,GAEA,IAAME,GAAyB,WAC7B9E,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,EAAMF,KAAM,aAClD8K,KACArG,gBAAc,mCAAoC,CAAA,EACpD,EAEMgH,GAAkB,WACd,IAGF+C,EAAc,CAClBvI,QAAS,OACTC,KALenF,EAAKA,MAACC,WAAWpB,YAAWsG,KAM3CC,MAAO,YACPpB,QANmBhE,EAAKA,MAACC,WAAWC,YAAWmJ,UAS9BrJ,EAAKA,MAACC,WAAWpB,YAAWuF,OACxCkB,KAAK,CAAEC,QAASkI,GACzB,EAEM7K,GAAmB,WACjB,IAAAI,EAAuChD,EAAKA,MAACC,WAAWpB,YAAtD0I,EAAkBvE,EAAAuE,mBAAEtI,EAAI+D,EAAA/D,KAAEE,WACrB,cAATF,GAIJqC,GAAMe,QAAQmF,cAAcD,GAC5B1J,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,IACtCmM,EAAyBA,2BAAC,GAC1BlJ,KACAiJ,KACA3H,gBAAc,iCAAkC,CAAA,IAR1CvE,GAAQkN,IAAgB,EAShC,EAkBMqB,GAA8B,WAflCjN,IAAW,GAEPC,GAAa2B,UACfC,aAAa5B,GAAa2B,SAC1B3B,GAAa2B,QAAU,MAerBzB,GAAiByB,SACnBC,aAAa1B,GAAiByB,SAIhCzB,GAAiByB,QAAUsL,WAAW,WAdtCjN,GAAa2B,QAAUsL,WAAW,WAChClN,IAAW,EACZ,EAAE,IAcF,EAAE,IACL,EAEM4L,GAAkB,SAACuB,QAAA,IAAAA,IAAAA,GAAmB,GACpC,IAAA5K,EAAoChD,EAAKA,MAACC,WAAWpB,YAAnDqN,EAAiBlJ,EAAAkJ,kBAAEjN,EAAI+D,EAAA/D,KAAEkG,SAOjC,GALArE,GAAqCuB,SAAU,EAC/Cf,GAAMe,QAAQmF,cAAc0E,GAC5BrO,EAASgB,YAAY6D,OAAO,CAAEvD,QAAQ,IACtCmM,4BAAmC,cAATrM,GAEtB2O,EAAc,CAER,IAAAd,EAAW9M,EAAKA,MAACC,WAAW8M,UAASD,OAC3BE,EAAiBhN,EAAKA,MAACC,WAAW/B,YAAWmL,SACvDA,EAAarJ,EAAKA,MAACC,WAAWC,YAAWmJ,SAEjDyD,EAAOG,KAAK,UAAW,CACrB1H,QAAS,oBACT2H,OAAQ/H,EACRmE,SAAU0D,EACV5D,SAAUC,GAEb,CAED3F,gBAAc,oCAAqC,CAAA,GACnD2H,IACF,EACAxH,EAAgBA,iBAAC,iCAAkC,WACjDwI,IACF,GAEA,IAOMX,GAA0DtL,EAAAA,UAAS,GAAlEyN,GAAwBnC,GAAA,GAAEoC,GAA2BpC,GAAA,GAEtDqC,GAAwB,WAAA,OAAAC,EAAAA,eAAA,OAAA,OAAA,EAAA,wEACxB,OAAAxM,cAAA,EAAAA,GAAmB8B,QAAS,EACC,CAAA,EAAA2K,EAAqBA,yBADrB,CAAA,EAAA,UAE/B,OADyBjL,EAA6BkL,QAEpDJ,IAA4B,GAC5B,CAAA,GAAO,KAEPA,IAA4B,GAC5B,CAAA,GAAO,WAIT,OADAA,IAA4B,GAC5B,CAAA,GAAO,0BAIX,OACEK,EAAA,QAAAC,cAAAD,EAAAA,QAAAE,SAAA,KACG5O,GACC0O,EAAAA,QAAAC,cAAA,MAAA,CACEE,IAAKvN,GACLwN,YAAa,WAAM,OAAAb,IAA6B,EAChDc,UAAWnO,GAAe,cAAgB,6BAE1C8N,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAW,6DAEdL,UAAAC,cAAA,QAAA,CACEK,UAAQ,EACRtQ,OAAO,EACPmQ,IAAKpN,GACLsN,UAAW,sCACTE,OAACxP,GAAyC,aAApBF,EAA+C,GAAd,eAI3DmP,UAAAC,cAAA,QAAA,CACEK,UAAQ,EACRtQ,OAAO,EACPmQ,IAAKrN,GACLuN,UAAW,sCACTE,OAACxP,GAAyC,cAApBF,EAAgD,GAAd,eAI5DmP,EACE,QAAAC,cAAA,QAAA,CAAAK,UACA,EAAAtQ,OAAO,EACPmQ,IAAKlN,GACLoN,UAAW,yBACTtP,GAAqBV,EAA6B,YAAc,MAIpE2P,EAAAA,QAAAC,cAAA,MAAA,CACEI,UAAW,0FACTE,OAAAxP,IAAsBV,EAA6B,YAAc,KAGnE2P,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,gHACbL,UAAMC,cAAA,OAAA,CAAAI,UAAU,qDACbG,EAAWA,YAACjQ,MAKnByP,EACE,QAAAC,cAAA,QAAA,CAAAjQ,OAAO,EACPsQ,YACAH,IAAKnN,GACLqN,UAAW,gFACRjQ,EAAoC,GAAd,eAI3B4P,EAAAA,QAAAC,cAAA,MAAA,CACEI,UAAW,8IACTE,OAAAnQ,IAAwBE,EAAqB,YAAc,KAG7D0P,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,gHACbL,EAAAA,QAAAC,cAAA,OAAA,CAAMI,UAAU,sDACbG,EAAWA,YAAC5O,GAAS6O,MAAQ,QAKpCT,EACE,QAAAC,cAAA,QAAA,CAAAjQ,OAAO,EACPsQ,UACA,EAAAH,IAAKjN,GACLmN,UAAW,0EAAAE,QACRxP,GAAqBV,EAA6B,YAAc,MAIrE2P,EAAAA,QACEC,cAAA,MAAA,CAAAI,UAAW,+IAAAE,OACRxP,GAAsBV,GAA+BC,EAElD,GADA,cAIN0P,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,gHACbL,UAAMC,cAAA,OAAA,CAAAI,UAAU,sDACbG,cAAYjQ,OAMrByP,EAAAA,QAAAC,cAAA,MAAA,CACEI,UAAW,GAAAE,QACRlO,IAAa,sCACyG,4HAEzH2N,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,gEAEXjP,gBAAAA,GAAqBsP,WACrBV,wBAACW,EAAMA,OAAA,CACLC,QAAQ,UACR5P,SAAQhB,EACR6Q,QAAS,WAAM,OAAC7Q,EAAQ8Q,EAAAA,oBAAsBC,EAAeA,iBAA9C,EACC,kBAAA,eACM,uBAAQ,UAAR/Q,EAAWgR,EAACA,EAAC,kBAAyBA,IAAE,kBAE7DhR,EACCgQ,EAAA,QAAAC,cAACgB,EAAeA,gBAAA,CAACZ,UAAU,gBAAgBa,KAAMC,EAAiBA,oBAElEnB,EAAA,QAAAC,cAACgB,EAAeA,gBAAC,CAAAZ,UAAU,gBAAgBa,KAAME,EAAAA,iBAMtD/N,cAAiB,EAAjBA,GAAmB8B,QAAS,GAC3B6K,EAAA,QAAAC,cAACU,EAAMA,OACL,CAAAC,QAAQ,UACRC,QAAS,WAAM,OA7mBXhB,EAAAA,eAAA,OAAA,OAAA,EAAA,wEACK,MAAM,CAAA,EAAAD,oBAAN/K,EAA6BkL,SAE9C3P,EACFmL,KAEAnH,cAumByB,EACC,kBAAA,uBACM,uBAAA,GAAAmM,OACnBb,GAEGtP,EACA4Q,EAAAA,EAAE,0BACFA,EAAAA,EAAE,yBAHFA,EAACA,EAAC,qCAAuC,IAK/CK,UAAW3B,GACXW,UAAW,GAAAE,OAAIb,GAA8C,GAAnB,mBAE1CM,EAAAA,QAAAC,cAACgB,kBACC,CAAAZ,UAAU,gBACVa,KAAM9Q,EAAsBkR,EAAAA,aAAeC,EAAOA,WAMA,WAAvDpO,GAAMe,QAAQsN,cAAcC,eAAeC,UAEtC,QADJrJ,EAAkE,QAAlExB,EAAmD,kBAAnDL,EAAmB,QAAnB3B,EAAAjD,gBAAAA,GAAU+P,eAAS,IAAA9M,OAAA,EAAAA,EAAA+M,wCAAmBC,qBAAa,IAAA/K,OAAA,EAAAA,EAAEgL,mBAAa,IAAAjL,OAAA,EAAAA,EAAAkL,sBAC9D,IAAA1J,OAAA,EAAAA,EAAA2J,SACHjR,GACCiP,EAAC,QAAAC,cAAAU,EAAAA,OACC,CAAAC,QAAQ,UACRC,QAAS,WAAM,OAAAvM,IAAA,EACC,kBAAA,6BACM,uBAAA0M,IAAE,yBAA2B,IAEnDhB,UAACC,cAAAgB,EAAAA,gBAAgB,CAAAZ,UAAU,gBAAgBa,KAAMe,eAKtDlR,GAAyC,cAApBF,GACpBmP,EAAA,QAAAC,cAACU,SAAM,CACLC,QAAQ,UACRC,QAAS,WAAM,OAAA3C,MACC,kBAAA,4BACM,uBAAA8C,IAAE,yBAExBhB,UAACC,cAAAgB,EAAAA,gBAAgB,CAAAZ,UAAU,gBAAgBa,KAAMgB,oBAKpDnR,GAAyC,aAApBF,GACpBmP,EAAAA,QAACC,cAAAU,SACC,CAAAC,QAAQ,UACRC,QAAS,WAAM,OAAArL,wBACC,4BAA2B,uBAEzCtD,GAAe8O,EAACA,EAAC,2BAA6BA,IAAE,6BAGlDhB,EAAAA,QAAAC,cAACgB,kBACC,CAAAZ,UAAU,gBACVa,KAAMhP,GAAeiQ,EAAAA,WAAaC,EAAQA,aAMuB,QAAtE5J,EAA2D,QAA3DC,EAA8C,QAA9CH,EAAoC,QAApCC,EAAiB,QAAjBH,EAAAxG,cAAQ,EAARA,GAAU+P,eAAO,IAAAvJ,OAAA,EAAAA,EAAEwJ,yBAAiB,IAAArJ,OAAA,EAAAA,EAAE8J,gBAAQ,IAAA/J,OAAA,EAAAA,EAAEwJ,mBAAW,IAAArJ,OAAA,EAAAA,EAAE6J,iBAAS,IAAA9J,OAAA,EAAAA,EAAEwJ,QACvEhC,EAAA,QAAAC,cAACU,EAAAA,OAAM,CACLC,QAAQ,UACRC,QAAS,WAAM,OAAA0B,EAAiBA,kBAACrS,EAAY,EAAA,kBAC7B,4BAA2B,uBAEzCA,EAAc8Q,EAAAA,EAAE,0BAA4BA,EAAAA,EAAE,mBAGhDhB,EAAAA,QAAAC,cAACgB,kBACC,CAAAZ,UAAU,gBACVa,KAAMhR,EAAcsS,EAAAA,OAASC,EAAQA,eAMxCrR,cAAmB,EAAnBA,GAAqBsR,aAAatR,cAAA,EAAAA,GAAqBsP,YACxDV,UAACC,cAAAU,EAAAA,OACC,CAAAC,QAAQ,UACRC,QAAS,WAAM,OAAC1Q,EAASwS,wBArOvCC,EAAAA,wBACI/Q,QAAMC,WAAWpB,YAAYM,QAC/BkN,MAmOwE,EAC5C,kBAAA,2BACM,uBAAA/N,EAAS6Q,EAACA,EAAC,gBAAkBA,IAAE,kBAErDhB,EAAAA,QAACC,cAAAgB,mBAAgBZ,UAAU,gBAAgBa,KAAM/Q,EAAS0S,EAAMA,OAAGC,cAIzE9C,EAAA,QAAAC,cAAC8C,EAAM,QAAC,CAAAC,eAAe,aAGzBhD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,0BAA0BsN,MAAM,WAC5ElD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,uBAAuBsN,MAAM,WACzElD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,4BAA4BsN,MAAM,WAC9ElD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,6BAA6BsN,MAAM,WAC/ElD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,4BAA4BsN,MAAM,WAC9ElD,UAAAC,cAACgD,EAAmBA,oBAAA,CAAC5C,UAAU,UAAUzK,GAAG,4BAA4BsN,MAAM,WAC9ElD,EAAAA,QAAAC,cAACgD,sBAAoB,CAAA5C,UAAU,UAAUzK,GAAG,2BAA2BsN,MAAM,YAI/ElD,EAAAA,QAAAC,cAAAD,UAAAE,SAAA,KACEF,EAAAA,QAAKC,cAAA,MAAA,CAAAI,UAAU,8CACbL,UAAAC,cAACkD,EAAM,QAAG,MACVnD,EAAA,QAAAC,cAACmD,UAAM,CAAAnT,UAAWA,EAAWoT,kBAAmB,KAC9C/R,IAAUK,KAAsB2R,EAAUA,cAC1CtD,EAAAA,QAAAC,cAACsD,YACC,CAAAC,YAAa7R,GACbxB,OAAQA,EACRsT,KAAMnS,GAAS,QAAU,YAQzC"}
|