diff --git a/assets/js/main.js b/assets/js/main.js index 6fc6ca7..ff06f46 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -126,6 +126,17 @@ document.addEventListener('DOMContentLoaded', () => { console.warn('AudioContext init failed', e); } }; + // Global listener to unlock audio on first interaction (helpful for TV boxes) + const unlockAudio = (e) => { + if (e && e.type === 'keydown' && e.key !== 'Enter' && e.key !== ' ') return; + if (window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false') { + initAudio(); + } + document.removeEventListener('click', unlockAudio); + document.removeEventListener('keydown', unlockAudio); + }; + document.addEventListener('click', unlockAudio); + document.addEventListener('keydown', unlockAudio); let availableVoices = []; if ('speechSynthesis' in window) { @@ -139,7 +150,7 @@ document.addEventListener('DOMContentLoaded', () => { const audioBtn = document.querySelector('.js-audio-toggle'); if (audioBtn) { const updateAudioBtnState = () => { - const isEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') === 'true'; + const isEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false'; const icon = audioBtn.querySelector('i'); if (icon) { icon.className = isEnabled ? 'bi bi-megaphone-fill' : 'bi bi-megaphone'; @@ -155,7 +166,7 @@ document.addEventListener('DOMContentLoaded', () => { updateAudioBtnState(); audioBtn.addEventListener('click', () => { - const isEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') === 'true'; + const isEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false'; const nextState = !isEnabled; window.localStorage.setItem('hospitalQueue:audioEnabled', nextState.toString()); updateAudioBtnState(); @@ -199,7 +210,7 @@ document.addEventListener('DOMContentLoaded', () => { const checkAnnouncements = () => { const cards = Array.from(document.querySelectorAll('.announcement-card')); const latest = cards[0]; - const audioEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') === 'true'; + const audioEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false'; if (latest) { const announcementKey = latest.dataset.announcementKey || ''; diff --git a/display.php b/display.php index 017c0f4..501849b 100644 --- a/display.php +++ b/display.php @@ -168,15 +168,62 @@ qh_page_start( } }, { once: true }); - if (window.localStorage.getItem('hospitalQueue:audioEnabled') === 'true') { + if (window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false') { player.muted = false; } - player.play().catch(function(e) { + player.play().catch(function(e) { console.error("Error playing video:", e); if (!player.muted) { player.muted = true; - player.play().catch(e => console.error("Fallback play failed:", e)); + player.play().catch(err => console.error("Fallback play failed:", err)); + } + + if (!window.audioPromptShown && window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false') { + window.audioPromptShown = true; + const prompt = document.createElement('div'); + prompt.style.position = 'fixed'; + prompt.style.bottom = '20px'; + prompt.style.left = '50%'; + prompt.style.transform = 'translateX(-50%)'; + prompt.style.zIndex = '9999'; + prompt.style.backgroundColor = '#dc3545'; // danger red + prompt.style.color = 'white'; + prompt.style.padding = '15px 30px'; + prompt.style.borderRadius = '50px'; + prompt.style.cursor = 'pointer'; + prompt.style.display = 'flex'; + prompt.style.alignItems = 'center'; + prompt.style.gap = '15px'; + prompt.style.boxShadow = '0 10px 25px rgba(0,0,0,0.5)'; + + const msg = "= qh_h(qh_t('Sound blocked by TV/Browser. Click here or press OK on remote to enable.', 'تم حظر الصوت بواسطة المتصفح/التلفاز. انقر هنا أو اضغط OK في الريموت للتفعيل.')) ?>"; + prompt.innerHTML = ' ' + msg + ''; + + const enableSound = function(ev) { + if (ev && ev.type === 'keydown' && ev.key !== 'Enter' && ev.key !== ' ') return; + + player.muted = false; + player.play().catch(e => console.warn("Still cannot play:", e)); + if (document.body.contains(prompt)) { + document.body.removeChild(prompt); + } + + if (ev && ev.type === 'keydown') { + document.body.click(); + } + }; + + prompt.addEventListener('click', enableSound); + document.body.appendChild(prompt); + document.addEventListener('keydown', enableSound); + + // Also listen for any click anywhere to dismiss it + document.addEventListener('click', function(ev2) { + if (document.body.contains(prompt) && ev2.target !== prompt && !prompt.contains(ev2.target)) { + enableSound(ev2); + } + }, { once: true }); } }); diff --git a/patch_display.php b/patch_display.php deleted file mode 100644 index eafed60..0000000 --- a/patch_display.php +++ /dev/null @@ -1,36 +0,0 @@ - -