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());
}