fix: 两大监听器在布局中时才设置监听器和定时器

Related to #1
This commit is contained in:
Baobhan Sith
2025-05-01 23:08:07 +08:00
parent 61492ed821
commit 37eae0a8ac
2 changed files with 36 additions and 16 deletions
@@ -3,6 +3,7 @@ import { useI18n } from 'vue-i18n';
import { useSettingsStore } from '../stores/settings.store'; import { useSettingsStore } from '../stores/settings.store';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import type { WebSocketMessage, MessagePayload } from '../types/websocket.types'; import type { WebSocketMessage, MessagePayload } from '../types/websocket.types';
import { useLayoutStore } from '../stores/layout.store';
// --- Interfaces (Copied from DockerManager.vue) --- // --- Interfaces (Copied from DockerManager.vue) ---
interface PortInfo { interface PortInfo {
@@ -253,15 +254,21 @@ export function createDockerManager(sessionId: string, wsDeps: DockerManagerDepe
watch(isConnected, (newIsConnected, oldIsConnected) => { watch(isConnected, (newIsConnected, oldIsConnected) => {
console.log(`[DockerManager ${sessionId}] Connection status changed: ${oldIsConnected} -> ${newIsConnected}`); console.log(`[DockerManager ${sessionId}] Connection status changed: ${oldIsConnected} -> ${newIsConnected}`);
if (newIsConnected) { if (newIsConnected) {
// Connection established // 只有当Docker管理器在布局中时才设置监听器和定时器
setupWsListeners(); const layoutStore = useLayoutStore();
requestDockerStatus(); // Fetch initial status if (layoutStore.usedPanes.has('dockerManager')) {
// Connection established
setupWsListeners();
requestDockerStatus(); // Fetch initial status
// Start refresh interval (consider if backend pushes updates reliably) // Start refresh interval (consider if backend pushes updates reliably)
if (!refreshInterval) { if (!refreshInterval) {
// Keep a safety interval // Keep a safety interval
refreshInterval = setInterval(requestDockerStatus, 15000); // Check every 15s refreshInterval = setInterval(requestDockerStatus, 15000); // Check every 15s
console.log(`[DockerManager ${sessionId}] Main refresh interval started (15s).`); console.log(`[DockerManager ${sessionId}] Main refresh interval started (15s).`);
}
} else {
console.log(`[DockerManager ${sessionId}] Docker管理器不在布局中,跳过设置监听器和定时器。`);
} }
} else { } else {
// Connection lost // Connection lost
@@ -283,11 +290,17 @@ export function createDockerManager(sessionId: string, wsDeps: DockerManagerDepe
// This handles cases where the manager is created after the WS connection is live. // This handles cases where the manager is created after the WS connection is live.
if (isConnected.value) { if (isConnected.value) {
console.log(`[DockerManager ${sessionId}] Initial setup: Already connected.`); console.log(`[DockerManager ${sessionId}] Initial setup: Already connected.`);
setupWsListeners(); // 只有当Docker管理器在布局中时才设置监听器和定时器
requestDockerStatus(); const layoutStore = useLayoutStore();
if (!refreshInterval) { if (layoutStore.usedPanes.has('dockerManager')) {
refreshInterval = setInterval(requestDockerStatus, 15000); setupWsListeners();
console.log(`[DockerManager ${sessionId}] Initial setup: Main refresh interval started (15s).`); requestDockerStatus();
if (!refreshInterval) {
refreshInterval = setInterval(requestDockerStatus, 15000);
console.log(`[DockerManager ${sessionId}] Initial setup: Main refresh interval started (15s).`);
}
} else {
console.log(`[DockerManager ${sessionId}] Docker管理器不在布局中,跳过初始设置。`);
} }
} else { } else {
console.log(`[DockerManager ${sessionId}] Initial setup: Not connected yet.`); console.log(`[DockerManager ${sessionId}] Initial setup: Not connected yet.`);
@@ -2,6 +2,7 @@ import { ref, readonly, watch, type Ref, ComputedRef } from 'vue'; // 修正导
// import { useWebSocketConnection } from './useWebSocketConnection'; // 移除全局导入 // import { useWebSocketConnection } from './useWebSocketConnection'; // 移除全局导入
import type { ServerStatus } from '../types/server.types'; import type { ServerStatus } from '../types/server.types';
import type { WebSocketMessage, MessagePayload } from '../types/websocket.types'; import type { WebSocketMessage, MessagePayload } from '../types/websocket.types';
import { useLayoutStore } from '../stores/layout.store';
// 定义与 WebSocket 相关的依赖接口 // 定义与 WebSocket 相关的依赖接口
export interface StatusMonitorDependencies { export interface StatusMonitorDependencies {
@@ -84,9 +85,15 @@ export function createStatusMonitorManager(sessionId: string, wsDeps: StatusMoni
watch(isConnected, (newValue, oldValue) => { watch(isConnected, (newValue, oldValue) => {
console.log(`[会话 ${sessionId}][状态监控模块] 连接状态变化: ${oldValue} -> ${newValue}`); console.log(`[会话 ${sessionId}][状态监控模块] 连接状态变化: ${oldValue} -> ${newValue}`);
if (newValue) { if (newValue) {
registerStatusHandlers(); // 只有当状态监视器在布局中时才注册处理器
// 连接成功后,可以考虑请求一次初始状态(如果后端支持) const layoutStore = useLayoutStore();
// sendMessage({ type: 'status:get', sessionId }); if (layoutStore.usedPanes.has('statusMonitor')) {
registerStatusHandlers();
// 连接成功后,可以考虑请求一次初始状态(如果后端支持)
// sendMessage({ type: 'status:update', sessionId });
} else {
console.log(`[会话 ${sessionId}][状态监控模块] 状态监视器不在布局中,跳过注册处理器。`);
}
} else { } else {
unregisterAllStatusHandlers(); unregisterAllStatusHandlers();
// 连接断开时清除状态 // 连接断开时清除状态