import { FormEvent, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { apiGet } from "../lib/api"; import type { DashboardOverview, LookupResult } from "../lib/types"; function formatDate(value: string) { return new Intl.DateTimeFormat("de-DE", { dateStyle: "medium", timeStyle: "short", }).format(new Date(value)); } function routeForSample(sampleId: string, routeSegment: string) { return `/samples/${sampleId}/${routeSegment}`; } const STEP_LABELS: Record = { ANAMNESIS: "Anamnese", ANTIBIOGRAM: "Antibiogramm", THERAPY: "Therapie", COMPLETED: "Abgeschlossen", }; export default function HomePage() { const navigate = useNavigate(); const [dashboard, setDashboard] = useState(null); const [sampleNumber, setSampleNumber] = useState(""); const [message, setMessage] = useState(null); const [loading, setLoading] = useState(true); const [showValidation, setShowValidation] = useState(false); useEffect(() => { async function loadDashboard() { try { const response = await apiGet("/dashboard"); setDashboard(response); } finally { setLoading(false); } } void loadDashboard(); }, []); async function handleLookup(event: FormEvent) { event.preventDefault(); setShowValidation(true); if (!sampleNumber.trim()) { setMessage("Bitte eine Probennummer eingeben."); return; } try { const response = await apiGet(`/dashboard/lookup/${sampleNumber.trim()}`); if (!response.found || !response.sampleId || !response.routeSegment) { setMessage(response.message); return; } setMessage(null); navigate(routeForSample(response.sampleId, response.routeSegment)); } catch (lookupError) { setMessage((lookupError as Error).message); } } return (

Startseite

Bearbeitungsstand sofort finden

Eine bekannte Probennummer oeffnet direkt den passenden Arbeitsschritt.

{message ?
{message}
: null}
Naechste Nummer {dashboard?.nextSampleNumber ?? "..."}
Offene Proben {dashboard?.openSamples ?? "..."}
Heute abgeschlossen {dashboard?.completedToday ?? "..."}

Arbeitsvorrat

Zuletzt bearbeitete Proben

{loading ? (
Dashboard wird geladen ...
) : dashboard?.recentSamples.length ? (
{dashboard.recentSamples.map((sample) => ( ))}
Probe Landwirt Kuh Typ Status Aktualisiert
{sample.sampleNumber} {sample.farmerName} {sample.cowLabel} {sample.sampleKind === "DRY_OFF" ? "Trockensteller" : "Laktation"} {STEP_LABELS[sample.currentStep]} {formatDate(sample.updatedAt)}
) : (
Noch keine Proben vorhanden.
)}
); }