From a059d282ed2d7cf83728afa7e95bba17485a9bb3 Mon Sep 17 00:00:00 2001 From: Adrian Zuercher Date: Tue, 6 May 2025 05:33:54 +0200 Subject: [PATCH] move websocket globally and modify mainn page --- quasar.config.ts | 2 +- src/boot/websocket.ts | 21 ++ src/components/DBMTree.vue | 5 +- src/components/LightComponent.vue | 10 +- src/components/MovingHead.vue | 203 ++++++++++++------ src/components/SubMenu.vue | 3 +- src/models/Set.ts | 2 +- src/pages/IndexPage.vue | 2 - .../useWebSocket.ts => services/websocket.ts} | 29 ++- 9 files changed, 176 insertions(+), 101 deletions(-) create mode 100644 src/boot/websocket.ts rename src/{composables/useWebSocket.ts => services/websocket.ts} (85%) diff --git a/quasar.config.ts b/quasar.config.ts index d9de8b2..581162d 100644 --- a/quasar.config.ts +++ b/quasar.config.ts @@ -11,7 +11,7 @@ export default defineConfig((/* ctx */) => { // app boot file (/src/boot) // --> boot files are part of "main.js" // https://v2.quasar.dev/quasar-cli-vite/boot-files - boot: [], + boot: ['websocket'], // https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#css css: ['app.scss'], diff --git a/src/boot/websocket.ts b/src/boot/websocket.ts new file mode 100644 index 0000000..99b8e9d --- /dev/null +++ b/src/boot/websocket.ts @@ -0,0 +1,21 @@ +import { boot } from 'quasar/wrappers'; +import type { QVueGlobals } from 'quasar'; +import { initWebSocket } from 'src/services/websocket'; + +export default boot(({ app }) => { + const $q = app.config.globalProperties.$q as QVueGlobals; + + const ws = initWebSocket('ws://127.0.0.1:8100/ws?id=quasar', $q); + app.config.globalProperties.$socket = ws; + ws.connect(); +}); + +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $socket: { + connect: () => void; + close: () => void; + socket: WebSocket | null; + }; + } +} diff --git a/src/components/DBMTree.vue b/src/components/DBMTree.vue index ca6ba22..6b6b1f5 100644 --- a/src/components/DBMTree.vue +++ b/src/components/DBMTree.vue @@ -57,17 +57,14 @@ diff --git a/src/composables/useWebSocket.ts b/src/services/websocket.ts similarity index 85% rename from src/composables/useWebSocket.ts rename to src/services/websocket.ts index de2ca4d..79c49a7 100644 --- a/src/composables/useWebSocket.ts +++ b/src/services/websocket.ts @@ -1,18 +1,16 @@ import type { Response } from 'src/models/Response'; import type { Publish } from 'src/models/Publish'; import type { Request } from 'src/models/Request'; +import type { QVueGlobals } from 'quasar'; import { subs, buildTree, dbmData } from 'src/composables/dbmTree'; -import { onBeforeUnmount, ref } from 'vue'; -import { useQuasar } from 'quasar'; +import { ref } from 'vue'; const pendingResponses = new Map void>(); -let socket: WebSocket | null = null; +export let socket: WebSocket | null = null; const isConnected = ref(false); -export function useWebSocket(url: string) { - const $q = useQuasar(); - +export function initWebSocket(url: string, $q?: QVueGlobals) { const connect = () => { socket = new WebSocket(url); @@ -22,22 +20,24 @@ export function useWebSocket(url: string) { }; socket.onclose = () => { isConnected.value = false; - $q.notify({ + console.log('WebSocket disconnected'); + $q?.notify({ message: 'WebSocket disconnected', color: 'orange', position: 'bottom-right', icon: 'warning', - timeout: 5000, + timeout: 10000, }); }; socket.onerror = (err) => { + console.log(`WebSocket error: ${err.type}`); isConnected.value = false; - $q.notify({ + $q?.notify({ message: `WebSocket error: ${err.type}`, color: 'red', position: 'bottom-right', icon: 'error', - timeout: 5000, + timeout: 10000, }); }; socket.onmessage = (event) => { @@ -67,13 +67,12 @@ export function useWebSocket(url: string) { } }; - onBeforeUnmount(() => { - close(); - }); + // onBeforeUnmount(() => { + // close(); + // }); return { connect, - send, close, socket, }; @@ -102,7 +101,7 @@ function waitForSocketConnection(): Promise { }); } -function send(data: Request): Promise { +export function send(data: Request): Promise { const id = generateId(); const payload = { ...data, id };