From d2f56817b3e134779b9e6616bddbfc2ec7aef9ab Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sat, 19 Sep 2026 17:26:31 -0400 Subject: [PATCH] feat(calls): say when answering turns the camera on, offer audio-only (#135) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The only join path that skips the prescreen and can start with the camera on is answering a video call with 'Join with Camera On' enabled. The incoming dialog and the in-call banner now say 'Answering turns your camera on', label the primary button 'Answer with camera' and add 'Answer without camera'. Nothing changes for voice calls or when the setting is off. The other no-prescreen paths already can't start on camera: the sidebar join uses a session video pref that is only ever true after the user turned it on themselves, and it is guarded by the same setting. Verified headless: video call + setting on → notice + both buttons, 'Answer without camera' joins with videoEnabled=false; voice call → plain Answer. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA --- src/app/components/CallEmbedProvider.tsx | 49 ++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/app/components/CallEmbedProvider.tsx b/src/app/components/CallEmbedProvider.tsx index 6c8e6520e..49362b1de 100644 --- a/src/app/components/CallEmbedProvider.tsx +++ b/src/app/components/CallEmbedProvider.tsx @@ -117,6 +117,10 @@ function IncomingCall({ dm, info, onIgnore, onAnswer, onReject }: IncomingCallPr const rtcSupported = webRTCSupported(); const canAnswer = livekitSupported && rtcSupported; const { room } = info; + // [Gitea #135] Answer follows cameraOnJoin: say so, and offer the audio-only + // alternative, rather than putting the user on video without warning. + const [cameraOnJoinPref] = useSetting(settingsAtom, 'cameraOnJoin'); + const willAnswerWithCamera = info.intent === 'video' && !!cameraOnJoinPref; const [ringtoneVolume] = useSetting(settingsAtom, 'ringtoneVolume'); const [ringtoneId] = useSetting(settingsAtom, 'ringtoneId'); @@ -222,6 +226,11 @@ function IncomingCall({ dm, info, onIgnore, onAnswer, onReject }: IncomingCallPr )} + {willAnswerWithCamera && ( + + Answering turns your camera on. + + )} + {willAnswerWithCamera && ( + + )} + {bannerCameraOn && ( + + )}