From 8e1428568d20a4505b294c8ca0f33f682a225306 Mon Sep 17 00:00:00 2001 From: GulshanJha00 Date: Wed, 25 Feb 2026 15:20:51 +0530 Subject: [PATCH 1/3] feat: add audio notification with mute toggle on peer join --- client/app.ts | 30 ++++++++++++++++++++++++++++++ client/index.html | 2 ++ client/sound/beep.mp3 | Bin 0 -> 22182 bytes 3 files changed, 32 insertions(+) create mode 100644 client/sound/beep.mp3 diff --git a/client/app.ts b/client/app.ts index 92b1176..6dcb279 100644 --- a/client/app.ts +++ b/client/app.ts @@ -5,6 +5,19 @@ let chat: any = null; let userId: string = ''; let channelHash: string = ''; let privateKey: string = ''; +let joinAudio: HTMLAudioElement | null = null; +let isMuted: boolean = false; +isMuted = localStorage.getItem('mute') === 'true'; + +const toggleSoundBtn = document.getElementById('toggle-sound-btn') as HTMLButtonElement; + +toggleSoundBtn.textContent = isMuted ? '🔕' : '🔔'; + +toggleSoundBtn.addEventListener('click', () => { + isMuted = !isMuted; + localStorage.setItem('mute', String(isMuted)); + toggleSoundBtn.textContent = isMuted ? '🔕' : '🔔'; +}); // DOM Elements // DOM Elements @@ -41,12 +54,28 @@ const callStatusText = document.getElementById('call-status')!; const endCallBtn = document.getElementById('end-call-btn') as HTMLButtonElement; const callDuration = document.getElementById('call-duration')!; + +function playJoinBeep() { + if (!joinAudio || isMuted) return; + + try { + joinAudio.currentTime = 0; + joinAudio.play().catch(() => { + + }); + } catch (err) { + console.error('Audio play error:', err); + } +} + // Initialize Chat async function initChat() { try { setupStatus.textContent = 'Initializing secure keys...'; chat = createChatInstance(); await chat.init(); + joinAudio = new Audio('/sound/beep.mp3'); + joinAudio.volume = 0.7; const keys = chat.getKeyPair(); privateKey = keys.privateKey; @@ -183,6 +212,7 @@ function setupChatListeners() { chat.on('on-alice-join', () => { chatHeader.classList.add('active'); participantInfo.textContent = 'Peer joined. Communication is encrypted.'; + playJoinBeep(); }); chat.on('on-alice-disconnect', () => { diff --git a/client/index.html b/client/index.html index 191ff71..6b9c148 100644 --- a/client/index.html +++ b/client/index.html @@ -88,6 +88,8 @@

Secure Channel

+ + diff --git a/client/sound/beep.mp3 b/client/sound/beep.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d9ce271f70063379e91dbc2122ea51b29edae613 GIT binary patch literal 22182 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 literal 0 HcmV?d00001 From 1ab5d757089aca8185f1c3f9df004e58369c220f Mon Sep 17 00:00:00 2001 From: GulshanJha00 Date: Wed, 25 Feb 2026 15:27:31 +0530 Subject: [PATCH 2/3] fix: address sonar quality issues --- client/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/app.ts b/client/app.ts index 6dcb279..e8306c1 100644 --- a/client/app.ts +++ b/client/app.ts @@ -61,7 +61,7 @@ function playJoinBeep() { try { joinAudio.currentTime = 0; joinAudio.play().catch(() => { - + console.warn('Audio playback prevented:'); }); } catch (err) { console.error('Audio play error:', err); From 85b390e984d80149be4a2283b691bac73be0a1dd Mon Sep 17 00:00:00 2001 From: GulshanJha00 Date: Wed, 25 Feb 2026 15:51:43 +0530 Subject: [PATCH 3/3] fix: improve reliability and handle storage safely --- client/app.ts | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/client/app.ts b/client/app.ts index e8306c1..f90bb2b 100644 --- a/client/app.ts +++ b/client/app.ts @@ -6,18 +6,33 @@ let userId: string = ''; let channelHash: string = ''; let privateKey: string = ''; let joinAudio: HTMLAudioElement | null = null; + let isMuted: boolean = false; -isMuted = localStorage.getItem('mute') === 'true'; -const toggleSoundBtn = document.getElementById('toggle-sound-btn') as HTMLButtonElement; +try { + isMuted = localStorage.getItem('mute') === 'true'; +} catch { + isMuted = false; +} -toggleSoundBtn.textContent = isMuted ? '🔕' : '🔔'; +const toggleSoundBtn = document.getElementById('toggle-sound-btn'); -toggleSoundBtn.addEventListener('click', () => { - isMuted = !isMuted; - localStorage.setItem('mute', String(isMuted)); +if (toggleSoundBtn instanceof HTMLButtonElement) { toggleSoundBtn.textContent = isMuted ? '🔕' : '🔔'; -}); + + toggleSoundBtn.addEventListener('click', () => { + isMuted = !isMuted; + + try { + localStorage.setItem('mute', String(isMuted)); + } catch (err) { + console.warn('Unable to persist mute preference', err); + } + + toggleSoundBtn.textContent = isMuted ? '🔕' : '🔔'; + }); +} + // DOM Elements // DOM Elements @@ -60,8 +75,8 @@ function playJoinBeep() { try { joinAudio.currentTime = 0; - joinAudio.play().catch(() => { - console.warn('Audio playback prevented:'); + joinAudio.play().catch((err) => { + console.warn('Audio playback prevented:',err); }); } catch (err) { console.error('Audio play error:', err); @@ -75,7 +90,7 @@ async function initChat() { chat = createChatInstance(); await chat.init(); joinAudio = new Audio('/sound/beep.mp3'); - joinAudio.volume = 0.7; + joinAudio.volume = 0.5; const keys = chat.getKeyPair(); privateKey = keys.privateKey;