'use client'; import { useEffect, useState } from 'react'; import { useI18n } from '../components/I18nProvider'; type User = { id: string; email: string; role: string; status: string; emailVerifiedAt: string | null; approvedAt: string | null; name: string | null; phone: string | null }; type ListingOverride = { id: string; label: string; bankAccount: string; vatBreakdownRequired: boolean }; type BillingSettings = { agentBillingEnabled: boolean; agentBankAccount: string; agentVatBreakdownRequired: boolean; agentUseListingOverrides: boolean; listingOverrides: ListingOverride[]; }; export default function ProfilePage() { const { t } = useI18n(); const [user, setUser] = useState(null); const [error, setError] = useState(null); const [name, setName] = useState(''); const [phone, setPhone] = useState(''); const [password, setPassword] = useState(''); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(null); const [billingSettings, setBillingSettings] = useState(null); const [billingError, setBillingError] = useState(null); const [billingMessage, setBillingMessage] = useState(null); const [billingSaving, setBillingSaving] = useState(false); useEffect(() => { const load = async () => { try { const res = await fetch('/api/auth/me', { cache: 'no-store' }); const data = await res.json(); if (data.user) { setUser(data.user); setName(data.user.name ?? ''); setPhone(data.user.phone ?? ''); const billingRes = await fetch('/api/billing-settings', { cache: 'no-store' }); const billingData = await billingRes.json(); if (billingRes.ok && billingData.settings) { setBillingSettings({ agentBillingEnabled: billingData.settings.agentBillingEnabled, agentBankAccount: billingData.settings.agentBankAccount ?? '', agentVatBreakdownRequired: billingData.settings.agentVatBreakdownRequired, agentUseListingOverrides: billingData.settings.agentUseListingOverrides, listingOverrides: billingData.listingOverrides ?? [], }); } else { setBillingError(billingData.error || 'Failed to load billing settings'); } } else { setError(t('notLoggedIn')); } } catch (err) { setError(t('notLoggedIn')); } }; load(); }, [t]); async function onSave(e: React.FormEvent) { e.preventDefault(); setSaving(true); setError(null); setMessage(null); try { const res = await fetch('/api/me', { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, phone, password: password || undefined }), }); const data = await res.json(); if (!res.ok) { setError(data.error || 'Update failed'); } else { setUser(data.user); setPassword(''); setMessage(t('profileUpdated')); } } catch (err) { setError('Update failed'); } finally { setSaving(false); } } async function onSaveBilling(e: React.FormEvent) { e.preventDefault(); if (!billingSettings) return; setBillingSaving(true); setBillingError(null); setBillingMessage(null); try { const res = await fetch('/api/billing-settings', { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ agentBillingEnabled: billingSettings.agentBillingEnabled, agentBankAccount: billingSettings.agentBankAccount, agentVatBreakdownRequired: billingSettings.agentVatBreakdownRequired, agentUseListingOverrides: billingSettings.agentUseListingOverrides, listingOverrides: billingSettings.listingOverrides.map((o) => ({ listingId: o.id, bankAccount: o.bankAccount, vatBreakdownRequired: o.vatBreakdownRequired, })), }), }); const data = await res.json(); if (!res.ok) { setBillingError(data.error || 'Update failed'); } else { setBillingMessage(t('billingSettingsSaved')); } } catch (err) { setBillingError('Update failed'); } finally { setBillingSaving(false); } } return (

{t('myProfileTitle')}

{message ?

{message}

: null} {user ? ( <>
  • {t('profileEmail')}: {user.email}
  • {t('profileName')}: {user.name ?? '—'}
  • {t('profilePhone')}: {user.phone ?? '—'}
  • {t('profileRole')}: {user.role}
  • {t('profileStatus')}: {user.status}
  • {t('profileEmailVerified')}: {user.emailVerifiedAt ? t('yes') : t('no')}
  • {t('profileApproved')}: {user.approvedAt ? t('yes') : t('no')}

{t('emailLocked')}

{t('billingAgentTitle')}

{billingMessage ?

{billingMessage}

: null} {billingError ?

{billingError}

: null} {billingSettings ? (

{t('billingAgentOptInHelp')}

{billingSettings.agentBillingEnabled && billingSettings.agentUseListingOverrides ? (
{billingSettings.listingOverrides.length === 0 ? (

{t('billingNoListings')}

) : ( billingSettings.listingOverrides.map((listing) => (
{listing.label}
)) )}
) : null}
) : (

{t('loading')}

)}
) : (

{error ?? t('notLoggedIn')}

)}
); }