From d8b1efc3cad235ddab776c8ee8eef20f0c973416 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 17 Nov 2025 16:19:43 +0100 Subject: [PATCH] Enhance StatusBar and daemon connection management - Added image preloading for quick access in StatusBar component - Implemented a watcher to reload images when the menu changes - Introduced a delay before sending 'setUserId' to ensure daemon readiness - Improved logging for WebSocket close events and errors --- .../src/components/falukant/StatusBar.vue | 38 ++++++++++++++++ frontend/src/store/index.js | 43 ++++++++++++++++--- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/falukant/StatusBar.vue b/frontend/src/components/falukant/StatusBar.vue index d0a6cdf..e2427f5 100644 --- a/frontend/src/components/falukant/StatusBar.vue +++ b/frontend/src/components/falukant/StatusBar.vue @@ -54,9 +54,21 @@ export default { ...mapState(["socket", "daemonSocket"]), ...mapGetters(['menu']), }, + watch: { + // Wenn sich das Menü ändert, lade die Bilder neu + 'menu.falukant': { + handler() { + this.preloadQuickAccessImages(); + }, + deep: true + } + }, async mounted() { await this.fetchStatus(); + // Bilder für Schnellzugriff vorladen und cachen + this.preloadQuickAccessImages(); + // Live-Socket-Events ["falukantUpdateStatus", "stock_change", "familychanged"].forEach(eventName => { if (this.daemonSocket) { @@ -77,6 +89,32 @@ export default { // Daemon WebSocket wird automatisch beim Logout geschlossen }, methods: { + preloadQuickAccessImages() { + // Lade alle Schnellzugriffs-Bilder vor, damit sie gecacht werden + if (this.menu.falukant && this.menu.falukant.children) { + Object.keys(this.menu.falukant.children).forEach(key => { + const img = new Image(); + img.src = `/images/icons/falukant/shortmap/${key}.png`; + }); + } + + // Lade auch andere häufig verwendete Bilder vor + const commonImages = [ + '/images/icons/falukant/messages24.png', + '/images/icons/falukant/age.png', + // Relationship-Bilder vorladen + '/images/icons/falukant/relationship-engaged.png', + '/images/icons/falukant/relationship-wooing.png', + '/images/icons/falukant/relationship-married.png', + '/images/icons/falukant/relationship-widow.png', + '/images/icons/falukant/relationship-.png' + ]; + + commonImages.forEach(src => { + const img = new Image(); + img.src = src; + }); + }, async fetchStatus() { try { const response = await apiClient.get("/api/falukant/info"); diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index fbe6889..9b915f6 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -299,17 +299,48 @@ const store = createStore({ state.daemonRetryTimer = null; } commit('setDaemonConnectionStatus', 'connected'); - const payload = JSON.stringify({ - event: 'setUserId', - data: { userId: state.user.id } - }); - daemonSocket.send(payload); + + // Warte kurz, bevor setUserId gesendet wird, damit der Daemon bereit ist + // Close-Code 1006 deutet darauf hin, dass der Daemon die Verbindung schließt, + // möglicherweise weil setUserId zu früh gesendet wird + setTimeout(() => { + try { + if (daemonSocket.readyState === WebSocket.OPEN && state.isLoggedIn && state.user) { + const payload = JSON.stringify({ + event: 'setUserId', + data: { userId: state.user.id } + }); + daemonSocket.send(payload); + console.log('[Daemon] setUserId gesendet für User:', state.user.id); + } else { + console.warn('[Daemon] Socket nicht mehr offen oder Benutzer nicht eingeloggt beim Senden von setUserId'); + } + } catch (error) { + console.error('[Daemon] Fehler beim Senden von setUserId:', error); + } + }, 100); // 100ms Delay }; daemonSocket.onclose = (event) => { state.daemonConnecting = false; commit('setDaemonConnectionStatus', 'disconnected'); + // Detailliertes Logging für Close-Events + const closeCodeMessages = { + 1000: 'Normal closure', + 1001: 'Going away', + 1002: 'Protocol error', + 1003: 'Unsupported data', + 1006: 'Abnormal closure (no close frame received)', + 1007: 'Invalid data', + 1008: 'Policy violation', + 1009: 'Message too big', + 1010: 'Extension error', + 1011: 'Internal server error' + }; + const closeMessage = closeCodeMessages[event.code] || `Unknown code: ${event.code}`; + console.warn(`[Daemon] Verbindung geschlossen - Code: ${event.code} (${closeMessage}), Reason: ${event.reason || 'none'}, WasClean: ${event.wasClean}, Opened: ${opened}`); + // Bereinige Socket-Referenz wenn Verbindung geschlossen wurde if (state.daemonSocket === daemonSocket) { state.daemonSocket = null; @@ -331,6 +362,8 @@ const store = createStore({ state.daemonConnecting = false; commit('setDaemonConnectionStatus', 'error'); + console.error('[Daemon] WebSocket-Fehler:', error, 'ReadyState:', daemonSocket.readyState, 'URL:', daemonUrl); + // Bereinige Socket-Referenz bei Fehler if (state.daemonSocket === daemonSocket) { state.daemonSocket = null;