diff --git a/assets/js/main.js b/assets/js/main.js index 4841737..f26da9c 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -226,11 +226,51 @@ document.addEventListener('DOMContentLoaded', () => { const announcementQueue = []; const queuedAnnouncementKeys = new Set(); + const announcedStorageKey = 'hospitalQueue:announcedKeys'; + const maxRememberedAnnouncementKeys = 200; let announcementPlaying = false; let activeAnnouncementAudio = null; let activeSpeechUtterance = null; let audioLoadTimeoutId = null; let activeAnnouncementKey = ''; + let rememberedAnnouncementKeys = []; + let rememberedAnnouncementKeySet = new Set(); + + const loadRememberedAnnouncementKeys = () => { + try { + const raw = window.localStorage.getItem(announcedStorageKey); + const parsed = raw ? JSON.parse(raw) : []; + if (Array.isArray(parsed)) { + rememberedAnnouncementKeys = parsed.filter((key) => typeof key === 'string' && key !== '').slice(-maxRememberedAnnouncementKeys); + rememberedAnnouncementKeySet = new Set(rememberedAnnouncementKeys); + } + } catch (e) { + rememberedAnnouncementKeys = []; + rememberedAnnouncementKeySet = new Set(); + } + }; + + const persistRememberedAnnouncementKeys = () => { + try { + window.localStorage.setItem(announcedStorageKey, JSON.stringify(rememberedAnnouncementKeys.slice(-maxRememberedAnnouncementKeys))); + } catch (e) { + console.warn('Failed to persist announcement keys', e); + } + }; + + const rememberAnnouncementKey = (key) => { + if (!key || rememberedAnnouncementKeySet.has(key)) return; + rememberedAnnouncementKeys.push(key); + rememberedAnnouncementKeySet.add(key); + if (rememberedAnnouncementKeys.length > maxRememberedAnnouncementKeys) { + const overflow = rememberedAnnouncementKeys.length - maxRememberedAnnouncementKeys; + const removedKeys = rememberedAnnouncementKeys.splice(0, overflow); + removedKeys.forEach((removedKey) => rememberedAnnouncementKeySet.delete(removedKey)); + } + persistRememberedAnnouncementKeys(); + }; + + loadRememberedAnnouncementKeys(); const syncAnnouncementVisualState = () => { document.querySelectorAll('.announcement-card').forEach((card) => { @@ -273,9 +313,10 @@ document.addEventListener('DOMContentLoaded', () => { if (!card) return; const key = card.dataset.announcementKey || ''; const text = locale === 'ar' ? (card.dataset.announcementAr || '') : (card.dataset.announcementEn || ''); - if (!key || !text || queuedAnnouncementKeys.has(key)) return; + if (!key || !text || queuedAnnouncementKeys.has(key) || rememberedAnnouncementKeySet.has(key)) return; announcementQueue.push({ key, text }); queuedAnnouncementKeys.add(key); + rememberAnnouncementKey(key); syncAnnouncementVisualState(); playNextAnnouncement(); }; @@ -381,38 +422,34 @@ document.addEventListener('DOMContentLoaded', () => { const checkAnnouncements = () => { const cards = Array.from(document.querySelectorAll('.announcement-card')); - const latest = cards[0]; const audioEnabled = window.localStorage.getItem('hospitalQueue:audioEnabled') !== 'false'; - if (!latest) { + if (cards.length === 0) { return; } - const storageKey = `hospitalQueue:lastAnnouncement:${locale}`; - const storedKey = window.localStorage.getItem(storageKey) || ''; - const latestKey = latest.dataset.announcementKey || ''; - if (!latestKey || latestKey === storedKey) { - return; - } - - let newCards = []; - if (!storedKey) { - newCards = [latest]; - } else { - for (const card of cards) { + if (rememberedAnnouncementKeys.length === 0) { + cards.forEach((card) => { const key = card.dataset.announcementKey || ''; - if (!key) continue; - if (key === storedKey) break; - newCards.push(card); - } - newCards.reverse(); + if (key) rememberAnnouncementKey(key); + }); + return; } - window.localStorage.setItem(storageKey, latestKey); + const newCards = cards.filter((card) => { + const key = card.dataset.announcementKey || ''; + return !!key && !rememberedAnnouncementKeySet.has(key) && !queuedAnnouncementKeys.has(key) && key !== activeAnnouncementKey; + }).reverse(); - if (audioEnabled) { - newCards.forEach(queueAnnouncement); + if (!audioEnabled) { + newCards.forEach((card) => { + const key = card.dataset.announcementKey || ''; + if (key) rememberAnnouncementKey(key); + }); + return; } + + newCards.forEach(queueAnnouncement); }; checkAnnouncements();