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