import { createElement } from "../lib/skeleton/index.js";
import rxjs, { effect } from "../lib/rx.js";
import { animate, opacityIn } from "../lib/animate.js";
class Loader extends window.HTMLElement {
constructor() {
super();
this.timeout = window.setTimeout(() => {
this.innerHTML = this.render({
inline: this.hasAttribute("inlined"),
});
}, parseInt(this.getAttribute("delay") || "0"));
}
disconnectedCallback() {
window.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 = 500 } = opts
const cancel = effect(new rxjs.Observable((observer) => {
const $icon = createElement(``);
const id = window.setTimeout(() => {
$parent.appendChild($icon);
animate($icon, { time: 1000, keyframes: opacityIn() });
}, wait);
return () => {
clearTimeout(id);
$icon.remove();
};
}));
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());
}