diff --git a/public/scripts/loader.js b/public/scripts/loader.js index 2df5f6edf..0fd368572 100644 --- a/public/scripts/loader.js +++ b/public/scripts/loader.js @@ -27,24 +27,45 @@ export async function hideLoader() { } return new Promise((resolve) => { - // Spinner blurs/fades out - $('#load-spinner').on('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function () { + const spinner = $('#load-spinner'); + if (!spinner.length) { + console.warn('Spinner element not found, skipping animation'); + cleanup(); + return; + } + + // Check if transitions are enabled + const transitionDuration = spinner[0] ? getComputedStyle(spinner[0]).transitionDuration : '0s'; + const hasTransitions = parseFloat(transitionDuration) > 0; + + if (hasTransitions) { + Promise.race([ + new Promise((r) => setTimeout(r, 500)), // Fallback timeout + new Promise((r) => spinner.one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', r)), + ]).finally(cleanup); + } else { + cleanup(); + } + + function cleanup() { $('#loader').remove(); // Yoink preloader entirely; it only exists to cover up unstyled content while loading JS // If it's present, we remove it once and then it's gone. yoinkPreloader(); - loaderPopup.complete(POPUP_RESULT.AFFIRMATIVE).then(() => { - loaderPopup = null; - resolve(); - }); - }); + loaderPopup.complete(POPUP_RESULT.AFFIRMATIVE) + .catch((err) => console.error('Error completing loaderPopup:', err)) + .finally(() => { + loaderPopup = null; + resolve(); + }); + } - $('#load-spinner') - .css({ - 'filter': 'blur(15px)', - 'opacity': '0', - }); + // Apply the styles + spinner.css({ + 'filter': 'blur(15px)', + 'opacity': '0', + }); }); }