"use client"; import { useState, JSXElementConstructor, ReactElement, ReactNode, ReactPortal, useMemo, } from "react"; import { useQuery } from "@tanstack/react-query"; import { useReactTable, getCoreRowModel, getSortedRowModel, getPaginationRowModel, flexRender, SortingState, PaginationState, } from "@tanstack/react-table"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Pagination, PaginationContent, PaginationItem, } from "@/components/ui/pagination"; import { Search } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { fetchInventoryItems } from "@/api/inventory"; import { AddInventoryItem } from "./add-inventory-item"; import { EditInventoryItem } from "./edit-inventory-item"; import { DeleteInventoryItem } from "./delete-inventory-item"; export default function InventoryPage() { const [sorting, setSorting] = useState([]); const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10, }); const { data: inventoryItems = [], isLoading, isError, } = useQuery({ queryKey: ["inventoryItems"], queryFn: fetchInventoryItems, staleTime: 60 * 1000, }); const [searchTerm, setSearchTerm] = useState(""); const handleSearch = () => { // update search state when user clicks or presses enter setSearchTerm(searchTerm); }; const filteredItems = useMemo(() => { return inventoryItems.filter((item) => item.name.toLowerCase().includes(searchTerm.toLowerCase()) ); }, [inventoryItems, searchTerm]); const columns = [ { accessorKey: "name", header: "Name" }, { accessorKey: "category", header: "Category" }, { accessorKey: "type", header: "Type" }, { accessorKey: "quantity", header: "Quantity" }, { accessorKey: "lastUpdated", header: "Last Updated" }, { accessorKey: "status", header: "Status", cell: (info: { getValue: () => | string | number | bigint | boolean | ReactElement> | Iterable | ReactPortal | Promise< | string | number | bigint | boolean | ReactPortal | ReactElement> | Iterable | null | undefined > | null | undefined; }) => {info.getValue()}, }, { accessorKey: "edit", header: "Edit", cell: () => }, { accessorKey: "delete", header: "Delete", cell: () => , }, ]; const table = useReactTable({ data: filteredItems, columns, state: { sorting, pagination }, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), onSortingChange: setSorting, onPaginationChange: setPagination, }); if (isLoading) return (
Loading...
); if (isError) return (
Error loading inventory data.
); return (

Inventory

setSearchTerm(e.target.value)} />
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {flexRender( header.column.columnDef.header, header.getContext() )} ))} ))} {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext() )} ))} ))}
); }