import { isEmpty } from "lodash" import { useAdminCustomers } from "medusa-react" import qs from "qs" import { useEffect, useState } from "react" import { useNavigate } from "react-router-dom" import { useTranslation } from "react-i18next" import { usePagination, useTable } from "react-table" import DetailsIcon from "../../fundamentals/details-icon" import EditIcon from "../../fundamentals/icons/edit-icon" import Table from "../../molecules/table" import TableContainer from "../../organisms/table-container" import { useCustomerColumns } from "./use-customer-columns" import { useCustomerFilters } from "./use-customer-filters" const DEFAULT_PAGE_SIZE = 15 const defaultQueryProps = { expand: "orders", } const CustomerTable = () => { const navigate = useNavigate() const { t } = useTranslation() const { reset, paginate, setQuery: setFreeText, queryObject, representationObject, } = useCustomerFilters(location.search, defaultQueryProps) const offs = parseInt(queryObject.offset) || 0 const lim = parseInt(queryObject.limit) || DEFAULT_PAGE_SIZE const { customers, isLoading, count } = useAdminCustomers( { ...queryObject, }, { keepPreviousData: true, } ) const [query, setQuery] = useState(queryObject.query) const [numPages, setNumPages] = useState(0) useEffect(() => { if (typeof count !== "undefined") { const controlledPageCount = Math.ceil(count / lim) setNumPages(controlledPageCount) } }, [count]) const [columns] = useCustomerColumns() const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow, canPreviousPage, canNextPage, pageCount, gotoPage, nextPage, previousPage, // Get the state from the instance state: { pageIndex }, } = useTable( { columns, data: customers || [], manualPagination: true, initialState: { pageSize: lim, pageIndex: offs / lim, }, pageCount: numPages, autoResetPage: false, }, usePagination ) // Debounced search useEffect(() => { const delayDebounceFn = setTimeout(() => { if (query) { setFreeText(query) gotoPage(0) } else { if (typeof query !== "undefined") { // if we delete query string, we reset the table view reset() } } }, 400) return () => clearTimeout(delayDebounceFn) }, [query]) const handleNext = () => { if (canNextPage) { paginate(1) nextPage() } } const handlePrev = () => { if (canPreviousPage) { paginate(-1) previousPage() } } const updateUrlFromFilter = (obj = {}) => { const stringified = qs.stringify(obj) window.history.replaceState(`/a/discounts`, "", `${`?${stringified}`}`) } const refreshWithFilters = () => { const filterObj = representationObject if (isEmpty(filterObj)) { updateUrlFromFilter({ offset: 0, limit: DEFAULT_PAGE_SIZE }) } else { updateUrlFromFilter(filterObj) } } useEffect(() => { refreshWithFilters() }, [representationObject]) return ( {headerGroups?.map((headerGroup) => ( {headerGroup.headers.map((col) => ( {col.render("Header")} ))} ))} {rows.map((row) => { prepareRow(row) return ( navigate(row.original.id), icon: , }, { label: t("customer-table-details", "Details"), onClick: () => navigate(row.original.id), icon: , }, ]} linkTo={row.original.id} {...row.getRowProps()} > {row.cells.map((cell, index) => { return ( {cell.render("Cell", { index })} ) })} ) })}
) } export default CustomerTable