'use client'; import { useState, useEffect } from 'react'; import { useLanguage } from '@/context/LanguageContext'; import { usersApi, User } from '@/lib/api'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import Input from '@/components/ui/Input'; import { MoreMenu, DropdownItem, BottomSheet, AdminMobileStyles } from '@/components/admin/MobileComponents'; import { TrashIcon, PencilSquareIcon, FunnelIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { CheckCircleIcon } from '@heroicons/react/24/outline'; import toast from 'react-hot-toast'; import clsx from 'clsx'; export default function AdminUsersPage() { const { t, locale } = useLanguage(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [roleFilter, setRoleFilter] = useState(''); const [editingUser, setEditingUser] = useState(null); const [editForm, setEditForm] = useState({ name: '', email: '', phone: '', role: '' as User['role'], languagePreference: '' as string, accountStatus: '' as string, }); const [saving, setSaving] = useState(false); const [mobileFilterOpen, setMobileFilterOpen] = useState(false); useEffect(() => { loadUsers(); }, [roleFilter]); const loadUsers = async () => { try { const { users } = await usersApi.getAll(roleFilter || undefined); setUsers(users); } catch (error) { toast.error('Failed to load users'); } finally { setLoading(false); } }; const handleRoleChange = async (userId: string, newRole: string) => { try { await usersApi.update(userId, { role: newRole as any }); toast.success('Role updated'); loadUsers(); } catch (error) { toast.error('Failed to update role'); } }; const handleDelete = async (userId: string) => { if (!confirm('Are you sure you want to delete this user?')) return; try { await usersApi.delete(userId); toast.success('User deleted'); loadUsers(); } catch (error: any) { toast.error(error.message || 'Failed to delete user'); } }; const openEditModal = (user: User) => { setEditingUser(user); setEditForm({ name: user.name, email: user.email, phone: user.phone || '', role: user.role, languagePreference: user.languagePreference || '', accountStatus: user.accountStatus || 'active', }); }; const handleEditSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!editingUser) return; if (!editForm.name.trim() || editForm.name.trim().length < 2) { toast.error('Name must be at least 2 characters'); return; } if (!editForm.email.trim()) { toast.error('Email is required'); return; } setSaving(true); try { await usersApi.update(editingUser.id, { name: editForm.name.trim(), email: editForm.email.trim(), phone: editForm.phone.trim() || undefined, role: editForm.role, languagePreference: editForm.languagePreference || undefined, accountStatus: editForm.accountStatus || undefined, } as Partial); toast.success('User updated successfully'); setEditingUser(null); loadUsers(); } catch (error: any) { toast.error(error.message || 'Failed to update user'); } finally { setSaving(false); } }; const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'America/Asuncion', }); }; const getRoleBadge = (role: string) => { const styles: Record = { admin: 'badge-danger', organizer: 'badge-info', staff: 'badge-warning', marketing: 'badge-success', user: 'badge-gray', }; return {t(`admin.users.roles.${role}`)}; }; if (loading) { return (
); } return (

{t('admin.users.title')}

{/* Desktop Filters */}
{/* Mobile Toolbar */}
{roleFilter && ( )} {users.length} users
{/* Desktop: Table */}
{users.length === 0 ? ( ) : ( users.map((user) => ( )) )}
User Contact Role Joined Actions
No users found
{user.name.charAt(0).toUpperCase()}

{user.name}

{user.email}

{user.phone || '-'} {formatDate(user.createdAt)}
{/* Mobile: Card List */}
{users.length === 0 ? (
No users found
) : ( users.map((user) => (
{user.name.charAt(0).toUpperCase()}

{user.name}

{user.email}

{user.phone &&

{user.phone}

}
{getRoleBadge(user.role)}

Joined {formatDate(user.createdAt)}

openEditModal(user)}> Edit User handleDelete(user.id)} className="text-red-600"> Delete
)) )}
{/* Mobile Filter BottomSheet */} setMobileFilterOpen(false)} title="Filter by Role">
{[ { value: '', label: 'All Roles' }, { value: 'admin', label: t('admin.users.roles.admin') }, { value: 'organizer', label: t('admin.users.roles.organizer') }, { value: 'staff', label: t('admin.users.roles.staff') }, { value: 'marketing', label: t('admin.users.roles.marketing') }, { value: 'user', label: t('admin.users.roles.user') }, ].map((opt) => ( ))}
{/* Edit User Modal */} {editingUser && (

Edit User

setEditForm({ ...editForm, name: e.target.value })} required minLength={2} /> setEditForm({ ...editForm, email: e.target.value })} required /> setEditForm({ ...editForm, phone: e.target.value })} placeholder="Optional" />
)}
); }