mediaStream (#3013)

* mediaStream

* make vitest happy

* fmt
This commit is contained in:
Kurt Hutten
2024-07-12 10:57:27 +10:00
committed by GitHub
parent 9dbe74e008
commit 999f72bccf
5 changed files with 61 additions and 35 deletions

View File

@ -39,3 +39,32 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => {
</AppStateContext.Provider>
)
}
interface AppStream {
mediaStream: MediaStream
setMediaStream: (mediaStream: MediaStream) => void
}
const AppStreamContext = createContext<AppStream>({
mediaStream: undefined as unknown as MediaStream,
setMediaStream: () => {},
})
export const useAppStream = () => useContext(AppStreamContext)
export const AppStreamProvider = ({ children }: { children: ReactNode }) => {
const [mediaStream, setMediaStream] = useState<MediaStream>(
undefined as unknown as MediaStream
)
return (
<AppStreamContext.Provider
value={{
mediaStream,
setMediaStream,
}}
>
{children}
</AppStreamContext.Provider>
)
}

View File

@ -9,6 +9,7 @@ import { ClientSideScene } from 'clientSideScene/ClientSideSceneComp'
import { btnName } from 'lib/cameraControls'
import { sendSelectEventToEngine } from 'lib/selections'
import { kclManager, engineCommandManager, sceneInfra } from 'lib/singletons'
import { useAppStream } from 'AppState'
export const Stream = () => {
const [isLoading, setIsLoading] = useState(true)
@ -17,6 +18,7 @@ export const Stream = () => {
const videoRef = useRef<HTMLVideoElement>(null)
const { settings } = useSettingsAuthContext()
const { state, send, context } = useModelingContext()
const { mediaStream } = useAppStream()
const { overallState } = useNetworkContext()
const [isFreezeFrame, setIsFreezeFrame] = useState(false)
@ -124,12 +126,10 @@ export const Stream = () => {
)
return
if (!videoRef.current) return
const _mediaStream =
context.store?.mediaStream || (window as any).mediaStream
if (!_mediaStream) return
if (!mediaStream) return
// Do not immediately play the stream!
videoRef.current.srcObject = _mediaStream
videoRef.current.srcObject = mediaStream
videoRef.current.pause()
send({
@ -138,7 +138,7 @@ export const Stream = () => {
videoElement: videoRef.current,
},
})
}, [context.store?.mediaStream])
}, [mediaStream])
const handleMouseDown: MouseEventHandler<HTMLDivElement> = (e) => {
if (!isNetworkOkay) return

View File

@ -4,7 +4,7 @@ import { deferExecution } from 'lib/utils'
import { Themes } from 'lib/theme'
import { makeDefaultPlanes, modifyGrid } from 'lang/wasm'
import { useModelingContext } from './useModelingContext'
import { useAppState } from 'AppState'
import { useAppState, useAppStream } from 'AppState'
export function useSetupEngineManager(
streamRef: React.RefObject<HTMLDivElement>,
@ -28,6 +28,7 @@ export function useSetupEngineManager(
}
) {
const { setAppState } = useAppState()
const { setMediaStream } = useAppStream()
const streamWidth = streamRef?.current?.offsetWidth
const streamHeight = streamRef?.current?.offsetHeight
@ -54,13 +55,7 @@ export function useSetupEngineManager(
settings.modelingSend
) {
engineCommandManager.start({
setMediaStream: (mediaStream) => {
settings.modelingSend({
type: 'Set context',
data: { mediaStream },
})
;(window as any).mediaStream = mediaStream
},
setMediaStream: setMediaStream,
setIsStreamReady: (isStreamReady) => setAppState({ isStreamReady }),
width: quadWidth,
height: quadHeight,

View File

@ -13,6 +13,7 @@ import {
UpdaterRestartModal,
createUpdaterRestartModal,
} from 'components/UpdaterRestartModal'
import { AppStreamProvider } from 'AppState'
// uncomment for xstate inspector
// import { DEV } from 'env'
@ -26,6 +27,7 @@ const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement)
root.render(
<HotkeysProvider>
<AppStreamProvider>
<Router />
<Toaster
position="bottom-center"
@ -48,6 +50,7 @@ root.render(
}}
/>
<ModalContainer />
</AppStreamProvider>
</HotkeysProvider>
)

View File

@ -138,7 +138,6 @@ export type SegmentOverlayPayload =
}
interface Store {
mediaStream?: MediaStream
videoElement?: HTMLVideoElement
buttonDownInStream: number | undefined
didDragInStream: boolean