window.taxbaikAdminSession = { syncRouteClass: function () { document.documentElement.classList.toggle( 'admin-login-route', window.location.pathname.toLowerCase().endsWith('/admin/login')); }, clearAuthToken: function () { try { localStorage.removeItem('auth_token'); } catch { // Ignore storage errors; redirect still recovers the session. } }, watchReconnect: function () { window.taxbaikAdminSession.syncRouteClass(); window.addEventListener('popstate', window.taxbaikAdminSession.syncRouteClass); // Hide loading indicator after Blazor initializes const loadingOverlay = document.getElementById('blazor-loading'); if (loadingOverlay) { const hideLoading = () => { if (loadingOverlay.classList.contains('show')) { loadingOverlay.classList.remove('show'); } }; // Method 1: Hide after 3 seconds (guaranteed timeout) setTimeout(hideLoading, 3000); // Method 2: Hide when Blazor components appear (faster if available) const observer = new MutationObserver(() => { const mudElements = document.querySelectorAll('[class*="mud-"]').length; if (mudElements > 10) { hideLoading(); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true, attributes: true }); // Method 3: Hide when page is interactive document.addEventListener('readystatechange', () => { if (document.readyState === 'interactive' || document.readyState === 'complete') { setTimeout(hideLoading, 500); } }); } const modal = document.getElementById('components-reconnect-modal'); if (!modal) { return; } const reloadOnRejectedCircuit = () => { const className = modal.className || ''; if (className.includes('components-reconnect-failed') || className.includes('components-reconnect-rejected')) { window.setTimeout(() => window.location.reload(), 1500); } }; new MutationObserver(reloadOnRejectedCircuit) .observe(modal, { attributes: true, attributeFilter: ['class'] }); } };