Fix connexion slots: topbar-logo fetch config a window.onload
Deplace le fetch get_config_sqlite de DOMContentLoaded vers window.onload dans topbar-logo.js. Les requetes sont maintenant sequencees: DOMContentLoaded (sidebar+topbar+i18n) -> onload (config) -> event (internet/scan). Max 3-4 requetes simultanees. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,29 +5,32 @@
|
|||||||
* - Shows/Hides "Screen" sidebar tab based on device type
|
* - Shows/Hides "Screen" sidebar tab based on device type
|
||||||
* - Updates sidebar device name
|
* - Updates sidebar device name
|
||||||
* - Shows hotspot badge in sidebar when in hotspot mode
|
* - Shows hotspot badge in sidebar when in hotspot mode
|
||||||
|
*
|
||||||
|
* Fetches config at window.onload (not DOMContentLoaded) to avoid
|
||||||
|
* saturating the browser's 6-connection-per-domain limit.
|
||||||
*/
|
*/
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
(function() {
|
||||||
let config = null;
|
let config = null;
|
||||||
|
|
||||||
// Fetch config once and share globally
|
// Observe DOM changes to apply config when sidebar/topbar are loaded
|
||||||
fetch('launcher.php?type=get_config_sqlite')
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => {
|
|
||||||
config = data;
|
|
||||||
window._nebuleairConfig = data;
|
|
||||||
applyConfig();
|
|
||||||
// Notify other scripts that config is ready
|
|
||||||
document.dispatchEvent(new CustomEvent('nebuleair-config-ready', { detail: data }));
|
|
||||||
})
|
|
||||||
.catch(error => console.error('Error loading config:', error));
|
|
||||||
|
|
||||||
// Observe DOM changes to handle dynamically loaded elements (sidebar, topbar)
|
|
||||||
const observer = new MutationObserver(() => {
|
const observer = new MutationObserver(() => {
|
||||||
if (config) applyConfig();
|
if (config) applyConfig();
|
||||||
});
|
});
|
||||||
|
|
||||||
observer.observe(document.body, { childList: true, subtree: true });
|
observer.observe(document.body, { childList: true, subtree: true });
|
||||||
|
|
||||||
|
// Fetch config after all initial resources are loaded
|
||||||
|
window.addEventListener('load', () => {
|
||||||
|
fetch('launcher.php?type=get_config_sqlite')
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
config = data;
|
||||||
|
window._nebuleairConfig = data;
|
||||||
|
applyConfig();
|
||||||
|
document.dispatchEvent(new CustomEvent('nebuleair-config-ready', { detail: data }));
|
||||||
|
})
|
||||||
|
.catch(error => console.error('Error loading config:', error));
|
||||||
|
});
|
||||||
|
|
||||||
function applyConfig() {
|
function applyConfig() {
|
||||||
if (!config) return;
|
if (!config) return;
|
||||||
|
|
||||||
@@ -36,13 +39,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
// 1. Topbar Logo Logic
|
// 1. Topbar Logo Logic
|
||||||
const logo = document.getElementById('topbar-logo');
|
const logo = document.getElementById('topbar-logo');
|
||||||
if (logo && isModuleAirPro) {
|
if (logo && isModuleAirPro) {
|
||||||
// prevent unnecessary re-assignments
|
|
||||||
if (!logo.src.includes('logoModuleAir.png')) {
|
if (!logo.src.includes('logoModuleAir.png')) {
|
||||||
logo.src = 'assets/img/logoModuleAir.png';
|
logo.src = 'assets/img/logoModuleAir.png';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Sidebar Screen Tab Logic - Use class since ID might be duplicated (desktop/mobile)
|
// 2. Sidebar Screen Tab Logic
|
||||||
const navScreenElements = document.querySelectorAll('.nav-screen-item');
|
const navScreenElements = document.querySelectorAll('.nav-screen-item');
|
||||||
if (navScreenElements.length > 0) {
|
if (navScreenElements.length > 0) {
|
||||||
navScreenElements.forEach(navScreen => {
|
navScreenElements.forEach(navScreen => {
|
||||||
@@ -70,6 +72,5 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
document.querySelectorAll('.sidebar-hotspot-badge').forEach(badge => {
|
document.querySelectorAll('.sidebar-hotspot-badge').forEach(badge => {
|
||||||
badge.style.display = (config.WIFI_status === 'hotspot') ? '' : 'none';
|
badge.style.display = (config.WIFI_status === 'hotspot') ? '' : 'none';
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
})();
|
||||||
|
|||||||
@@ -564,15 +564,9 @@ function get_internet(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Use window.onload to wait for all initial resources to finish loading
|
// Wait for config loaded by topbar-logo.js (fires after window.onload)
|
||||||
// This frees up HTTP connection slots before making AJAX calls
|
document.addEventListener('nebuleair-config-ready', function(e) {
|
||||||
window.onload = function() {
|
const data = e.detail;
|
||||||
// Reuse config already fetched by topbar-logo.js, or fetch if not ready
|
|
||||||
const data = window._nebuleairConfig;
|
|
||||||
if (!data) {
|
|
||||||
console.warn("Config not ready yet, skipping wifi page init");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.log("Config loaded (wifi page):");
|
console.log("Config loaded (wifi page):");
|
||||||
console.log(data);
|
console.log(data);
|
||||||
|
|
||||||
@@ -603,7 +597,7 @@ function get_internet(){
|
|||||||
document.getElementById('card-hotspot-info').style.display = 'none';
|
document.getElementById('card-hotspot-info').style.display = 'none';
|
||||||
document.getElementById('card-wifi-scan').style.display = '';
|
document.getElementById('card-wifi-scan').style.display = '';
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user