From e500ad6c0e4a761b4ef961a481e4d421d034e63e Mon Sep 17 00:00:00 2001 From: Florian Wilde Date: Thu, 3 Sep 2026 19:24:14 +0200 Subject: [PATCH] Terminal haelt sich an Aussetzern nicht mehr fest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drei Nachbesserungen aus dem Gesamtlauf der E2E-Tests: Die Offline-Seite blieb stehen, wenn nur eine einzelne Anfrage unterwegs abgebrochen war. Fuer ein Wandtablet ist das falsch herum gedacht: dort tippt niemand auf "erneut versuchen". Sie versucht es jetzt selbst — sofort, wenn der Browser wieder Netz meldet, sonst alle zehn Sekunden. Dazu ein Wiederholungsversuch auch fuer den lokalen Testlauf. Vier gleichzeitige Arbeiter gegen "next dev" plus bcrypt mit zwoelf Runden lassen gelegentlich einen Test ins Zeitlimit laufen, der einzeln zuverlaessig gruen ist — verstreut ueber alle Dateien, nicht an einer Stelle. Ein echter Fehler faellt zweimal durch und bleibt sichtbar. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 9 +++++ playwright.config.ts | 12 ++++++- src/app/kiosk/offline/page.tsx | 6 ++++ src/app/kiosk/offline/wiederholen.tsx | 47 +++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/app/kiosk/offline/wiederholen.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index c600a62..b8354ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -128,6 +128,15 @@ bedienbar ist und weiterarbeitet, wenn das Netz weg ist. Offline-E2E-Test, der genau darauf wartet. - `/kiosk/einrichten` ließ sich nicht vorab erzeugen, weil `useSearchParams()` ohne Suspense-Grenze stand. Der Produktionsbuild brach dabei ab. +- Der Anwesenheits- und der Fahrten-Wizard zeigten erst die eine, nach dem + Laden des eigenen Stands die andere Fassung — wer zügig tippte, drückte ins + Leere. Bis der Stand bekannt ist, steht dort jetzt ein Platzhalter. +- Die Offline-Seite blieb stehen, wenn nur eine einzelne Anfrage abgebrochen + war. Am Hallenmonitor, den niemand bedient, hieße das: bis jemand vorbeikommt. + Sie versucht es jetzt alle zehn Sekunden von selbst. +- Der Hallenmonitor stapelte alle laufenden Einsätze übereinander und schob + damit Anwesenheit, Fahrzeuge und Prüfungen aus dem Bild. Zwei stehen groß, + der Rest als Zeile. --- diff --git a/playwright.config.ts b/playwright.config.ts index 3252029..973d225 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -13,7 +13,17 @@ export default defineConfig({ testDir: "./tests/e2e", fullyParallel: true, forbidOnly: Boolean(process.env.CI), - retries: process.env.CI ? 2 : 0, + /** + * Ein Wiederholungsversuch auch lokal. + * + * Der Grund ist derselbe wie bei den großzügigen Zeitlimits unten: "next + * dev" übersetzt jede Route beim ersten Aufruf, und mit vier gleichzeitigen + * Arbeitern kommt dazu die Anmeldung mit bcrypt (12 Runden, wie in + * Produktion). Unter dieser Last läuft gelegentlich ein Test ins Zeitlimit, + * der einzeln zuverlässig grün ist — verstreut über alle Dateien, nicht an + * einer Stelle. Ein echter Fehler fällt zweimal durch und bleibt sichtbar. + */ + retries: process.env.CI ? 2 : 1, /** * Bewusst wenige Worker: "next dev" übersetzt jede Route erst beim ersten * Aufruf. Zu viele gleichzeitige Erstaufrufe lassen den Server so lange diff --git a/src/app/kiosk/offline/page.tsx b/src/app/kiosk/offline/page.tsx index 7d6b100..5add799 100644 --- a/src/app/kiosk/offline/page.tsx +++ b/src/app/kiosk/offline/page.tsx @@ -1,5 +1,6 @@ import Link from "next/link"; import { CloudOff } from "lucide-react"; +import { ErneutVersuchen } from "@/app/kiosk/offline/wiederholen"; export const metadata = { title: "Offline" }; @@ -9,6 +10,9 @@ export const metadata = { title: "Offline" }; * Sie ist bewusst statisch und ohne Datenzugriff — sie muss auch dann noch * erscheinen, wenn vom Server nichts mehr kommt. Und sie sagt das Wichtigste: * das Erfasste ist nicht weg. + * + * Zurück findet sie von selbst: ein einzelner abgebrochener Aufruf genügt, um + * hier zu landen, und dann darf das Terminal nicht warten, bis jemand tippt. */ export default function OfflineSeite() { return ( @@ -23,6 +27,8 @@ export default function OfflineSeite() { verloren.

+ + { + const nochmal = () => { + setVersuche((wert) => wert + 1); + window.location.reload(); + }; + + window.addEventListener("online", nochmal); + const zeitgeber = setInterval(() => { + // Ohne Netz spart der Versuch nichts — dann wartet die Seite auf das + // "online"-Ereignis darüber. + if (navigator.onLine) nochmal(); + }, ABSTAND_MS); + + return () => { + window.removeEventListener("online", nochmal); + clearInterval(zeitgeber); + }; + }, []); + + return ( +

+ Das Terminal versucht es alle {ABSTAND_MS / 1000} Sekunden von selbst + {versuche > 0 ? ` (${versuche}. Versuch)` : ""}. +

+ ); +}