diff --git a/shop/app/account-kunden/AccountSettingsForm.tsx b/shop/app/account-kunden/AccountSettingsForm.tsx new file mode 100644 index 0000000..bd42cd7 --- /dev/null +++ b/shop/app/account-kunden/AccountSettingsForm.tsx @@ -0,0 +1,346 @@ +'use client'; + +import { useState } from 'react'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { updateUserProfile, updateCompanyDetails } from '@/lib/actions/users'; +import { updatePassword } from '@/lib/actions/auth'; +import { Save, KeyRound, Loader2 } from 'lucide-react'; + +interface AccountSettingsFormProps { + userId: string; + profile: any; + company: any; +} + +export function AccountSettingsForm({ userId, profile, company }: AccountSettingsFormProps) { + // Profil State + const [firstName, setFirstName] = useState(profile?.first_name || ''); + const [lastName, setLastName] = useState(profile?.last_name || ''); + const [profileMessage, setProfileMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); + const [isUpdatingProfile, setIsUpdatingProfile] = useState(false); + + // Company State + const [street, setStreet] = useState(company?.street || ''); + const [zip, setZip] = useState(company?.zip || ''); + const [city, setCity] = useState(company?.city || ''); + const [companyEmail, setCompanyEmail] = useState(company?.email || ''); + const [companyMessage, setCompanyMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); + const [isUpdatingCompany, setIsUpdatingCompany] = useState(false); + + // Passwort State + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [passwordMessage, setPasswordMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); + const [isUpdatingPassword, setIsUpdatingPassword] = useState(false); + + // Profil speichern + const handleUpdateProfile = async (e: React.FormEvent) => { + e.preventDefault(); + setProfileMessage(null); + setIsUpdatingProfile(true); + + try { + const res = await updateUserProfile(userId, { + first_name: firstName || null, + last_name: lastName || null, + }); + + if (res.success) { + setProfileMessage({ type: 'success', text: 'Persönliche Daten erfolgreich aktualisiert.' }); + } else { + setProfileMessage({ type: 'error', text: res.error || 'Fehler beim Aktualisieren des Profils.' }); + } + } catch (err: any) { + setProfileMessage({ type: 'error', text: err.message || 'Ein unerwarteter Fehler ist aufgetreten.' }); + } finally { + setIsUpdatingProfile(false); + } + }; + + // Company speichern + const handleUpdateCompany = async (e: React.FormEvent) => { + e.preventDefault(); + if (!company?.id) return; + setCompanyMessage(null); + setIsUpdatingCompany(true); + + try { + const res = await updateCompanyDetails(company.id, { + street: street || null, + zip: zip || null, + city: city || null, + email: companyEmail || null, + }); + + if (res.success) { + setCompanyMessage({ type: 'success', text: 'Unternehmensdaten erfolgreich aktualisiert.' }); + } else { + setCompanyMessage({ type: 'error', text: res.error || 'Fehler beim Aktualisieren der Unternehmensdaten.' }); + } + } catch (err: any) { + setCompanyMessage({ type: 'error', text: err.message || 'Ein unerwarteter Fehler ist aufgetreten.' }); + } finally { + setIsUpdatingCompany(false); + } + }; + + // Passwort speichern + const handleUpdatePassword = async (e: React.FormEvent) => { + e.preventDefault(); + setPasswordMessage(null); + + if (newPassword.length < 6) { + setPasswordMessage({ type: 'error', text: 'Das Passwort muss mindestens 6 Zeichen lang sein.' }); + return; + } + + if (newPassword !== confirmPassword) { + setPasswordMessage({ type: 'error', text: 'Die Passwörter stimmen nicht überein.' }); + return; + } + + setIsUpdatingPassword(true); + + try { + const res = await updatePassword(newPassword); + if (res.success) { + setPasswordMessage({ type: 'success', text: 'Passwort erfolgreich geändert.' }); + setNewPassword(''); + setConfirmPassword(''); + } else { + setPasswordMessage({ type: 'error', text: res.error || 'Fehler beim Ändern des Passworts.' }); + } + } catch (err: any) { + setPasswordMessage({ type: 'error', text: err.message || 'Ein unerwarteter Fehler ist aufgetreten.' }); + } finally { + setIsUpdatingPassword(false); + } + }; + + return ( +
+ Verwalten Sie Ihre persönlichen Profildaten, Unternehmensdaten und Sicherheitseinstellungen. +
+Kein Unternehmen zugewiesen
++ Wenden Sie sich an einen Administrator, um Ihrem Account ein Partner-Unternehmen zuzuweisen. +
+