Spaces:
No application file
No application file
// Monitors the gallery and sends a browser notification when the leading image is new. | |
let lastHeadImg = null; | |
let notificationButton = null; | |
onUiUpdate(function() { | |
if (notificationButton == null) { | |
notificationButton = gradioApp().getElementById('request_notifications'); | |
if (notificationButton != null) { | |
notificationButton.addEventListener('click', () => { | |
void Notification.requestPermission(); | |
}, true); | |
} | |
} | |
const galleryPreviews = gradioApp().querySelectorAll('div[id^="tab_"][style*="display: block"] div[id$="_results"] .thumbnail-item > img'); | |
if (galleryPreviews == null) return; | |
const headImg = galleryPreviews[0]?.src; | |
if (headImg == null || headImg == lastHeadImg) return; | |
lastHeadImg = headImg; | |
// play notification sound if available | |
gradioApp().querySelector('#audio_notification audio')?.play(); | |
if (document.hasFocus()) return; | |
// Multiple copies of the images are in the DOM when one is selected. Dedup with a Set to get the real number generated. | |
const imgs = new Set(Array.from(galleryPreviews).map(img => img.src)); | |
const notification = new Notification( | |
'Stable Diffusion', | |
{ | |
body: `Generated ${imgs.size > 1 ? imgs.size - opts.return_grid : 1} image${imgs.size > 1 ? 's' : ''}`, | |
icon: headImg, | |
image: headImg, | |
} | |
); | |
notification.onclick = function(_) { | |
parent.focus(); | |
this.close(); | |
}; | |
}); | |