"use client"; import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter, useParams } from "next/navigation"; import Link from "next/link"; import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import { Input } from "@/components/ui/Input"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import { LoadingState } from "@/components/ui/States"; export default function EditUserPage() { const [user, setUser] = useState(null); const [formData, setFormData] = useState({ name: "", username: "", role: "user", is_active: true, password: "" }); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); const { data: session, status } = useSession(); const router = useRouter(); const params = useParams(); // Check if user is admin useEffect(() => { if (status === "loading") return; if (!session || session.user.role !== "admin") { router.push("/"); return; } }, [session, status, router]); // Fetch user data useEffect(() => { if (session?.user?.role === "admin" && params.id) { fetchUser(); } }, [session, params.id]); const fetchUser = async () => { try { setLoading(true); const response = await fetch(`/api/admin/users/${params.id}`); if (!response.ok) { if (response.status === 404) { setError("User not found"); return; } throw new Error("Failed to fetch user"); } const userData = await response.json(); setUser(userData); setFormData({ name: userData.name, username: userData.username, role: userData.role, is_active: userData.is_active, password: "" // Never populate password field }); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleSubmit = async (e) => { e.preventDefault(); setSaving(true); setError(""); setSuccess(""); try { // Prepare update data (exclude empty password) const updateData = { name: formData.name, username: formData.username, role: formData.role, is_active: formData.is_active }; // Only include password if it's provided if (formData.password.trim()) { if (formData.password.length < 6) { throw new Error("Password must be at least 6 characters long"); } updateData.password = formData.password; } const response = await fetch(`/api/admin/users/${params.id}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(updateData), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || "Failed to update user"); } const updatedUser = await response.json(); setUser(updatedUser); setSuccess("User updated successfully"); // Clear password field after successful update setFormData(prev => ({ ...prev, password: "" })); } catch (err) { setError(err.message); } finally { setSaving(false); } }; if (status === "loading" || !session) { return ; } if (session.user.role !== "admin") { return (

Access Denied

You need admin privileges to access this page.

); } if (loading) { return ; } if (error && !user) { return (

Error

{error}

); } return ( {error && (

{error}

)} {success && (

{success}

)}

User Information

setFormData({ ...formData, name: e.target.value })} required />
setFormData({ ...formData, username: e.target.value })} required />
setFormData({ ...formData, password: e.target.value })} placeholder="Leave blank to keep current password" minLength={6} />

Leave blank to keep the current password

setFormData({ ...formData, is_active: e.target.checked })} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" disabled={user?.id === session?.user?.id} />
{/* User Details Card */} {user && (

Account Details

Created

{new Date(user.created_at).toLocaleDateString()}

Last Updated

{user.updated_at ? new Date(user.updated_at).toLocaleDateString() : "Never"}

Last Login

{user.last_login ? new Date(user.last_login).toLocaleDateString() : "Never"}

Failed Login Attempts

{user.failed_login_attempts || 0}

Account Status

{user.is_active ? "Active" : "Inactive"}

Account Locked

{user.locked_until && new Date(user.locked_until) > new Date() ? `Until ${new Date(user.locked_until).toLocaleDateString()}` : "No" }

)}
); }