import React, { forwardRef, MutableRefObject, useMemo, useState } from 'react'; import { Box, SkeletonGroup, SkeletonLine, Table, TableProps, } from '@wix/design-system'; import { FiltersMap } from '@wix/bex-core'; import { ResponsiveColumnsState, ToolbarCollectionState } from '../../state'; import { observer } from 'mobx-react-lite'; export interface TableSkeletonProps { state: ToolbarCollectionState; dataHook?: string; rowsCount?: number; showTitleBar?: boolean; rowVerticalPadding?: TableProps['rowVerticalPadding']; } export function _TableSkeleton( props: TableSkeletonProps, ) { const { state, dataHook, rowsCount = 7, showTitleBar, ...rest } = props; const [{ columnCount, minItemWidth, itemsContentWidth }] = useState( () => new ResponsiveColumnsState({ gridState: { gap: 24, }, minItemWidth: 192, rectState: state.toolbarRect, containerPadding: 48, }), ); const data = useMemo( () => new Array(rowsCount) .fill(null) .map((_, i) => ({ id: `skeleton-row-${i}` })), [rowsCount], ); const columns = useMemo( () => new Array(columnCount).fill(null).map((_, i) => ({ title: '', key: `skeleton-column-${i}`, dataHook: `skeleton-column-${i}`, render: () => ( ), })), [columnCount], ); const [TrElementType] = useState(() => forwardRef( ( { rowData: _rowData, ...trProps }: { rowData?: unknown }, ref: | ((instance: HTMLTableRowElement | null) => void) | MutableRefObject | null, ) => { // is rendered inside the main component, so we need to remove the data-table-row attribute from the element to make testkit not to consider skeleton rows as real rows return ; }, ), ); if (!itemsContentWidth && process.env.NODE_ENV !== 'test') { return null; } return ( // wrapper always aligns the skeleton to the top of the table
); } export const TableSkeleton = observer(_TableSkeleton);