import { NestedTableKeyedItem, NestedTableState } from '../../state'; import React, { forwardRef, MutableRefObject, ReactElement, useMemo, } from 'react'; import { VirtualTableRepeater, VirtualTableRepeaterProps, } from '../VirtualGridRepeater/VirtualTableRepeater'; import { VirtualGridStateProvider } from '../VirtualGridRepeater/VirtualGridStateContext'; import { NestedTableRow } from './NestedTableRow'; import { useNestedModeColumns } from './useNestedModeColumns'; import { useFlatModeColumns } from './useFlatModeColumns'; import { TableColumn as TableColumnWSR } from '@wix/design-system/dist/types/Table'; import type { NestedTableDragAndDrop } from '../NestedTableDragAndDrop/NestedTableDragAndDrop'; import { NestedTablePlaceholderStatesRow } from './NestedTablePlaceholderStatesRow'; export interface UseModeTableProps { state: NestedTableState; horizontalScroll?: boolean; actionCellWidth?: string | number; actionCellProps?: Partial, 'render' | 'style'>>; dragAndDrop?: typeof NestedTableDragAndDrop; } export function useModeTableProps( props: UseModeTableProps, ) { const { state: wrapperState, horizontalScroll, actionCellWidth, actionCellProps, dragAndDrop, } = props; const { isFlatMode } = wrapperState; const state = isFlatMode ? wrapperState.flat : wrapperState.nested; const key = wrapperState.isFlatMode.toString(); const BodyElementType = useMemo( () => ({ children }: VirtualTableRepeaterProps) => ( {children} ), [state, key], ); const TrElementType = useMemo( () => isFlatMode ? undefined : forwardRef( ( props: { children: ReactElement[]; rowData: NestedTableKeyedItem; className: string; }, ref: | ((instance: HTMLTableRowElement | null) => void) | MutableRefObject | null, ) => props.rowData.item.originalKeyedItem ? ( ) : ( ), ), [isFlatMode, dragAndDrop], ); const nestedColumns = useNestedModeColumns({ state: wrapperState, horizontalScroll, actionCellWidth, actionCellProps, dragAndDrop, }); const flatColumns = useFlatModeColumns({ state: wrapperState, horizontalScroll, actionCellWidth, actionCellProps, }); return { state, key, BodyElementType, TrElementType, columns: isFlatMode ? flatColumns : nestedColumns, }; }