Spaces:
Running
on
Zero
Running
on
Zero
/** | |
* File: notify.js | |
* Project: comfy_mtb | |
* Author: Mel Massadian | |
* | |
* Copyright (c) 2023 Mel Massadian | |
* | |
*/ | |
import { app } from '../../scripts/app.js' | |
const log = (...args) => { | |
if (window.MTB?.TRACE) { | |
console.debug(...args) | |
} | |
} | |
let transition_time = 300 | |
const containerStyle = ` | |
position: fixed; | |
top: 20px; | |
left: 20px; | |
font-family: monospace; | |
z-index: 99999; | |
height: 0; | |
overflow: hidden; | |
transition: height ${transition_time}ms ease-in-out; | |
` | |
const toastStyle = ` | |
background-color: #333; | |
color: #fff; | |
padding: 10px; | |
border-radius: 5px; | |
opacity: 0; | |
overflow:hidden; | |
height:20px; | |
transition-property: opacity, height, padding; | |
transition-duration: ${transition_time}ms; | |
` | |
function notify(message, timeout = 3000) { | |
log('Creating toast') | |
const container = document.getElementById('mtb-notify-container') | |
const toast = document.createElement('div') | |
toast.style.cssText = toastStyle | |
toast.innerText = message | |
container.appendChild(toast) | |
toast.addEventListener('transitionend', (e) => { | |
// Only on out | |
if ( | |
e.target === toast && | |
e.propertyName === 'height' && | |
e.elapsedTime > transition_time / 1000 - Number.EPSILON | |
) { | |
log('Transition out') | |
const totalHeight = Array.from(container.children).reduce( | |
(acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts | |
0 | |
) | |
container.style.height = `${totalHeight}px` | |
// If there are no toasts left, set the container's height to 0 | |
if (container.children.length === 0) { | |
container.style.height = '0' | |
} | |
setTimeout(() => { | |
container.removeChild(toast) | |
log('Removed toast from DOM') | |
}, transition_time) | |
} else { | |
log('Transition') | |
} | |
}) | |
// Fading in the toast | |
toast.style.opacity = '1' | |
// Update container's height to fit new toast | |
const totalHeight = Array.from(container.children).reduce( | |
(acc, child) => acc + child.offsetHeight + 10, // Add spacing of 10px between toasts | |
0 | |
) | |
container.style.height = `${totalHeight}px` | |
// remove the toast after the specified timeout | |
setTimeout(() => { | |
// trigger the transitions | |
toast.style.opacity = '0' | |
toast.style.height = '0' | |
toast.style.paddingTop = '0' | |
toast.style.paddingBottom = '0' | |
}, timeout - transition_time) | |
} | |
app.registerExtension({ | |
name: 'mtb.Notify', | |
setup() { | |
if (!window.MTB) { | |
window.MTB = {} | |
} | |
const container = document.createElement('div') | |
container.id = 'mtb-notify-container' | |
container.style.cssText = containerStyle | |
document.body.appendChild(container) | |
window.MTB.notify = notify | |
// window.MTB.notify('Hello world!') | |
}, | |
}) | |