"use client"; import React, { useEffect, useState } from "react"; import { useAppSelector } from "@/redux/store"; export default function SlotActivityOverlay({ slotIndex, }: { slotIndex: number; }) { const ksx = useAppSelector((s) => s.deviceEvents.ksx); const ksy = useAppSelector((s) => s.deviceEvents.ksy); const ksz = useAppSelector((s) => s.deviceEvents.ksz); const loopStartedAt = useAppSelector((s) => s.deviceEvents.loopStartedAt); const tdrStartedAt = useAppSelector((s) => s.deviceEvents.tdrStartedAt); const alignmentStartedAt = useAppSelector( (s) => s.deviceEvents.alignmentStartedAt ); const loopActive = Array.isArray(ksx) && ksx[slotIndex] === 1; const tdrActive = Array.isArray(ksy) && ksy[slotIndex] === 1; const alignActive = Array.isArray(ksz) && ksz[slotIndex] === 1; // Progress ticker const [now, setNow] = useState(Date.now()); useEffect(() => { const any = loopActive || tdrActive || alignActive; if (!any) return; const id = setInterval(() => setNow(Date.now()), 1000); return () => clearInterval(id); }, [loopActive, tdrActive, alignActive]); const clamp = (v: number, min = 0, max = 1) => Math.max(min, Math.min(max, v)); const compute = (startedAt: number | null, durationMs: number) => { if (!startedAt) return { pct: 0 }; const elapsed = now - startedAt; const pct = clamp(elapsed / durationMs) * 100; return { pct }; }; // Durations const LOOP_MS = 2 * 60 * 1000; // ~2 min const TDR_MS = 30 * 1000; // ~30 s const ALIGN_MS = 10 * 60 * 1000; // ~10 min if (!loopActive && !tdrActive && !alignActive) return null; return (
Bitte warten…
{loopActive && (
Schleife
{(() => { const { pct } = compute(loopStartedAt, LOOP_MS); return (
{Math.round(pct)}%
); })()}
)} {tdrActive && (
TDR
{(() => { const { pct } = compute(tdrStartedAt, TDR_MS); return (
{Math.round(pct)}%
); })()}
)} {alignActive && (
Abgleich
{(() => { const { pct } = compute(alignmentStartedAt, ALIGN_MS); return (
{Math.round(pct)}%
); })()}
)}
); }