From 00e197b216633e77397e7389ae1765e1636be09d Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Sun, 14 Jun 2026 00:33:51 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8(frontend)=20mute=20join=20notifica?= =?UTF-8?q?tion=20sound=20in=20larger=20rooms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In particularly large rooms, with more than 5 or 10 participants, the entry notification sound can quickly feel spammy. A configuration to disable it exists, but new users do not discover it easily. The sound notification is most useful while waiting for the first few participants to arrive; once a few people are in, the meeting usually starts and the sound becomes more disruptive than helpful. The visual notification remains in place, so users are still aware when newcomers join. Roll this out and check whether users find the change helpful. --- CHANGELOG.md | 1 + src/backend/meet/settings.py | 3 +++ src/frontend/src/api/useConfig.ts | 1 + .../notifications/MainNotificationToast.tsx | 15 +++++++++++++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8d6abbf..2dd5a500 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to ### Changed - ✨(frontend) enhance noise reduction with BBBA audio processing pipeline +- 🚸(frontend) mute join notification sound in larger rooms ## [1.20.0] - 2026-06-12 diff --git a/src/backend/meet/settings.py b/src/backend/meet/settings.py index 4f7d696a..9fa2c1a0 100755 --- a/src/backend/meet/settings.py +++ b/src/backend/meet/settings.py @@ -411,6 +411,9 @@ class Base(Configuration): "transcription_destination": values.Value( None, environ_name="FRONTEND_TRANSCRIPTION_DESTINATION", environ_prefix=None ), + "max_participants_for_sound": values.PositiveIntegerValue( + 5, environ_name="FRONTEND_MAX_PARTICIPANTS_FOR_SOUND", environ_prefix=None + ) } # Mail diff --git a/src/frontend/src/api/useConfig.ts b/src/frontend/src/api/useConfig.ts index e7c84e67..1265b59e 100644 --- a/src/frontend/src/api/useConfig.ts +++ b/src/frontend/src/api/useConfig.ts @@ -55,6 +55,7 @@ export interface ApiConfig { default_sources: Source[] } transcription_destination?: string + max_participants_for_sound: number } const fetchConfig = (): Promise => { diff --git a/src/frontend/src/features/notifications/MainNotificationToast.tsx b/src/frontend/src/features/notifications/MainNotificationToast.tsx index 096d70d8..b912de64 100644 --- a/src/frontend/src/features/notifications/MainNotificationToast.tsx +++ b/src/frontend/src/features/notifications/MainNotificationToast.tsx @@ -14,9 +14,11 @@ import { useScreenReaderAnnounce } from '@/hooks/useScreenReaderAnnounce' import { Emoji } from '@/features/reactions/types' import { useReactions } from '@/features/reactions/hooks/useReactions' import { NotificationProvider } from './NotificationProvider' +import { useConfig } from '@/api/useConfig' export const MainNotificationToast = () => { const room = useRoomContext() + const { data } = useConfig() const { triggerNotificationSound } = useNotificationSound() const { t } = useTranslation('notifications') const announce = useScreenReaderAnnounce() @@ -135,12 +137,21 @@ export const MainNotificationToast = () => { } }, [room, handleEmoji]) + const triggerNotificationSoundIfRoomIsSmall = useCallback( + (type: NotificationType) => { + if (!data) return + if (room.numParticipants >= data.max_participants_for_sound) return + triggerNotificationSound(type) + }, + [room, data, triggerNotificationSound] + ) + useEffect(() => { const showJoinNotification = (participant: Participant) => { if (isMobileBrowser()) { return } - triggerNotificationSound(NotificationType.ParticipantJoined) + triggerNotificationSoundIfRoomIsSmall(NotificationType.ParticipantJoined) toastQueue.add( { participant, @@ -155,7 +166,7 @@ export const MainNotificationToast = () => { return () => { room.off(RoomEvent.ParticipantConnected, showJoinNotification) } - }, [room, triggerNotificationSound]) + }, [room, triggerNotificationSoundIfRoomIsSmall]) useEffect(() => { const removeParticipantNotifications = (participant: Participant) => {