import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { debugLog, handleApiError } from "@/lib/client-validation"; import { useState, useEffect } from "react"; const schema = z.object({ name: z.string().min(1, "Name ist erforderlich"), legalForm: z.string().optional(), taxId: z.string().optional(), vatId: z.string().optional(), address: z.string().min(1, "Adresse ist erforderlich"), zip: z.string().min(1, "PLZ ist erforderlich"), city: z.string().min(1, "Ort ist erforderlich"), country: z.string().optional(), email: z.string().email("Ungültige E-Mail").optional().or(z.literal("")), phone: z.string().optional(), website: z.string().optional(), bankIban: z.string().optional(), bankBic: z.string().optional(), bankName: z.string().optional(), invoicePrefix: z.string().optional(), kleinunternehmer: z.boolean().optional(), }); type FormData = z.infer; interface CompanyFormProps { defaultValues?: Partial; onSubmit: (data: FormData) => Promise; submitLabel?: string; } function Field({ label, error, tooltip, required = false, children }: { label: string; error?: string; tooltip?: string; required?: boolean; children: React.ReactNode }) { const [showRequiredTooltip, setShowRequiredTooltip] = useState(false); // Debug: log errors to console if (error) { console.log(`[Field Error] ${label}: ${error}`); } return (
{children}
{/* Show error tooltip ONLY when there's an error */} {error && (

{error}

{tooltip &&

{tooltip}

}
)}
); } export function CompanyForm({ defaultValues, onSubmit, submitLabel = "Speichern" }: CompanyFormProps) { const [apiError, setApiError] = useState(null); const [validationError, setValidationError] = useState(null); const { register, handleSubmit, formState: { errors, isSubmitting, isValid }, watch, trigger } = useForm({ resolver: zodResolver(schema), mode: "onBlur", // Validate when user leaves field defaultValues: { country: "DE", invoicePrefix: "RE", kleinunternehmer: false, ...defaultValues }, }); // Debug: log all errors useEffect(() => { if (Object.keys(errors).length > 0) { console.log("[Form Errors]", errors); } }, [errors]); // Watch form data for debug logging const formData = watch(); const handleFormSubmit = async (data: FormData) => { // Trigger validation to check if form is actually valid const isFormValid = await trigger(); if (!isFormValid) { // Build error message from validation errors const errorFields: string[] = []; if (errors.name) errorFields.push("Firmenname"); if (errors.address) errorFields.push("Adresse"); if (errors.zip) errorFields.push("Postleitzahl"); if (errors.city) errorFields.push("Ort/Stadt"); if (errors.email) errorFields.push("E-Mail"); if (errors.taxId) errorFields.push("Steuernummer"); if (errors.vatId) errorFields.push("USt-IdNr."); if (errors.bankIban) errorFields.push("IBAN"); if (errors.bankBic) errorFields.push("BIC"); const fieldList = errorFields.length > 0 ? errorFields.join(", ") : "Bitte überprüfen Sie die rot gekennzeichneten Felder"; const message = `Folgende Felder sind erforderlich oder falsch: ${fieldList}`; setValidationError(message); debugLog("warning", "Form validation failed", { errors: errorFields }); return; } try { setApiError(null); setValidationError(null); debugLog("info", "Submitting form", data); await onSubmit(data); debugLog("success", "Form submitted successfully"); } catch (error) { debugLog("error", "Form submission failed", error); handleApiError(error, "/api/companies"); // Extract error message for user if (error instanceof Response) { try { const json = await error.clone().json(); const messages = json.error?.map?.((e: any) => e.message)?.join(", ") || json.message || "Ein Fehler ist aufgetreten"; setApiError(messages); } catch { setApiError(`HTTP ${error.status}: ${error.statusText}`); } } else if (error instanceof Error) { setApiError(error.message); } else { setApiError("Ein unbekannter Fehler ist aufgetreten"); } } }; return (
{/* Required fields info banner */}

ℹ️ Erforderliche Felder

Folgende Felder sind erforderlich: Firmenname, Adresse, Postleitzahl, Ort

{/* Validation error banner */} {validationError && (

⚠️ Eingabefehler

{validationError}

)} {/* API error banner */} {apiError && (

❌ Fehler

{apiError}

)}

Stammdaten

Anschrift

Kontakt

Bankverbindung

Rechnungseinstellungen

Format: {"{Präfix}"}-{"{Jahr}"}-{"{Nummer}"} z.B. RE-2024-001

); }