'use client'; import { useEffect, useState, type FormEvent } from 'react'; import { useRouter } from 'next/navigation'; import type { PublicUser } from '@/lib/auth/getCurrentUser'; import { useI18n } from '@/lib/i18n/I18nProvider'; export default function ProfilePage() { const router = useRouter(); const { t, locale, theme, setLocale, setTheme } = useI18n(); const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [avatarUrl, setAvatarUrl] = useState(''); const [error, setError] = useState(null); const [saved, setSaved] = useState(false); useEffect(() => { fetch('/api/auth/me') .then((res) => (res.ok ? res.json() : Promise.reject(res))) .then((data: { user: PublicUser }) => { setUser(data.user); setName(data.user.name); setEmail(data.user.email); setAvatarUrl(data.user.avatarUrl ?? ''); }) .catch(() => router.push('/login')) .finally(() => setLoading(false)); }, [router]); async function onSubmit(event: FormEvent) { event.preventDefault(); setError(null); setSaved(false); const res = await fetch('/api/users/me', { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, email, avatarUrl }), }); if (res.ok) { const data = (await res.json()) as { user: PublicUser }; setUser(data.user); setSaved(true); } else { const data = (await res.json().catch(() => null)) as { error?: { message?: string }; } | null; setError(data?.error?.message ?? t('auth.failed')); } } async function onLogout() { await fetch('/api/auth/logout', { method: 'POST' }); router.push('/login'); } if (loading) { return (

{t('common.loading')}

); } return (

{t('profile.title')}

setName(e.target.value)} className="mt-1 w-full rounded border px-3 py-2 dark:border-gray-600 dark:bg-gray-700" />
setEmail(e.target.value)} className="mt-1 w-full rounded border px-3 py-2 dark:border-gray-600 dark:bg-gray-700" />
setAvatarUrl(e.target.value)} className="mt-1 w-full rounded border px-3 py-2 dark:border-gray-600 dark:bg-gray-700" />
{error && (

{error}

)} {saved && (

{t('profile.saved')}

)}

{t('profile.role')}: {user?.role}

); }