'use client' import { useState, useEffect, useCallback } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Search, Edit, Trash2, UserPlus, ChevronLeft, ChevronRight } from 'lucide-react' import { toast } from '@/hooks/use-toast' import { formatDistanceToNow } from 'date-fns' interface User { _id: string name: string email: string siliconId: string role: 'user' | 'admin' isVerified: boolean balance: number lastLogin: string createdAt: string provider: string } interface UserManagementProps { initialUsers?: User[] } export default function UserManagement({ initialUsers = [] }: UserManagementProps) { const [users, setUsers] = useState(initialUsers) const [loading, setLoading] = useState(false) const [search, setSearch] = useState('') const [roleFilter, setRoleFilter] = useState('all') const [verifiedFilter, setVerifiedFilter] = useState('all') const [currentPage, setCurrentPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [editingUser, setEditingUser] = useState(null) const [showAddDialog, setShowAddDialog] = useState(false) const [editForm, setEditForm] = useState({ name: '', email: '', role: 'user' as 'user' | 'admin', isVerified: false, balance: 0, }) const [addForm, setAddForm] = useState({ name: '', email: '', password: '', role: 'user' as 'user' | 'admin', isVerified: false, balance: 0, }) const fetchUsers = useCallback(async () => { setLoading(true) try { const token = localStorage.getItem('accessToken') || document.cookie .split('; ') .find((row) => row.startsWith('accessToken=')) ?.split('=')[1] const params = new URLSearchParams({ page: currentPage.toString(), limit: '20', search, role: roleFilter, verified: verifiedFilter, }) const response = await fetch(`/api/admin/users?${params}`, { headers: { Authorization: `Bearer ${token}`, }, }) if (!response.ok) { throw new Error('Failed to fetch users') } const data = await response.json() setUsers(data.users) setTotalPages(data.pagination.totalPages) } catch (error) { console.error('Users fetch error:', error) toast({ title: 'Error', description: 'Failed to load users', variant: 'destructive', }) } finally { setLoading(false) } }, [search, roleFilter, verifiedFilter, currentPage]) useEffect(() => { fetchUsers() }, [fetchUsers]) const handleEditUser = (user: User) => { setEditingUser(user) setEditForm({ name: user.name, email: user.email, role: user.role, isVerified: user.isVerified, balance: user.balance, }) } const handleUpdateUser = async () => { if (!editingUser) return try { const token = localStorage.getItem('accessToken') || document.cookie .split('; ') .find((row) => row.startsWith('accessToken=')) ?.split('=')[1] const response = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ action: 'update', userId: editingUser._id, data: editForm, }), }) if (!response.ok) { throw new Error('Failed to update user') } const data = await response.json() setUsers(users.map((u) => (u._id === editingUser._id ? data.user : u))) setEditingUser(null) toast({ title: 'Success', description: 'User updated successfully', }) } catch (error) { console.error('User update error:', error) toast({ title: 'Error', description: 'Failed to update user', variant: 'destructive', }) } } const handleDeleteUser = async (userId: string) => { if (!confirm('Are you sure you want to delete this user?')) return try { const token = localStorage.getItem('accessToken') || document.cookie .split('; ') .find((row) => row.startsWith('accessToken=')) ?.split('=')[1] const response = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ action: 'delete', userId, }), }) if (!response.ok) { throw new Error('Failed to delete user') } setUsers(users.filter((u) => u._id !== userId)) toast({ title: 'Success', description: 'User deleted successfully', }) } catch (error) { console.error('Error deleting user:', error) toast({ title: 'Error', description: 'Failed to delete user', variant: 'destructive', }) } } const handleAddUser = async () => { try { const token = localStorage.getItem('accessToken') || document.cookie .split('; ') .find((row) => row.startsWith('accessToken=')) ?.split('=')[1] const response = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ action: 'create', data: addForm, }), }) if (!response.ok) { throw new Error('Failed to create user') } const data = await response.json() setUsers([data.user, ...users]) setShowAddDialog(false) setAddForm({ name: '', email: '', password: '', role: 'user', isVerified: false, balance: 0, }) toast({ title: 'Success', description: 'User created successfully', }) } catch (error) { console.error('Error creating user:', error) toast({ title: 'Error', description: 'Failed to create user', variant: 'destructive', }) } } const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR', minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(amount) } return (
User Management
{/* Filters */}
setSearch(e.target.value)} className="pl-10" />
{/* Users Table */}
{loading ? ( ) : users.length === 0 ? ( ) : ( users.map((user) => ( )) )}
User Role Status Balance Last Login Actions
Loading users...
No users found

{user.name}

{user.email}

ID: {user.siliconId}

{user.role}
{user.isVerified ? 'Verified' : 'Unverified'} {user.provider}
{formatCurrency(user.balance)} {user.lastLogin ? formatDistanceToNow(new Date(user.lastLogin), { addSuffix: true }) : 'Never'}
{/* Pagination */} {totalPages > 1 && (

Page {currentPage} of {totalPages}

)} {/* Add User Dialog */} Add New User
setAddForm({ ...addForm, name: e.target.value })} placeholder="Enter user name" />
setAddForm({ ...addForm, email: e.target.value })} placeholder="Enter email address" />
setAddForm({ ...addForm, password: e.target.value })} placeholder="Enter password" />
setAddForm({ ...addForm, balance: parseInt(e.target.value) || 0 }) } placeholder="0" />
setAddForm({ ...addForm, isVerified: checked })} />
{/* Edit User Dialog */} setEditingUser(null)}> Edit User
setEditForm({ ...editForm, name: e.target.value })} />
setEditForm({ ...editForm, email: e.target.value })} />
setEditForm({ ...editForm, balance: parseInt(e.target.value) || 0 }) } />
setEditForm({ ...editForm, isVerified: checked })} />
) }