From 6fa63854c25792d0e10536b32930a2ebb43cdec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D0=B8=D0=BC=D0=BE=D0=B2=20=D0=A0=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BC?= Date: Wed, 11 Mar 2026 01:48:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=B8=D0=B4=D0=B5=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/components/CallModal.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/CallModal.tsx b/apps/web/src/components/CallModal.tsx index cdf0fc5..338bc3b 100644 --- a/apps/web/src/components/CallModal.tsx +++ b/apps/web/src/components/CallModal.tsx @@ -237,9 +237,16 @@ export default function CallModal({ isOpen, onClose, targetUser, callType: initi // Helper to update video UI state const checkVideo = () => { + const stream = remoteStreamRef.current; + if (!stream) { + setHasRemoteVideo(false); + return; + } const videoTracks = stream.getVideoTracks(); + // Be more lenient: if track is 'live', trust it even if it reports 'muted' initially. + // Some browsers report muted while the buffer is filling. const hasVideo = videoTracks.length > 0 && videoTracks.some( - t => t.readyState === 'live' && t.enabled && !t.muted + t => t.readyState === 'live' && t.enabled ); console.log('[checkVideo] remote videoTracks:', videoTracks.map(t => @@ -1308,6 +1315,16 @@ export default function CallModal({ isOpen, onClose, targetUser, callType: initi if (data.from !== targetUserIdRef.current) return; console.log('[onCallTypeChanged] New call type:', data.callType); setCallType(data.callType); + + // If remote switched to video, nudge the video element + if (data.callType === 'video') { + setTimeout(() => { + if (remoteVideoRef.current && remoteStreamRef.current) { + remoteVideoRef.current.srcObject = remoteStreamRef.current; + remoteVideoRef.current.play().catch(() => {}); + } + }, 500); + } }; socket.on('call_answered', onCallAnswered);