"use client"; import { useMutation, useQuery } from "@tanstack/react-query"; import { ArrowRight, Loader2, Search, Sparkles, UserRoundCheck } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { useAuth } from "@/components/auth"; import { apiFetch, apiGet, Customer, Paginated, QuickStartCustomerData, ValidationItem } from "@/lib/api"; const validationTypeLabels: Record = { Erstvalidierung: "Erstvalidierung", Revalidierung: "Revalidierung", Leistungsbeurteilung: "Leistungsbeurteilung" }; export default function QuickStartValidationPage() { const { token, user } = useAuth(); const [search, setSearch] = useState(""); const [selectedCustomerId, setSelectedCustomerId] = useState(""); const [selectedLocationId, setSelectedLocationId] = useState(""); const [selectedContactId, setSelectedContactId] = useState(""); const [selectedDeviceId, setSelectedDeviceId] = useState(""); const [validationType, setValidationType] = useState("Erstvalidierung"); const [error, setError] = useState(""); const customers = useQuery({ queryKey: ["quickstart-customers", search, token], queryFn: () => apiGet>(`/customers?page=1&page_size=12${search.trim() ? `&search=${encodeURIComponent(search.trim())}` : ""}`, token ?? ""), enabled: Boolean(token) }); const customerData = useQuery({ queryKey: ["quickstart-customer-data", selectedCustomerId, token], queryFn: () => apiGet(`/customers/${selectedCustomerId}/quickstart-data`, token ?? ""), enabled: Boolean(token && selectedCustomerId) }); useEffect(() => { setSelectedLocationId(""); setSelectedContactId(""); setSelectedDeviceId(""); setError(""); }, [selectedCustomerId]); useEffect(() => { const data = customerData.data; if (!data) { return; } if (data.locations.length === 1) { setSelectedLocationId(data.locations[0].id); } if (data.contacts.length === 1) { setSelectedContactId(data.contacts[0].id); } if (data.devices.length === 1) { setSelectedDeviceId(data.devices[0].id); } if (validationType === "Revalidierung" && data.devices.length > 0 && !selectedDeviceId) { const previousDevice = data.validations[0]?.device_id; if (previousDevice) { setSelectedDeviceId(previousDevice); } } }, [customerData.data, selectedDeviceId, validationType]); const selectedCustomer = customers.data?.items.find((item) => item.id === selectedCustomerId) ?? customerData.data?.customer ?? null; const selectedDevice = customerData.data?.devices.find((item) => item.id === selectedDeviceId) ?? null; const selectedLocation = customerData.data?.locations.find((item) => item.id === selectedLocationId) ?? null; const selectedContact = customerData.data?.contacts.find((item) => item.id === selectedContactId) ?? null; const currentExaminer = user ? `${user.first_name} ${user.last_name}` : "nicht angemeldet"; const latestValidation = useMemo(() => { if (!selectedDeviceId) { return null; } return customerData.data?.validations.find((item) => item.device_id === selectedDeviceId) ?? null; }, [customerData.data?.validations, selectedDeviceId]); const createMutation = useMutation({ mutationFn: async () => apiFetch( "/validations/quick-start", token ?? "", { method: "POST", body: JSON.stringify({ customer_id: selectedCustomerId, location_id: selectedLocationId || null, contact_id: selectedContactId || null, device_id: selectedDeviceId || null, validation_type: validationType }) } ), onSuccess: (created) => { window.location.replace(`/validations/${created.id}/edit`); }, onError: (err: Error) => setError(err.message) }); const customerCards = customers.data?.items ?? []; const canCreate = Boolean(selectedCustomerId) && Boolean(selectedDeviceId) && (customerData.data?.locations.length ?? 0) > 0 && ((customerData.data?.locations.length ?? 0) === 1 ? Boolean(selectedLocationId) : Boolean(selectedLocationId)) && !createMutation.isPending; return (

Quickstart

Neue Validierung starten

Wir fassen die wichtigsten Entscheidungen zusammen und öffnen danach direkt die bestehende Validierungsbearbeitung.

1 Kunde 2 Gerät 3 Validierungsart 4 Erstellen

1. Kunde

{selectedCustomer && Ausgewählt}
{customers.isError &&

Kunden konnten nicht geladen werden.

}
{customerCards.map((item) => { const active = item.id === selectedCustomerId; return ( ); })} {customers.isLoading &&

Kunden werden geladen...

} {!customers.isLoading && !customers.isError && customerCards.length === 0 &&

Keine Kunden gefunden.

}

2. Gerät

{selectedDevice && Ausgewählt}
{customerData.isError &&

Kundendaten konnten nicht geladen werden.

}
{(customerData.data?.devices ?? []).map((item) => { const active = item.id === selectedDeviceId; const latest = customerData.data?.validations.find((validation) => validation.device_id === item.id) ?? null; return ( ); })} {customerData.isLoading && selectedCustomerId &&

Geräte werden geladen...

} {selectedCustomerId && !customerData.isLoading && !customerData.isError && (customerData.data?.devices.length ?? 0) === 0 &&

Keine Geräte gefunden.

}

3. Validierungsart

{Object.entries(validationTypeLabels).map(([value, label]) => { const active = validationType === value; return ( ); })}

4. Übernahme vorhandener Daten

{(customerData.data?.validations.length ?? 0) > 0 && (

Letzte Validierungen

{customerData.data?.validations.slice(0, 3).map((item) => (

{item.report_number}

{item.validation_type ?? "Validierung"} · {item.performed_on ?? "nicht erfasst"}

{item.next_validation_on ? `Naechste Revalidierung: ${item.next_validation_on}` : "Naechste Revalidierung nicht erfasst"}

))}
)} {selectedCustomer && (
{customerData.isLoading ? "Vorhandene Daten werden geladen..." : "Vorhandene Daten stehen bereit."}
)}
{error ?

{error}

:

Nach dem Erstellen öffnet sich direkt die Bearbeitungsseite.

}
); } function InfoCard({ label, value }: { label: string; value: string }) { return (

{label}

{value}

); }