From f69ca520c047298b448b27fe878525b06b93fab2 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Mon, 10 Mar 2025 16:43:21 +0100 Subject: [PATCH] Refetch schedule and stream if session is updated --- composables/schedule.ts | 50 ++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/composables/schedule.ts b/composables/schedule.ts index cbf77e1..8ec81a6 100644 --- a/composables/schedule.ts +++ b/composables/schedule.ts @@ -2,7 +2,9 @@ import type { Schedule } from '~/shared/types/schedule'; let source: EventSource | null = null; let sourceRefs = 0; +let sourceSessionId: number | undefined = undefined; export const useSchedule = () => { + const { data: session } = useAccountSession(); const asyncData = useAsyncData( 'schedule', () => $fetch("/api/schedule"), @@ -10,14 +12,9 @@ export const useSchedule = () => { ) const { data: schedule } = asyncData; - onMounted(() => { - console.log("useSchedule onMounted", sourceRefs); - sourceRefs += 1; - if (sourceRefs !== 1) { - console.log("Event source already open"); - return; - } - console.log("Opening event source"); + function connect() { + console.log("Opening event source sid:", session.value?.id); + sourceSessionId = session.value?.id; source = new EventSource("/api/events"); source.addEventListener("message", (message) => { console.log("Message", message.data); @@ -27,15 +24,46 @@ export const useSchedule = () => { console.log("Update", updatedSchedule); schedule.value = updatedSchedule; }); + } + + function disconnect() { + console.log("Closing event source") + source!.close(); + source = null; + } + + onMounted(() => { + console.log("useSchedule onMounted", sourceRefs); + sourceRefs += 1; + if (sourceRefs !== 1) { + console.log("Event source already open"); + return; + } + connect(); + }) + + watch(() => session.value?.id, () => { + if (sourceSessionId === session.value?.id) { + return; + } + sourceSessionId = session.value?.id; + console.log("Session changed, refetching schedule") + $fetch("/api/schedule").then( + data => { schedule.value = data; }, + err => { console.error(err); schedule.value = { locations: [], events: []}}, + ) + if (source && sourceRefs > 0) { + console.log("Restarting event stream") + disconnect(); + connect(); + } }) onUnmounted(() => { console.log("useSchedule onUnmounted", sourceRefs); sourceRefs -= 1; if (source && sourceRefs === 0) { - console.log("Closing event source") - source.close(); - source = null; + disconnect(); } if (sourceRefs < 0) { throw Error("Source reference count below zero");