diff --git a/web/plugin.head.html b/web/plugin.head.html index 9464eb0..b79fb7e 100644 --- a/web/plugin.head.html +++ b/web/plugin.head.html @@ -723,6 +723,10 @@ display: none !important; } + .politictalk-hidden-local-leave-toast { + display: none !important; + } + .politictalk-hidden-video-screen-control { display: none !important; } @@ -1726,6 +1730,147 @@ }); } + function markPoliticTalkLocalMeetingExit() { + window.politicTalkLocalMeetingExitStartedAt = Date.now(); + suppressPoliticTalkLocalLeaveToasts(); + } + + function isPoliticTalkLocalMeetingExitActive() { + var startedAt = Number(window.politicTalkLocalMeetingExitStartedAt || 0); + + if (startedAt && Date.now() - startedAt < 12000) { + return true; + } + + return document.body + && normalizePoliticTalkText(document.body.textContent).indexOf('thank you for using politictalk') !== -1; + } + + function isPoliticTalkMeetingExitControl(element) { + var control = element; + + while (control && control !== document.body) { + if (control.matches && control.matches('button, [role="button"], a')) { + var text = normalizePoliticTalkText([ + control.getAttribute('aria-label'), + control.getAttribute('title'), + control.textContent + ].join(' ')); + + return text.indexOf('hang up') !== -1 + || text.indexOf('hangup') !== -1 + || text.indexOf('leave meeting') !== -1 + || text.indexOf('leave conference') !== -1 + || text.indexOf('end meeting') !== -1 + || text.indexOf('end conference') !== -1; + } + + control = control.parentElement; + } + + return false; + } + + function handlePoliticTalkMeetingExitPointer(event) { + if (!event || !event.target || !isPoliticTalkMeetingExitControl(event.target)) { + return; + } + + markPoliticTalkLocalMeetingExit(); + } + + function isPoliticTalkLeftMeetingToast(element) { + if (!element) { + return false; + } + + var text = normalizePoliticTalkText(element.textContent); + + if (text.indexOf('thank you for using politictalk') !== -1) { + return false; + } + + return text.indexOf('left the meeting') !== -1 + || text.indexOf('left the conference') !== -1; + } + + function getPoliticTalkLocalLeaveToastRoot(element) { + var root = element; + var current = element; + + while (current && current.parentElement && current.parentElement !== document.body) { + var parent = current.parentElement; + var parentText = normalizePoliticTalkText(parent.textContent); + + if (!isPoliticTalkLeftMeetingToast(parent)) { + break; + } + + if (parentText.indexOf('thank you for using politictalk') !== -1) { + break; + } + + var rect = parent.getBoundingClientRect(); + + if (rect.width > 720 || rect.height > 180) { + break; + } + + root = parent; + current = parent; + } + + return root; + } + + function suppressPoliticTalkLocalLeaveToasts() { + if (!isPoliticTalkLocalMeetingExitActive() || !document.body) { + return; + } + + document.querySelectorAll('div, [role="alert"], [class*="notification"], [class*="Notification"]') + .forEach(function(candidate) { + if (!isPoliticTalkLeftMeetingToast(candidate)) { + return; + } + + var toast = getPoliticTalkLocalLeaveToastRoot(candidate); + + toast.classList.add('politictalk-hidden-local-leave-toast'); + toast.setAttribute('aria-hidden', 'true'); + toast.setAttribute('tabindex', '-1'); + }); + } + + function mountPoliticTalkLocalLeaveNotificationPolicy() { + suppressPoliticTalkLocalLeaveToasts(); + + if (!window.politicTalkLocalLeaveListenersMounted) { + window.politicTalkLocalLeaveListenersMounted = true; + document.addEventListener('click', handlePoliticTalkMeetingExitPointer, true); + document.addEventListener('touchend', handlePoliticTalkMeetingExitPointer, true); + document.addEventListener('pointerup', handlePoliticTalkMeetingExitPointer, true); + } + + if (window.politicTalkLocalLeaveNotificationObserver || !document.body) { + return; + } + + window.politicTalkLocalLeaveNotificationObserver = new MutationObserver(function() { + window.cancelAnimationFrame(window.politicTalkLocalLeaveNotificationFrame); + window.politicTalkLocalLeaveNotificationFrame = window.requestAnimationFrame( + suppressPoliticTalkLocalLeaveToasts + ); + }); + window.politicTalkLocalLeaveNotificationObserver.observe(document.body, { + attributes: true, + attributeFilter: [ 'aria-label', 'class', 'role', 'style', 'title' ], + childList: true, + characterData: true, + subtree: true + }); + } + function normalizePoliticTalkText(value) { return String(value || '').replace(/\s+/g, ' ').trim().toLowerCase(); } @@ -3107,6 +3252,7 @@ mountPoliticTalkRoleMetadataSync(); mountPoliticTalkTileTheme(); mountPoliticTalkModerationNotificationPolicy(); + mountPoliticTalkLocalLeaveNotificationPolicy(); mountPoliticTalkAudioOnlyUiPolicy(); mountPoliticTalkRoomChatOnlyPolicy(); }); @@ -3120,6 +3266,7 @@ mountPoliticTalkRoleMetadataSync(); mountPoliticTalkTileTheme(); mountPoliticTalkModerationNotificationPolicy(); + mountPoliticTalkLocalLeaveNotificationPolicy(); mountPoliticTalkAudioOnlyUiPolicy(); mountPoliticTalkRoomChatOnlyPolicy(); }