Fix: Make event listener setup idempotent and modularize connection logic
Signed-off-by: YoungSoo Shin <shinys000114@gmail.com>
This commit is contained in:
@@ -13,11 +13,19 @@ import { debounce, isMobile } from './utils.js';
|
|||||||
|
|
||||||
// A flag to track if charts have been initialized
|
// A flag to track if charts have been initialized
|
||||||
let chartsInitialized = false;
|
let chartsInitialized = false;
|
||||||
|
let listenersAttached = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up all event listeners for the application's interactive elements.
|
* Sets up all event listeners for the application's interactive elements.
|
||||||
|
* This function is now idempotent and will only attach listeners once.
|
||||||
*/
|
*/
|
||||||
export function setupEventListeners() {
|
export function setupEventListeners() {
|
||||||
|
if (listenersAttached) {
|
||||||
|
console.log("Event listeners already attached. Skipping.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("Attaching event listeners...");
|
||||||
|
|
||||||
// --- Theme Toggle ---
|
// --- Theme Toggle ---
|
||||||
dom.themeToggle.addEventListener('change', () => {
|
dom.themeToggle.addEventListener('change', () => {
|
||||||
const newTheme = dom.themeToggle.checked ? 'dark' : 'light';
|
const newTheme = dom.themeToggle.checked ? 'dark' : 'light';
|
||||||
@@ -90,4 +98,7 @@ export function setupEventListeners() {
|
|||||||
// --- Window Resize Event ---
|
// --- Window Resize Event ---
|
||||||
// Debounced to avoid excessive calls during resizing.
|
// Debounced to avoid excessive calls during resizing.
|
||||||
window.addEventListener('resize', debounce(ui.handleResize, 150));
|
window.addEventListener('resize', debounce(ui.handleResize, 150));
|
||||||
|
|
||||||
|
listenersAttached = true;
|
||||||
|
console.log("Event listeners attached successfully.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ function onWsClose() {
|
|||||||
term.write('\r\n\x1b[31mConnection closed. Reconnecting...\x1b[0m\r\n');
|
term.write('\r\n\x1b[31mConnection closed. Reconnecting...\x1b[0m\r\n');
|
||||||
}
|
}
|
||||||
// Attempt to re-establish the connection after 2 seconds
|
// Attempt to re-establish the connection after 2 seconds
|
||||||
setTimeout(initialize, 2000);
|
setTimeout(connect, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,9 +75,26 @@ function onWsMessage(event) {
|
|||||||
|
|
||||||
// --- Application Initialization ---
|
// --- Application Initialization ---
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Establishes the connection-related parts of the application.
|
||||||
|
* Fetches initial status and initializes WebSocket.
|
||||||
|
*/
|
||||||
|
function connect() {
|
||||||
|
// Fetch initial status on page load or reconnect
|
||||||
|
updateControlStatus();
|
||||||
|
|
||||||
|
// Establish the WebSocket connection with the defined handlers
|
||||||
|
initWebSocket({
|
||||||
|
onOpen: onWsOpen,
|
||||||
|
onClose: onWsClose,
|
||||||
|
onMessage: onWsMessage
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the entire application.
|
* Initializes the entire application.
|
||||||
* This function sets up the UI, theme, terminal, chart, WebSocket connection, and event listeners.
|
* This function sets up the UI, theme, terminal, and event listeners.
|
||||||
|
* It should only be called once when the DOM is loaded.
|
||||||
*/
|
*/
|
||||||
function initialize() {
|
function initialize() {
|
||||||
// Initialize basic UI components
|
// Initialize basic UI components
|
||||||
@@ -87,22 +104,14 @@ function initialize() {
|
|||||||
setupTerminal();
|
setupTerminal();
|
||||||
|
|
||||||
// Apply the saved theme or detect the user's preferred theme.
|
// Apply the saved theme or detect the user's preferred theme.
|
||||||
// This must be done AFTER the chart and terminal are initialized.
|
|
||||||
const savedTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
const savedTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||||||
applyTheme(savedTheme);
|
applyTheme(savedTheme);
|
||||||
|
|
||||||
// Fetch initial status on page load
|
|
||||||
updateControlStatus();
|
|
||||||
|
|
||||||
// Establish the WebSocket connection with the defined handlers
|
|
||||||
initWebSocket({
|
|
||||||
onOpen: onWsOpen,
|
|
||||||
onClose: onWsClose,
|
|
||||||
onMessage: onWsMessage
|
|
||||||
});
|
|
||||||
|
|
||||||
// Attach all event listeners to the DOM elements
|
// Attach all event listeners to the DOM elements
|
||||||
setupEventListeners();
|
setupEventListeners();
|
||||||
|
|
||||||
|
// Start the connection process
|
||||||
|
connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Start Application ---
|
// --- Start Application ---
|
||||||
|
|||||||
Reference in New Issue
Block a user