diff --git a/packages/web/src/components/modals/settingsPanels/VideoSection.tsx b/packages/web/src/components/modals/settingsPanels/VideoSection.tsx index 643b6aae..8a7d4bf8 100644 --- a/packages/web/src/components/modals/settingsPanels/VideoSection.tsx +++ b/packages/web/src/components/modals/settingsPanels/VideoSection.tsx @@ -1,5 +1,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; +import { Track } from 'livekit-client'; import { useVoiceStore } from '../../../stores/voiceStore'; +import { getActiveRoom } from '../../../hooks/useLiveKit'; import { isElectron, getElectronAPI } from '../../../platform/platform'; type PermissionState = 'unknown' | 'probing' | 'granted' | 'initial-denied' | 'hard-blocked'; @@ -56,6 +58,7 @@ function buildDisplayLabels(devices: MediaDeviceInfo[]): Map { export function VideoSection() { const cameraDeviceId = useVoiceStore((s) => s.cameraDeviceId); const setCameraDeviceId = useVoiceStore((s) => s.setCameraDeviceId); + const isCameraOn = useVoiceStore((s) => s.isCameraOn); const [permState, setPermState] = useState('unknown'); const [devices, setDevices] = useState([]); @@ -137,19 +140,69 @@ export function VideoSection() { }; }, [permState]); - // Pre-call preview: start a getUserMedia stream for the selected device whenever - // permission is granted. Swap source when cameraDeviceId changes. + // Dual-mode preview: + // - In-call: if a LiveKit local Camera publication exists with a live MediaStreamTrack, + // attach that track to the