import { ReactNode, Dispatch, SetStateAction } from 'react'; import classNames from 'classnames'; import { Banner, Loading, SearchField } from 'react-basics'; import { useMessages } from 'components/hooks'; import Empty from 'components/common/Empty'; import Pager from 'components/common/Pager'; import styles from './DataTable.module.css'; const DEFAULT_SEARCH_DELAY = 600; export interface DataTableProps { queryResult: { result: { page: number; pageSize: number; count: number; data: any[]; }; params: { query: string; page: number; }; setParams: Dispatch>; isLoading: boolean; error: unknown; }; searchDelay?: number; showSearch?: boolean; showPaging?: boolean; children: ReactNode | ((data: any) => ReactNode); } export function DataTable({ queryResult, searchDelay = 600, showSearch = true, showPaging = true, children, }: DataTableProps) { const { formatMessage, labels, messages } = useMessages(); const { result, error, isLoading, params, setParams } = queryResult || {}; const { page, pageSize, count, data } = result || {}; const { query } = params || {}; const hasData = Boolean(!isLoading && data?.length); const noResults = Boolean(!isLoading && query && !hasData); const handleSearch = query => { setParams({ ...params, query, page: params.query ? page : 1 }); }; const handlePageChange = page => { setParams({ ...params, page }); }; if (error) { return {formatMessage(messages.error)}; } return ( <> {(hasData || query || isLoading) && showSearch && ( )}
{hasData ? (typeof children === 'function' ? children(result) : children) : null} {isLoading && } {!isLoading && !hasData && !query && ( )} {noResults && }
{showPaging && ( )} ); } export default DataTable;