"use client"; import { Download, FileUp, Play, Upload } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import ImportPreviewTable from "@/components/customers/ImportPreviewTable"; import ImportSummaryCard from "@/components/customers/ImportSummaryCard"; import { Button, buttonVariants } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { api } from "@/lib/api"; import type { CustomerImportCommitResponse, CustomerImportMode, CustomerImportPreviewResponse, } from "@/types/customer"; type Props = { open: boolean; onOpenChange: (open: boolean) => void; onCommitted: (result: CustomerImportCommitResponse) => void; onError: (message: string) => void; }; function errorMessage(error: unknown) { if (typeof error === "object" && error !== null && "response" in error) { const response = (error as { response?: { data?: { detail?: string } } }).response; return response?.data?.detail ?? "Import konnte nicht ausgeführt werden"; } return "Import konnte nicht ausgeführt werden"; } function buildFormData(file: File, mode: CustomerImportMode) { const formData = new FormData(); formData.append("mode", mode); formData.append("file", file); return formData; } export default function CustomerImportDialog({ open, onOpenChange, onCommitted, onError }: Props) { const [file, setFile] = useState(null); const [mode, setMode] = useState("upsert"); const [preview, setPreview] = useState(null); const [pending, setPending] = useState(false); const [serverError, setServerError] = useState(""); async function runPreview() { if (!file) { setServerError("Bitte CSV-Datei auswählen"); return; } setPending(true); setServerError(""); try { const response = await api.post( "/customers/import/preview", buildFormData(file, mode), ); setPreview(response.data); } catch (error) { const message = errorMessage(error); setServerError(message); onError(message); } finally { setPending(false); } } async function commitImport() { if (!file || !preview || preview.summary.valid_rows === 0) { return; } setPending(true); setServerError(""); try { const response = await api.post( "/customers/import/commit", buildFormData(file, mode), ); onCommitted(response.data); setPreview(null); setFile(null); onOpenChange(false); } catch (error) { const message = errorMessage(error); setServerError(message); onError(message); } finally { setPending(false); } } return ( Kunden importieren CSV-Datei prüfen und anschließend gültige Zeilen übernehmen.
{ setFile(event.target.files?.[0] ?? null); setPreview(null); setServerError(""); }} />
Vorlage
{serverError &&

{serverError}

} {preview && (
)}
); }