'use client'; import { useState, useEffect, FormEvent, ChangeEvent } from 'react'; import { useRouter } from 'next/navigation'; import Image from 'next/image'; interface User { id: string; username: string; avatar: string | null; theme: string; createdAt: string; modifiedAt: string; } interface ProfileEditorProps { isAdmin?: boolean; } export default function ProfileEditor({ isAdmin = false }: ProfileEditorProps) { const router = useRouter(); const [user, setUser] = useState(null); const [formData, setFormData] = useState({ username: '', password: '', // Optional for updates theme: 'system', // Default to system }); const [avatar, setAvatar] = useState(null); const [avatarPreview, setAvatarPreview] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); // Fetch current user data useEffect(() => { const fetchUser = async () => { try { const response = await fetch('/api/auth'); const data = await response.json(); if (!data.authenticated) { router.push(isAdmin ? '/admin/login' : '/'); return; } setUser(data.user); setFormData({ username: data.user.username, password: '', // Don't populate password theme: data.user.theme || 'system', }); if (data.user.avatar) { setAvatarPreview(data.user.avatar); } setIsLoading(false); } catch (err) { setError('Failed to load user data'); setIsLoading(false); } }; fetchUser(); }, [router, isAdmin]); const handleChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; const handleAvatarChange = (e: ChangeEvent) => { if (e.target.files && e.target.files[0]) { const file = e.target.files[0]; setAvatar(file); // Create a preview URL const reader = new FileReader(); reader.onloadend = () => { setAvatarPreview(reader.result as string); }; reader.readAsDataURL(file); } }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); setIsSubmitting(true); setError(null); setSuccessMessage(null); try { // Validate form if (!formData.username) { throw new Error('Username is required'); } if (!user) { throw new Error('User not found'); } // Create form data for submission const submitData = new FormData(); submitData.append('username', formData.username); submitData.append('theme', formData.theme); // Only include password if it was changed if (formData.password) { submitData.append('password', formData.password); } // Only include avatar if a new one was selected if (avatar) { submitData.append('avatar', avatar); } // Submit the form const response = await fetch(`/api/users/${user.id}`, { method: 'PUT', body: submitData, }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Failed to update profile'); } // Update the user data const updatedUser = await response.json(); setUser(updatedUser); // Show success message setSuccessMessage('Profile updated successfully'); // Clear password field setFormData(prev => ({ ...prev, password: '' })); // Refresh the page to update the UI router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setIsSubmitting(false); } }; if (isLoading) { return
Loading...
; } return (

Edit Profile

{error && (

{error}

)} {successMessage && (

{successMessage}

)}

Choose your preferred theme or use your system settings.

{avatarPreview && (
Avatar preview
)}
); }