const init = () => { // initLoaders() }; const initLoaders = () => { function domReady(condition: DocumentReadyState[] = ["complete", "interactive"]) { return new Promise(resolve => { if (condition.includes(document.readyState)) { resolve(true); } else { document.addEventListener("readystatechange", () => { if (condition.includes(document.readyState)) { resolve(true); } }); } }); } const safeDOM = { append(parent: HTMLElement, child: HTMLElement) { if (!Array.from(parent.children).find(e => e === child)) { return parent.appendChild(child); } }, remove(parent: HTMLElement, child: HTMLElement) { if (Array.from(parent.children).find(e => e === child)) { return parent.removeChild(child); } }, }; /** * https://tobiasahlin.com/spinkit * https://connoratherton.com/loaders * https://projects.lukehaas.me/css-loaders * https://matejkustec.github.io/SpinThatShit */ function useLoading() { const className = `loaders-css__square-spin`; const styleContent = ` @keyframes loading-spin { 33%{background-size:calc(100%/3) 0% ,calc(100%/3) 100%,calc(100%/3) 100%} 50%{background-size:calc(100%/3) 100%,calc(100%/3) 0% ,calc(100%/3) 100%} 66%{background-size:calc(100%/3) 100%,calc(100%/3) 100%,calc(100%/3) 0% } } .${className} > div { width: 60px; aspect-ratio: 4; --_g: no-repeat radial-gradient(circle closest-side,#cbd5e1 90%,#cbd5e100); background: var(--_g) 0% 50%, var(--_g) 50% 50%, var(--_g) 100% 50%; background-size: calc(100%/3) 100%; animation: loading-spin 1s infinite linear; } .app-loading-wrap { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: #FFFFFF; z-index: 10000; } [data-theme="dark"] .app-loading-wrap { background: #17171A; } [data-theme="dark"] .${className} > div { --_g: no-repeat radial-gradient(circle closest-side,#2D3748 90%,#2D374800); } `; const oStyle = document.createElement("style"); const oDiv = document.createElement("div"); let hasLoading = false; let setLoadingTimer = null; oStyle.id = "app-loading-style"; oStyle.innerHTML = styleContent; oDiv.className = "app-loading-wrap"; oDiv.innerHTML = `
`; return { appendLoading() { setLoadingTimer = setTimeout(() => { safeDOM.append(document.head, oStyle); safeDOM.append(document.body, oDiv); hasLoading = true; }, 1000); }, removeLoading() { clearTimeout(setLoadingTimer); if (hasLoading) { safeDOM.remove(document.head, oStyle); safeDOM.remove(document.body, oDiv); hasLoading = false; } }, }; } const {appendLoading, removeLoading} = useLoading(); const isMain = () => { return true; let l = window.location.href; if (l.indexOf("app.asar/dist/index.html") > 0) { return true; } if (l.indexOf("localhost") > 0 && l.indexOf(".html") === -1) { return true; } return false; }; if (isMain()) { domReady().then(appendLoading); window.onmessage = ev => { ev.data.payload === "removeLoading" && removeLoading(); }; } setTimeout(removeLoading, 4999); }; export default { init, };