Move schedule fetching into useSchedule composable
This commit is contained in:
parent
ddecfa3805
commit
13f344472e
5 changed files with 49 additions and 35 deletions
|
@ -80,7 +80,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
const schedule = useSchedule();
|
const schedule = await useSchedule();
|
||||||
const eventSelect = useTemplateRef("eventSelect");
|
const eventSelect = useTemplateRef("eventSelect");
|
||||||
|
|
||||||
function onChange(event: any) {
|
function onChange(event: any) {
|
||||||
|
|
|
@ -429,7 +429,7 @@ function tableElementsFromStretches(
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const schedule = useSchedule();
|
const schedule = await useSchedule();
|
||||||
const junctions = computed(() => junctionsFromEdges(edgesFromEvents(schedule.value.events)));
|
const junctions = computed(() => junctionsFromEdges(edgesFromEvents(schedule.value.events)));
|
||||||
const stretches = computed(() => [
|
const stretches = computed(() => [
|
||||||
...stretchesFromSpans(spansFromJunctions(junctions.value, schedule.value.locations), oneHourMs * 5)
|
...stretchesFromSpans(spansFromJunctions(junctions.value, schedule.value.locations), oneHourMs * 5)
|
||||||
|
|
46
composables/schedule.ts
Normal file
46
composables/schedule.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import type { Schedule } from '~/shared/types/schedule';
|
||||||
|
|
||||||
|
let source: EventSource | null = null;
|
||||||
|
let sourceRefs = 0;
|
||||||
|
export const useSchedule = () => {
|
||||||
|
const asyncData = useAsyncData<Schedule>(
|
||||||
|
'schedule',
|
||||||
|
() => $fetch("/api/schedule"),
|
||||||
|
{ default: () => ({ events: [], locations: [] }) },
|
||||||
|
)
|
||||||
|
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");
|
||||||
|
source = new EventSource("/api/events");
|
||||||
|
source.addEventListener("message", (message) => {
|
||||||
|
console.log("Message", message.data);
|
||||||
|
});
|
||||||
|
source.addEventListener("update", (message) => {
|
||||||
|
const updatedSchedule: Schedule = JSON.parse(message.data);
|
||||||
|
console.log("Update", updatedSchedule);
|
||||||
|
schedule.value = updatedSchedule;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
|
onUnmounted(() => {
|
||||||
|
console.log("useSchedule onUnmounted", sourceRefs);
|
||||||
|
sourceRefs -= 1;
|
||||||
|
if (source && sourceRefs === 0) {
|
||||||
|
console.log("Closing event source")
|
||||||
|
source.close();
|
||||||
|
source = null;
|
||||||
|
}
|
||||||
|
if (sourceRefs < 0) {
|
||||||
|
throw Error("Source reference count below zero");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return asyncData.then(({ data }) => data);
|
||||||
|
}
|
|
@ -1,3 +0,0 @@
|
||||||
import type { Schedule } from "~/shared/types/schedule";
|
|
||||||
|
|
||||||
export const useSchedule = () => useState<Schedule>('schedule');
|
|
|
@ -27,35 +27,6 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { Schedule } from '~/shared/types/schedule';
|
|
||||||
const { data: session } = await useAccountSession();
|
const { data: session } = await useAccountSession();
|
||||||
|
const schedule = await useSchedule();
|
||||||
const schedule = useSchedule();
|
|
||||||
|
|
||||||
await callOnce(async () => {
|
|
||||||
schedule.value = await $fetch("/api/schedule");
|
|
||||||
})
|
|
||||||
|
|
||||||
const source = ref<EventSource | null>(null);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
console.log("Opening event source")
|
|
||||||
source.value = new EventSource("/api/events");
|
|
||||||
source.value.addEventListener("message", (message) => {
|
|
||||||
console.log("Message", message.data);
|
|
||||||
});
|
|
||||||
source.value.addEventListener("update", (message) => {
|
|
||||||
const updatedSchedule: Schedule = JSON.parse(message.data);
|
|
||||||
console.log("Update", updatedSchedule);
|
|
||||||
schedule.value = updatedSchedule;
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
onUnmounted(() => {
|
|
||||||
if (source.value) {
|
|
||||||
console.log("Closing event source")
|
|
||||||
source.value.close();
|
|
||||||
source.value = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue