diff --git a/apps/web/src/components/vision/DockedVisionFeed.tsx b/apps/web/src/components/vision/DockedVisionFeed.tsx index 47651407..81473627 100644 --- a/apps/web/src/components/vision/DockedVisionFeed.tsx +++ b/apps/web/src/components/vision/DockedVisionFeed.tsx @@ -272,10 +272,12 @@ export function DockedVisionFeed({ onValueDetected, columnCount = 5 }: DockedVis }, [videoStream]) // Register vision source for training data capture + // Note: We depend on remoteLatestFrame because the element only renders when we have a frame, + // so remoteImageRef.current is null until the first frame arrives useEffect(() => { if (isLocalCamera && videoRef.current && videoStream) { visionSourceRef.current = { type: 'video', element: videoRef.current } - } else if (isRemoteCamera && remoteImageRef.current && remoteIsPhoneConnected) { + } else if (isRemoteCamera && remoteImageRef.current && remoteIsPhoneConnected && remoteLatestFrame) { visionSourceRef.current = { type: 'image', element: remoteImageRef.current } } @@ -283,7 +285,7 @@ export function DockedVisionFeed({ onValueDetected, columnCount = 5 }: DockedVis // Clear the source ref when this component unmounts visionSourceRef.current = null } - }, [isLocalCamera, isRemoteCamera, videoStream, remoteIsPhoneConnected, visionSourceRef]) + }, [isLocalCamera, isRemoteCamera, videoStream, remoteIsPhoneConnected, remoteLatestFrame, visionSourceRef]) // Subscribe to remote camera session useEffect(() => {