From 4d18d6d784acbff59b4fbd13c2ad3260425baa4f Mon Sep 17 00:00:00 2001 From: Korupt-virus Date: Wed, 29 Jul 2026 14:50:37 -0700 Subject: [PATCH 001/199] fix stale-session reprocessing --- CHANGELOG.md | 1 + client/messages/de.json | 5 + client/messages/en.json | 5 + .../src/components/StaleLapReprocessing.tsx | 127 ++++++++++++++++ client/src/lib/reprocess-state.ts | 90 +++++++++++ client/src/routes/__root.tsx | 84 +---------- client/src/stores/telemetry.ts | 29 ++-- playwright/playwright.config.ts | 8 + playwright/reprocessing.spec.ts | 141 ++++++++++++++++++ test/reprocess-state.test.ts | 80 ++++++++++ 10 files changed, 475 insertions(+), 95 deletions(-) create mode 100644 client/src/components/StaleLapReprocessing.tsx create mode 100644 client/src/lib/reprocess-state.ts create mode 100644 playwright/reprocessing.spec.ts create mode 100644 test/reprocess-state.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 8986c958b..d25babc8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - View all release notes since your installed version in the app ### Fixes +- Made stale-session reprocessing recoverable with retry and dismissal actions, accessible progress states, and clear failure feedback ### Internal - Consolidated live dashboard routing across all supported games while preserving game-specific URLs diff --git a/client/messages/de.json b/client/messages/de.json index 52ce496b7..744fa1f8a 100644 --- a/client/messages/de.json +++ b/client/messages/de.json @@ -646,6 +646,11 @@ "root_update_short": "Update", "root_reprocessing_complete": "Neuverarbeitung abgeschlossen", "root_reprocessing": "Sitzungen werden neu verarbeitet…", + "root_reprocessing_starting": "Neuverarbeitung wird gestartet…", + "root_reprocessing_progress": "{done} von {total} Sitzungen verarbeitet.", + "root_reprocessing_failed": "Neuverarbeitung fehlgeschlagen", + "root_reprocessing_failed_description": "Die Sitzungen konnten nicht neu verarbeitet werden. Versuche es erneut oder schließe diesen Dialog und versuche es später noch einmal.", + "root_reprocess_retry": "Erneut versuchen", "root_all_sessions_updated": "Alle Sitzungen aktualisiert.", "root_lap_detection_updated": "Rundenerkennung aktualisiert", "root_desktop_required": "Desktop erforderlich", diff --git a/client/messages/en.json b/client/messages/en.json index 5248d2eac..a1c73fe16 100644 --- a/client/messages/en.json +++ b/client/messages/en.json @@ -646,6 +646,11 @@ "root_update_short": "Update", "root_reprocessing_complete": "Reprocessing complete", "root_reprocessing": "Reprocessing sessions…", + "root_reprocessing_starting": "Starting reprocessing…", + "root_reprocessing_progress": "{done} of {total} sessions processed.", + "root_reprocessing_failed": "Reprocessing failed", + "root_reprocessing_failed_description": "The sessions could not be reprocessed. Retry now or close this dialog and try again later.", + "root_reprocess_retry": "Retry", "root_all_sessions_updated": "All sessions updated.", "root_lap_detection_updated": "Lap detection updated", "root_desktop_required": "Desktop required", diff --git a/client/src/components/StaleLapReprocessing.tsx b/client/src/components/StaleLapReprocessing.tsx new file mode 100644 index 000000000..25ddde91c --- /dev/null +++ b/client/src/components/StaleLapReprocessing.tsx @@ -0,0 +1,127 @@ +import { CheckCircle2, RefreshCw, TriangleAlert } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { canStartReprocess, submitStaleSessionReprocess } from "@/lib/reprocess-state"; +import { client } from "@/lib/rpc"; +import { m } from "@/paraglide/messages"; +import { useTelemetryStore } from "@/stores/telemetry"; + +function ReprocessStatusIcon({ status }: { status: "submitting" | "progressing" | "success" | "error" }) { + if (status === "success") { + return