import { useGetBlacklist, useGetRoomList, useAddBlacklist, useDeleteBlacklist, useUpdateDeviceBlacklist, } from "@/hooks/queries"; import { createFileRoute } from "@tanstack/react-router"; import type { ColumnDef } from "@tanstack/react-table"; import type { Blacklist } from "@/types/black-list"; import { BlackListManagerTemplate } from "@/template/table-manager-template"; import { toast } from "sonner"; import { useState } from "react"; export const Route = createFileRoute("/_auth/blacklists/")({ head: () => ({ meta: [{ title: "Danh sách các ứng dụng bị chặn" }] }), component: BlacklistComponent, loader: async ({ context }) => { context.breadcrumbs = [ { title: "Quản lý danh sách chặn", path: "/_auth/blacklists/" }, ]; }, }); function BlacklistComponent() { const [selectedRows, setSelectedRows] = useState>(new Set()); // Lấy danh sách blacklist const { data, isLoading } = useGetBlacklist(); // Lấy danh sách phòng const { data: roomData = [] } = useGetRoomList(); const blacklist: Blacklist[] = Array.isArray(data) ? (data as Blacklist[]) : []; const columns: ColumnDef[] = [ { accessorKey: "id", header: "STT", cell: (info) => info.getValue(), }, { accessorKey: "appName", header: "Tên ứng dụng", cell: (info) => info.getValue(), }, { accessorKey: "processName", header: "Tên tiến trình", cell: (info) => info.getValue(), }, { accessorKey: "createdAt", header: "Ngày tạo", cell: (info) => info.getValue(), }, { accessorKey: "updatedAt", header: "Ngày cập nhật", cell: (info) => info.getValue(), }, { accessorKey: "createdBy", header: "Người tạo", cell: (info) => info.getValue(), }, { id: "select", header: () => ( { if (e.target.checked && data) { const allIds = data.map((item: { id: number }) => item.id); setSelectedRows(new Set(allIds)); } else { setSelectedRows(new Set()); } }} /> ), cell: ({ row }) => ( { const newSelected = new Set(selectedRows); if (e.target.checked) { newSelected.add(row.original.id); } else { newSelected.delete(row.original.id); } setSelectedRows(newSelected); }} /> ), }, ]; // API mutations const addNewBlacklistMutation = useAddBlacklist(); const deleteBlacklistMutation = useDeleteBlacklist(); const updateDeviceMutation = useUpdateDeviceBlacklist(); // Thêm blacklist const handleAddNewBlacklist = async (blacklistData: { appName: string; processName: string; }) => { try { await addNewBlacklistMutation.mutateAsync(blacklistData); toast.success("Thêm mới thành công!"); } catch (error: any) { console.error("Add blacklist error:", error); toast.error("Thêm mới thất bại!"); } }; // Xoá blacklist const handleDeleteBlacklist = async () => { try { for (const blacklistId of selectedRows) { await deleteBlacklistMutation.mutateAsync(blacklistId); } toast.success("Xóa thành công!"); setSelectedRows(new Set()); } catch (error: any) { console.error("Delete blacklist error:", error); toast.error("Xóa thất bại!"); } }; const handleUpdateDevice = async (target: string | string[]) => { const targets = Array.isArray(target) ? target : [target]; try { for (const roomName of targets) { await updateDeviceMutation.mutateAsync({ roomName, data: {}, }); toast.success(`Đã gửi cập nhật cho ${roomName}`); } } catch (e: any) { console.error("Update device error:", e); toast.error("Có lỗi xảy ra khi cập nhật!"); } }; return ( title="Danh sách các ứng dụng bị chặn" description="Quản lý các ứng dụng và tiến trình bị chặn trên thiết bị" data={blacklist} columns={columns} isLoading={isLoading} rooms={roomData} onAdd={handleAddNewBlacklist} onDelete={handleDeleteBlacklist} onUpdate={handleUpdateDevice} /> ); }