"use client"; import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { Card, CardHeader, CardContent } from "@/components/ui/Card"; import Button from "@/components/ui/Button"; import Badge from "@/components/ui/Badge"; import { Input } from "@/components/ui/Input"; import PageContainer from "@/components/ui/PageContainer"; import PageHeader from "@/components/ui/PageHeader"; import { LoadingState } from "@/components/ui/States"; import { formatDate } from "@/lib/utils"; import { useTranslation } from "@/lib/i18n"; export default function UserManagementPage() { const { t } = useTranslation(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [showCreateForm, setShowCreateForm] = useState(false); const { data: session, status } = useSession(); const router = useRouter(); // Check if user is admin useEffect(() => { if (status === "loading") return; if (!session || session.user.role !== "admin") { router.push("/"); return; } }, [session, status, router]); // Fetch users useEffect(() => { if (session?.user?.role === "admin") { fetchUsers(); } }, [session]); const fetchUsers = async () => { try { setLoading(true); const response = await fetch("/api/admin/users"); if (!response.ok) { throw new Error("Failed to fetch users"); } const data = await response.json(); setUsers(data); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleDeleteUser = async (userId) => { if (!confirm(t('admin.deleteUser') + "?")) return; try { const response = await fetch(`/api/admin/users/${userId}`, { method: "DELETE", }); if (!response.ok) { throw new Error("Failed to delete user"); } setUsers(users.filter(user => user.id !== userId)); } catch (err) { setError(err.message); } }; const handleToggleUser = async (userId, isActive) => { try { const response = await fetch(`/api/admin/users/${userId}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ is_active: !isActive }), }); if (!response.ok) { throw new Error("Failed to update user"); } setUsers(users.map(user => user.id === userId ? { ...user, is_active: !isActive } : user )); } catch (err) { setError(err.message); } }; const handleToggleAssignable = async (userId, canBeAssigned) => { try { const response = await fetch(`/api/admin/users/${userId}`, { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ can_be_assigned: !canBeAssigned }), }); if (!response.ok) { throw new Error("Failed to update user"); } setUsers(users.map(user => user.id === userId ? { ...user, can_be_assigned: !canBeAssigned } : user )); } catch (err) { setError(err.message); } }; const getRoleColor = (role) => { switch (role) { case "admin": return "red"; case "team_lead": return "purple"; case "project_manager": return "blue"; case "user": return "green"; case "read_only": return "gray"; default: return "gray"; } }; const getRoleDisplay = (role) => { switch (role) { case "project_manager": return "Project Manager"; case "team_lead": return "Team Lead"; case "read_only": return "Read Only"; default: return role.charAt(0).toUpperCase() + role.slice(1); } }; if (status === "loading" || !session) { return ; } if (session.user.role !== "admin") { return (

Access Denied

You need admin privileges to access this page.

); } return ( {error && (

{error}

)} {loading ? ( ) : (
{/* Users List */}
{users.length === 0 ? (

No Users Found

Start by creating your first user.

) : ( users.map((user) => (

{user.name}

{user.username}

{user.initial && (

Initial: {user.initial}

)}
{getRoleDisplay(user.role)} {user.is_active ? "Active" : "Inactive"} {user.can_be_assigned ? "Assignable" : "Not Assignable"}

Created

{formatDate(user.created_at)}

Last Login

{user.last_login ? formatDate(user.last_login) : "Never"}

Failed Attempts

{user.failed_login_attempts || 0}

{user.locked_until && new Date(user.locked_until) > new Date() && (

Account locked until {formatDate(user.locked_until)}

)}
handleToggleAssignable(user.id, user.can_be_assigned)} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" />
)) )}
)} {/* Create User Modal/Form */} {showCreateForm && ( setShowCreateForm(false)} onUserCreated={(newUser) => { setUsers([...users, newUser]); setShowCreateForm(false); }} /> )}
); } // Create User Modal Component function CreateUserModal({ onClose, onUserCreated }) { const [formData, setFormData] = useState({ name: "", username: "", password: "", role: "user", is_active: true, can_be_assigned: true }); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const handleSubmit = async (e) => { e.preventDefault(); setLoading(true); setError(""); try { const response = await fetch("/api/admin/users", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || "Failed to create user"); } const newUser = await response.json(); onUserCreated(newUser); } catch (err) { setError(err.message); } finally { setLoading(false); } }; return (

Create New User

{error && (

{error}

)}
setFormData({ ...formData, name: e.target.value })} required />
setFormData({ ...formData, username: e.target.value })} required />
setFormData({ ...formData, password: e.target.value })} required minLength={6} />
setFormData({ ...formData, is_active: e.target.checked })} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" />
setFormData({ ...formData, can_be_assigned: e.target.checked })} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" />
); }