| import { POPUP_RESULT, POPUP_TYPE, Popup } from './popup.js'; |
|
|
| |
| let loaderPopup; |
|
|
| let preloaderYoinked = false; |
|
|
| export function showLoader() { |
| |
| if (loaderPopup) loaderPopup.complete(POPUP_RESULT.CANCELLED); |
|
|
| loaderPopup = new Popup(` |
| <div id="loader"> |
| <div id="load-spinner" class="fa-solid fa-gear fa-spin fa-3x"></div> |
| </div>`, POPUP_TYPE.DISPLAY, null, { transparent: true, animation: 'none', wide: true, large: true }); |
|
|
| |
| loaderPopup.closeButton.style.display = 'none'; |
|
|
| loaderPopup.show(); |
| } |
|
|
| export async function hideLoader() { |
| if (!loaderPopup) { |
| console.warn('There is no loader showing to hide'); |
| return Promise.resolve(); |
| } |
|
|
| return new Promise((resolve) => { |
| const spinner = $('#load-spinner'); |
| if (!spinner.length) { |
| console.warn('Spinner element not found, skipping animation'); |
| cleanup(); |
| return; |
| } |
|
|
| |
| const transitionDuration = spinner[0] ? getComputedStyle(spinner[0]).transitionDuration : '0s'; |
| const hasTransitions = parseFloat(transitionDuration) > 0; |
|
|
| if (hasTransitions) { |
| Promise.race([ |
| new Promise((r) => setTimeout(r, 500)), |
| new Promise((r) => spinner.one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', r)), |
| ]).finally(cleanup); |
| } else { |
| cleanup(); |
| } |
|
|
| function cleanup() { |
| $('#loader').remove(); |
| |
| |
| yoinkPreloader(); |
|
|
| loaderPopup.complete(POPUP_RESULT.AFFIRMATIVE) |
| .catch((err) => console.error('Error completing loaderPopup:', err)) |
| .finally(() => { |
| loaderPopup = null; |
| resolve(); |
| }); |
| } |
|
|
| |
| spinner.css({ |
| 'filter': 'blur(15px)', |
| 'opacity': '0', |
| }); |
| }); |
| } |
|
|
| function yoinkPreloader() { |
| if (preloaderYoinked) return; |
| document.getElementById('preloader').remove(); |
| preloaderYoinked = true; |
| } |
|
|