All files / src/utils useReservationTimer.ts

87.23% Statements 41/47
66.66% Branches 6/9
100% Functions 1/1
87.23% Lines 41/47

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 47x   47x   47x 47x 47x 47x 47x   47x 47x 47x 47x   47x 47x 47x   47x 47x   47x 47x   47x 47x   47x   47x   47x 47x   47x 47x   47x 47x 47x       47x       47x   47x 47x 47x 47x 47x 47x 47x 47x  
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,
  };
}