import { useMemo } from "react"; import { Button, DataTableViewOptions } from "@marzneshin/components"; import { useTranslation } from "react-i18next"; import { useQuery } from "@tanstack/react-query"; import { EntityTableContext } from "./contexts"; import { TableFiltering, DataTablePagination, EntityDataTable } from "./components"; import { type UseRowSelectionReturn, useFiltering, usePagination, type FetchEntityReturn, useEntityTable, useVisibility, useSorting, type SortableQueryKey, type QueryKey, type EntityQueryKeyType, } from "./hooks"; export interface EntityTableProps { fetchEntity: ({ queryKey }: EntityQueryKeyType) => FetchEntityReturn; columnsFn: any; filteredColumn: string; entityKey: string; rowSelection?: UseRowSelectionReturn; manualSorting?: boolean; onCreate: () => void; onEdit: (entity: T) => void; onOpen: (entity: T) => void; onDelete: (entity: T) => void; } export function EntityTable({ fetchEntity, columnsFn, filteredColumn, rowSelection, entityKey, manualSorting = false, onCreate, onEdit, onOpen, onDelete, }: EntityTableProps) { const { t } = useTranslation(); const filtering = useFiltering({ column: filteredColumn }); const sorting = useSorting(); const visibility = useVisibility(); const { onPaginationChange, pageIndex, pageSize } = usePagination(); const sortedQuery: SortableQueryKey = [ entityKey, pageIndex, pageSize, filtering.columnFilters, sorting.sorting[0]?.id ? sorting.sorting[0].id : "created_at", sorting.sorting[0]?.desc, ]; const query: QueryKey = [ entityKey, pageIndex, pageSize, filtering.columnFilters, ]; const { data, isFetching } = useQuery({ queryFn: fetchEntity, queryKey: manualSorting ? sortedQuery : query, initialData: { entity: [], pageCount: 1 }, }); const columns = columnsFn({ onEdit, onDelete, onOpen }); const table = useEntityTable({ data, columns, pageSize, pageIndex, rowSelection, visibility, sorting, onPaginationChange, }); const contextValue = useMemo( () => ({ table, data: data.entity, filtering, isLoading: isFetching }), [table, data.entity, filtering, isFetching], ); return (
{onCreate && ( )}
); }