import React, { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useContact, useCreateContact, useUpdateContact, useCompanies, Company } from '@/api/hooks'; import { Input } from '@/components/ui/Input'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { Skeleton } from '@/components/ui/Skeleton'; import { Badge } from '@/components/ui/Badge'; import { useToast } from '@/components/ui/Toast'; import { UnsavedChangesGuard } from '@/components/shared/UnsavedChangesGuard'; const contactSchema = z.object({ first_name: z.string().min(1, 'Vorname ist erforderlich').max(100), last_name: z.string().min(1, 'Nachname ist erforderlich').max(100), email: z.string().email('Ungültige E-Mail-Adresse').max(255).optional().or(z.literal('')), phone: z.string().max(30).optional().or(z.literal('')), position: z.string().max(100).optional().or(z.literal('')), address_street: z.string().max(255).optional().or(z.literal('')), address_city: z.string().max(100).optional().or(z.literal('')), address_zip: z.string().max(20).optional().or(z.literal('')), address_country: z.string().max(2).optional().or(z.literal('')), address_state: z.string().max(100).optional().or(z.literal('')), }); type ContactFormValues = z.infer; export function ContactFormPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { t } = useTranslation(); const toast = useToast(); const isEdit = !!id; const { data: contact, isLoading } = useContact(isEdit ? id : undefined); const createMutation = useCreateContact(); const updateMutation = useUpdateContact(); const { data: companiesData } = useCompanies(1, 100); const [selectedCompanyIds, setSelectedCompanyIds] = useState([]); const { register, handleSubmit, reset, formState: { errors, isDirty, isSubmitting }, } = useForm({ resolver: zodResolver(contactSchema), defaultValues: { first_name: '', last_name: '', email: '', phone: '', position: '', address_street: '', address_city: '', address_zip: '', address_country: '', address_state: '', }, }); useEffect(() => { if (isEdit && contact) { reset({ first_name: contact.first_name || '', last_name: contact.last_name || '', email: contact.email || '', phone: contact.phone || '', position: contact.position || '', address_street: (contact as any).address_street || '', address_city: (contact as any).address_city || '', address_zip: (contact as any).address_zip || '', address_country: (contact as any).address_country || '', address_state: (contact as any).address_state || '', }); setSelectedCompanyIds(contact.company_ids || (contact.companies?.map((c) => c.id) || [])); } }, [contact, isEdit, reset]); const toggleCompany = (companyId: string) => { setSelectedCompanyIds((prev) => prev.includes(companyId) ? prev.filter((cid) => cid !== companyId) : [...prev, companyId] ); }; const onSubmit = async (values: ContactFormValues) => { const payload = { ...values, company_ids: selectedCompanyIds }; try { if (isEdit && id) { await updateMutation.mutateAsync({ id, data: payload }); toast.success(t('contacts.updated')); navigate(`/contacts/${id}`); } else { const result = await createMutation.mutateAsync(payload) as { id: string }; toast.success(t('contacts.created')); navigate(`/contacts/${result.id}`); } } catch (err: any) { toast.error(err.message || (isEdit ? t('contacts.updateFailed') : t('contacts.createFailed'))); } }; if (isEdit && isLoading) { return (
); } const availableCompanies: Company[] = companiesData?.items ?? []; return (
0} />

{isEdit ? t('contacts.edit') : t('contacts.create')}

{availableCompanies.length === 0 ? (

{t('companies.emptyTitle')}

) : (
{availableCompanies.map((company) => ( ))}
)} {selectedCompanyIds.length > 0 && (

{selectedCompanyIds.length} {selectedCompanyIds.length === 1 ? 'Firma zugewiesen' : 'Firmen zugewiesen'}

)}
); }