stammtisch-hersbruck/frontend/src/lib/stores/ticker.svelte.ts
Daniel Michelberger 245f8d7924 feat: Zeitnahme und Ergebnisse an Run und Fahrer statt an eigene Seiten
Die Routen /dashboard/timing und /dashboard/results entfallen samt ihrer
Menueeintraege. Beides passiert jetzt dort, wo es hingehoert: am Run
innerhalb seines Events.

Die Run-Seite zeigt laufende Zeiten in Echtzeit, jede Zeile ist Klickziel
fuer den Stopp-Dialog (Stoppen oder DNF). Gestartet wird ueber einen Dialog
mit Fahrersuche. Dazu Rangliste mit CSV-Export und ein Abschnitt fuer
Zeiten ohne Wertung.

Die Fahrer-Seite zeigt alle Runs des Events aus Sicht eines Fahrers, mit
Zeit, Status und Platz - auch Runs ohne Zeit, damit sichtbar bleibt, was
fehlt.

enrich() im times-Store nimmt now als Parameter: Ohne das waere Date.now()
fuer Svelte keine Abhaengigkeit und laufende Zeiten stuenden still. Der
neue ticker() liefert diesen Wert, wodurch die {#key tick}-Bloecke der
alten Zeitnahmeseite entfallen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014dh9W1i7aLSdPYJzQPid5o
2026-09-02 12:08:14 +02:00

22 lines
666 B
TypeScript

/**
* Laufende Uhr für Live-Anzeigen. Wird im Komponenten-Setup aufgerufen; das
* Intervall hängt am Effekt-Kontext der Komponente und endet mit ihr.
*
* Der Wert wird bewusst als Zahl herausgereicht statt als fertiger Text:
* Ableitungen, die `now` lesen, rechnen dadurch bei jedem Tick neu — ohne
* `{#key}`-Blöcke, die sonst ganze Listen neu aufbauen würden.
*/
export function ticker(intervalMs = 100) {
let now = $state(Date.now())
$effect(() => {
const id = setInterval(() => (now = Date.now()), intervalMs)
return () => clearInterval(id)
})
return {
get now() {
return now
},
}
}