import { MouseEventHandler, useEffect, useRef, useState } from 'react' import { useStore } from '../useStore' import { getNormalisedCoordinates } from '../lib/utils' import Loading from './Loading' import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext' import { useModelingContext } from 'hooks/useModelingContext' import { useNetworkContext } from 'hooks/useNetworkContext' import { NetworkHealthState } from 'hooks/useNetworkStatus' import { ClientSideScene } from 'clientSideScene/ClientSideSceneComp' import { butName } from 'lib/cameraControls' import { sendSelectEventToEngine } from 'lib/selections' export const Stream = ({ className = '' }: { className?: string }) => { const [isLoading, setIsLoading] = useState(true) const [clickCoords, setClickCoords] = useState<{ x: number; y: number }>() const videoRef = useRef(null) const { mediaStream, setButtonDownInStream, didDragInStream, setDidDragInStream, streamDimensions, } = useStore((s) => ({ mediaStream: s.mediaStream, setButtonDownInStream: s.setButtonDownInStream, didDragInStream: s.didDragInStream, setDidDragInStream: s.setDidDragInStream, streamDimensions: s.streamDimensions, })) const { settings } = useSettingsAuthContext() const { state } = useModelingContext() const { overallState } = useNetworkContext() const isNetworkOkay = overallState === NetworkHealthState.Ok || overallState === NetworkHealthState.Weak useEffect(() => { if ( typeof window === 'undefined' || typeof RTCPeerConnection === 'undefined' ) return if (!videoRef.current) return if (!mediaStream) return videoRef.current.srcObject = mediaStream }, [mediaStream]) const handleMouseDown: MouseEventHandler = (e) => { if (!isNetworkOkay) return if (!videoRef.current) return if (state.matches('Sketch')) return if (state.matches('Sketch no face')) return const { x, y } = getNormalisedCoordinates({ clientX: e.clientX, clientY: e.clientY, el: videoRef.current, ...streamDimensions, }) setButtonDownInStream(e.button) setClickCoords({ x, y }) } const handleMouseUp: MouseEventHandler = (e) => { if (!isNetworkOkay) return if (!videoRef.current) return setButtonDownInStream(undefined) if (state.matches('Sketch')) return if (state.matches('Sketch no face')) return if (!didDragInStream && butName(e).left) { sendSelectEventToEngine(e, videoRef.current, streamDimensions) } setDidDragInStream(false) setClickCoords(undefined) } const handleMouseMove: MouseEventHandler = (e) => { if (!isNetworkOkay) return if (state.matches('Sketch')) return if (state.matches('Sketch no face')) return if (!clickCoords) return const delta = ((clickCoords.x - e.clientX) ** 2 + (clickCoords.y - e.clientY) ** 2) ** 0.5 if (delta > 5 && !didDragInStream) { setDidDragInStream(true) } } return (
e.preventDefault()} onContextMenuCapture={(e) => e.preventDefault()} >
) }