import React from "react"; import { AuthContext, tokenExpireError } from "@/authContext"; import MkdSDK from "@/utils/MkdSDK"; import { useForm } from "react-hook-form"; import { useNavigate, useSearchParams, Link } from "react-router-dom"; import { GlobalContext, showToast } from "@/globalContext"; import { clearSearchParams, parseSearchParams } from "@/utils/utils"; import PaginationBar from "@/components/PaginationBar"; import Button from "@/components/Button"; import PaginationHeader from "@/components/PaginationHeader"; import { ID_PREFIX, NOTIFICATION_STATUS, NOTIFICATION_TYPE } from "@/utils/constants"; import SwitchBulkMode from "@/components/SwitchBulkMode"; import moment from "moment/moment"; import TreeSDK from "@/utils/TreeSDK"; let sdk = new MkdSDK(); const treeSdk = new TreeSDK(); const loginStatusMapping = ["NO", "YES"]; const statusMapping = ["INACTIVE", "ACTIVE"]; const columns = [ { header: "ID", accessor: "id", isSorted: true, isSortedDesc: true, idPrefix: ID_PREFIX.DEVICE, }, { header: "User ID", accessor: "user_id", isSorted: true, isSortedDesc: true, idPrefix: ID_PREFIX.USER, }, { header: "Device UID", accessor: "uid", isSorted: true, isSortedDesc: true, }, { header: "Logged In", accessor: "active", isSorted: true, isSortedDesc: true, mapping: loginStatusMapping, }, { header: "Last Login", accessor: "last_login_time", isSorted: true, isSortedDesc: true, format: (raw) => moment(raw).format("MM/DD/yyyy hh:mm:ss A"), }, ]; export default function AdminDevicesPage() { const { dispatch } = React.useContext(AuthContext); const { state: globalState, dispatch: globalDispatch } = React.useContext(GlobalContext); const [tableColumns, setTableColumns] = React.useState(columns); const [data, setCurrentTableData] = React.useState([]); const [pageSize, setPageSize] = React.useState(10); const [pageCount, setPageCount] = React.useState(0); const [dataTotal, setDataTotal] = React.useState(0); const [currentPage, setPage] = React.useState(0); const [canPreviousPage, setCanPreviousPage] = React.useState(false); const [canNextPage, setCanNextPage] = React.useState(false); const [bulkMode, setBulkMode] = React.useState(false); const [bulkSelected, setBulkSelected] = React.useState([]); const [bulkStatus, setBulkStatus] = React.useState(""); const [currentDevice, setCurrentDevice] = React.useState({}); const [viewDevice, setViewDevice] = React.useState(false); const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(localStorage.getItem("admin_device_filter") ?? ""); const { reset, register, handleSubmit, setError, formState: { errors }, } = useForm({ defaultValues: parseSearchParams(searchParams), }); function onSort(accessor) { const columns = tableColumns; const index = columns.findIndex((column) => column.accessor === accessor); const column = columns[index]; column.isSortedDesc = !column.isSortedDesc; columns.splice(index, 1, column); setTableColumns(() => [...columns]); const sortedList = selector(data, column.isSortedDesc, accessor); setCurrentTableData(sortedList); } function selector(users, isSortedDesc, accessor) { if (accessor?.split(",").length > 1) { accessor = accessor.split(",")[0]; } return users.sort((a, b) => { if (isSortedDesc) { if (isNaN(a[accessor])) { return a[accessor]?.toLowerCase() < b[accessor]?.toLowerCase() ? 1 : -1; } else { return a[accessor] < b[accessor] ? 1 : -1; } } if (!isSortedDesc) { if (isNaN(a[accessor])) { return a[accessor]?.toLowerCase() < b[accessor]?.toLowerCase() ? -1 : 1; } else { return a[accessor] < b[accessor] ? -1 : 1; } } }); } function updatePageSize(limit) { (async function () { setPageSize(limit); await getData(0, limit); })(); } function previousPage() { (async function () { await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); })(); } function nextPage() { (async function () { await getData(currentPage + 1 <= pageCount ? currentPage + 1 : 0, pageSize); })(); } async function getData(pageNum, limitNum) { const data = parseSearchParams(searchParams); data.id = data.id?.replace(ID_PREFIX.DEVICE, ""); try { let filter = ["deleted_at,is"]; if (data.id) { filter.push(`id,eq,'${data.id}'`); } if (data.user_id) { filter.push(`user_id,eq,${data.user_id}`); } if (data.active) { filter.push(`active,eq,${data.active}`); } if (data.status) { filter.push(`status,eq,${data.status}`); } const result = await treeSdk.getPaginate("device", { join: [], filter, page: pageNum || 1, size: limitNum, order: "update_at" }); const { list, total, limit, num_pages, page } = result; const sortedList = selector(list, false); setCurrentTableData(sortedList); setPageSize(limit); setPageCount(num_pages); setPage(page); setDataTotal(total); setCanPreviousPage(page > 1); setCanNextPage(page + 1 <= num_pages); } catch (error) { tokenExpireError(dispatch, error.message); showToast(globalDispatch, error.message, 4000, "ERROR"); } } const onSubmit = (data) => { searchParams.set("id", data.id); searchParams.set("status", data.status); searchParams.set("active", data.active); searchParams.set("user_id", data.user_id); setSearchParams(searchParams); localStorage.setItem("admin_device_filter", searchParams.toString()); getData(1, pageSize); }; React.useEffect(() => { globalDispatch({ type: "SETPATH", payload: { path: "device", }, }); getData(1, pageSize); }, []); async function logout() { } return ( <>
| )} {columns.map((column, index) => ( | onSort(column.accessor)} > {column.header} {column.isSorted} {column.isSorted ? (column.isSortedDesc ? " ▼" : " ▲") : ""} | ))}||||
|---|---|---|---|---|---|
| { if (bulkSelected.includes(row.id)) { setBulkSelected((prev) => { let copy = [...prev]; copy.splice( prev.findIndex((id) => id == row.id), 1, ); return copy; }); } else { setBulkSelected((prev) => [...prev, row.id]); } }} checked={bulkSelected.includes(row.id)} onChange={() => { }} /> | )} {tableColumns.map((cell, index) => { if (cell.format) { return ({cell.format(row[cell.accessor])} | ); } if (cell.accessor == "") { return (); } if (cell.mapping) { return ( | {cell.mapping[row[cell.accessor] ?? 0]} | ); } if (cell.idPrefix) { return ({cell.idPrefix + row[cell.accessor]} | ); } return ({row[cell.accessor]} | ); })}