'use client' import { useEffect, useState } from 'react' import { getUsers, createUserByAdmin, toggleUserActive, deleteUser, resetUserPassword, } from '@/app/actions' import { Button } from '@/components/ui/button' import { Card, CardContent, CardHeader } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Loader2, Plus, KeyRound, Ban, Trash2, CheckCircle2, ShieldCheck, User } from 'lucide-react' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' export default function UsersPage() { const [users, setUsers] = useState([]) const [total, setTotal] = useState(0) const [totalPages, setTotalPages] = useState(1) const [page, setPage] = useState(1) const [loading, setLoading] = useState(true) // Modals const [isCreateOpen, setIsCreateOpen] = useState(false) const [isPassOpen, setIsPassOpen] = useState(false) const [selectedUser, setSelectedUser] = useState(null) // Forms const [name, setName] = useState('') const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [role, setRole] = useState('user') const [newPass, setNewPass] = useState('') const [actionLoading, setActionLoading] = useState(false) useEffect(() => { loadUsers(page) }, [page]) const loadUsers = async (p: number) => { setLoading(true) const res = await getUsers(p, 10) setUsers(res.users) setTotal(res.total) setTotalPages(res.totalPages) setLoading(false) } const handleCreateUser = async (e: React.FormEvent) => { e.preventDefault() if (!name || !username || !password) return alert('Lengkapi semua field') setActionLoading(true) const res = await createUserByAdmin(name, username, password, role) if (res.success) { setIsCreateOpen(false) setName('') setUsername('') setPassword('') setRole('user') loadUsers(page) } else { alert(res.error) } setActionLoading(false) } const handleResetPassword = async (e: React.FormEvent) => { e.preventDefault() if (!newPass || newPass.length < 6) return alert('Password minimal 6 karakter') setActionLoading(true) const res = await resetUserPassword(selectedUser.id, newPass) if (res.success) { setIsPassOpen(false) setNewPass('') alert('Password berhasil diubah') } else { alert(res.error) } setActionLoading(false) } const handleToggleActive = async (id: string, currentStatus: boolean) => { if (!confirm(`Yakin ingin ${currentStatus ? 'menonaktifkan' : 'mengaktifkan'} user ini?`)) return const res = await toggleUserActive(id, !currentStatus) if (res.success) { loadUsers(page) } else { alert(res.error) } } const handleDelete = async (id: string) => { if (!confirm('Yakin ingin menghapus user ini secara permanen?')) return const res = await deleteUser(id) if (res.success) { loadUsers(page) } else { alert(res.error) } } return (

Manajemen Pengguna

Kelola data seluruh pengguna TitipIn.

{loading ? ( ) : users.length === 0 ? ( ) : ( users.map((u) => ( )) )}
Pengguna Role Status Terdaftar Aksi
Belum ada pengguna lain.
{u.photo ? ( {u.name} ) : (
{u.name.charAt(0)}
)}
{u.name}
@{u.username}
{u.role === 'superadmin' ? ( Superadmin ) : ( User )} {u.is_active ? ( Aktif ) : ( Nonaktif )} {new Date(u.created_at).toLocaleDateString('id-ID')}
{u.role !== 'superadmin' && ( <> )}
{totalPages > 1 && (
Halaman {page} dari {totalPages}
)} {/* CREATE MODAL */}
Tambah User Baru
setName(e.target.value)} className="h-11 rounded-xl" placeholder="Masukkan nama lengkap" />
setUsername(e.target.value)} className="h-11 rounded-xl" placeholder="Masukkan username unik" />
setPassword(e.target.value)} className="h-11 rounded-xl" placeholder="Buat kata sandi (min. 6 karakter)" />
{/* RESET PASSWORD MODAL */}
Ubah Password

Ubah password untuk user{' '} @{selectedUser?.username}

setNewPass(e.target.value)} className="h-11 rounded-xl" placeholder="Minimal 6 karakter" />
) }