Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 1x 1x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x 44x | import type { SelectedAppointmentProvider } from "@/types/ProvideInjectTypes"; import type { Ref } from "vue"; import { computed, inject, onBeforeUnmount, onMounted, ref } from "vue"; export function useReservationTimer() { const { appointment } = inject<SelectedAppointmentProvider>("appointment")!; const reservationStartMs = inject<Ref<number | null>>("reservationStartMs")!; const reservationDurationMinutes = computed<number | undefined>(() => { const raw: unknown = (appointment.value as any)?.scope?.reservationDuration; const n = raw as number | undefined; return Number.isFinite(n) ? n : undefined; }); const deadlineMs = computed<number | null>(() => { if ( reservationStartMs.value == null || reservationDurationMinutes.value == null ) return null; return reservationStartMs.value + reservationDurationMinutes.value * 60_000; }); const nowMs = ref<number>(Date.now()); let timer: number | undefined; onMounted(() => { timer = window.setInterval(() => { nowMs.value = Date.now(); }, 1000); }); onBeforeUnmount(() => { if (timer) window.clearInterval(timer); }); const remainingMs = computed<number | null>(() => deadlineMs.value == null ? null : Math.max(0, deadlineMs.value - nowMs.value) ); const isExpired = computed<boolean>( () => remainingMs.value !== null && remainingMs.value <= 0 ); // Nachfolgendes kann für späteres Ticket ZMSKVR-501 zur Anzeige des restlichen Timers verwendet werden const timeLeftString = computed<string>(() => { if (remainingMs.value == null) return ""; const totalSeconds = Math.floor(remainingMs.value / 1000); return `${totalSeconds} Sekunden`; }); return { isExpired, remainingMs, deadlineMs, nowMs, timeLeftString, }; } |