'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import PageLayout from '../../../components/PageLayout' import useAuthStore from '../../../store/authStore' import { useUserStatus } from '../../../hooks/useUserStatus' interface PersonalProfileData { dob: string nationality: string street: string postalCode: string city: string country: string accountHolder: string iban: string secondPhone: string emergencyName: string emergencyPhone: string } // Common nationalities list const NATIONALITIES = [ 'German', 'Austrian', 'Swiss', 'Italian', 'French', 'Spanish', 'Portuguese', 'Dutch', 'Belgian', 'Polish', 'Czech', 'Hungarian', 'Croatian', 'Slovenian', 'Slovak', 'British', 'Irish', 'Swedish', 'Norwegian', 'Danish', 'Finnish', 'Russian', 'Turkish', 'Greek', 'Romanian', 'Bulgarian', 'Serbian', 'Albanian', 'Bosnian', 'American', 'Canadian', 'Brazilian', 'Argentinian', 'Mexican', 'Chinese', 'Japanese', 'Indian', 'Pakistani', 'Australian', 'South African', 'Other' ] // Common countries list const COUNTRIES = [ 'Germany', 'Austria', 'Switzerland', 'Italy', 'France', 'Spain', 'Portugal', 'Netherlands', 'Belgium', 'Poland', 'Czech Republic', 'Hungary', 'Croatia', 'Slovenia', 'Slovakia', 'United Kingdom', 'Ireland', 'Sweden', 'Norway', 'Denmark', 'Finland', 'Russia', 'Turkey', 'Greece', 'Romania', 'Bulgaria', 'Serbia', 'Albania', 'Bosnia and Herzegovina', 'United States', 'Canada', 'Brazil', 'Argentina', 'Mexico', 'China', 'Japan', 'India', 'Pakistan', 'Australia', 'South Africa', 'Other' ] const initialData: PersonalProfileData = { dob: '', nationality: '', street: '', postalCode: '', city: '', country: '', accountHolder: '', iban: '', secondPhone: '', emergencyName: '', emergencyPhone: '' } export default function PersonalAdditionalInformationPage() { const router = useRouter() const { accessToken } = useAuthStore() const { refreshStatus } = useUserStatus() const [form, setForm] = useState(initialData) const [loading, setLoading] = useState(false) const [success, setSuccess] = useState(false) const [error, setError] = useState('') const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target setForm(p => ({ ...p, [name]: value })) setError('') } const validateDateOfBirth = (dob: string) => { if (!dob) return false const birthDate = new Date(dob) const today = new Date() // Check if date is valid if (isNaN(birthDate.getTime())) return false // Check if birth date is not in the future if (birthDate > today) return false // Check minimum age (18 years) const minDate = new Date() minDate.setFullYear(today.getFullYear() - 18) if (birthDate > minDate) return false // Check maximum age (120 years) const maxDate = new Date() maxDate.setFullYear(today.getFullYear() - 120) if (birthDate < maxDate) return false return true } const validate = () => { const requiredKeys: (keyof PersonalProfileData)[] = [ 'dob','nationality','street','postalCode','city','country','accountHolder','iban' ] for (const k of requiredKeys) { if (!form[k].trim()) { setError('Bitte alle Pflichtfelder ausfüllen.') return false } } // Date of birth validation if (!validateDateOfBirth(form.dob)) { setError('Ungültiges Geburtsdatum. Sie müssen mindestens 18 Jahre alt sein.') return false } // very loose IBAN check if (!/^([A-Z]{2}\d{2}[A-Z0-9]{10,30})$/i.test(form.iban.replace(/\s+/g,''))) { setError('Ungültige IBAN.') return false } setError('') return true } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (loading || success) return if (!validate()) return if (!accessToken) { setError('Not authenticated. Please log in again.') return } setLoading(true) try { // Prepare data for backend with correct field names const profileData = { dateOfBirth: form.dob, nationality: form.nationality, address: form.street, // Backend expects 'address', not nested object zip_code: form.postalCode, // Backend expects 'zip_code' city: form.city, country: form.country, phoneSecondary: form.secondPhone || null, // Backend expects 'phoneSecondary' emergencyContactName: form.emergencyName || null, emergencyContactPhone: form.emergencyPhone || null, accountHolderName: form.accountHolder, // Backend expects 'accountHolderName' iban: form.iban.replace(/\s+/g, '') // Remove spaces from IBAN } const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/profile/personal/complete`, { method: 'POST', headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify(profileData) }) if (!response.ok) { const errorData = await response.json().catch(() => ({ message: 'Save failed' })) throw new Error(errorData.message || 'Save failed') } setSuccess(true) // Refresh user status to update profile completion state await refreshStatus() // Redirect to next step after short delay setTimeout(() => { router.push('/quickaction-dashboard/register-sign-contract/personal') }, 1500) } catch (error: any) { console.error('Personal profile save error:', error) setError(error.message || 'Speichern fehlgeschlagen. Bitte erneut versuchen.') } finally { setLoading(false) } } return (
{/* Background */}

Complete Your Profile

{/* Personal Information */}

Personal Information


{/* Bank Details */}

Bank Details


{/* Additional Information */}

Additional Information

{error && (
{error}
)} {success && (
Daten gespeichert.
)}
) }