diff --git a/src/app/components/CallEmbedProvider.tsx b/src/app/components/CallEmbedProvider.tsx index cfef9b71a..ed86aa421 100644 --- a/src/app/components/CallEmbedProvider.tsx +++ b/src/app/components/CallEmbedProvider.tsx @@ -19,6 +19,7 @@ import { import { EventTimelineSetHandlerMap, EventType, + JoinRule, RelationType, Room, RoomEvent, @@ -323,6 +324,19 @@ function IncomingCallListener({ callEmbed, joined }: IncomingCallListenerProps) ); if (!hasCallPermission) return; + // Only ring for DMs or private non-space group chats. + // Space voice channels and public rooms fire room-level RTC notifications + // whenever anyone joins — ringing every member is incorrect behaviour. + const isDirect = directs.has(room.roomId); + const isSpaceChild = !!getStateEvent(room, StateEvent.SpaceParent); + const joinRule = room.getJoinRule(); + const isPrivateGroup = + !isSpaceChild && + (joinRule === JoinRule.Invite || + joinRule === JoinRule.Knock || + joinRule === JoinRule.Restricted); + if (!isDirect && !isPrivateGroup) return; + const info: IncomingCallInfo = { room, sender, @@ -338,7 +352,7 @@ function IncomingCallListener({ callEmbed, joined }: IncomingCallListenerProps) setCallInfo(info); }, - [mx], + [mx, directs], ); useEffect(() => {