'use client'; import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { useToast } from '@/hooks/use-toast'; import { UserPlus, Edit, Trash2, Search, Users, Mail, Calendar } from 'lucide-react'; interface User { id: string; name: string; surname: string; email: string; role: 'user' | 'admin'; createdAt: string; } interface UserFormData { name: string; surname: string; email: string; role: 'user' | 'admin'; password?: string; } export function AdminUserManagement() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const [editingUser, setEditingUser] = useState(null); const [formData, setFormData] = useState({ name: '', surname: '', email: '', role: 'user', password: '', }); const { toast } = useToast(); useEffect(() => { fetchUsers(); }, []); const fetchUsers = async () => { try { setLoading(true); const response = await fetch('/api/admin/users'); if (response.ok) { const data = await response.json(); setUsers(data.users); } else { throw new Error('Failed to fetch users'); } } catch (error) { console.error('Error fetching users:', error); toast({ title: 'Error', description: 'Failed to fetch users', variant: 'destructive', }); } finally { setLoading(false); } }; const handleCreateUser = async (e?: React.FormEvent) => { try { // Prevent form submission and double submissions if (e) e.preventDefault(); if (loading) return; if (!formData.name || !formData.surname || !formData.email || !formData.password) { toast({ title: 'Error', description: 'Please fill in all required fields', variant: 'destructive', }); return; } setLoading(true); const response = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formData), }); const data = await response.json(); if (response.ok) { toast({ title: 'Success', description: 'User created successfully', }); setIsCreateDialogOpen(false); resetForm(); fetchUsers(); } else { toast({ title: 'Error', description: data.error || 'Failed to create user', variant: 'destructive', }); } } catch (error) { console.error('Error creating user:', error); toast({ title: 'Error', description: 'Failed to create user', variant: 'destructive', }); } finally { setLoading(false); } }; const handleEditUser = async () => { try { // Prevent double submissions if (loading) return; if (!editingUser || !formData.name || !formData.surname || !formData.email) { toast({ title: 'Error', description: 'Please fill in all required fields', variant: 'destructive', }); return; } setLoading(true); const updateData = { ...formData }; if (!updateData.password) { delete updateData.password; // Don't update password if not provided } const response = await fetch(`/api/admin/users/${editingUser.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(updateData), }); const data = await response.json(); if (response.ok) { toast({ title: 'Success', description: 'User updated successfully', }); setIsEditDialogOpen(false); setEditingUser(null); resetForm(); fetchUsers(); } else { toast({ title: 'Error', description: data.error || 'Failed to update user', variant: 'destructive', }); } } catch (error) { console.error('Error updating user:', error); toast({ title: 'Error', description: 'Failed to update user', variant: 'destructive', }); } finally { setLoading(false); } }; const handleDeleteUser = async (userId: string) => { try { if (!confirm('Are you sure you want to delete this user? This action cannot be undone.')) { return; } const response = await fetch(`/api/admin/users/${userId}`, { method: 'DELETE', }); const data = await response.json(); if (response.ok) { toast({ title: 'Success', description: 'User deleted successfully', }); fetchUsers(); } else { toast({ title: 'Error', description: data.error || 'Failed to delete user', variant: 'destructive', }); } } catch (error) { console.error('Error deleting user:', error); toast({ title: 'Error', description: 'Failed to delete user', variant: 'destructive', }); } }; const openEditDialog = (user: User) => { setEditingUser(user); setFormData({ name: user.name, surname: user.surname, email: user.email, role: user.role, password: '', // Don't pre-fill password }); setIsEditDialogOpen(true); }; const resetForm = () => { setFormData({ name: '', surname: '', email: '', role: 'user', password: '', }); }; const filteredUsers = users.filter( (user) => user.name.toLowerCase().includes(searchTerm.toLowerCase()) || user.surname.toLowerCase().includes(searchTerm.toLowerCase()) || user.email.toLowerCase().includes(searchTerm.toLowerCase()) ); if (loading) { return (
); } return (
{/* Header */}

User Management

Create New User
setFormData({ ...formData, name: e.target.value })} placeholder='John' />
setFormData({ ...formData, surname: e.target.value })} placeholder='Doe' />
setFormData({ ...formData, email: e.target.value })} placeholder='john.doe@example.com' />
setFormData({ ...formData, password: e.target.value })} placeholder='Enter password' />
{/* Search */}
setSearchTerm(e.target.value)} className='max-w-sm' />
{/* Users Table */} All Users ({filteredUsers.length}) Name Email Role Created Actions {filteredUsers.map((user) => ( {user.name} {user.surname}
{user.email}
{user.role}
{new Date(user.createdAt).toLocaleDateString()}
))}
{filteredUsers.length === 0 && (
No users found matching your search criteria
)}
{/* Edit User Dialog */} Edit User
setFormData({ ...formData, name: e.target.value })} placeholder='John' />
setFormData({ ...formData, surname: e.target.value })} placeholder='Doe' />
setFormData({ ...formData, email: e.target.value })} placeholder='john.doe@example.com' />
setFormData({ ...formData, password: e.target.value })} placeholder='Enter new password' />
); }