'use client' import colors from '@/con/colors'; import { Box, Button, Center, Group, Pagination, Paper, Select, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconCheck, IconSearch, IconTrash, IconX } from '@tabler/icons-react'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../_com/header'; import { ModalKonfirmasiHapus } from '../../_com/modalKonfirmasiHapus'; import user from '../../_state/user/user-state'; import { authStore } from '@/store/authStore'; function User() { const [search, setSearch] = useState(""); return ( } value={search} onChange={(e) => setSearch(e.currentTarget.value)} /> ); } function ListUser({ search }: { search: string }) { const stateUser = useProxy(user.userState); const stateRole = useProxy(user.roleState); const [modalHapus, setModalHapus] = useState(false); const [selectedId, setSelectedId] = useState(null); const { data, page, totalPages, loading, load, } = stateUser.findMany; const handleDelete = () => { if (selectedId) { stateUser.deleteUser.delete(selectedId); setModalHapus(false); setSelectedId(null); stateUser.findMany.load(); } }; useShallowEffect(() => { stateRole.findMany.load(); load(page, 10, search); }, [page, search]); // ✅ Helper function untuk nama role const getRoleName = (roleId: string) => { // Cari dari data role yang sudah diload const role = stateRole.findMany.data.find((r) => r.id === roleId); return role?.name || "Unknown Role"; }; // ✅ Handler untuk perubahan role dengan konfirmasi const handleRoleChange = async ( userId: string, username: string, oldRoleId: string, newRoleId: string ) => { // Skip jika sama if (oldRoleId === newRoleId) { return true; } // ✅ Konfirmasi perubahan role const confirmed = window.confirm( `⚠️ PERINGATAN\n\n` + `Mengubah role untuk "${username}" akan:\n` + `• Logout user otomatis dari semua device\n` + `• Mengubah akses menu sesuai role baru\n\n` + `Role: ${getRoleName(oldRoleId)} → ${getRoleName(newRoleId)}\n\n` + `Lanjutkan?` ); if (!confirmed) { // Reload data untuk reset dropdown ke nilai lama stateUser.findMany.load(page, 10, search); return false; } // ✅ Submit update const success = await stateUser.update.submit({ id: userId, roleId: newRoleId, }); if (success) { // ✅ Logout user jika sedang mengedit diri sendiri const currentUserId = authStore.user?.id; if (currentUserId === userId) { authStore.setUser(null); document.cookie = `${process.env.BASE_SESSION_KEY}=; Max-Age=0; path=/;`; alert("Perubahan memerlukan login ulang"); window.location.href = "/login"; return; } // Reload data stateUser.findMany.load(page, 10, search); } return success; }; // ✅ Handler untuk toggle isActive const handleToggleActive = async (userId: string, currentStatus: boolean) => { const success = await stateUser.update.submit({ id: userId, isActive: !currentStatus, }); if (success) { // ✅ Logout user jika sedang mengedit diri sendiri const currentUserId = authStore.user?.id; if (currentUserId === userId) { authStore.setUser(null); document.cookie = `${process.env.BASE_SESSION_KEY}=; Max-Age=0; path=/;`; alert("Perubahan memerlukan login ulang"); window.location.href = "/login"; return; } // Reload data stateUser.findMany.load(page, 10, search); } }; const filteredData = (data || []).filter((item) => { return item.roleId !== "0" && item.roleId !== "1"; }); if (loading || !data) { return ( ); } return ( Daftar User Nama User Nomor Role Aktif / Nonaktif Hapus {filteredData.length > 0 ? ( filteredData.map((item) => ( {item.username} {item.nomor}
{ load(newPage, 10); window.scrollTo({ top: 0, behavior: 'smooth' }); }} total={totalPages} mt="md" mb="md" color="blue" radius="md" />
{/* Modal Konfirmasi Hapus */} setModalHapus(false)} onConfirm={handleDelete} text='Apakah anda yakin ingin menghapus user ini?' />
); } export default User;