'use client'; import { useState, useEffect, FormEvent, ChangeEvent } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import Image from 'next/image'; interface User { id: string; username: string; avatar: string | null; createdAt: string; modifiedAt: string; } interface EditUserProps { id: string; } export default function EditUser({ id }: EditUserProps) { const router = useRouter(); const [formData, setFormData] = useState({ username: '', password: '', // Optional for updates }); 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); // Fetch user data useEffect(() => { const fetchUser = async () => { try { const response = await fetch(`/api/users/${id}`); if (!response.ok) { throw new Error('Failed to fetch user'); } const user: User = await response.json(); setFormData({ username: user.username, password: '', // Don't populate password }); if (user.avatar) { setAvatarPreview(user.avatar); } setIsLoading(false); } catch (err) { setError('Failed to load user data'); setIsLoading(false); } }; fetchUser(); }, [id]); 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); try { // Validate form if (!formData.username) { throw new Error('Username is required'); } // Create form data for submission const submitData = new FormData(); submitData.append('username', formData.username); // 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/${id}`, { method: 'PUT', body: submitData, }); if (!response.ok) { const data = await response.json(); throw new Error(data.error || 'Failed to update user'); } // Redirect to users list on success router.push('/admin/users'); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); setIsSubmitting(false); } }; if (isLoading) { return
Loading...
; } return (

Edit User

Back to Users
{error && (

{error}

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