"use client"; import type { Table as ReactTableType, VisibilityState } from "@tanstack/react-table"; import { useEffect, useRef } from "react"; import { DataTable, DataTablePagination, useFetchMoreOnBottomReached, useDataTable, useColumnFilters, } from "@calcom/features/data-table"; import { classNames } from "@calcom/lib"; export type DataTableWrapperProps = { testId?: string; bodyTestId?: string; table: ReactTableType; isPending: boolean; hasNextPage: boolean; fetchNextPage: () => void; isFetching: boolean; hideHeader?: boolean; variant?: "default" | "compact"; totalDBRowCount?: number; ToolbarLeft?: React.ReactNode; ToolbarRight?: React.ReactNode; EmptyView?: React.ReactNode; LoaderView?: React.ReactNode; className?: string; containerClassName?: string; children?: React.ReactNode; tableContainerRef?: React.RefObject; }; export function DataTableWrapper({ testId, bodyTestId, table, isPending, hasNextPage, fetchNextPage, isFetching, totalDBRowCount, variant, hideHeader, ToolbarLeft, ToolbarRight, EmptyView, LoaderView, className, containerClassName, children, tableContainerRef: externalRef, }: DataTableWrapperProps) { const internalRef = useRef(null); const tableContainerRef = externalRef || internalRef; const fetchMoreOnBottomReached = useFetchMoreOnBottomReached({ tableContainerRef, hasNextPage, fetchNextPage, isFetching, }); const { sorting, setSorting, columnVisibility, setColumnVisibility } = useDataTable(); const columnFilters = useColumnFilters(); useEffect(() => { const mergedColumnVisibility = { ...(table.initialState?.columnVisibility || {}), ...columnVisibility, } satisfies VisibilityState; table.setState((prev) => ({ ...prev, sorting, columnFilters, columnVisibility: mergedColumnVisibility, })); table.setOptions((prev) => ({ ...prev, onSortingChange: setSorting, onColumnVisibilityChange: setColumnVisibility, })); }, [table, sorting, columnFilters, columnVisibility]); let view: "loader" | "empty" | "table" = "table"; if (isPending && LoaderView) { view = "loader"; } else if (table.getRowCount() === 0 && EmptyView) { view = "empty"; } return ( <> {(ToolbarLeft || ToolbarRight || children) && (
{ToolbarLeft}
{ToolbarRight}
{children}
)} {view === "loader" && LoaderView} {view === "empty" && EmptyView} {view === "table" && ( fetchMoreOnBottomReached(e.target as HTMLDivElement)}> {totalDBRowCount && (
)}
)} ); }