import { createElement, onDestroy } from "../lib/skeleton/index.js"; import rxjs from "../lib/rx.js"; import { animate, opacityIn } from "../lib/animate.js"; class Loader extends HTMLElement { constructor() { super(); this.timeout = setTimeout(() => { this.innerHTML = this.render({ inline: this.hasAttribute("inlined"), }); }, parseInt(this.getAttribute("delay") || "0")); } disconnectedCallback() { clearTimeout(this.timeout); } render({ inline }) { const fixedCss = ` position: fixed; left: 0; right: 0; top: calc(50% - 200px);`; return `
`; } } customElements.define("component-loader", Loader); export function createLoader($parent, opts = {}) { const { wait = 250, append = ($loader) => $parent.appendChild($loader), } = opts; const $icon = createElement(`
`); const alreadyHasLoader = () => !!$parent.querySelector(".component_loader"); const id = setTimeout(() => { if (alreadyHasLoader()) return; append($icon); animate($icon, { time: 750, keyframes: opacityIn() }); }, wait); const cancel = () => { clearTimeout(id); $icon.remove(); }; onDestroy(() => cancel()); return rxjs.tap(() => cancel()); } // > after this should be deprecated export default createElement(""); export function toggle($node, show = false) { if (show === true) return rxjs.tap(() => $node.appendChild(createElement(""))); else return rxjs.tap(() => $node.querySelector("component-loader")?.remove()); }