'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import { useAction } from 'next-safe-action/hooks'; import { useRouter } from 'next/navigation'; import { Button } from '@kit/ui/button'; import { Input } from '@kit/ui/input'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@kit/ui/form'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { toast } from '@kit/ui/sonner'; import { CreateMemberSchema } from '../schema/member.schema'; import { createMember } from '../server/actions/member-actions'; interface Props { accountId: string; account: string; // slug for redirect duesCategories: Array<{ id: string; name: string; amount: number }>; } export function CreateMemberForm({ accountId, account, duesCategories }: Props) { const router = useRouter(); const form = useForm({ resolver: zodResolver(CreateMemberSchema), defaultValues: { accountId, firstName: '', lastName: '', email: '', phone: '', mobile: '', street: '', houseNumber: '', postalCode: '', city: '', country: 'DE', memberNumber: '', status: 'active' as const, entryDate: new Date().toISOString().split('T')[0]!, iban: '', bic: '', accountHolder: '', gdprConsent: false, notes: '', }, }); const { execute, isPending } = useAction(createMember, { onSuccess: ({ data }) => { if (data?.success) { toast.success('Mitglied erfolgreich erstellt'); router.push(`/home/${account}/members-cms`); } }, onError: ({ error }) => { toast.error(error.serverError ?? 'Fehler beim Erstellen'); }, }); return (
execute(data))} className="space-y-6"> Persönliche Daten ( Vorname * )} /> ( Nachname * )} /> ( Geburtsdatum )} /> ( Geschlecht )} /> Kontakt ( E-Mail )} /> ( Telefon )} /> ( Mobil )} /> Adresse ( Straße )} /> ( Hausnummer )} /> ( PLZ )} /> ( Ort )} /> Mitgliedschaft ( Mitgliedsnr. )} /> ( Status )} /> ( Eintrittsdatum )} /> {duesCategories.length > 0 && ( ( Beitragskategorie )} /> )} SEPA-Bankdaten ( IBAN field.onChange(e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, ''))} /> )} /> ( BIC )} /> ( Kontoinhaber )} /> {/* Guardian (Gap 4) */} Erziehungsberechtigte (Jugend) ( Name Erziehungsberechtigte/r )} /> ( Telefon )} /> ( E-Mail )} /> {/* Lifecycle flags (Gap 4) */} Mitgliedschaftsmerkmale {([ ['isHonorary', 'Ehrenmitglied'], ['isFoundingMember', 'Gründungsmitglied'], ['isYouth', 'Jugendmitglied'], ['isRetiree', 'Rentner/Senior'], ['isProbationary', 'Probejahr'], ] as const).map(([name, label]) => ( ( {label} )} /> ))} {/* GDPR granular (Gap 4) */} Datenschutz-Einwilligungen {([ ['gdprConsent', 'Allgemeine Einwilligung'], ['gdprNewsletter', 'Newsletter'], ['gdprInternet', 'Internet/Homepage'], ['gdprPrint', 'Vereinszeitung'], ['gdprBirthdayInfo', 'Geburtstagsinfo'], ] as const).map(([name, label]) => ( ( {label} )} /> ))} Sonstiges
( Anrede )} /> ( Geburtsort )} /> ( Adresszusatz )} />
( Notizen