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!') | |
| }, | |
| }) | |